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

optimize compile-time: removed unnecessary array copying

This commit is contained in:
neargye 2023-05-21 17:32:22 +04:00
parent 9c710f6119
commit 18602fd224
2 changed files with 34 additions and 10 deletions

View file

@ -189,6 +189,8 @@ constexpr customize_t enum_type_name() noexcept {
return default_tag;
}
static_assert(std::is_same_v<string_view::value_type, string::value_type>, "magic_enum::customize requires same string_view::value_type and string::value_type");
} // namespace magic_enum::customize
namespace detail {
@ -294,11 +296,6 @@ constexpr std::size_t find(string_view str, char c) noexcept {
}
}
template <typename T, std::size_t N, std::size_t... I>
constexpr std::array<std::remove_cv_t<T>, N> to_array(T (&a)[N], std::index_sequence<I...>) noexcept {
return {{a[I]...}};
}
template <typename BinaryPredicate>
constexpr bool is_default_predicate() noexcept {
return std::is_same_v<std::decay_t<BinaryPredicate>, std::equal_to<string_view::value_type>> ||
@ -589,6 +586,7 @@ constexpr int reflected_max() noexcept {
}
}
#if defined(__cpp_lib_array_constexpr) && __cpp_lib_array_constexpr >= 201603L
template <std::size_t N>
constexpr std::size_t values_count(const bool (&valid)[N]) noexcept {
auto count = std::size_t{0};
@ -600,6 +598,24 @@ constexpr std::size_t values_count(const bool (&valid)[N]) noexcept {
return count;
}
#else
template <typename T, std::size_t N, std::size_t... I>
constexpr std::array<std::remove_cv_t<T>, N> to_array(T (&a)[N], std::index_sequence<I...>) noexcept {
return {{a[I]...}};
}
template <std::size_t N>
constexpr std::size_t values_count(const bool (&valid)[N]) noexcept {
auto count = std::size_t{0};
for (std::size_t i = 0; i < N; ++i) {
if (valid[i]) {
++count;
}
}
return count;
}
#endif
template <typename E, enum_subtype S, int Min, std::size_t... I>
constexpr auto values(std::index_sequence<I...>) noexcept {
@ -608,14 +624,22 @@ constexpr auto values(std::index_sequence<I...>) noexcept {
constexpr std::size_t count = values_count(valid);
if constexpr (count > 0) {
#if defined(__cpp_lib_array_constexpr) && __cpp_lib_array_constexpr >= 201603L
std::array<E, count> values = {};
#else
E values[count] = {};
#endif
for (std::size_t i = 0, v = 0; v < count; ++i) {
if (valid[i]) {
values[v++] = value<E, Min, S>(i);
}
}
#if defined(__cpp_lib_array_constexpr) && __cpp_lib_array_constexpr >= 201603L
return values;
#else
return to_array(values, std::make_index_sequence<count>{});
#endif
} else {
return std::array<E, 0>{};
}

View file

@ -37,7 +37,7 @@
#if !defined(MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT)
# define MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT 1
# define MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT_AUTO_DEFINE
#endif // MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT
#endif
namespace magic_enum::customize {
// customize enum to enable/disable automatic std::format
@ -72,7 +72,7 @@ struct std::formatter<E, std::enable_if_t<std::is_enum_v<std::decay_t<E>> && mag
}
};
#endif // MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT
#endif
#if defined(FMT_VERSION)
@ -99,11 +99,11 @@ struct fmt::formatter<E, std::enable_if_t<std::is_enum_v<std::decay_t<E>> && mag
}
};
#endif // FMT_VERSION
#endif
#if defined(MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT_AUTO_DEFINE)
# undef MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT
# undef MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT_AUTO_DEFINE
#endif // MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT_AUTO_DEFINE
#endif
#endif // NEARGYE_MAGIC_ENUM_FORMAT_HPP