36 template<
class E,
class P,
class I,
class S,
class Fun>
39 traits::is_executor_v<E> &&
40 traits::is_partitioner_v<P, I, S> &&
41 traits::is_input_iterator_v<I> &&
42 traits::is_sentinel_for_v<S, I> &&
43 traits::is_indirectly_unary_invocable_v<Fun, I> &&
44 std::is_copy_constructible_v<Fun>
46 )
constexpr decltype(
auto)
48 if(std::is_constant_evaluated()) {
51 return Derived().run(executor, p, first, last, std::move(f));
56 template<
class E,
class P,
class R,
class Fun>
59 traits::is_executor_v<E> &&
60 traits::is_range_partitioner_v<P, R> &&
61 traits::is_input_range_v<R> &&
62 traits::is_indirectly_unary_invocable_v<Fun, traits::iterator_t<R>> &&
63 std::is_copy_constructible_v<Fun>
65 )
constexpr decltype(
auto)
67 if(std::is_constant_evaluated()) {
70 return operator()(executor, p, std::begin(r), std::end(r), std::move(f));
75 template<
class P,
class I,
class S,
class Fun>
78 traits::is_partitioner_v<P, I,S> &&
79 traits::is_input_iterator_v<I> &&
80 traits::is_sentinel_for_v<S, I> &&
81 traits::is_indirectly_unary_invocable_v<Fun, I> &&
82 std::is_copy_constructible_v<Fun>
85 constexpr decltype(
auto)
87 if (std::is_constant_evaluated()) {
110 traits::is_range_partitioner_v<P,R> &&
111 traits::is_input_range_v<R> &&
112 traits::is_indirectly_unary_invocable_v<Fun, traits::iterator_t<R>> &&
113 std::is_copy_constructible_v<Fun>
115 )
constexpr decltype(
auto)
117 if(std::is_constant_evaluated()) {
125 template<
class E,
class I,
class S,
class Fun>
128 traits::is_executor_v<E> &&
129 traits::is_input_iterator_v<I> &&
130 traits::is_sentinel_for_v<S, I> &&
131 traits::is_indirectly_unary_invocable_v<Fun, I> &&
132 std::is_copy_constructible_v<Fun>
134 )
constexpr decltype(
auto)
136 if(std::is_constant_evaluated()) {
144 template<
class E,
class R,
class Fun>
147 traits::is_executor_v<E> &&
148 traits::is_input_range_v<R> &&
149 traits::is_indirectly_unary_invocable_v<Fun, traits::iterator_t<R>> &&
150 std::is_copy_constructible_v<Fun>
152 )
constexpr decltype(
auto)
154 if(std::is_constant_evaluated()) {
162 template<
class I,
class S,
class Fun>
165 traits::is_input_iterator_v<I> &&
166 traits::is_sentinel_for_v<S, I> &&
167 traits::is_indirectly_unary_invocable_v<Fun, I> &&
168 std::is_copy_constructible_v<Fun>
170 )
constexpr decltype(
auto)
172 if(std::is_constant_evaluated()) {
180 template<
class R,
class Fun>
183 traits::is_input_range_v<R> &&
184 traits::is_indirectly_unary_invocable_v<Fun, traits::iterator_t<R>> &&
185 std::is_copy_constructible_v<Fun>
187 )
constexpr decltype(
auto)
189 if(std::is_constant_evaluated()) {
A partitioner is a light callable object that takes a pair of iterators and returns the middle of the...
The halve partitioner always splits the sequence into two parts of roughly equal size.
Definition Partitioner.hpp:37
Overloads for unary invoke algorithms.
Definition UnaryAlgorithm.hpp:34
constexpr decltype(auto) operator()(const E &executor, P p, R &&r, Fun f) const
Overload for Ranges.
Definition UnaryAlgorithm.hpp:66
constexpr decltype(auto) operator()(const E &executor, I first, S last, Fun f) const
Overload for Iterators / default partitioner.
Definition UnaryAlgorithm.hpp:135
constexpr decltype(auto) operator()(P p, I first, S last, Fun f) const
Overload for Iterators / default parallel executor.
Definition UnaryAlgorithm.hpp:86
constexpr decltype(auto) operator()(I first, S last, Fun f) const
Overload for Iterators / default executor / default partitioner.
Definition UnaryAlgorithm.hpp:171
constexpr decltype(auto) operator()(R &&r, Fun f) const
Overload for Ranges / default executor / default partitioner.
Definition UnaryAlgorithm.hpp:188
constexpr decltype(auto) operator()(const E &executor, P p, I first, S last, Fun f) const
Definition UnaryAlgorithm.hpp:47
constexpr decltype(auto) operator()(const E &executor, R &&r, Fun f) const
Overload for Ranges / default partitioner.
Definition UnaryAlgorithm.hpp:153
Definition Application.hpp:19
constexpr auto make_inline_executor()
An executor that runs anything inline.
Definition ExecutionContext.hpp:660
constexpr std::size_t make_grain_size(const std::size_t n, const std::size_t occupancy=hardware_concurrency())
Determine a reasonable minimum grain size depending on the number of elements in a sequence.
Definition Partitioner.hpp:89
auto make_default_executor()
The default executor to be used when no other executor is provided.
Definition ExecutionContext.hpp:743
constexpr size_t hash(const T &v)
Generates a hash for the provided type.
Definition Hash.hpp:25
DefaultPartitioner make_default_partitioner(const size_t n, const std::size_t occupancy=hardware_concurrency())
Create an instance of the default partitioner with a reasonable grain size for n elements.
Definition Partitioner.hpp:97