diff --git a/Include/AuroraEnum.hpp b/Include/AuroraEnum.hpp index 7669eaa..ef9bb45 100644 --- a/Include/AuroraEnum.hpp +++ b/Include/AuroraEnum.hpp @@ -20,7 +20,6 @@ #if !defined(AUE_NOCPPSTL) #include #include - #include #if !defined(AU_AuHashMap) #define AU_AuHashMap @@ -33,11 +32,6 @@ using AuString = std::string; #endif - #if !defined(AU_AuConsumer) - #define AU_AuConsumer - template - using AuConsumer = std::function; - #endif #endif #if !defined(AU_AuUInt) @@ -81,6 +75,13 @@ /// @hideinitializer #define _AUE_EMIT_CHECK(name, val) if (codename == #val) {return name::val;} +#if defined(__cplusplus) + #define _AUE_EMIT_CCHECK(name, val) if (strcmp(#val, codename) == 0) { return name::val; } +#else + #define _AUE_EMIT_CCHECK(name, val) if (strcmp(#val, codename) == 0) { return k ## name ## val; } +#endif + + /////////////////////////////////////////////////////////////////////////////////////////// // API /////////////////////////////////////////////////////////////////////////////////////////// @@ -100,10 +101,13 @@ #define AUE_DEFINE_BODY(name, vals) \ inline const char * k ## name ## ToString[static_cast(name::kEnumCount)] = { AU_FOR_EACH(_AUE_EMIT_A, _AUE_STRIP_BRACKETS(vals)) }; \ inline const name k ## name ## Values[static_cast(name::kEnumCount)] = { AU_FOR_EACH_THAT(_AUE_EMIT_D, name, _AUE_STRIP_BRACKETS(vals)) }; \ - inline const char * name ## ToString(name val) { static const char * invalid = "kEnumCount"; if (static_cast(val) >= static_cast(name::kEnumCount)) return invalid; return k ## name ## ToString[static_cast(val)]; } \ + inline const char * name ## ToString(name val) { static const char * invalid = "kEnumInvalid"; if (static_cast(val) >= static_cast(name::kEnumCount)) return invalid; return k ## name ## ToString[static_cast(val)]; } \ + inline name name ## FromString(const char *codename) { AU_FOR_EACH_THAT(_AUE_EMIT_CCHECK, name, _AUE_STRIP_BRACKETS(vals)) return name::kEnumInvalid; } \ inline bool name ## IsValid(name val) { return static_cast(val) < static_cast(name::kEnumCount); } \ + template \ + inline void name ## ForEach(const T &consumer) { AU_FOR_EACH_THAT(_AUE_EMIT_CALL, name, _AUE_STRIP_BRACKETS(vals)) } \ static const AuUInt k ## name ## Count = static_cast(name::kEnumCount); \ - static const name k ## name ## Invalid = name::kEnumCount; \ + static const name k ## name ## Invalid = name::kEnumInvalid; \ static const name k ## name ## MaxLegal = static_cast(k ## name ## Count - 1); \ static const name k ## name ## MinLegal = static_cast(0); @@ -111,14 +115,15 @@ #define AUE_DEFINE_BODY(name, vals) \ inline const AuString k ## name ## ToString[static_cast(name::kEnumCount)] = {AU_FOR_EACH(_AUE_EMIT_A, _AUE_STRIP_BRACKETS(vals))}; \ inline const name k ## name ## Values[static_cast(name::kEnumCount)] = {AU_FOR_EACH_THAT(_AUE_EMIT_D, name, _AUE_STRIP_BRACKETS(vals))}; \ - inline const AuHashMap k ## name ## FromString = {AU_FOR_EACH_THAT(_AUE_EMIT_PAIRNAME, name, _AUE_STRIP_BRACKETS(vals)) { "kEnumCount", name::kEnumCount }}; \ - inline name name ## FromString(const AuString & codename) { AU_FOR_EACH_THAT(_AUE_EMIT_CHECK, name, _AUE_STRIP_BRACKETS(vals)) return name::kEnumCount; } \ - inline name name ## FromHashString(const AuString & codename) { auto itr = k ## name ## FromString.find(codename); if (itr == k ## name ## FromString.end()) return name::kEnumCount; return itr->second; } \ - inline const AuString &name ## ToString(name val) { static const AuString invalid = "kEnumCount"; if (static_cast(val) >= static_cast(name::kEnumCount)) return invalid; return k ## name ## ToString[static_cast(val)]; } \ + inline const AuHashMap k ## name ## FromString = {AU_FOR_EACH_THAT(_AUE_EMIT_PAIRNAME, name, _AUE_STRIP_BRACKETS(vals)) { "kEnumInvalid", name::kEnumCount }}; \ + inline name name ## FromString(const AuString & codename) { AU_FOR_EACH_THAT(_AUE_EMIT_CHECK, name, _AUE_STRIP_BRACKETS(vals)) return name::kEnumInvalid; } \ + inline name name ## FromHashString(const AuString & codename) { auto itr = k ## name ## FromString.find(codename); if (itr == k ## name ## FromString.end()) return name::kEnumInvalid; return itr->second; } \ + inline const AuString &name ## ToString(name val) { static const AuString invalid = "kEnumInvalid"; if (static_cast(val) >= static_cast(name::kEnumCount)) return invalid; return k ## name ## ToString[static_cast(val)]; } \ inline bool name ## IsValid(name val) { return static_cast(val) < static_cast(name::kEnumCount); } \ - inline void name ## ForEach(const AuConsumer &consumer) { AU_FOR_EACH_THAT(_AUE_EMIT_CALL, name, _AUE_STRIP_BRACKETS(vals)) } \ + template \ + inline void name ## ForEach(const T &consumer) { AU_FOR_EACH_THAT(_AUE_EMIT_CALL, name, _AUE_STRIP_BRACKETS(vals)) } \ static const AuUInt k ## name ## Count = static_cast(name::kEnumCount); \ - static const name k ## name ## Invalid = name::kEnumCount; \ + static const name k ## name ## Invalid = name::kEnumInvalid; \ static const name k ## name ## MaxLegal = static_cast(k ## name ## Count - 1); \ static const name k ## name ## MinLegal = static_cast(0); @@ -126,10 +131,11 @@ #define AUE_DEFINE_BODY(name, vals) \ static const char * k ## name ## ToString[(size_ct)(k ## name ## EnumCount)] = { AU_FOR_EACH(_AUE_EMIT_A, _AUE_STRIP_BRACKETS(vals)) }; \ static const name k ## name ## Values[(size_ct)(k ## name ## EnumCount)] = { AU_FOR_EACH_THAT(_AUE_EMIT_E, name, _AUE_STRIP_BRACKETS(vals)) }; \ - static const char * name ## ToString(name val) { static const char * invalid = "kEnumCount"; if ((size_ct)(val) >= (size_ct)(k ## name ## EnumCount)) return invalid; return k ## name ## ToString[(size_ct)(val)]; } \ + static name name ## FromString(const char *codename) { AU_FOR_EACH_THAT(_AUE_EMIT_CCHECK, name, _AUE_STRIP_BRACKETS(vals)) return k ## name ## EnumInvalid; } \ + static const char * name ## ToString(name val) { static const char * invalid = "kEnumInvalid"; if ((size_ct)(val) >= (size_ct)(k ## name ## EnumCount)) return invalid; return k ## name ## ToString[(size_ct)(val)]; } \ static bool name ## IsValid(name val) { return (size_ct)(val) < (size_ct)(k ## name ## EnumCount); } \ static const size_ct k ## name ## Count = (size_ct)(k ## name ## EnumCount); \ - static const name k ## name ## Invalid = k ## name ## EnumCount; \ + static const name k ## name ## Invalid = k ## name ## EnumInvalid; \ static const name k ## name ## MaxLegal = (name)(k ## name ## Count - 1); \ static const name k ## name ## MinLegal = (name)(0);