[*] Update 2024: made the kEnumNameInvalids match kEnumNameEnumInvalids; and removed the consumer type
This commit is contained in:
parent
93e8dacb5d
commit
9a8abc0023
@ -20,7 +20,6 @@
|
|||||||
#if !defined(AUE_NOCPPSTL)
|
#if !defined(AUE_NOCPPSTL)
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <functional>
|
|
||||||
|
|
||||||
#if !defined(AU_AuHashMap)
|
#if !defined(AU_AuHashMap)
|
||||||
#define AU_AuHashMap
|
#define AU_AuHashMap
|
||||||
@ -33,11 +32,6 @@
|
|||||||
using AuString = std::string;
|
using AuString = std::string;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(AU_AuConsumer)
|
|
||||||
#define AU_AuConsumer
|
|
||||||
template<typename ... T>
|
|
||||||
using AuConsumer = std::function<void(T...)>;
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(AU_AuUInt)
|
#if !defined(AU_AuUInt)
|
||||||
@ -81,6 +75,13 @@
|
|||||||
/// @hideinitializer
|
/// @hideinitializer
|
||||||
#define _AUE_EMIT_CHECK(name, val) if (codename == #val) {return name::val;}
|
#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
|
// API
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
@ -100,10 +101,13 @@
|
|||||||
#define AUE_DEFINE_BODY(name, vals) \
|
#define AUE_DEFINE_BODY(name, vals) \
|
||||||
inline const char * k ## name ## ToString[static_cast<AuUInt>(name::kEnumCount)] = { AU_FOR_EACH(_AUE_EMIT_A, _AUE_STRIP_BRACKETS(vals)) }; \
|
inline const char * k ## name ## ToString[static_cast<AuUInt>(name::kEnumCount)] = { AU_FOR_EACH(_AUE_EMIT_A, _AUE_STRIP_BRACKETS(vals)) }; \
|
||||||
inline const name k ## name ## Values[static_cast<AuUInt>(name::kEnumCount)] = { AU_FOR_EACH_THAT(_AUE_EMIT_D, name, _AUE_STRIP_BRACKETS(vals)) }; \
|
inline const name k ## name ## Values[static_cast<AuUInt>(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<AuUInt>(val) >= static_cast<AuUInt>(name::kEnumCount)) return invalid; return k ## name ## ToString[static_cast<AuUInt>(val)]; } \
|
inline const char * name ## ToString(name val) { static const char * invalid = "kEnumInvalid"; if (static_cast<AuUInt>(val) >= static_cast<AuUInt>(name::kEnumCount)) return invalid; return k ## name ## ToString[static_cast<AuUInt>(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<AuUInt>(val) < static_cast<AuUInt>(name::kEnumCount); } \
|
inline bool name ## IsValid(name val) { return static_cast<AuUInt>(val) < static_cast<AuUInt>(name::kEnumCount); } \
|
||||||
|
template <typename T> \
|
||||||
|
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<AuUInt>(name::kEnumCount); \
|
static const AuUInt k ## name ## Count = static_cast<AuUInt>(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<name>(k ## name ## Count - 1); \
|
static const name k ## name ## MaxLegal = static_cast<name>(k ## name ## Count - 1); \
|
||||||
static const name k ## name ## MinLegal = static_cast<name>(0);
|
static const name k ## name ## MinLegal = static_cast<name>(0);
|
||||||
|
|
||||||
@ -111,14 +115,15 @@
|
|||||||
#define AUE_DEFINE_BODY(name, vals) \
|
#define AUE_DEFINE_BODY(name, vals) \
|
||||||
inline const AuString k ## name ## ToString[static_cast<AuUInt>(name::kEnumCount)] = {AU_FOR_EACH(_AUE_EMIT_A, _AUE_STRIP_BRACKETS(vals))}; \
|
inline const AuString k ## name ## ToString[static_cast<AuUInt>(name::kEnumCount)] = {AU_FOR_EACH(_AUE_EMIT_A, _AUE_STRIP_BRACKETS(vals))}; \
|
||||||
inline const name k ## name ## Values[static_cast<AuUInt>(name::kEnumCount)] = {AU_FOR_EACH_THAT(_AUE_EMIT_D, name, _AUE_STRIP_BRACKETS(vals))}; \
|
inline const name k ## name ## Values[static_cast<AuUInt>(name::kEnumCount)] = {AU_FOR_EACH_THAT(_AUE_EMIT_D, name, _AUE_STRIP_BRACKETS(vals))}; \
|
||||||
inline const AuHashMap<AuString, name> k ## name ## FromString = {AU_FOR_EACH_THAT(_AUE_EMIT_PAIRNAME, name, _AUE_STRIP_BRACKETS(vals)) { "kEnumCount", name::kEnumCount }}; \
|
inline const AuHashMap<AuString, name> 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::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::kEnumCount; return itr->second; } \
|
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 = "kEnumCount"; if (static_cast<AuUInt>(val) >= static_cast<AuUInt>(name::kEnumCount)) return invalid; return k ## name ## ToString[static_cast<AuUInt>(val)]; } \
|
inline const AuString &name ## ToString(name val) { static const AuString invalid = "kEnumInvalid"; if (static_cast<AuUInt>(val) >= static_cast<AuUInt>(name::kEnumCount)) return invalid; return k ## name ## ToString[static_cast<AuUInt>(val)]; } \
|
||||||
inline bool name ## IsValid(name val) { return static_cast<AuUInt>(val) < static_cast<AuUInt>(name::kEnumCount); } \
|
inline bool name ## IsValid(name val) { return static_cast<AuUInt>(val) < static_cast<AuUInt>(name::kEnumCount); } \
|
||||||
inline void name ## ForEach(const AuConsumer<name> &consumer) { AU_FOR_EACH_THAT(_AUE_EMIT_CALL, name, _AUE_STRIP_BRACKETS(vals)) } \
|
template <typename T> \
|
||||||
|
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<AuUInt>(name::kEnumCount); \
|
static const AuUInt k ## name ## Count = static_cast<AuUInt>(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<name>(k ## name ## Count - 1); \
|
static const name k ## name ## MaxLegal = static_cast<name>(k ## name ## Count - 1); \
|
||||||
static const name k ## name ## MinLegal = static_cast<name>(0);
|
static const name k ## name ## MinLegal = static_cast<name>(0);
|
||||||
|
|
||||||
@ -126,10 +131,11 @@
|
|||||||
#define AUE_DEFINE_BODY(name, vals) \
|
#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 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 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 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 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 ## MaxLegal = (name)(k ## name ## Count - 1); \
|
||||||
static const name k ## name ## MinLegal = (name)(0);
|
static const name k ## name ## MinLegal = (name)(0);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user