diff --git a/include/magic_enum.hpp b/include/magic_enum.hpp index 30d172d..5ceeb54 100644 --- a/include/magic_enum.hpp +++ b/include/magic_enum.hpp @@ -49,10 +49,8 @@ #if defined(__clang__) # pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wsign-conversion" // Implicit conversion changes signedness: 'int' to 'size_t'. #elif defined(__GNUC__) # pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wsign-conversion" // Implicit conversion changes signedness: 'int' to 'size_t'. #elif defined(_MSC_VER) # pragma warning(push) # pragma warning(disable : 26495) // Variable 'static_string::chars' is uninitialized. @@ -293,7 +291,11 @@ constexpr int reflected_min() noexcept { static_assert(lhs > (std::numeric_limits::min)(), "magic_enum::enum_range requires min must be greater than INT16_MIN."); constexpr auto rhs = (std::numeric_limits::min)(); - return cmp_less(lhs, rhs) ? rhs : lhs; + if constexpr (cmp_less(lhs, rhs)) { + return rhs; + } else { + return lhs; + } } } @@ -309,7 +311,11 @@ constexpr int reflected_max() noexcept { static_assert(lhs < (std::numeric_limits::max)(), "magic_enum::enum_range requires max must be less than INT16_MAX."); constexpr auto rhs = (std::numeric_limits::max)(); - return cmp_less(lhs, rhs) ? lhs : rhs; + if constexpr (cmp_less(lhs, rhs)) { + return lhs; + } else { + return rhs; + } } } @@ -320,13 +326,13 @@ template inline constexpr auto reflected_max_v = reflected_max(); template > -constexpr auto value(std::size_t i) noexcept { +constexpr E value(std::size_t i) noexcept { static_assert(is_enum_v, "magic_enum::detail::value requires enum type."); if constexpr (IsFlags) { - return static_cast(static_cast(1) << static_cast(i + O)); + return static_cast(static_cast(1) << static_cast(static_cast(i) + O)); } else { - return static_cast(i + O); + return static_cast(static_cast(i) + O); } } @@ -453,10 +459,10 @@ template inline constexpr bool is_sparse_v = is_sparse(); template > -constexpr int undex(U value) noexcept { +constexpr std::size_t undex(U value) noexcept { static_assert(is_enum_v, "magic_enum::detail::undex requires enum type."); - if (const auto i = static_cast(value - min_v); value >= min_v && value <= max_v) { + if (const auto i = static_cast(value - min_v); value >= min_v && value <= max_v) { if constexpr (is_sparse_v) { if (const auto idx = indexes_v[i]; idx != invalid_index_v) { return idx; @@ -466,11 +472,11 @@ constexpr int undex(U value) noexcept { } } - return -1; // Value out of range. + return invalid_index_v; // Value out of range. } template > -constexpr int endex(E value) noexcept { +constexpr std::size_t endex(E value) noexcept { static_assert(is_enum_v, "magic_enum::detail::endex requires enum type."); return undex(static_cast(value)); @@ -590,12 +596,11 @@ template template [[nodiscard]] constexpr auto enum_value(std::size_t index) noexcept -> detail::enable_if_enum_t> { using D = std::decay_t; - constexpr auto count = detail::count_v; if constexpr (detail::is_sparse_v) { - return assert(index < count), detail::values_v[index]; + return assert((index < detail::count_v)), detail::values_v[index]; } else { - return assert(index < count), detail::value>(index); + return assert((index < detail::count_v)), detail::value>(index); } } @@ -625,7 +630,7 @@ template [[nodiscard]] constexpr auto enum_name(E value) noexcept -> detail::enable_if_enum_t { using D = std::decay_t; - if (const auto i = detail::endex(value); i != -1) { + if (const auto i = detail::endex(value); i != detail::invalid_index_v) { return detail::names_v[i]; } @@ -685,7 +690,7 @@ template [[nodiscard]] constexpr auto enum_cast(underlying_type_t value) noexcept -> detail::enable_if_enum_t>> { using D = std::decay_t; - if (detail::undex(value) != -1) { + if (detail::undex(value) != detail::invalid_index_v) { return static_cast(value); } @@ -704,7 +709,7 @@ template [[nodiscard]] constexpr auto enum_index(E value) noexcept -> detail::enable_if_enum_t> { using D = std::decay_t; - if (const auto i = detail::endex(value); i != -1) { + if (const auto i = detail::endex(value); i != detail::invalid_index_v) { return i; } @@ -716,7 +721,7 @@ template [[nodiscard]] constexpr auto enum_contains(E value) noexcept -> detail::enable_if_enum_t { using D = std::decay_t; - return detail::endex(value) != -1; + return detail::endex(value) != detail::invalid_index_v; } // Checks whether enum contains enumerator with such integer value. @@ -724,7 +729,7 @@ template [[nodiscard]] constexpr auto enum_contains(underlying_type_t value) noexcept -> detail::enable_if_enum_t { using D = std::decay_t; - return detail::undex(value) != -1; + return detail::undex(value) != detail::invalid_index_v; } // Checks whether enum contains enumerator with such string name. @@ -821,14 +826,13 @@ template template [[nodiscard]] constexpr auto enum_value(std::size_t index) noexcept -> detail::enable_if_enum_flags_t> { using D = std::decay_t; - constexpr auto count = detail::count_v; if constexpr (detail::is_sparse_v) { - return assert(index < count), detail::values_v[index]; + return assert((index < detail::count_v)), detail::values_v[index]; } else { constexpr auto min = detail::log2(detail::min_v) - 1; - return assert(index < count), detail::value(index); + return assert((index < detail::count_v)), detail::value(index); } } @@ -913,7 +917,7 @@ template template [[nodiscard]] constexpr auto enum_contains(std::string_view value) noexcept -> detail::enable_if_enum_flags_t { // TODO: impl - static_assert(sizeof(E) == 0, "not implemented"); + static_assert(sizeof(decltype(value)) == sizeof(E) * 0, "not implemented"); return {}; } @@ -936,7 +940,7 @@ template [[nodiscard]] constexpr auto enum_cast(std::string_view value, BinaryPredicate p) noexcept(std::is_nothrow_invocable_r_v) -> detail::enable_if_enum_flags_t>> { static_assert(std::is_invocable_r_v, "magic_enum::flags::enum_cast requires bool(char, char) invocable predicate."); // TODO: impl - static_assert(sizeof(E) == 0, "not implemented"); + static_assert(sizeof(decltype(value)) + sizeof(decltype(p)) == sizeof(E) * 0, "not implemented"); return {}; } @@ -945,7 +949,7 @@ template template [[nodiscard]] constexpr auto enum_cast(std::string_view value) noexcept -> detail::enable_if_enum_flags_t>> { // TODO: impl - static_assert(sizeof(E) == 0, "not implemented"); + static_assert(sizeof(decltype(value)) == sizeof(E) * 0, "not implemented"); return {}; }