diff --git a/example/example_switch.cpp b/example/example_switch.cpp index 78432b7..c168fcc 100644 --- a/example/example_switch.cpp +++ b/example/example_switch.cpp @@ -38,8 +38,8 @@ constexpr std::string_view DoWork() { } // Helper type for the visitor pattern. -template struct overloaded : Ts... { using Ts::operator()...; }; -template overloaded(Ts...) -> overloaded; +template struct overloaded : Ts... { using Ts::operator()...; }; +template overloaded(Ts...) -> overloaded; int main() { Color c = Color::RED; diff --git a/include/magic_enum.hpp b/include/magic_enum.hpp index 84aa863..ea7af86 100644 --- a/include/magic_enum.hpp +++ b/include/magic_enum.hpp @@ -705,7 +705,7 @@ constexpr enum_subtype subtype(std::true_type) noexcept { return enum_subtype::common; } } - return flags_values.size() > 0; + return enum_subtype::flags; #else return enum_subtype::common; #endif @@ -1106,14 +1106,14 @@ template } // Returns number of enum values. -template > +template > [[nodiscard]] constexpr auto enum_count() noexcept -> detail::enable_if_t { return detail::count_v, S>; } // Returns enum value at specified index. // No bounds checking is performed: the behavior is undefined if index >= number of enum values. -template > +template > [[nodiscard]] constexpr auto enum_value(std::size_t index) noexcept -> detail::enable_if_t> { using D = std::decay_t; @@ -1127,7 +1127,7 @@ template > } // Returns enum value at specified index. -template > +template > [[nodiscard]] constexpr auto enum_value() noexcept -> detail::enable_if_t> { using D = std::decay_t; static_assert(I < detail::count_v, "magic_enum::enum_value out of range."); @@ -1136,7 +1136,7 @@ template > } // Returns std::array with enum values, sorted by enum value. -template > +template > [[nodiscard]] constexpr auto enum_values() noexcept -> detail::enable_if_t> { return detail::values_v, S>; } @@ -1155,7 +1155,7 @@ template // Obtains index in enum values from enum value. // Returns optional with index. -template > +template > [[nodiscard]] constexpr auto enum_index(E value) noexcept -> detail::enable_if_t> { using D = std::decay_t; using U = underlying_type_t; @@ -1196,7 +1196,7 @@ template } // Obtains index in enum values from static storage enum variable. -template >> +template >> [[nodiscard]] constexpr auto enum_index() noexcept -> detail::enable_if_t { constexpr auto index = enum_index, S>(V); static_assert(index, "magic_enum::enum_index enum value does not have a index."); @@ -1216,7 +1216,7 @@ template // Returns name from enum value. // If enum value does not have name or value out of range, returns empty string. -template > +template > [[nodiscard]] constexpr auto enum_name(E value) noexcept -> detail::enable_if_t { using D = std::decay_t; @@ -1263,13 +1263,13 @@ template } // Returns std::array with names, sorted by enum value. -template > +template > [[nodiscard]] constexpr auto enum_names() noexcept -> detail::enable_if_t> { return detail::names_v, S>; } // Returns std::array with pairs (value, name), sorted by enum value. -template > +template > [[nodiscard]] constexpr auto enum_entries() noexcept -> detail::enable_if_t> { return detail::entries_v, S>; } @@ -1279,7 +1279,7 @@ inline constexpr auto case_insensitive = detail::case_insensitive<>{}; // Obtains enum value from integer value. // Returns optional with enum value. -template > +template > [[nodiscard]] constexpr auto enum_cast(underlying_type_t value) noexcept -> detail::enable_if_t>> { using D = std::decay_t; @@ -1347,7 +1347,7 @@ template // Obtains enum value from name. // Returns optional with enum value. -template , typename BinaryPredicate = std::equal_to<>> +template , typename BinaryPredicate = std::equal_to<>> [[nodiscard]] constexpr auto enum_cast(string_view value, [[maybe_unused]] BinaryPredicate p = {}) noexcept(detail::is_nothrow_invocable()) -> detail::enable_if_t>, BinaryPredicate> { using D = std::decay_t; @@ -1414,7 +1414,7 @@ template > } // Checks whether enum contains value with such value. -template > +template > [[nodiscard]] constexpr auto enum_contains(E value) noexcept -> detail::enable_if_t { using D = std::decay_t; using U = underlying_type_t; @@ -1441,7 +1441,7 @@ template } // Checks whether enum contains value with such integer value. -template > +template > [[nodiscard]] constexpr auto enum_contains(underlying_type_t value) noexcept -> detail::enable_if_t { using D = std::decay_t; @@ -1457,7 +1457,7 @@ template } // Checks whether enum contains enumerator with such name. -template , typename BinaryPredicate = std::equal_to<>> +template , typename BinaryPredicate = std::equal_to<>> [[nodiscard]] constexpr auto enum_contains(string_view value, BinaryPredicate p = {}) noexcept(detail::is_nothrow_invocable()) -> detail::enable_if_t { using D = std::decay_t; @@ -1472,7 +1472,7 @@ template > return static_cast(enum_flags_cast(value, std::move(p))); } -template , typename F, detail::enable_if_t = 0> +template , typename F, detail::enable_if_t = 0> constexpr auto enum_for_each(F&& f) { using D = std::decay_t; static_assert(std::is_enum_v, "magic_enum::enum_for_each requires enum type."); diff --git a/include/magic_enum_switch.hpp b/include/magic_enum_switch.hpp index 385eb25..4e06e46 100644 --- a/include/magic_enum_switch.hpp +++ b/include/magic_enum_switch.hpp @@ -142,7 +142,7 @@ constexpr decltype(auto) constexpr_switch(F&& f, E value, Def&& def) { } // namespace magic_enum::detail -template , typename F, typename R = detail::result_t> +template , typename F, typename R = detail::result_t> constexpr decltype(auto) enum_switch(F&& f, E value) { using D = std::decay_t; static_assert(std::is_enum_v, "magic_enum::enum_switch requires enum type."); @@ -165,7 +165,7 @@ constexpr decltype(auto) enum_switch(F&& f, E value) { return enum_switch(std::forward(f), value); } -template , typename F, typename R = detail::result_t> +template , typename F, typename R = detail::result_t> constexpr decltype(auto) enum_switch(F&& f, E value, Result&& result) { using D = std::decay_t; static_assert(std::is_enum_v, "magic_enum::enum_switch requires enum type.");