1
0
Fork 0
mirror of https://github.com/Neargye/magic_enum.git synced 2026-01-09 23:34:23 +00:00

support gcc8 with defined MAGIC_ENUM_NO_CHECK_SUPPORT and with specialized magic_enum::customize::enum_name (#137)

This commit is contained in:
Bela Schaum 2022-02-18 16:52:09 +01:00 committed by GitHub
parent 4e39c3ba55
commit 07181c5a11
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -330,16 +330,19 @@ inline constexpr bool is_enum_v = std::is_enum_v<T> && std::is_same_v<T, std::de
template <typename E> template <typename E>
constexpr auto n() noexcept { constexpr auto n() noexcept {
static_assert(is_enum_v<E>, "magic_enum::detail::n requires enum type."); static_assert(is_enum_v<E>, "magic_enum::detail::n requires enum type.");
#if defined(MAGIC_ENUM_SUPPORTED) && MAGIC_ENUM_SUPPORTED
# if defined(__clang__) || defined(__GNUC__) if constexpr (supported<E>::value) {
constexpr auto name = pretty_name({__PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 2}); #if defined(__clang__) || defined(__GNUC__)
# elif defined(_MSC_VER) constexpr auto name = pretty_name({__PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 2});
constexpr auto name = pretty_name({__FUNCSIG__, sizeof(__FUNCSIG__) - 17}); #elif defined(_MSC_VER)
# endif constexpr auto name = pretty_name({__FUNCSIG__, sizeof(__FUNCSIG__) - 17});
return static_string<name.size()>{name};
#else #else
return string_view{}; // Unsupported compiler. constexpr auto name = string_view{};
#endif #endif
return static_string<name.size()>{name};
} else {
return string_view{}; // Unsupported compiler.
}
} }
template <typename E> template <typename E>
@ -348,20 +351,21 @@ inline constexpr auto type_name_v = n<E>();
template <typename E, E V> template <typename E, E V>
constexpr auto n() noexcept { constexpr auto n() noexcept {
static_assert(is_enum_v<E>, "magic_enum::detail::n requires enum type."); static_assert(is_enum_v<E>, "magic_enum::detail::n requires enum type.");
constexpr auto custom_name = customize::enum_name<E>(V); [[maybe_unused]] constexpr auto custom_name = customize::enum_name<E>(V);
if constexpr (custom_name.empty()) { if constexpr (custom_name.empty()) {
static_cast<void>(custom_name); if constexpr (supported<E>::value) {
#if defined(MAGIC_ENUM_SUPPORTED) && MAGIC_ENUM_SUPPORTED #if defined(__clang__) || defined(__GNUC__)
# if defined(__clang__) || defined(__GNUC__) constexpr auto name = pretty_name({__PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 2});
constexpr auto name = pretty_name({__PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 2}); #elif defined(_MSC_VER)
# elif defined(_MSC_VER) constexpr auto name = pretty_name({__FUNCSIG__, sizeof(__FUNCSIG__) - 17});
constexpr auto name = pretty_name({__FUNCSIG__, sizeof(__FUNCSIG__) - 17});
# endif
return static_string<name.size()>{name};
#else #else
return string_view{}; // Unsupported compiler. constexpr auto name = string_view{};
#endif #endif
return static_string<name.size()>{name};
} else {
return string_view{}; // Unsupported compiler.
}
} else { } else {
return static_string<custom_name.size()>{custom_name}; return static_string<custom_name.size()>{custom_name};
} }
@ -510,7 +514,7 @@ template <typename E>
inline constexpr bool is_flags_v = is_flags_enum<E>(); inline constexpr bool is_flags_v = is_flags_enum<E>();
template <typename E> template <typename E>
inline constexpr auto values_v = values<E, is_flags_v<E>>(); inline constexpr std::array values_v = values<E, is_flags_v<E>>();
template <typename E, typename D = std::decay_t<E>> template <typename E, typename D = std::decay_t<E>>
using values_t = decltype((values_v<D>)); using values_t = decltype((values_v<D>));
@ -532,7 +536,7 @@ constexpr auto names(std::index_sequence<I...>) noexcept {
} }
template <typename E> template <typename E>
inline constexpr auto names_v = names<E>(std::make_index_sequence<count_v<E>>{}); inline constexpr std::array names_v = names<E>(std::make_index_sequence<count_v<E>>{});
template <typename E, typename D = std::decay_t<E>> template <typename E, typename D = std::decay_t<E>>
using names_t = decltype((names_v<D>)); using names_t = decltype((names_v<D>));
@ -545,7 +549,7 @@ constexpr auto entries(std::index_sequence<I...>) noexcept {
} }
template <typename E> template <typename E>
inline constexpr auto entries_v = entries<E>(std::make_index_sequence<count_v<E>>{}); inline constexpr std::array entries_v = entries<E>(std::make_index_sequence<count_v<E>>{});
template <typename E, typename D = std::decay_t<E>> template <typename E, typename D = std::decay_t<E>>
using entries_t = decltype((entries_v<D>)); using entries_t = decltype((entries_v<D>));
@ -871,7 +875,7 @@ template <typename E>
} else { } else {
const auto v = static_cast<U>(value); const auto v = static_cast<U>(value);
if (v >= detail::min_v<D> && v <= detail::max_v<D>) { if (v >= detail::min_v<D> && v <= detail::max_v<D>) {
return static_cast<std::size_t>(v - detail::min_v<E>); return static_cast<std::size_t>(v - detail::min_v<D>);
} }
} }
@ -947,14 +951,15 @@ template <typename Char, typename Traits, typename E, detail::enable_if_enum_t<E
std::basic_ostream<Char, Traits>& operator<<(std::basic_ostream<Char, Traits>& os, E value) { std::basic_ostream<Char, Traits>& operator<<(std::basic_ostream<Char, Traits>& os, E value) {
using D = std::decay_t<E>; using D = std::decay_t<E>;
using U = underlying_type_t<D>; using U = underlying_type_t<D>;
#if defined(MAGIC_ENUM_SUPPORTED) && MAGIC_ENUM_SUPPORTED
if (const auto name = magic_enum::enum_flags_name<D>(value); !name.empty()) { if constexpr (detail::supported<D>::value) {
for (const auto c : name) { if (const auto name = magic_enum::enum_flags_name<D>(value); !name.empty()) {
os.put(c); for (const auto c : name) {
os.put(c);
}
return os;
} }
return os;
} }
#endif
return (os << static_cast<U>(value)); return (os << static_cast<U>(value));
} }