diff --git a/include/magic_enum.hpp b/include/magic_enum.hpp index 8f7b215..80fb3a3 100644 --- a/include/magic_enum.hpp +++ b/include/magic_enum.hpp @@ -193,12 +193,13 @@ inline constexpr int reflected_max_v = static_cast(enum_range::max < (st template constexpr std::size_t reflected_size() { - static_assert(is_enum_v, "magic_enum::detail::range_size requires enum type."); + static_assert(is_enum_v, "magic_enum::detail::reflected_size requires enum type."); static_assert(reflected_min_v > (std::numeric_limits::min)(), "magic_enum::enum_range requires min must be greater than INT16_MIN."); static_assert(reflected_max_v < (std::numeric_limits::max)(), "magic_enum::enum_range requires max must be less than INT16_MAX."); 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); } @@ -232,6 +233,7 @@ 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); } @@ -263,7 +265,7 @@ constexpr auto values(std::integer_sequence) noexcept { std::array> values{}; for (std::size_t i = 0, v = 0; v < count_v; ++i) { if (valid[i]) { - values[v++] = static_cast(i + min_v); + values[v++] = static_cast(static_cast(i) + min_v); } } @@ -361,7 +363,7 @@ struct enum_traits>> { if constexpr (size_v != count_v) { return assert(index < count), values[index]; } else { - return assert(index < count), static_cast(index + min_v); + return assert(index < count), static_cast(static_cast(index) + min_v); } } @@ -374,6 +376,7 @@ struct enum_traits>> { } private: + static_assert(is_enum_v, "magic_enum::enum_traits requires enum type."); static_assert(enum_range::min > (std::numeric_limits::min)(), "magic_enum::enum_range requires min must be greater than INT16_MIN."); static_assert(enum_range::max < (std::numeric_limits::max)(), "magic_enum::enum_range requires max must be less than INT16_MAX."); static_assert(enum_range::max > enum_range::min, "magic_enum::enum_range requires max > min.");