29 template<
class E,
class P,
class I,
class S,
class T,
class Fun = std::plus<>>
32 traits::is_executor_v<E> &&
33 traits::is_partitioner_v<P, I, S> &&
34 traits::is_input_iterator_v<I> &&
35 traits::is_sentinel_for_v<S, I> &&
36 std::is_same_v<traits::iter_value_t<I>,
T> &&
37 traits::is_indirectly_binary_invocable_v<Fun, I, I> &&
38 std::is_copy_constructible_v<Fun>
40 )
constexpr decltype(
auto)
parallel(
const E& executor,
P p,
I first,
S last,
T i,
Fun f = std::plus<>())
const {
41 if(std::is_constant_evaluated()) {
44 return Derived().run(executor, p, first, last,
i, std::move(f));
49 template<
class E,
class P,
class I,
class S,
class T,
class Fun = std::plus<>>
52 traits::is_executor_v<E> &&
53 traits::is_partitioner_v<P, I, S> &&
54 traits::is_input_iterator_v<I> &&
55 traits::is_sentinel_for_v<S, I> &&
56 std::is_same_v<traits::iter_value_t<I>,
T> &&
57 traits::is_indirectly_binary_invocable_v<Fun, I, I> &&
58 std::is_copy_constructible_v<Fun>
60 )
constexpr decltype(
auto)
62 return parallel(executor, p, first, last,
i, std::move(f));
66 template<
class E,
class P,
class I,
class S,
class Fun = std::plus<>>
69 traits::is_executor_v<E> &&
70 traits::is_partitioner_v<P, I, S> &&
71 traits::is_input_iterator_v<I> &&
72 traits::is_sentinel_for_v<S, I> &&
73 traits::is_indirectly_binary_invocable_v<Fun, I, I> &&
74 std::is_copy_constructible_v<Fun>
76 )
constexpr decltype(
auto)
parallel(
const E& executor,
P p,
I first,
S last,
Fun f = std::plus<>())
const {
81 if(std::is_constant_evaluated()) {
84 return Derived().run(executor, p, std::next(first), last, *first, std::move(f));
89 template<
class E,
class P,
class I,
class S,
class Fun = std::plus<>>
92 traits::is_executor_v<E> &&
93 traits::is_partitioner_v<P, I, S> &&
94 traits::is_input_iterator_v<I> &&
95 traits::is_sentinel_for_v<S, I> &&
96 traits::is_indirectly_binary_invocable_v<Fun, I, I> &&
97 std::is_copy_constructible_v<Fun>
99 )
constexpr decltype(
auto)
101 return parallel(executor, p, first, last, std::move(f));
105 template<
class E,
class P,
class R,
class T,
class Fun = std::plus<>>
108 traits::is_executor_v<E> &&
109 traits::is_range_partitioner_v<P,R> &&
110 traits::is_input_range_v<R> &&
111 std::is_same_v<traits::range_value_t<R>,
T> &&
113 std::is_copy_constructible_v<Fun>
115 )
constexpr decltype(
auto)
parallel(
const E& executor,
P p,
R&& r,
T i,
Fun f = std::plus<>())
const {
116 if(std::is_constant_evaluated()) {
119 return operator()(executor, p, std::begin(r), std::end(r),
i, std::move(f));
124 template<
class E,
class P,
class R,
class T,
class Fun = std::plus<>>
127 traits::is_executor_v<E> &&
128 traits::is_range_partitioner_v<P,R> &&
129 traits::is_input_range_v<R> &&
130 std::is_same_v<traits::range_value_t<R>,
T> &&
132 std::is_copy_constructible_v<Fun>
134 )
constexpr decltype(
auto)
136 return parallel(executor, p, r, std::move(
i), std::move(f));
140 template<
class E,
class P,
class R,
class Fun = std::plus<>>
143 traits::is_executor_v<E> &&
144 traits::is_range_partitioner_v<P, R> &&
145 traits::is_input_range_v<R> &&
147 std::is_copy_constructible_v<Fun>
149 )
constexpr decltype(
auto)
parallel(
const E& executor,
P p,
R&& r,
Fun f = std::plus<>())
const {
150 if(std::is_constant_evaluated()) {
153 return operator()(executor, p, std::begin(r), std::end(r), std::move(f));
158 template<
class E,
class P,
class R,
class Fun = std::plus<>>
161 traits::is_executor_v<E> &&
162 traits::is_range_partitioner_v<P, R> &&
163 traits::is_input_range_v<R> &&
165 std::is_copy_constructible_v<Fun>
167 )
constexpr decltype(
auto)
169 return parallel(executor, p, std::forward<R>(r), std::move(f));
173 template<
class P,
class I,
class S,
class T,
class Fun = std::plus<>>
176 traits::is_partitioner_v< P, I, S> &&
177 traits::is_input_iterator_v<I> &&
178 traits::is_sentinel_for_v<S, I> &&
179 std::is_same_v<traits::iter_value_t<I>,
T> &&
180 traits::is_indirectly_binary_invocable_v<Fun, I, I> &&
181 std::is_copy_constructible_v<Fun>
183 )
constexpr decltype(
auto)
parallel(
P p,
I first,
S last,
T i,
Fun f = std::plus<>())
const {
184 if(std::is_constant_evaluated()) {
192 template<
class P,
class I,
class S,
class Fun = std::plus<>>
195 traits::is_partitioner_v<P,I,S> &&
196 traits::is_input_iterator_v<I> &&
197 traits::is_sentinel_for_v<S, I> &&
198 traits::is_indirectly_binary_invocable_v<Fun, I, I> &&
199 std::is_copy_constructible_v<Fun>
201 )
constexpr decltype(
auto)
parallel(
P p,
I first,
S last,
Fun f = std::plus<>())
const {
202 if(std::is_constant_evaluated()) {
210 template<
class P,
class R,
class T,
class Fun = std::plus<>>
213 traits::is_range_partitioner_v<P,R> &&
214 traits::is_input_range_v<R> &&
215 std::is_same_v<traits::range_value_t<R>,
T> &&
217 std::is_copy_constructible_v<Fun>
220 if(std::is_constant_evaluated()) {
228 template<
class P,
class R,
class Fun = std::plus<>>
231 traits::is_range_partitioner_v<P, R> &&
232 traits::is_input_range_v<R> &&
234 std::is_copy_constructible_v<Fun>
236 )
constexpr decltype(
auto)
parallel(
P p,
R&& r,
Fun f = std::plus<>())
const {
237 if(std::is_constant_evaluated()) {
245 template<
class E,
class I,
class S,
class T,
class Fun = std::plus<>>
248 traits::is_executor_v<E> &&
249 traits::is_input_iterator_v<I> &&
250 traits::is_sentinel_for_v<S, I> &&
251 std::is_same_v<traits::iter_value_t<I>,
T> &&
252 traits::is_indirectly_binary_invocable_v<Fun, I, I> &&
253 std::is_copy_constructible_v<Fun>
255 )
constexpr decltype(
auto)
parallel(
const E& executor,
I first,
S last,
T i,
Fun f = std::plus<>())
const {
256 if(std::is_constant_evaluated()) {
264 template<
class E,
class I,
class S,
class T,
class Fun = std::plus<>>
267 traits::is_executor_v<E> &&
268 traits::is_input_iterator_v<I> &&
269 traits::is_sentinel_for_v<S, I> &&
270 std::is_same_v<traits::iter_value_t<I>,
T> &&
271 traits::is_indirectly_binary_invocable_v<Fun, I, I> &&
272 std::is_copy_constructible_v<Fun>
274 )
constexpr decltype(
auto)
276 return parallel(executor, first, last, std::move(
i), std::move(f));
280 template<
class E,
class I,
class S,
class Fun = std::plus<>>
283 traits::is_executor_v<E> &&
284 traits::is_input_iterator_v<I> &&
285 traits::is_sentinel_for_v<S, I> &&
286 traits::is_indirectly_binary_invocable_v<Fun, I, I> &&
287 std::is_copy_constructible_v<Fun>
289 )
constexpr decltype(
auto)
parallel(
const E& executor,
I first,
S last,
Fun f = std::plus<>())
const {
290 if(std::is_constant_evaluated()) {
298 template<
class E,
class I,
class S,
class Fun = std::plus<>>
301 traits::is_executor_v<E> &&
302 traits::is_input_iterator_v<I> &&
303 traits::is_sentinel_for_v<S, I> &&
304 traits::is_indirectly_binary_invocable_v<Fun, I, I> &&
305 std::is_copy_constructible_v<Fun>
307 )
constexpr decltype(
auto)
309 return parallel(executor, first, last, std::move(f));
313 template<
class E,
class R,
class T,
class Fun = std::plus<>>
316 traits::is_executor_v<E> &&
317 traits::is_input_range_v<R> &&
318 std::is_same_v<traits::range_value_t<R>,
T> &&
320 std::is_copy_constructible_v<Fun>
322 )
constexpr decltype(
auto)
parallel(
const E& executor,
R&& r,
T i,
Fun f = std::plus<>())
const {
323 if(std::is_constant_evaluated()) {
331 template<
class E,
class R,
class T,
class Fun = std::plus<>>
334 traits::is_executor_v<E> &&
335 traits::is_input_range_v<R> &&
336 std::is_same_v<traits::range_value_t<R>,
T> &&
338 std::is_copy_constructible_v<Fun>
340 )
constexpr decltype(
auto)
342 return parallel(executor, std::forward<R>(r), std::move(
i), std::move(f));
346 template<
class E,
class R,
class Fun = std::plus<>>
349 traits::is_executor_v<E> &&
350 traits::is_input_range_v<R> &&
352 std::is_copy_constructible_v<Fun>
354 )
constexpr decltype(
auto)
parallel(
const E& executor,
R&& r,
Fun f = std::plus<>())
const {
355 if(std::is_constant_evaluated()) {
363 template<
class E,
class R,
class Fun = std::plus<>>
366 traits::is_executor_v<E> &&
367 traits::is_input_range_v<R> &&
369 std::is_copy_constructible_v<Fun>
371 )
constexpr decltype(
auto)
373 return parallel(executor, std::forward<R>(r), std::move(f));
377 template<
class I,
class S,
class T,
class Fun = std::plus<>>
380 traits::is_input_iterator_v<I> &&
381 traits::is_sentinel_for_v<S, I> &&
382 std::is_same_v<traits::iter_value_t<I>,
T> &&
383 traits::is_indirectly_binary_invocable_v<Fun, I, I> &&
384 std::is_copy_constructible_v<Fun>
386 )
constexpr decltype(
auto)
parallel(
I first,
S last,
T i,
Fun f = std::plus<>())
const {
387 if(std::is_constant_evaluated()) {
395 template<
class I,
class S,
class T,
class Fun = std::plus<>>
398 traits::is_input_iterator_v<I> &&
399 traits::is_sentinel_for_v<S, I> &&
400 std::is_same_v<traits::iter_value_t<I>,
T> &&
401 traits::is_indirectly_binary_invocable_v<Fun, I, I> &&
402 std::is_copy_constructible_v<Fun>
404 )
constexpr decltype(
auto)
406 return Derived{}.run(first, last,
i, std::move(f));
411 template<
class I,
class S,
class Fun = std::plus<>>
414 traits::is_input_iterator_v<I> &&
415 traits::is_sentinel_for_v<S, I> &&
416 traits::is_indirectly_binary_invocable_v<Fun, I, I> &&
417 std::is_copy_constructible_v<Fun>
419 )
constexpr decltype(
auto)
parallel(
I first,
S last,
Fun f = std::plus<>())
const {
420 if(std::is_constant_evaluated()) {
429 template<
class I,
class S,
class Fun = std::plus<>>
432 traits::is_input_iterator_v<I> &&
433 traits::is_sentinel_for_v<S, I> &&
434 traits::is_indirectly_binary_invocable_v<Fun, I, I> &&
435 std::is_copy_constructible_v<Fun>
437 )
constexpr decltype(
auto)
443 template<
class R,
class T,
class Fun = std::plus<>>
446 traits::is_input_range_v<R> &&
447 std::is_same_v<traits::range_value_t<R>,
T> &&
449 std::is_copy_constructible_v<Fun>
452 if(std::is_constant_evaluated()) {
460 template<
class R,
class T,
class Fun = std::plus<>>
463 traits::is_input_range_v<R> &&
464 std::is_same_v<traits::range_value_t<R>,
T> &&
466 std::is_copy_constructible_v<Fun>
468 )
constexpr decltype(
auto)
470 return Derived{}.run(std::begin(r), std::end(r),
i, std::move(f));
474 template<
class R,
class Fun = std::plus<>>
477 traits::is_input_range_v<R> &&
479 std::is_copy_constructible_v<Fun>
481 )
constexpr decltype(
auto)
483 if(std::is_constant_evaluated()) {