diff --git a/include/magic_enum.hpp b/include/magic_enum.hpp index 0ba8ec4..30d172d 100644 --- a/include/magic_enum.hpp +++ b/include/magic_enum.hpp @@ -326,7 +326,7 @@ constexpr auto value(std::size_t i) noexcept { if constexpr (IsFlags) { return static_cast(static_cast(1) << static_cast(i + O)); } else { - return static_cast(static_cast(i) + O); + return static_cast(i + O); } } @@ -456,7 +456,7 @@ template > constexpr int undex(U value) noexcept { static_assert(is_enum_v, "magic_enum::detail::undex requires enum type."); - if (const auto i = static_cast(value) - static_cast(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; @@ -613,7 +613,7 @@ template [[nodiscard]] constexpr std::string_view enum_name() noexcept { using D = std::decay_t; static_assert(std::is_enum_v, "Requires enum type."); - constexpr std::string_view name = detail::enum_name_v, V>; + constexpr std::string_view name = detail::enum_name_v; static_assert(name.size() > 0, "Enum value does not have a name."); return name; @@ -737,10 +737,11 @@ template namespace ostream_operators { -template > +template , int> = 0> auto& operator<<(std::basic_ostream& os, E value) { - using namespace magic_enum; +#if defined(MAGIC_ENUM_SUPPORTED) && MAGIC_ENUM_SUPPORTED using D = std::decay_t; + using namespace magic_enum; if (const auto name = enum_name(value); !name.empty()) { for (const auto c : name) { @@ -749,14 +750,14 @@ auto& operator<<(std::basic_ostream& os, E value) { } else { os << enum_integer(value); } - +#else + os << static_cast>(value); +#endif return os; } -template > +template , int> = 0> auto& operator<<(std::basic_ostream& os, std::optional value) { - using namespace magic_enum; - if (value.has_value()) { os << value.value(); } @@ -970,7 +971,7 @@ using magic_enum::enum_integer; // TODO: impl namespace ostream_operators { -template > +template = 0> auto& operator<<(std::basic_ostream& os, E value) { using namespace magic_enum::flags; using D = std::decay_t; @@ -986,10 +987,8 @@ auto& operator<<(std::basic_ostream& os, E value) { return os; } -template > +template = 0> auto& operator<<(std::basic_ostream& os, std::optional value) { - using namespace magic_enum::flags; - if (value.has_value()) { os << value.value(); }