From 8edf2e328614448890db570e6694d9b2054cb766 Mon Sep 17 00:00:00 2001 From: neargye Date: Tue, 13 Oct 2020 13:14:09 +0300 Subject: [PATCH] fix noising assert --- include/magic_enum.hpp | 59 ++++++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/include/magic_enum.hpp b/include/magic_enum.hpp index 1988842..51255e5 100644 --- a/include/magic_enum.hpp +++ b/include/magic_enum.hpp @@ -557,10 +557,10 @@ constexpr U value_ors() noexcept { } template -struct enable_if_enum {}; +struct enable_if_reflected_enum {}; template -struct enable_if_enum { +struct enable_if_reflected_enum { using type = R; using D = std::decay_t; static_assert(supported::value, "magic_enum unsupported compiler (https://github.com/Neargye/magic_enum#compiler-compatibility)."); @@ -568,7 +568,7 @@ struct enable_if_enum { }; template -struct enable_if_enum { +struct enable_if_reflected_enum { using type = R; using D = std::decay_t; static_assert(supported::value, "magic_enum unsupported compiler (https://github.com/Neargye/magic_enum#compiler-compatibility)."); @@ -576,10 +576,13 @@ struct enable_if_enum { }; template -using enable_if_enum_t = typename enable_if_enum>, false, T, R>::type; +using enable_if_reflected_enum_t = typename enable_if_reflected_enum>, false, T, R>::type; template -using enable_if_enum_flags_t = typename enable_if_enum>, true, T, R>::type; +using enable_if_reflected_enum_flags_t = typename enable_if_reflected_enum>, true, T, R>::type; + +template +using enable_if_enum_t = std::enable_if_t>, R>; template >>> using enum_concept = T; @@ -636,7 +639,7 @@ using underlying_type_t = typename underlying_type::type; // Returns type name of enum. template -[[nodiscard]] constexpr auto enum_type_name() noexcept -> std::enable_if_t>, string_view> { +[[nodiscard]] constexpr auto enum_type_name() noexcept -> detail::enable_if_enum_t { using D = std::decay_t; constexpr string_view name = detail::type_name_v; static_assert(name.size() > 0, "Enum type does not have a name."); @@ -655,7 +658,7 @@ template // Returns enum value at specified index. // No bounds checking is performed: the behavior is undefined if index >= number of enum values. template -[[nodiscard]] constexpr auto enum_value(std::size_t index) noexcept -> detail::enable_if_enum_t> { +[[nodiscard]] constexpr auto enum_value(std::size_t index) noexcept -> detail::enable_if_reflected_enum_t> { using D = std::decay_t; if constexpr (detail::is_sparse_v) { @@ -667,7 +670,7 @@ template // Returns std::array with enum values, sorted by enum value. template -[[nodiscard]] constexpr auto enum_values() noexcept -> detail::enable_if_enum_t> { +[[nodiscard]] constexpr auto enum_values() noexcept -> detail::enable_if_reflected_enum_t> { using D = std::decay_t; return detail::values_v; @@ -676,7 +679,7 @@ template // Returns name from static storage enum variable. // This version is much lighter on the compile times and is not restricted to the enum_range limitation. template -[[nodiscard]] constexpr auto enum_name() noexcept -> std::enable_if_t>, string_view> { +[[nodiscard]] constexpr auto enum_name() noexcept -> detail::enable_if_enum_t { using D = std::decay_t; constexpr string_view name = detail::enum_name_v; static_assert(name.size() > 0, "Enum value does not have a name."); @@ -699,7 +702,7 @@ template // Returns std::array with names, sorted by enum value. template -[[nodiscard]] constexpr auto enum_names() noexcept -> detail::enable_if_enum_t> { +[[nodiscard]] constexpr auto enum_names() noexcept -> detail::enable_if_reflected_enum_t> { using D = std::decay_t; return detail::names_v; @@ -707,7 +710,7 @@ template // Returns std::array with pairs (value, name), sorted by enum value. template -[[nodiscard]] constexpr auto enum_entries() noexcept -> detail::enable_if_enum_t> { +[[nodiscard]] constexpr auto enum_entries() noexcept -> detail::enable_if_reflected_enum_t> { using D = std::decay_t; return detail::entries_v; @@ -753,7 +756,7 @@ template // Returns integer value from enum value. template -[[nodiscard]] constexpr auto enum_integer(E value) noexcept -> std::enable_if_t>, underlying_type_t> { +[[nodiscard]] constexpr auto enum_integer(E value) noexcept -> detail::enable_if_enum_t> { return static_cast>(value); } @@ -873,7 +876,7 @@ using magic_enum::enum_type_name; // Returns number of enum-flags values. template -[[nodiscard]] constexpr auto enum_count() noexcept -> detail::enable_if_enum_flags_t { +[[nodiscard]] constexpr auto enum_count() noexcept -> detail::enable_if_enum_t { using D = std::decay_t; return detail::count_v; @@ -882,7 +885,7 @@ template // Returns enum-flags value at specified index. // No bounds checking is performed: the behavior is undefined if index >= number of enum-flags values. template -[[nodiscard]] constexpr auto enum_value(std::size_t index) noexcept -> detail::enable_if_enum_flags_t> { +[[nodiscard]] constexpr auto enum_value(std::size_t index) noexcept -> detail::enable_if_reflected_enum_flags_t> { using D = std::decay_t; if constexpr (detail::is_sparse_v) { @@ -896,7 +899,7 @@ template // Returns std::array with enum-flags values, sorted by enum-flags value. template -[[nodiscard]] constexpr auto enum_values() noexcept -> detail::enable_if_enum_flags_t> { +[[nodiscard]] constexpr auto enum_values() noexcept -> detail::enable_if_reflected_enum_flags_t> { using D = std::decay_t; return detail::values_v; @@ -905,7 +908,7 @@ template // Returns name from enum-flags value. // If enum-flags value does not have name or value out of range, returns empty string. template -[[nodiscard]] auto enum_name(E value) -> detail::enable_if_enum_flags_t { +[[nodiscard]] auto enum_name(E value) -> detail::enable_if_enum_t { using D = std::decay_t; using U = underlying_type_t; @@ -931,7 +934,7 @@ template // Returns std::array with string names, sorted by enum-flags value. template -[[nodiscard]] constexpr auto enum_names() noexcept -> detail::enable_if_enum_flags_t> { +[[nodiscard]] constexpr auto enum_names() noexcept -> detail::enable_if_reflected_enum_flags_t> { using D = std::decay_t; return detail::names_v; @@ -939,7 +942,7 @@ template // Returns std::array with pairs (value, name), sorted by enum-flags value. template -[[nodiscard]] constexpr auto enum_entries() noexcept -> detail::enable_if_enum_flags_t> { +[[nodiscard]] constexpr auto enum_entries() noexcept -> detail::enable_if_reflected_enum_flags_t> { using D = std::decay_t; return detail::entries_v; @@ -948,7 +951,7 @@ template // Obtains enum-flags value from integer value. // Returns optional with enum-flags value. template -[[nodiscard]] constexpr auto enum_cast(underlying_type_t value) noexcept -> detail::enable_if_enum_flags_t>> { +[[nodiscard]] constexpr auto enum_cast(underlying_type_t value) noexcept -> detail::enable_if_enum_t>> { using D = std::decay_t; using U = underlying_type_t; @@ -978,7 +981,7 @@ template // Obtains enum-flags value from name. // Returns optional with enum-flags value. template -[[nodiscard]] constexpr auto enum_cast(string_view value, BinaryPredicate p) noexcept(std::is_nothrow_invocable_r_v) -> detail::enable_if_enum_flags_t>> { +[[nodiscard]] constexpr auto enum_cast(string_view value, BinaryPredicate p) noexcept(std::is_nothrow_invocable_r_v) -> detail::enable_if_enum_t>> { static_assert(std::is_invocable_r_v, "magic_enum::flags::enum_cast requires bool(char, char) invocable predicate."); using D = std::decay_t; using U = underlying_type_t; @@ -1011,7 +1014,7 @@ template // Obtains enum-flags value from name. // Returns optional with enum-flags value. template -[[nodiscard]] constexpr auto enum_cast(string_view value) noexcept -> detail::enable_if_enum_flags_t>> { +[[nodiscard]] constexpr auto enum_cast(string_view value) noexcept -> detail::enable_if_enum_t>> { using D = std::decay_t; return enum_cast(value, detail::char_equal_to{}); @@ -1023,7 +1026,7 @@ using magic_enum::enum_integer; // Obtains index in enum-flags values from enum-flags value. // Returns optional with index. template -[[nodiscard]] constexpr auto enum_index(E value) noexcept -> detail::enable_if_enum_flags_t> { +[[nodiscard]] constexpr auto enum_index(E value) noexcept -> detail::enable_if_enum_t> { using D = std::decay_t; using U = underlying_type_t; @@ -1040,7 +1043,7 @@ template // Checks whether enum-flags contains enumerator with such enum-flags value. template -[[nodiscard]] constexpr auto enum_contains(E value) noexcept -> detail::enable_if_enum_flags_t { +[[nodiscard]] constexpr auto enum_contains(E value) noexcept -> detail::enable_if_enum_t { using D = std::decay_t; using U = underlying_type_t; @@ -1049,7 +1052,7 @@ template // Checks whether enum-flags contains enumerator with such integer value. template -[[nodiscard]] constexpr auto enum_contains(underlying_type_t value) noexcept -> detail::enable_if_enum_flags_t { +[[nodiscard]] constexpr auto enum_contains(underlying_type_t value) noexcept -> detail::enable_if_enum_t { using D = std::decay_t; return enum_cast(value).has_value(); @@ -1057,7 +1060,7 @@ template // Checks whether enum-flags contains enumerator with such name. template -[[nodiscard]] constexpr auto enum_contains(string_view value, BinaryPredicate p) noexcept(std::is_nothrow_invocable_r_v) -> detail::enable_if_enum_flags_t { +[[nodiscard]] constexpr auto enum_contains(string_view value, BinaryPredicate p) noexcept(std::is_nothrow_invocable_r_v) -> detail::enable_if_enum_t { static_assert(std::is_invocable_r_v, "magic_enum::flags::enum_contains requires bool(char, char) invocable predicate."); using D = std::decay_t; @@ -1066,7 +1069,7 @@ template // Checks whether enum-flags contains enumerator with such name. template -[[nodiscard]] constexpr auto enum_contains(string_view value) noexcept -> detail::enable_if_enum_flags_t { +[[nodiscard]] constexpr auto enum_contains(string_view value) noexcept -> detail::enable_if_enum_t { using D = std::decay_t; return enum_cast(value).has_value(); @@ -1076,7 +1079,7 @@ template namespace flags::ostream_operators { -template = 0> +template , int> = 0> std::basic_ostream& operator<<(std::basic_ostream& os, E value) { using D = std::decay_t; using U = underlying_type_t; @@ -1091,7 +1094,7 @@ std::basic_ostream& operator<<(std::basic_ostream& o return (os << static_cast(value)); } -template = 0> +template , int> = 0> std::basic_ostream& operator<<(std::basic_ostream& os, optional value) { return value.has_value() ? (os << value.value()) : os; }