diff --git a/include/magic_enum.hpp b/include/magic_enum.hpp index acbd6ee..96b0850 100644 --- a/include/magic_enum.hpp +++ b/include/magic_enum.hpp @@ -130,12 +130,6 @@ struct static_string<0> { constexpr operator std::string_view() const noexcept { return {}; } }; -struct char_equal { - constexpr bool operator()(char lhs, char rhs) const noexcept { - return lhs == rhs; - } -}; - constexpr std::string_view pretty_name(std::string_view name) noexcept { for (std::size_t i = name.size(); i > 0; --i) { if (!((name[i - 1] >= '0' && name[i - 1] <= '9') || @@ -515,17 +509,9 @@ template static_assert(detail::count_v > 0, "magic_enum requires enum implementation and valid max and min."); static_assert(std::is_invocable_r_v, "magic_enum::enum_cast requires bool(char, char) invocable predicate."); - if constexpr (detail::range_size_v > detail::count_v * 2) { - for (std::size_t i = 0; i < detail::count_v; ++i) { - if (detail::cmp_equal(value, detail::names_v[i], p)) { - return detail::values_v[i]; - } - } - } else { - for (auto i = detail::min_v; i <= detail::max_v; ++i) { - if (detail::cmp_equal(value, enum_name(static_cast(i)), p)) { - return static_cast(i); - } + for (std::size_t i = 0; i < detail::count_v; ++i) { + if (detail::cmp_equal(value, detail::names_v[i], std::move(p))) { + return enum_value(i); } } @@ -538,7 +524,13 @@ template static_assert(detail::supported::value, "magic_enum unsupported compiler (https://github.com/Neargye/magic_enum#compiler-compatibility)."); static_assert(detail::count_v > 0, "magic_enum requires enum implementation and valid max and min."); - return enum_cast(value, detail::char_equal{}); + for (std::size_t i = 0; i < detail::count_v; ++i) { + if (value == detail::names_v[i]) { + return enum_value(i); + } + } + + return std::nullopt; // Invalid value or out of range. } // Obtains enum value from integer value.