Added IsTypeSafeEnum #1
@@ -17,6 +17,21 @@
|
|||||||
#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_HELPER4(name, ...) cb(TheEnum::name, CPP_STRINGIFY(name));
|
||||||
|
namespace detail {
|
||||||
|
template<typename T>
|
||||||
|
constexpr bool isTypeSafeEnum(T) { return false; }
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct IsTypeSafeEnumTrait {
|
||||||
|
static constexpr bool value = isTypeSafeEnum(T{});
|
||||||
|
};
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct iterateEnum;
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
constexpr bool IsTypeSafeEnum = detail::IsTypeSafeEnumTrait<T>::value;
|
||||||
|
|
||||||
#define DECLARE_TYPESAFE_ENUM(Name, Derivation, Values) \
|
#define DECLARE_TYPESAFE_ENUM(Name, Derivation, Values) \
|
||||||
enum class Name Derivation \
|
enum class Name Derivation \
|
||||||
@@ -44,4 +59,15 @@
|
|||||||
{ \
|
{ \
|
||||||
using TheEnum = Name; \
|
using TheEnum = Name; \
|
||||||
Values(DECLARE_TYPESAFE_ENUM_HELPER4) \
|
Values(DECLARE_TYPESAFE_ENUM_HELPER4) \
|
||||||
}
|
} \
|
||||||
|
constexpr inline bool isTypeSafeEnum(Name) { return true; } \
|
||||||
|
template<> \
|
||||||
|
struct iterateEnum<Name> { \
|
||||||
|
template<typename T> \
|
||||||
|
static void iterate(T&&cb) \
|
||||||
|
{ \
|
||||||
|
return iterate##Name(std::forward<T>(cb)); \
|
||||||
|
} \
|
||||||
|
};
|
||||||
|
|
||||||
|
#define IMPLEMENT_TYPESAFE_ENUM(Name, Derivation, Values)
|
||||||
|
Reference in New Issue
Block a user