AmpGen 2.1
Loading...
Searching...
No Matches
enum.h
Go to the documentation of this file.
1#ifndef AMPGEN_ENUM_H
2#define AMPGEN_ENUM_H 1
3#include "AmpGen/MsgService.h"
4#include "AmpGen/Utilities.h"
5#include <string.h>
6
7#define declare_enum(name, ...) \
8enum class name {__VA_ARGS__, Invalid}; \
9template <> name parse(const std::string& word); \
10template <> std::string to_string( const name& enumItem ); \
11std::ostream& operator<<( std::ostream& os, const name& np);
12
13#define complete_enum(name, ...) \
14template <> name parse(const std::string& word){ constexpr auto args = #__VA_ARGS__; return AmpGen::detail::parse<name>(word, args); } \
15template <> std::string to_string( const name& enumItem ){ constexpr auto args = #__VA_ARGS__; return AmpGen::detail::to_string<name>(enumItem, args) ; } \
16template <> name lexical_cast(const std::string& word, bool& /*status*/){ return parse<name>(word); } \
17std::ostream& operator<<(std::ostream& os, const name& np){ return os << to_string<name>(np);}
18
19#define make_enum(name, ...) \
20enum class name {__VA_ARGS__, Invalid}; \
21template <> name parse(const std::string& word){ constexpr auto args = #__VA_ARGS__; return AmpGen::detail::parse<name>(word, args); } \
22template <> std::string to_string( const name& enumItem ){ constexpr auto args = #__VA_ARGS__; return AmpGen::detail::to_string<name>(enumItem, args) ; } \
23template <> name lexical_cast(const std::string& word, bool& /*status*/){ return parse<name>(word); } \
24std::ostream& operator<<(std::ostream& os, const name& np){ return os << to_string<name>(np);}
25
26namespace AmpGen {
27 template <class T> T parse( const std::string& word ){ return T(); }
28 template <class T> std::string to_string( const T& enumItem ){ return ""; }
29
30 namespace detail {
31 template <class T> T parse(const std::string& word, const char* args)
32 {
33 char* p;
34 auto number = strtoul( word.c_str(), &p, 10 );
35 if( *p == 0 ) return T(number);
36 unsigned counter = 0;
37 unsigned begin = 0;
38 unsigned end = 0;
39 auto compare = [](const char* word, const char* otherWord, const unsigned& nChar)
40 {
41 if( strlen(word) != nChar ) return false;
42 for( size_t x = 0; x != nChar ; ++x) if( word[x] != otherWord[x] ) return false;
43 return true;
44 };
45 bool found = false;
46 while( args[begin] != '\0' )
47 {
48 while( args[begin] == ' ' ) begin++;
49 for( end=begin; args[end] != '\0'; end++ ) if( args[end] == ',' ) break;
50 if( compare( word.c_str(), args + begin , end-begin ) ) { found = true; break; }
51 begin = end+1;
52 counter++;
53 if( args[end] == '\0' ) break;
54 }
55 if(!found) return T::Invalid;
56 return T(counter);
57 }
58 template <class T> std::string to_string(const T& enumItem, const char* args)
59 {
60 unsigned counter = 0;
61 unsigned sBegin = 0;
62 unsigned sLength = 0;
63 for( ; args[sBegin] != '\0' && counter != unsigned(enumItem); sBegin++ )
64 {
65 if( args[sBegin] == ',' ) counter++;
66 }
67 while( args[sBegin] == ' ') sBegin++;
68 for(; args[sLength + sBegin] != '\0' ; ++sLength ) if( args[sBegin + sLength] == ',') break;
69 return std::string(args).substr(sBegin, sLength);
70 }
71 }
72}
73#endif
T parse(const std::string &word, const char *args)
Definition enum.h:31
std::string to_string(const T &enumItem, const char *args)
Definition enum.h:58
std::string to_string(const T &enumItem)
Definition enum.h:28
T parse(const std::string &word)
Definition enum.h:27