mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-25 22:52:01 +00:00
Template simplifications
Switch count_t to use constexpr_sum (under non-MSVC), and then make all_of_t/any_of_t use it instead of doing the sum itself. For MSVC, count_t is still done using template recursion, but all_of_t/any_of_t can also make use of it.
This commit is contained in:
parent
260b26b3d6
commit
5aa2cd5eb9
@ -342,22 +342,24 @@ constexpr size_t constexpr_sum() { return 0; }
|
|||||||
template <typename T, typename... Ts>
|
template <typename T, typename... Ts>
|
||||||
constexpr size_t constexpr_sum(T n, Ts... ns) { return size_t{n} + constexpr_sum(ns...); }
|
constexpr size_t constexpr_sum(T n, Ts... ns) { return size_t{n} + constexpr_sum(ns...); }
|
||||||
|
|
||||||
/// Return true if all/any Ts satify Predicate<T>
|
// Counts the number of types in the template parameter pack matching the predicate
|
||||||
#if !defined(_MSC_VER)
|
#if !defined(_MSC_VER)
|
||||||
template <template<typename> class Predicate, typename... Ts>
|
template <template<typename> class Predicate, typename... Ts>
|
||||||
using all_of_t = bool_constant<(constexpr_sum(Predicate<Ts>::value...) == sizeof...(Ts))>;
|
using count_t = std::integral_constant<size_t, constexpr_sum(Predicate<Ts>::value...)>;
|
||||||
template <template<typename> class Predicate, typename... Ts>
|
|
||||||
using any_of_t = bool_constant<(constexpr_sum(Predicate<Ts>::value...) > 0)>;
|
|
||||||
#else
|
#else
|
||||||
// MSVC workaround (2015 Update 3 has issues with some member type aliases and constexpr)
|
// MSVC workaround (2015 Update 3 has issues with some member type aliases and constexpr)
|
||||||
template <template<typename> class P, typename...> struct all_of_t : std::true_type { };
|
template <template<typename> class Predicate, typename... Ts> struct count_t;
|
||||||
template <template<typename> class P, typename T, typename... Ts>
|
template <template<typename> class Predicate> struct count_t<Predicate> : std::integral_constant<size_t, 0> {};
|
||||||
struct all_of_t<P, T, Ts...> : conditional_t<P<T>::value, all_of_t<P, Ts...>, std::false_type> { };
|
template <template<typename> class Predicate, class T, class... Ts>
|
||||||
template <template<typename> class P, typename...> struct any_of_t : std::false_type { };
|
struct count_t<Predicate, T, Ts...> : std::integral_constant<size_t, Predicate<T>::value + count_t<Predicate, Ts...>::value> {};
|
||||||
template <template<typename> class P, typename T, typename... Ts>
|
|
||||||
struct any_of_t<P, T, Ts...> : conditional_t<P<T>::value, std::true_type, any_of_t<P, Ts...>> { };
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/// Return true if all/any Ts satify Predicate<T>
|
||||||
|
template <template<typename> class Predicate, typename... Ts>
|
||||||
|
using all_of_t = bool_constant<(count_t<Predicate, Ts...>::value == sizeof...(Ts))>;
|
||||||
|
template <template<typename> class Predicate, typename... Ts>
|
||||||
|
using any_of_t = bool_constant<(count_t<Predicate, Ts...>::value > 0)>;
|
||||||
|
|
||||||
// Extracts the first type from the template parameter pack matching the predicate, or Default if none match.
|
// Extracts the first type from the template parameter pack matching the predicate, or Default if none match.
|
||||||
template <template<class> class Predicate, class Default, class... Ts> struct first_of;
|
template <template<class> class Predicate, class Default, class... Ts> struct first_of;
|
||||||
template <template<class> class Predicate, class Default> struct first_of<Predicate, Default> {
|
template <template<class> class Predicate, class Default> struct first_of<Predicate, Default> {
|
||||||
@ -373,13 +375,6 @@ struct first_of<Predicate, Default, T, Ts...> {
|
|||||||
};
|
};
|
||||||
template <template<class> class Predicate, class Default, class... T> using first_of_t = typename first_of<Predicate, Default, T...>::type;
|
template <template<class> class Predicate, class Default, class... T> using first_of_t = typename first_of<Predicate, Default, T...>::type;
|
||||||
|
|
||||||
// Counts the number of types in the template parameter pack matching the predicate
|
|
||||||
template <template<typename> class Predicate, typename... Ts> struct count_t;
|
|
||||||
template <template<typename> class Predicate> struct count_t<Predicate> : std::integral_constant<size_t, 0> {};
|
|
||||||
template <template<typename> class Predicate, class T, class... Ts>
|
|
||||||
struct count_t<Predicate, T, Ts...> : std::integral_constant<size_t,
|
|
||||||
Predicate<T>::value + count_t<Predicate, Ts...>::value> {};
|
|
||||||
|
|
||||||
/// Defer the evaluation of type T until types Us are instantiated
|
/// Defer the evaluation of type T until types Us are instantiated
|
||||||
template <typename T, typename... /*Us*/> struct deferred_type { using type = T; };
|
template <typename T, typename... /*Us*/> struct deferred_type { using type = T; };
|
||||||
template <typename T, typename... Us> using deferred_t = typename deferred_type<T, Us...>::type;
|
template <typename T, typename... Us> using deferred_t = typename deferred_type<T, Us...>::type;
|
||||||
|
Loading…
Reference in New Issue
Block a user