diff --git a/include/magic_enum.hpp b/include/magic_enum.hpp index 931de2b..c38b7e0 100644 --- a/include/magic_enum.hpp +++ b/include/magic_enum.hpp @@ -172,7 +172,7 @@ template } template -using enable_if_enum_t = typename std::enable_if>>::type; +using enable_if_enum_t = typename std::enable_if>::type; template> struct is_scoped_enum_impl : std::false_type {}; @@ -203,54 +203,54 @@ template inline constexpr bool is_scoped_enum_v = is_scoped_enum::value; // Obtains enum value from enum string name. -template , typename D = std::decay_t> +template > [[nodiscard]] constexpr std::optional enum_cast(std::string_view value) noexcept { - static_assert(std::is_enum_v, "magic_enum::enum_cast requires enum type."); + static_assert(std::is_enum_v, "magic_enum::enum_cast requires enum type."); - return detail::enum_cast_impl(value); + return detail::enum_cast_impl(value); } // Obtains enum value from integer value. -template , typename D = std::decay_t> +template > [[nodiscard]] constexpr std::optional enum_cast(std::underlying_type_t value) noexcept { - static_assert(std::is_enum_v, "magic_enum::enum_cast requires enum type."); + static_assert(std::is_enum_v, "magic_enum::enum_cast requires enum type."); - if (detail::name_impl(static_cast(value)).empty()) { + if (detail::name_impl(static_cast(value)).empty()) { return std::nullopt; // Invalid value or out of range. } else { - return static_cast(value); + return static_cast(value); } } // Returns enum value at specified index. No bounds checking is performed: the behavior is undefined if index >= number of enum values. -template, typename D = std::decay_t> +template> [[nodiscard]] constexpr E enum_value(std::size_t index) { - static_assert(std::is_enum_v, "magic_enum::enum_value requires enum type."); - constexpr auto values = detail::values_impl(detail::range_impl()); + static_assert(std::is_enum_v, "magic_enum::enum_value requires enum type."); + constexpr auto values = detail::values_impl(detail::range_impl()); return assert(index < values.size()), values[index]; } // Obtains value enum sequence. -template , typename D = std::decay_t> +template > [[nodiscard]] constexpr decltype(auto) enum_values() noexcept { - static_assert(std::is_enum_v, "magic_enum::enum_values requires enum type."); - constexpr auto values = detail::values_impl(detail::range_impl()); + static_assert(std::is_enum_v, "magic_enum::enum_values requires enum type."); + constexpr auto values = detail::values_impl(detail::range_impl()); return values; } // Returns number of enum values. -template , typename D = std::decay_t> +template > [[nodiscard]] constexpr std::size_t enum_count() noexcept { - static_assert(std::is_enum_v, "magic_enum::enum_count requires enum type."); - constexpr auto count = detail::values_impl(detail::range_impl()).size(); + static_assert(std::is_enum_v, "magic_enum::enum_count requires enum type."); + constexpr auto count = detail::values_impl(detail::range_impl()).size(); return count; } // Obtains string enum name from enum value. -template , typename D = std::decay_t> +template , typename = detail::enable_if_enum_t> [[nodiscard]] constexpr std::optional enum_name(E value) noexcept { static_assert(std::is_enum_v, "magic_enum::enum_name requires enum type."); const auto name = detail::name_impl(static_cast(value)); @@ -263,18 +263,18 @@ template , typename D = std:: } // Obtains string enum name sequence. -template , typename D = std::decay_t> +template > [[nodiscard]] constexpr decltype(auto) enum_names() noexcept { - static_assert(std::is_enum_v, "magic_enum::enum_names requires enum type."); - constexpr auto count = detail::values_impl(detail::range_impl()).size(); - constexpr auto names = detail::names_impl(std::make_index_sequence{}); + static_assert(std::is_enum_v, "magic_enum::enum_names requires enum type."); + constexpr auto count = detail::values_impl(detail::range_impl()).size(); + constexpr auto names = detail::names_impl(std::make_index_sequence{}); return names; } namespace ops { -template , typename D = std::decay_t> +template , typename = detail::enable_if_enum_t> std::ostream& operator<<(std::ostream& os, E value) { static_assert(std::is_enum_v, "magic_enum::ops::operator<< requires enum type."); const auto name = detail::name_impl(static_cast(value)); @@ -286,12 +286,12 @@ std::ostream& operator<<(std::ostream& os, E value) { return os; } -template , typename D = std::decay_t> +template > std::ostream& operator<<(std::ostream& os, std::optional value) { - static_assert(std::is_enum_v, "magic_enum::ops::operator<< requires enum type."); + static_assert(std::is_enum_v, "magic_enum::ops::operator<< requires enum type."); if (value.has_value()) { - const auto name = detail::name_impl(static_cast(value.value())); + const auto name = detail::name_impl(static_cast(value.value())); if (!name.empty()) { os << name; }