mirror of
https://github.com/Neargye/magic_enum.git
synced 2026-01-10 23:44:29 +00:00
optimize compile-time: removed unnecessary array copying
This commit is contained in:
parent
9c710f6119
commit
18602fd224
2 changed files with 34 additions and 10 deletions
|
|
@ -189,6 +189,8 @@ constexpr customize_t enum_type_name() noexcept {
|
||||||
return default_tag;
|
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 magic_enum::customize
|
||||||
|
|
||||||
namespace detail {
|
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>
|
template <typename BinaryPredicate>
|
||||||
constexpr bool is_default_predicate() noexcept {
|
constexpr bool is_default_predicate() noexcept {
|
||||||
return std::is_same_v<std::decay_t<BinaryPredicate>, std::equal_to<string_view::value_type>> ||
|
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>
|
template <std::size_t N>
|
||||||
constexpr std::size_t values_count(const bool (&valid)[N]) noexcept {
|
constexpr std::size_t values_count(const bool (&valid)[N]) noexcept {
|
||||||
auto count = std::size_t{0};
|
auto count = std::size_t{0};
|
||||||
|
|
@ -600,6 +598,24 @@ constexpr std::size_t values_count(const bool (&valid)[N]) noexcept {
|
||||||
|
|
||||||
return count;
|
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>
|
template <typename E, enum_subtype S, int Min, std::size_t... I>
|
||||||
constexpr auto values(std::index_sequence<I...>) noexcept {
|
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);
|
constexpr std::size_t count = values_count(valid);
|
||||||
|
|
||||||
if constexpr (count > 0) {
|
if constexpr (count > 0) {
|
||||||
|
#if defined(__cpp_lib_array_constexpr) && __cpp_lib_array_constexpr >= 201603L
|
||||||
|
std::array<E, count> values = {};
|
||||||
|
|
||||||
|
#else
|
||||||
E values[count] = {};
|
E values[count] = {};
|
||||||
|
#endif
|
||||||
for (std::size_t i = 0, v = 0; v < count; ++i) {
|
for (std::size_t i = 0, v = 0; v < count; ++i) {
|
||||||
if (valid[i]) {
|
if (valid[i]) {
|
||||||
values[v++] = value<E, Min, S>(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>{});
|
return to_array(values, std::make_index_sequence<count>{});
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
return std::array<E, 0>{};
|
return std::array<E, 0>{};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@
|
||||||
#if !defined(MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT)
|
#if !defined(MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT)
|
||||||
# define MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT 1
|
# define MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT 1
|
||||||
# define MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT_AUTO_DEFINE
|
# define MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT_AUTO_DEFINE
|
||||||
#endif // MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT
|
#endif
|
||||||
|
|
||||||
namespace magic_enum::customize {
|
namespace magic_enum::customize {
|
||||||
// customize enum to enable/disable automatic std::format
|
// 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)
|
#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)
|
#if defined(MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT_AUTO_DEFINE)
|
||||||
# undef MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT
|
# undef MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT
|
||||||
# undef MAGIC_ENUM_DEFAULT_ENABLE_ENUM_FORMAT_AUTO_DEFINE
|
# 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
|
#endif // NEARGYE_MAGIC_ENUM_FORMAT_HPP
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue