diff --git a/include/magic_enum.hpp b/include/magic_enum.hpp index cd85375..ba642f4 100644 --- a/include/magic_enum.hpp +++ b/include/magic_enum.hpp @@ -431,26 +431,44 @@ constexpr auto n() noexcept { template inline constexpr auto enum_name_v = n(); +#if defined(__clang__) || defined(__GNUC__) +template +struct is_valid : std::false_type {}; + template -constexpr bool is_valid() noexcept { +struct is_valid(V)>())>> : std::bool_constant<(n(V)>().size() != 0)> {}; +#else +template +constexpr bool valid() noexcept { static_assert(is_enum_v, "magic_enum::detail::is_valid requires enum type."); return n(V)>().size() != 0; } +template +struct is_valid : std::bool_constant(V)>()> {}; +#endif + +template > +constexpr U ualue(std::size_t i) noexcept { + static_assert(is_enum_v, "magic_enum::detail::value requires enum type."); + + if constexpr (std::is_same_v) { // bool special case + static_assert(O == 0, "magic_enum::detail::value requires valid offset."); + + return static_cast(i); + } else if constexpr (IsFlags) { + return static_cast(U{1} << static_cast(static_cast(i) + O)); + } else { + return static_cast(static_cast(i) + O); + } +} + template > constexpr E value(std::size_t i) noexcept { static_assert(is_enum_v, "magic_enum::detail::value requires enum type."); - if constexpr (std::is_same_v) { // bool special case - static_assert(O == 0, "magic_enum::detail::value requires valid offset."); - - return static_cast(i); - } else if constexpr (IsFlags) { - return static_cast(U{1} << static_cast(static_cast(i) + O)); - } else { - return static_cast(static_cast(i) + O); - } + return static_cast(ualue(i)); } template > @@ -510,7 +528,7 @@ constexpr std::size_t values_count(const bool (&valid)[N]) noexcept { template constexpr auto values(std::index_sequence) noexcept { static_assert(is_enum_v, "magic_enum::detail::values requires enum type."); - constexpr bool valid[sizeof...(I)] = {is_valid(I)>()...}; + constexpr bool valid[sizeof...(I)] = {is_valid(I)>::value...}; constexpr std::size_t count = values_count(valid); if constexpr (count > 0) {