diff --git a/include/magic_enum.hpp b/include/magic_enum.hpp index 9dd3e91..51bea1a 100644 --- a/include/magic_enum.hpp +++ b/include/magic_enum.hpp @@ -227,6 +227,16 @@ constexpr auto n() noexcept { template inline constexpr auto name_v = n(); +template +constexpr std::size_t range_size() noexcept { + static_assert(is_enum_v, "magic_enum::detail::range_size requires enum type."); + constexpr auto size = Max - Min + 1; + static_assert(size > 0, "magic_enum::enum_range requires valid size."); + static_assert(size < (std::numeric_limits::max)(), "magic_enum::enum_range requires valid size."); + + return static_cast(size); +} + template constexpr int reflected_min() noexcept { static_assert(is_enum_v, "magic_enum::detail::reflected_min requires enum type."); @@ -253,17 +263,6 @@ inline constexpr int reflected_min_v = reflected_min(); template inline constexpr int reflected_max_v = reflected_max(); -template -constexpr std::size_t reflected_size() noexcept { - static_assert(is_enum_v, "magic_enum::detail::reflected_size requires enum type."); - static_assert(reflected_max_v > reflected_min_v, "magic_enum::enum_range requires max > min."); - constexpr auto size = reflected_max_v - reflected_min_v + 1; - static_assert(size > 0, "magic_enum::enum_range requires valid size."); - static_assert(size < (std::numeric_limits::max)(), "magic_enum::enum_range requires valid size."); - - return static_cast(size); -} - template constexpr auto values(std::integer_sequence) noexcept { static_assert(is_enum_v, "magic_enum::detail::values requires enum type."); @@ -281,7 +280,7 @@ constexpr auto values(std::integer_sequence) noexcept { } template -inline constexpr auto values_v = values(std::make_integer_sequence()>{}); +inline constexpr auto values_v = values(std::make_integer_sequence, reflected_max_v>()>{}); template inline constexpr std::size_t count_v = values_v.size(); @@ -293,17 +292,7 @@ template inline constexpr int max_v = values_v.empty() ? 0 : static_cast(values_v.back()); template -constexpr std::size_t range_size() noexcept { - static_assert(is_enum_v, "magic_enum::detail::range_size requires enum type."); - constexpr auto size = max_v - min_v + 1; - static_assert(size > 0, "magic_enum::enum_range requires valid size."); - static_assert(size < (std::numeric_limits::max)(), "magic_enum::enum_range requires valid size."); - - return static_cast(size); -} - -template -inline constexpr std::size_t range_size_v = range_size(); +inline constexpr std::size_t range_size_v = range_size, max_v>(); template using index_t = std::conditional_t < (std::numeric_limits::max)(), std::uint8_t, std::uint16_t>;