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

fix empry sting and static_str string_view conversion

This commit is contained in:
neargye 2025-11-21 18:13:46 +04:00
parent ca3c6c35fe
commit 3e5609848e

View file

@ -181,11 +181,9 @@ namespace detail {
constexpr inline std::size_t prefix_length_or_zero = 0;
template<typename E>
constexpr inline auto prefix_length_or_zero<E, std::void_t<decltype(customize::enum_range<E>::prefix_length)>> = std::size_t{ customize::enum_range<E>::prefix_length };
inline auto prefix_length_or_zero<E, std::void_t<decltype(customize::enum_range<E>::prefix_length)>> = std::size_t{ customize::enum_range<E>::prefix_length };
}
namespace customize {
template <bool IsFlags = false, int Min = MAGIC_ENUM_RANGE_MIN, int Max = MAGIC_ENUM_RANGE_MAX, std::size_t PrefixLength = 0>
@ -197,16 +195,15 @@ struct adl_info_holder {
template<int min,int max>
constexpr static adl_info_holder<IsFlags,min,max,PrefixLength> minmax() { return {}; }
template<bool is_flag>
constexpr static adl_info_holder<is_flag,Min,Max,PrefixLength> flag() { return {}; }
template<std::size_t prefix_len>
constexpr static adl_info_holder<IsFlags,Min,Max,prefix_len> prefix() { return {}; }
};
constexpr adl_info_holder<> adl_info()
{
return {};
}
constexpr adl_info_holder<> adl_info() { return {}; }
// Enum value must be in range [MAGIC_ENUM_RANGE_MIN, MAGIC_ENUM_RANGE_MAX]. By default MAGIC_ENUM_RANGE_MIN = -128, MAGIC_ENUM_RANGE_MAX = 127.
// If need another range for all enum types by default, redefine the macro MAGIC_ENUM_RANGE_MIN and MAGIC_ENUM_RANGE_MAX.
@ -218,8 +215,7 @@ struct enum_range {
};
template <typename E>
struct enum_range<E, decltype(void(magic_enum_define_range_adl(E{}))) >
: decltype(magic_enum_define_range_adl(E{})) {};
struct enum_range<E, decltype(void(magic_enum_define_range_adl(E{})))> : decltype(magic_enum_define_range_adl(E{})) {};
static_assert(MAGIC_ENUM_RANGE_MAX > MAGIC_ENUM_RANGE_MIN, "MAGIC_ENUM_RANGE_MAX must be greater than MAGIC_ENUM_RANGE_MIN.");
@ -318,7 +314,7 @@ class static_str {
constexpr std::uint16_t size() const noexcept { return N; }
constexpr operator string_view() const noexcept { return {data(), size()}; }
constexpr string_view str() const noexcept { return string_view(data(), size()); }
private:
template <std::uint16_t... I>
@ -343,7 +339,7 @@ class static_str<0> {
constexpr std::uint16_t size() const noexcept { return 0; }
constexpr operator string_view() const noexcept { return {}; }
constexpr string_view str() const noexcept { return ""; }
};
template <typename Op = std::equal_to<>>
@ -886,7 +882,7 @@ inline constexpr auto max_v = (count_v<E, S> > 0) ? static_cast<U>(values_v<E, S
template <typename E, enum_subtype S, std::size_t... I>
constexpr auto names(std::index_sequence<I...>) noexcept {
constexpr auto names = std::array<string_view, sizeof...(I)>{{enum_name_v<E, values_v<E, S>[I]>...}};
constexpr auto names = std::array<string_view, sizeof...(I)>{{enum_name_v<E, values_v<E, S>[I]>.str()...}};
return names;
}
@ -898,7 +894,7 @@ using names_t = decltype((names_v<D, S>));
template <typename E, enum_subtype S, std::size_t... I>
constexpr auto entries(std::index_sequence<I...>) noexcept {
constexpr auto entries = std::array<std::pair<E, string_view>, sizeof...(I)>{{{values_v<E, S>[I], enum_name_v<E, values_v<E, S>[I]>}...}};
constexpr auto entries = std::array<std::pair<E, string_view>, sizeof...(I)>{{{values_v<E, S>[I], enum_name_v<E, values_v<E, S>[I]>.str()}...}};
return entries;
}
@ -1334,7 +1330,7 @@ template <auto V, detail::enum_subtype S = detail::subtype_v<std::decay_t<declty
// This version is much lighter on the compile times and is not restricted to the enum_range limitation.
template <auto V>
[[nodiscard]] constexpr auto enum_name() noexcept -> detail::enable_if_t<decltype(V), string_view> {
constexpr string_view name = detail::enum_name_v<std::decay_t<decltype(V)>, V>;
constexpr string_view name = detail::enum_name_v<std::decay_t<decltype(V)>, V>.str();
static_assert(!name.empty(), "magic_enum::enum_name enum value does not have a name.");
return name;
@ -1350,7 +1346,7 @@ template <typename E, detail::enum_subtype S = detail::subtype_v<E>>
if (const auto i = enum_index<D, S>(value)) {
return detail::names_v<D, S>[*i];
}
return {};
return "";
}
// Returns name from enum value.