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