Improved typesafeenum
This commit is contained in:
@@ -13,6 +13,14 @@
|
||||
// These macros make it possible to define a typesafe enum with parse and
|
||||
// toString methods
|
||||
|
||||
namespace typesafeenum {
|
||||
template<typename T>
|
||||
struct iterateEnum;
|
||||
|
||||
template<typename T>
|
||||
struct parseEnum;
|
||||
}
|
||||
|
||||
#define DECLARE_TYPESAFE_ENUM_HELPER1(name, ...) name __VA_ARGS__ ,
|
||||
#define DECLARE_TYPESAFE_ENUM_HELPER2(name, ...) case TheEnum::name: return #name;
|
||||
#define DECLARE_TYPESAFE_ENUM_HELPER3(name, ...) else if (str == CPP_STRINGIFY(name)) return TheEnum::name;
|
||||
@@ -45,3 +53,25 @@
|
||||
using TheEnum = Name; \
|
||||
Values(DECLARE_TYPESAFE_ENUM_HELPER4) \
|
||||
}
|
||||
|
||||
#define DECLARE_GLOBAL_TYPESAFE_ENUM(Name, Derivation, Values) \
|
||||
DECLARE_TYPESAFE_ENUM(Name, Derivation, Values) \
|
||||
namespace typesafeenum { \
|
||||
template<> \
|
||||
struct iterateEnum<Name> { \
|
||||
template<typename T> \
|
||||
static void iterate(T&&cb) \
|
||||
{ \
|
||||
return iterate##Name(std::forward<T>(cb)); \
|
||||
} \
|
||||
}; \
|
||||
template<> \
|
||||
struct parseEnum<Name> { \
|
||||
static std::expected<Name, std::string> parse(std::string_view str) \
|
||||
{ \
|
||||
return parse##Name(str); \
|
||||
} \
|
||||
}; \
|
||||
}
|
||||
|
||||
using namespace typesafeenum;
|
||||
|
Reference in New Issue
Block a user