AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  Connexion  

Partagez
 

 Ablabla C++

Aller en bas 
Aller à la page : Précédent  1, 2
AuteurMessage
daminetreg
Administrateur
daminetreg

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

Ablabla C++ - Page 2 Empty
MessageSujet: Re: Ablabla C++   Ablabla C++ - Page 2 EmptyLun 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!
Ablabla C++ - Page 2 U3dfr2
Revenir en haut Aller en bas
http://lecbna.org/
daminetreg
Administrateur
daminetreg

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

Ablabla C++ - Page 2 Empty
MessageSujet: Re: Ablabla C++   Ablabla C++ - Page 2 EmptyMar 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!
Ablabla C++ - Page 2 U3dfr2
Revenir en haut Aller en bas
http://lecbna.org/
onilink_
Modérateur
onilink_

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

Ablabla C++ - Page 2 Empty
MessageSujet: Re: Ablabla C++   Ablabla C++ - Page 2 EmptyMer 17 Juin 2015 - 7:41

Sympa ça :b

_________________
Ablabla C++ - Page 2 Runningpotato1Ablabla C++ - Page 2 TvF6GED
Revenir en haut Aller en bas
onilink_
Modérateur
onilink_

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

Ablabla C++ - Page 2 Empty
MessageSujet: Re: Ablabla C++   Ablabla C++ - Page 2 EmptyMar 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).

_________________
Ablabla C++ - Page 2 Runningpotato1Ablabla C++ - Page 2 TvF6GED
Revenir en haut Aller en bas
Contenu sponsorisé




Ablabla C++ - Page 2 Empty
MessageSujet: Re: Ablabla C++   Ablabla C++ - Page 2 Empty

Revenir en haut Aller en bas
 
Ablabla C++
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: