Sync from fork #2
@@ -13,6 +13,14 @@
|
|||||||
// These macros make it possible to define a typesafe enum with parse and
|
// These macros make it possible to define a typesafe enum with parse and
|
||||||
// toString methods
|
// 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_HELPER1(name, ...) name __VA_ARGS__ ,
|
||||||
#define DECLARE_TYPESAFE_ENUM_HELPER2(name, ...) case TheEnum::name: return #name;
|
#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;
|
#define DECLARE_TYPESAFE_ENUM_HELPER3(name, ...) else if (str == CPP_STRINGIFY(name)) return TheEnum::name;
|
||||||
@@ -45,3 +53,25 @@
|
|||||||
using TheEnum = Name; \
|
using TheEnum = Name; \
|
||||||
Values(DECLARE_TYPESAFE_ENUM_HELPER4) \
|
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