diff --git a/Include/AuroraEnum.hpp b/Include/AuroraEnum.hpp index 164e7f3..e0596d6 100644 --- a/Include/AuroraEnum.hpp +++ b/Include/AuroraEnum.hpp @@ -7,7 +7,6 @@ ***/ #pragma once - /////////////////////////////////////////////////////////////////////////////////////////// /// Configuration /////////////////////////////////////////////////////////////////////////////////////////// @@ -36,7 +35,7 @@ using AuUInt = size_t; #if !defined(AU_Consumer) #define AU_Consumer -template +template using AuConsumer = std::function; #endif @@ -78,12 +77,13 @@ using AuConsumer = std::function; /////////////////////////////////////////////////////////////////////////////////////////// #define AUE_DEFINE(name, vals) enum class name { AU_FOR_EACH(AUE_EMIT_ARRAY, AUE_STRIP_BRACKETS(vals)) kEnumCount }; \ - static inline const AuString k ## name ## ToString[static_cast(name::kEnumCount)] = {AU_FOR_EACH(AUE_EMIT_A, AUE_STRIP_BRACKETS(vals)) }; \ - static inline const name k ## name ## Values[static_cast(name::kEnumCount)] = {AU_FOR_EACH_THAT(AUE_EMIT_D, name, AUE_STRIP_BRACKETS(vals)) }; \ + static inline const AuString k ## name ## ToString[static_cast(name::kEnumCount)] = { AU_FOR_EACH(AUE_EMIT_A, AUE_STRIP_BRACKETS(vals)) }; \ + static 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} }; \ static inline name name ## FromString (const AuString &codename) { AU_FOR_EACH_THAT(AUE_EMIT_CHECK, name, AUE_STRIP_BRACKETS(vals)) return name::kEnumCount; } \ static 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; } \ static 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)]; } \ + static inline bool name ## IsValid(name val) { return static_cast(val) < static_cast(name::kEnumCount); } \ static inline void name ## ForEach(const AuConsumer &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; \