AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  Connexion  

Partagez | 
 

 Ablabla C++

Voir le sujet précédent Voir le sujet suivant Aller en bas 
Aller à la page : Précédent  1, 2
AuteurMessage
daminetreg
Administrateur
avatar

Messages : 16994
Localisation : Siege du CBNA!
Projet Actuel : Site Web du CBNA, version beta :

MessageSujet: Re: Ablabla C++   Lun 15 Juin 2015 - 17:15

Bon après une longue absence je me lance. Smile

J'ai joué la semaine dernière avec cette magnifique librarie nommée metaparse. Et j'ai produit l'ébauche d'un générateur de données de réflexion pour transformer un enum en string.

Je travaille dessus pour en faire une lib propre, mais voici l'idée :

Code:

#include <iostream>

#include <mpllibs/metaparse/string.hpp>
#include <mpllibs/metaparse/lit_c.hpp>
#include <mpllibs/metaparse/sequence.hpp>

#include <mpllibs/metaparse/entire_input.hpp>
#include <mpllibs/metaparse/token.hpp>
#include <mpllibs/metaparse/build_parser.hpp>

#include <mpllibs/metaparse/foldl.hpp>
#include <mpllibs/metaparse/any.hpp>

#include <mpllibs/metaparse/one_char_except.hpp>
#include <mpllibs/metaparse/empty.hpp>

#include <mpllibs/metaparse/one_of.hpp>

#include <mpllibs/metaparse/transform.hpp>

#include <boost/mpl/size.hpp>
#include <boost/mpl/at.hpp>
#include <boost/mpl/int.hpp>

#include <boost/mpl/lambda.hpp>
#include <boost/mpl/plus.hpp>

#include <boost/mpl/vector.hpp>

#include <boost/mpl/string.hpp>

using namespace mpllibs::metaparse;

using enum_sequence = sequence<lit_c<'e'>,lit_c<'n'>,lit_c<'u'>,lit_c<'m'>>;
using enumeration_ids = sequence<
      token<lit_c<'{'>>,
      any<
        sequence<
          token<any<one_char_except<std::integral_constant<char, ','>>>>,
          token<lit_c<','>>
        >
      >,
      token<lit_c<'}'>>
>;

using enum_parser = build_parser<
  entire_input<
    sequence<
      token<enum_sequence>,
      enumeration_ids
    >
  >
>;

enum class test { first, second, third };

using parsed = enum_parser::apply<MPLLIBS_STRING("enum { first, second, third, }")>::type;

using get_enum_entry_count =
  boost::mpl::size< boost::mpl::at_c< boost::mpl::at_c<parsed, 1>::type, 1 >::type>::type;

template <int x>
using get_enum_entry =
  typename boost::mpl::at_c< typename boost::mpl::at_c< boost::mpl::at_c< boost::mpl::at_c<parsed, 1>::type, 1 >::type, x >::type, 0>::type;


template <int x>
using enum_strval = typename boost::mpl::fold<
  typename get_enum_entry< x >::type,
  boost::mpl::string<>::type,
  boost::mpl::lambda< boost::mpl::push_back<boost::mpl::_1, boost::mpl::_2> >::type >::type;

int main(int argc, const char** argv) {
  using namespace boost::mpl;

  std::cout << "There are " << get_enum_entry_count::value << " identifiers. " << std::endl;


  std::cout << "Enum as string is " << c_str< enum_strval<int(test::first)> >::type::value << std::endl;
  std::cout << "Enum as string is " << c_str< enum_strval<int(test::second)> >::type::value << std::endl;
  std::cout << "Enum as string is " << c_str< enum_strval<int(test::third)> >::type::value << std::endl;

  return 0;
}



Pour un enum donné on pourra récupérer une string pour chacune de ses valeurs et vice-versa :

Code:

  enum class test { first, second, third };
  std::cout << "There are " << get_enum_entry_count<test>::value << " identifiers. " << std::endl;
  std::cout << "Enum as string is " << c_str< enum_strval<int(test::first)> >::type::value << std::endl;
  std::cout << "Enum as string is " << c_str< enum_strval<int(test::second)> >::type::value << std::endl;
  std::cout << "Enum as string is " << c_str< enum_strval<int(test::third)> >::type::value << std::endl;

Cela ouput :

Code:

daminetreg@daminetreg-laptop:~/workspace/experiments/parseEnums$ ./parseEnum
There are 3 identifiers.
Enum as string is first
Enum as string is second
Enum as string is third

_________________
Mon CV : fr - de - en
Le CBNA Tous Ensemble! Réalisons!
Revenir en haut Aller en bas
http://lecbna.org/
daminetreg
Administrateur
avatar

Messages : 16994
Localisation : Siege du CBNA!
Projet Actuel : Site Web du CBNA, version beta :

MessageSujet: Re: Ablabla C++   Mar 16 Juin 2015 - 21:29

J'ai pu l'améliorer : http://git.lecbna.org/toolsutilities/lib-cpp-enums/blob/master/parseEnums.cpp

Il est possible de transformer un enum en string ainsi :
Code:

SMART_ENUM(test, (

      enum class test { Oh, Yeah, Cool, }
))

Et ainsi d'accèder à leur valeur en tant que runtime string (générée à la compilation) avec :
Code:

enum_as_cstr<adapted_test, int(test::Cool)>::value

_________________
Mon CV : fr - de - en
Le CBNA Tous Ensemble! Réalisons!
Revenir en haut Aller en bas
http://lecbna.org/
onilink_
Modérateur
avatar

Messages : 8918
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: Ablabla C++   Mer 17 Juin 2015 - 7:41

Sympa ça :b

_________________
                 
Revenir en haut Aller en bas
onilink_
Modérateur
avatar

Messages : 8918
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: Ablabla C++   Mar 29 Mar 2016 - 16:04

Un pattern de Signal/Slot a la Qt en C++11:
https://github.com/onidev/Signal-Slot

Très utile quand il s'agit de faire de la GUI, ou bien pratique pour gérer certains types d'events dans une API (par ex une API network qui doit indiquer quand un client se co/deco).

_________________
                 
Revenir en haut Aller en bas
Contenu sponsorisé




MessageSujet: Re: Ablabla C++   

Revenir en haut Aller en bas
 
Ablabla C++
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 2 sur 2Aller à la page : Précédent  1, 2

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Forum Le CBNA :: Développement :: Programmation-
Sauter vers: