8 #ifndef INCL_evo_enum_h     9 #define INCL_evo_enum_h    67 #if defined(EVO_OLDCC2)   134 #define EVO_ENUM_MAP(ENUM, FIRST_VAL, LAST_VAL, UNKNOWN_VAL, ...) \   135     struct ENUM ## Enum { \   137         typedef EnumMapIterator< ENUM ## Enum > Iter; \   138         static const ENUM FIRST   = FIRST_VAL; \   139         static const ENUM LAST    = LAST_VAL; \   140         static const ENUM UNKNOWN = UNKNOWN_VAL; \   141         static const evo::SubStringMapList& map() { \   142             static const evo::SubString LIST[] = { __VA_ARGS__ }; \   143             static const evo::SubStringMapList MAP(LIST, evo::fixed_array_size(LIST)); \   146         static ENUM get_enum(const evo::SubString& key) \   147             { return map().find_enum<ENUM>(key, FIRST, LAST, UNKNOWN); } \   148         static ENUM get_enum(int val) \   149             { return (val < (int)FIRST || val > (int)LAST ? UNKNOWN : (ENUM)val); } \   150         static int get_int(ENUM val) \   151             { return (int)val; } \   152         static SubString get_string(ENUM val) \   153             { return map().get_enum_string(val, FIRST, LAST); } \   168 #define EVO_ENUM_REMAP(ENUM, FIRST_VAL, LAST_VAL, UNKNOWN_VAL, REMAP_ARRAY, ...) \   169     struct ENUM ## Enum { \   171         typedef EnumMapIterator< ENUM ## Enum > Iter; \   172         static const ENUM FIRST   = FIRST_VAL; \   173         static const ENUM LAST    = LAST_VAL; \   174         static const ENUM UNKNOWN = UNKNOWN_VAL; \   175         static const ENUM* get_remap_array() { \   176             return REMAP_ARRAY; \   178         static const SizeT* get_reverse_remap_array() { \   179             static const SubStringMapList::ReverseRemap< ENUM ## Enum > REVERSE(get_remap_array()); \   180             return REVERSE.array; \   182         static const evo::SubStringMapList& map() { \   183             static const evo::SubString LIST[] = { __VA_ARGS__ }; \   184             static const evo::SubStringMapList MAP(LIST, evo::fixed_array_size(LIST)); \   187         static ENUM get_enum(const evo::SubString& key) \   188             { return map().find_enum_remap<Type>(get_remap_array(), key, FIRST, LAST, UNKNOWN); } \   189         static ENUM get_enum(int val) \   190             { return (val < (int)FIRST || val > (int)LAST ? UNKNOWN : (ENUM)val); } \   191         static int get_int(ENUM val) \   192             { return (int)val; } \   193         static SubString get_string(ENUM val) \   194             { return map().get_enum_string_remap(get_reverse_remap_array(), val, FIRST, LAST); } \   219 #define EVO_ENUM_MAP_PREFIXED(ENUM, PREFIX, ...) \   220     EVO_ENUM_MAP(ENUM, (ENUM)((int)(PREFIX ## UNKNOWN) + 1), (ENUM)((int)(PREFIX ## ENUM_END) - 1), PREFIX ## UNKNOWN, __VA_ARGS__)   232 #define EVO_ENUM_REMAP_PREFIXED(ENUM, PREFIX, REMAP_ARRAY, ...) \   233     EVO_ENUM_REMAP(ENUM, (ENUM)((int)(PREFIX ## UNKNOWN) + 1), (ENUM)((int)(PREFIX ## ENUM_END) - 1), PREFIX ## UNKNOWN, REMAP_ARRAY, __VA_ARGS__)   235 #if defined(EVO_CPP11)   251     #define EVO_ENUM_CLASS_MAP(ENUM, ...) \   252         struct ENUM ## Enum { \   254             typedef EnumMapIterator< ENUM ## Enum > Iter; \   255             static const ENUM FIRST = (ENUM)((int)(ENUM::UNKNOWN) + 1); \   256             static const ENUM LAST = (ENUM)((int)(ENUM::ENUM_END) - 1); \   257             static const evo::SubStringMapList& map() { \   258                 static const evo::SubString LIST[] = { __VA_ARGS__ }; \   259                 static const evo::SubStringMapList MAP(LIST, evo::fixed_array_size(LIST)); \   262             static ENUM get_enum(const evo::SubString& key) \   263                 { return map().find_enum_class<ENUM>(key); } \   264             static ENUM get_enum(int val) \   265                 { return (val <= (int)ENUM::UNKNOWN || val >= (int)ENUM::ENUM_END ? ENUM::UNKNOWN : (ENUM)val); } \   266             static int get_int(ENUM val) \   267                 { return (int)val; } \   268             static SubString get_string(ENUM val) \   269                 { return map().get_enum_class_string(val); } \   281     #define EVO_ENUM_CLASS_REMAP(ENUM, REMAP_ARRAY, ...) \   282         struct ENUM ## Enum { \   284             typedef EnumMapIterator< ENUM ## Enum > Iter; \   285             static const ENUM FIRST = (ENUM)((int)(ENUM::UNKNOWN) + 1); \   286             static const ENUM LAST = (ENUM)((int)(ENUM::ENUM_END) - 1); \   287             static const ENUM* get_remap_array() { \   288                 return REMAP_ARRAY; \   290             static const SizeT* get_reverse_remap_array() { \   291                 static const SubStringMapList::ReverseRemap< ENUM ## Enum > REVERSE(get_remap_array()); \   292                 return REVERSE.array; \   294             static const evo::SubStringMapList& map() { \   295                 static const evo::SubString LIST[] = { __VA_ARGS__ }; \   296                 static const evo::SubStringMapList MAP(LIST, evo::fixed_array_size(LIST)); \   299             static ENUM get_enum(const evo::SubString& key) \   300                 { return map().find_enum_remap<Type>(get_remap_array(), key, FIRST, LAST, Type::UNKNOWN); } \   301             static ENUM get_enum(int val) \   302                 { return (val <= (int)ENUM::UNKNOWN || val >= (int)ENUM::ENUM_END ? ENUM::UNKNOWN : (ENUM)val); } \   303             static int get_int(ENUM val) \   304                 { return (int)val; } \   305             static SubString get_string(ENUM val) \   306                 { return map().get_enum_string_remap(get_reverse_remap_array(), val, FIRST, LAST); } \   326 #define EVO_ENUM_TRAITS(ENUM, TRAITS, START_VAL, ...) \   327     struct ENUM ## EnumTraits { \   329         static const ENUM START = START_VAL; \   330         static const TRAITS& get(ENUM value) { \   331             return data()[(int)value - (int)START]; \   334         static const TRAITS* data() { \   335             static const TRAITS DATA[] = { __VA_ARGS__ }; \   340 #if defined(EVO_CPP11)   355     #define EVO_ENUM_CLASS_TRAITS(ENUM, TRAITS, ...) \   356         struct ENUM ## EnumTraits { \   358             static const ENUM START = ENUM::UNKNOWN; \   359             static const TRAITS& get(ENUM value) { \   360                 return data()[(int)value - (int)START]; \   363             static const TRAITS* data() { \   364                 static const TRAITS DATA[] = { __VA_ARGS__ }; \ SubString value_str() const
Get current enum string value. 
Definition: enum.h:105
 
This & operator=(EnumType value)
Definition: enum.h:92
 
This & operator=(const This &src)
Assignment operator. 
Definition: iter.h:1261
 
Expanded EnumIterator used with enum traits. 
Definition: enum.h:64
 
IteratorPos
Iterator position value. 
Definition: iter.h:20
 
EnumMapIterator< T > This
Definition: enum.h:65
 
EnumType value_
Definition: iter.h:1362
 
static const T FIRST
Definition: iter.h:1231
 
EnumMapIterator(IteratorPos pos)
Definition: enum.h:84
 
Iterator template for sequential enum values. 
Definition: iter.h:1227
 
static const T LAST
Definition: iter.h:1232
 
T EnumType
Definition: iter.h:1230
 
EnumMapIterator(EnumType value)
Definition: enum.h:81
 
EnumMapIterator()
Definition: enum.h:75
 
Evo C++ Library namespace. 
Definition: alg.h:11
 
This & operator=(IteratorPos pos)
Definition: enum.h:97
 
EnumIterator< typename T::Type,(int) T::FIRST,(int) T::LAST > BaseType
Definition: enum.h:66
 
This & operator=(const This &src)
Definition: enum.h:87
 
Reference and access existing string data. 
Definition: substring.h:229
 
bool end_
Definition: iter.h:1363
 
EnumMapIterator(const This &src)
Definition: enum.h:78
 
EnumType value() const
Get current enum value. 
Definition: iter.h:1349