Improved typesafeenum

This commit is contained in:
CommanderRedYT
2023-11-26 02:39:06 +01:00
parent 2ab8be6f3c
commit 6e78da9b95

View File

@@ -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;