1
0
Fork 0
mirror of https://github.com/Neargye/magic_enum.git synced 2026-01-08 23:24:20 +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

@ -172,54 +172,50 @@ static_assert([] {
} (), "magic_enum::customize wchar_t is not compatible with ASCII.");
namespace customize {
template <typename E, typename = void>
struct enum_range;
template <typename E, typename = void>
struct enum_range;
}
namespace detail {
template<typename E,typename = void>
constexpr inline std::size_t prefix_length_or_zero = 0;
template<typename E,typename = void>
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 };
template<typename E>
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>
template <bool IsFlags = false, int Min = MAGIC_ENUM_RANGE_MIN, int Max = MAGIC_ENUM_RANGE_MAX, std::size_t PrefixLength = 0>
struct adl_info_holder {
constexpr static int max = Max;
constexpr static int min = Min;
constexpr static bool is_flags =IsFlags;
constexpr static std::size_t prefix_length = PrefixLength;
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 static int max = Max;
constexpr static int min = Min;
constexpr static bool is_flags =IsFlags;
constexpr static std::size_t prefix_length = PrefixLength;
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.
// If need another range for specific enum type, add specialization enum_range for necessary enum type.
template <typename E,typename /*= void*/>
struct enum_range {
static constexpr int min = MAGIC_ENUM_RANGE_MIN;
static constexpr int max = MAGIC_ENUM_RANGE_MAX;
static constexpr int min = MAGIC_ENUM_RANGE_MIN;
static constexpr int max = MAGIC_ENUM_RANGE_MAX;
};
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.