mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-29 16:37:13 +00:00
Move constexpr_first/last to common.h
This keeps it with constexpr_sum and the other metafunctions.
This commit is contained in:
parent
3b4b921192
commit
34d308adf0
@ -1314,25 +1314,6 @@ private:
|
|||||||
std::tuple<make_caster<Args>...> value;
|
std::tuple<make_caster<Args>...> value;
|
||||||
};
|
};
|
||||||
|
|
||||||
NAMESPACE_BEGIN(constexpr_impl)
|
|
||||||
/// Implementation details for constexpr functions
|
|
||||||
constexpr int first(int i) { return i; }
|
|
||||||
template <typename T, typename... Ts>
|
|
||||||
constexpr int first(int i, T v, Ts... vs) { return v ? i : first(i + 1, vs...); }
|
|
||||||
|
|
||||||
constexpr int last(int /*i*/, int result) { return result; }
|
|
||||||
template <typename T, typename... Ts>
|
|
||||||
constexpr int last(int i, int result, T v, Ts... vs) { return last(i + 1, v ? i : result, vs...); }
|
|
||||||
NAMESPACE_END(constexpr_impl)
|
|
||||||
|
|
||||||
/// Return the index of the first type in Ts which satisfies Predicate<T>
|
|
||||||
template <template<typename> class Predicate, typename... Ts>
|
|
||||||
constexpr int constexpr_first() { return constexpr_impl::first(0, Predicate<Ts>::value...); }
|
|
||||||
|
|
||||||
/// Return the index of the last type in Ts which satisfies Predicate<T>
|
|
||||||
template <template<typename> class Predicate, typename... Ts>
|
|
||||||
constexpr int constexpr_last() { return constexpr_impl::last(0, -1, Predicate<Ts>::value...); }
|
|
||||||
|
|
||||||
/// Helper class which collects only positional arguments for a Python function call.
|
/// Helper class which collects only positional arguments for a Python function call.
|
||||||
/// A fancier version below can collect any argument, but this one is optimal for simple calls.
|
/// A fancier version below can collect any argument, but this one is optimal for simple calls.
|
||||||
template <return_value_policy policy>
|
template <return_value_policy policy>
|
||||||
|
@ -449,6 +449,26 @@ 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...); }
|
||||||
|
|
||||||
|
NAMESPACE_BEGIN(constexpr_impl)
|
||||||
|
/// Implementation details for constexpr functions
|
||||||
|
constexpr int first(int i) { return i; }
|
||||||
|
template <typename T, typename... Ts>
|
||||||
|
constexpr int first(int i, T v, Ts... vs) { return v ? i : first(i + 1, vs...); }
|
||||||
|
|
||||||
|
constexpr int last(int /*i*/, int result) { return result; }
|
||||||
|
template <typename T, typename... Ts>
|
||||||
|
constexpr int last(int i, int result, T v, Ts... vs) { return last(i + 1, v ? i : result, vs...); }
|
||||||
|
NAMESPACE_END(constexpr_impl)
|
||||||
|
|
||||||
|
/// Return the index of the first type in Ts which satisfies Predicate<T>. Returns sizeof...(Ts) if
|
||||||
|
/// none match.
|
||||||
|
template <template<typename> class Predicate, typename... Ts>
|
||||||
|
constexpr int constexpr_first() { return constexpr_impl::first(0, Predicate<Ts>::value...); }
|
||||||
|
|
||||||
|
/// Return the index of the last type in Ts which satisfies Predicate<T>, or -1 if none match.
|
||||||
|
template <template<typename> class Predicate, typename... Ts>
|
||||||
|
constexpr int constexpr_last() { return constexpr_impl::last(0, -1, Predicate<Ts>::value...); }
|
||||||
|
|
||||||
// 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> {
|
||||||
|
Loading…
Reference in New Issue
Block a user