From c96248204fe5925c68638c3638544e9cac3ee684 Mon Sep 17 00:00:00 2001 From: CommanderRedYT Date: Sat, 26 Mar 2022 21:21:05 +0100 Subject: [PATCH 1/2] IsTypeSafeEnum --- src/cpptypesafeenum.h | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/cpptypesafeenum.h b/src/cpptypesafeenum.h index eb6858f..81cda1b 100644 --- a/src/cpptypesafeenum.h +++ b/src/cpptypesafeenum.h @@ -17,6 +17,18 @@ #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_HELPER4(name, ...) cb(TheEnum::name, CPP_STRINGIFY(name)); +namespace detail { + template + constexpr bool isTypeSafeEnum(T) { return false; } + + template + struct IsTypeSafeEnumTrait { + static constexpr bool value = isTypeSafeEnum(T{}); + }; +} // namespace detail + +template +constexpr bool IsTypeSafeEnum = detail::IsTypeSafeEnumTrait::value; #define DECLARE_TYPESAFE_ENUM(Name, Derivation, Values) \ enum class Name Derivation \ @@ -44,4 +56,8 @@ { \ using TheEnum = Name; \ Values(DECLARE_TYPESAFE_ENUM_HELPER4) \ - } + } \ + constexpr inline bool isTypeSafeEnum(Name) { return true; } + + +#define IMPLEMENT_TYPESAFE_ENUM(Name, Derivation, Values) -- 2.50.1 From 1c79d9b266e6191432e01c8e0afb0a0adb999437 Mon Sep 17 00:00:00 2001 From: CommanderRedYT Date: Sat, 26 Mar 2022 21:36:58 +0100 Subject: [PATCH 2/2] Added general iterate function --- src/cpptypesafeenum.h | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/cpptypesafeenum.h b/src/cpptypesafeenum.h index 81cda1b..acf31c7 100644 --- a/src/cpptypesafeenum.h +++ b/src/cpptypesafeenum.h @@ -27,6 +27,9 @@ namespace detail { }; } // namespace detail +template +struct iterateEnum; + template constexpr bool IsTypeSafeEnum = detail::IsTypeSafeEnumTrait::value; @@ -57,7 +60,14 @@ constexpr bool IsTypeSafeEnum = detail::IsTypeSafeEnumTrait::value; using TheEnum = Name; \ Values(DECLARE_TYPESAFE_ENUM_HELPER4) \ } \ - constexpr inline bool isTypeSafeEnum(Name) { return true; } - + constexpr inline bool isTypeSafeEnum(Name) { return true; } \ + template<> \ + struct iterateEnum { \ + template \ + static void iterate(T&&cb) \ + { \ + return iterate##Name(std::forward(cb)); \ + } \ + }; #define IMPLEMENT_TYPESAFE_ENUM(Name, Derivation, Values) -- 2.50.1