From e73c1b1168fbd5d59ff3292e74769759bcca9f78 Mon Sep 17 00:00:00 2001 From: neargye Date: Tue, 13 Oct 2020 13:29:21 +0300 Subject: [PATCH] more comfortable static check --- include/magic_enum.hpp | 45 ++++++++++++++++++------------------------ 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/include/magic_enum.hpp b/include/magic_enum.hpp index 51255e5..73707ae 100644 --- a/include/magic_enum.hpp +++ b/include/magic_enum.hpp @@ -556,31 +556,16 @@ constexpr U value_ors() noexcept { return value; } -template -struct enable_if_reflected_enum {}; +template +struct enable_if_enum {}; template -struct enable_if_reflected_enum { +struct enable_if_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)."); - static_assert(count_v > 0, "magic_enum requires enum implementation and valid max and min."); }; -template -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)."); - static_assert(count_v > 0, "magic_enum::flags requires enum-flags implementation."); -}; - -template -using enable_if_reflected_enum_t = typename enable_if_reflected_enum>, false, T, R>::type; - -template -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>; @@ -658,8 +643,9 @@ 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_reflected_enum_t> { +[[nodiscard]] constexpr auto enum_value(std::size_t index) noexcept -> detail::enable_if_enum_t> { using D = std::decay_t; + static_assert(count_v > 0, "magic_enum requires enum implementation and valid max and min."); if constexpr (detail::is_sparse_v) { return assert((index < detail::count_v)), detail::values_v[index]; @@ -670,8 +656,9 @@ template // Returns std::array with enum values, sorted by enum value. template -[[nodiscard]] constexpr auto enum_values() noexcept -> detail::enable_if_reflected_enum_t> { +[[nodiscard]] constexpr auto enum_values() noexcept -> detail::enable_if_enum_t> { using D = std::decay_t; + static_assert(count_v > 0, "magic_enum requires enum implementation and valid max and min."); return detail::values_v; } @@ -702,16 +689,18 @@ template // Returns std::array with names, sorted by enum value. template -[[nodiscard]] constexpr auto enum_names() noexcept -> detail::enable_if_reflected_enum_t> { +[[nodiscard]] constexpr auto enum_names() noexcept -> detail::enable_if_enum_t> { using D = std::decay_t; + static_assert(count_v > 0, "magic_enum requires enum implementation and valid max and min."); return detail::names_v; } // Returns std::array with pairs (value, name), sorted by enum value. template -[[nodiscard]] constexpr auto enum_entries() noexcept -> detail::enable_if_reflected_enum_t> { +[[nodiscard]] constexpr auto enum_entries() noexcept -> detail::enable_if_enum_t> { using D = std::decay_t; + static_assert(count_v > 0, "magic_enum requires enum implementation and valid max and min."); return detail::entries_v; } @@ -885,8 +874,9 @@ 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_reflected_enum_flags_t> { +[[nodiscard]] constexpr auto enum_value(std::size_t index) noexcept -> detail::enable_if_enum_t> { using D = std::decay_t; + static_assert(count_v > 0, "magic_enum::flags requires enum-flags implementation."); if constexpr (detail::is_sparse_v) { return assert((index < detail::count_v)), detail::values_v[index]; @@ -899,8 +889,9 @@ template // Returns std::array with enum-flags values, sorted by enum-flags value. template -[[nodiscard]] constexpr auto enum_values() noexcept -> detail::enable_if_reflected_enum_flags_t> { +[[nodiscard]] constexpr auto enum_values() noexcept -> detail::enable_if_enum_t> { using D = std::decay_t; + static_assert(count_v > 0, "magic_enum::flags requires enum-flags implementation."); return detail::values_v; } @@ -934,16 +925,18 @@ template // Returns std::array with string names, sorted by enum-flags value. template -[[nodiscard]] constexpr auto enum_names() noexcept -> detail::enable_if_reflected_enum_flags_t> { +[[nodiscard]] constexpr auto enum_names() noexcept -> detail::enable_if_enum_t> { using D = std::decay_t; + static_assert(count_v > 0, "magic_enum::flags requires enum-flags implementation."); return detail::names_v; } // Returns std::array with pairs (value, name), sorted by enum-flags value. template -[[nodiscard]] constexpr auto enum_entries() noexcept -> detail::enable_if_reflected_enum_flags_t> { +[[nodiscard]] constexpr auto enum_entries() noexcept -> detail::enable_if_enum_t> { using D = std::decay_t; + static_assert(count_v > 0, "magic_enum::flags requires enum-flags implementation."); return detail::entries_v; }