Allow iterating over enum keys/values
This commit is contained in:
@ -13,6 +13,7 @@
|
|||||||
#define DECLARE_TYPESAFE_ENUM_HELPER1(name) name,
|
#define DECLARE_TYPESAFE_ENUM_HELPER1(name) name,
|
||||||
#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;
|
||||||
|
#define DECLARE_TYPESAFE_ENUM_HELPER4(name) cb(TheEnum::name, CPP_STRINGIFY(name));
|
||||||
|
|
||||||
#define DECLARE_TYPESAFE_ENUM(Name, Derivation, Values) \
|
#define DECLARE_TYPESAFE_ENUM(Name, Derivation, Values) \
|
||||||
enum class Name Derivation \
|
enum class Name Derivation \
|
||||||
@ -20,7 +21,13 @@
|
|||||||
Values(DECLARE_TYPESAFE_ENUM_HELPER1) \
|
Values(DECLARE_TYPESAFE_ENUM_HELPER1) \
|
||||||
}; \
|
}; \
|
||||||
std::string toString(Name value); \
|
std::string toString(Name value); \
|
||||||
std::optional<Name> parse##Name(std::string_view str);
|
std::optional<Name> parse##Name(std::string_view str); \
|
||||||
|
template<typename T> \
|
||||||
|
void iterate##Name(T &&cb) \
|
||||||
|
{ \
|
||||||
|
using TheEnum = Name; \
|
||||||
|
Values(DECLARE_TYPESAFE_ENUM_HELPER4) \
|
||||||
|
}
|
||||||
|
|
||||||
#define IMPLEMENT_TYPESAFE_ENUM(Name, Derivation, Values) \
|
#define IMPLEMENT_TYPESAFE_ENUM(Name, Derivation, Values) \
|
||||||
std::string toString(Name value) \
|
std::string toString(Name value) \
|
||||||
|
Reference in New Issue
Block a user