1// -*- C++ -*-
2//===-- algorithm_fwd.h --------------------------------------------------===//
3//
4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef _PSTL_ALGORITHM_FWD_H
11#define _PSTL_ALGORITHM_FWD_H
12
13#include <type_traits>
14#include <utility>
15
16namespace __pstl
17{
18namespace __internal
19{
20
21//------------------------------------------------------------------------
22// any_of
23//------------------------------------------------------------------------
24
25template <class _ForwardIterator, class _Pred>
26bool
27__brick_any_of(const _ForwardIterator, const _ForwardIterator, _Pred,
28               /*__is_vector=*/std::false_type) noexcept;
29
30template <class _ForwardIterator, class _Pred>
31bool
32__brick_any_of(const _ForwardIterator, const _ForwardIterator, _Pred,
33               /*__is_vector=*/std::true_type) noexcept;
34
35template <class _ExecutionPolicy, class _ForwardIterator, class _Pred, class _IsVector>
36bool
37__pattern_any_of(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Pred, _IsVector,
38                 /*parallel=*/std::false_type) noexcept;
39
40template <class _ExecutionPolicy, class _ForwardIterator, class _Pred, class _IsVector>
41bool
42__pattern_any_of(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Pred, _IsVector,
43                 /*parallel=*/std::true_type);
44
45//------------------------------------------------------------------------
46// walk1 (pseudo)
47//
48// walk1 evaluates f(x) for each dereferenced value x drawn from [first,last)
49//------------------------------------------------------------------------
50
51template <class _ForwardIterator, class _Function>
52void __brick_walk1(_ForwardIterator, _ForwardIterator, _Function,
53                   /*vector=*/std::false_type) noexcept;
54
55template <class _RandomAccessIterator, class _Function>
56void __brick_walk1(_RandomAccessIterator, _RandomAccessIterator, _Function,
57                   /*vector=*/std::true_type) noexcept;
58
59template <class _ExecutionPolicy, class _ForwardIterator, class _Function, class _IsVector>
60void
61__pattern_walk1(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Function, _IsVector,
62                /*parallel=*/std::false_type) noexcept;
63
64template <class _ExecutionPolicy, class _ForwardIterator, class _Function, class _IsVector>
65void
66__pattern_walk1(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Function, _IsVector,
67                /*parallel=*/std::true_type);
68
69template <class _ExecutionPolicy, class _ForwardIterator, class _Brick>
70void
71__pattern_walk_brick(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Brick,
72                     /*parallel=*/std::false_type) noexcept;
73
74template <class _ExecutionPolicy, class _ForwardIterator, class _Brick>
75void
76__pattern_walk_brick(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Brick,
77                     /*parallel=*/std::true_type);
78
79//------------------------------------------------------------------------
80// walk1_n
81//------------------------------------------------------------------------
82
83template <class _ForwardIterator, class _Size, class _Function>
84_ForwardIterator __brick_walk1_n(_ForwardIterator, _Size, _Function,
85                                 /*_IsVectorTag=*/std::false_type);
86
87template <class _RandomAccessIterator, class _DifferenceType, class _Function>
88_RandomAccessIterator __brick_walk1_n(_RandomAccessIterator, _DifferenceType, _Function,
89                                      /*vectorTag=*/std::true_type) noexcept;
90
91template <class _ExecutionPolicy, class _ForwardIterator, class _Size, class _Function, class _IsVector>
92_ForwardIterator
93__pattern_walk1_n(_ExecutionPolicy&&, _ForwardIterator, _Size, _Function, _IsVector,
94                  /*is_parallel=*/std::false_type) noexcept;
95
96template <class _ExecutionPolicy, class _RandomAccessIterator, class _Size, class _Function, class _IsVector>
97_RandomAccessIterator
98__pattern_walk1_n(_ExecutionPolicy&&, _RandomAccessIterator, _Size, _Function, _IsVector,
99                  /*is_parallel=*/std::true_type);
100
101template <class _ExecutionPolicy, class _ForwardIterator, class _Size, class _Brick>
102_ForwardIterator
103__pattern_walk_brick_n(_ExecutionPolicy&&, _ForwardIterator, _Size, _Brick,
104                       /*is_parallel=*/std::false_type) noexcept;
105
106template <class _ExecutionPolicy, class _RandomAccessIterator, class _Size, class _Brick>
107_RandomAccessIterator
108__pattern_walk_brick_n(_ExecutionPolicy&&, _RandomAccessIterator, _Size, _Brick,
109                       /*is_parallel=*/std::true_type);
110
111//------------------------------------------------------------------------
112// walk2 (pseudo)
113//
114// walk2 evaluates f(x,y) for deferenced values (x,y) drawn from [first1,last1) and [first2,...)
115//------------------------------------------------------------------------
116
117template <class _ForwardIterator1, class _ForwardIterator2, class _Function>
118_ForwardIterator2 __brick_walk2(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _Function,
119                                /*vector=*/std::false_type) noexcept;
120
121template <class _ForwardIterator1, class _ForwardIterator2, class _Function>
122_ForwardIterator2 __brick_walk2(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _Function,
123                                /*vector=*/std::true_type) noexcept;
124
125template <class _ForwardIterator1, class _Size, class _ForwardIterator2, class _Function>
126_ForwardIterator2 __brick_walk2_n(_ForwardIterator1, _Size, _ForwardIterator2, _Function,
127                                  /*vector=*/std::false_type) noexcept;
128
129template <class _ForwardIterator1, class _Size, class _ForwardIterator2, class _Function>
130_ForwardIterator2 __brick_walk2_n(_ForwardIterator1, _Size, _ForwardIterator2, _Function,
131                                  /*vector=*/std::true_type) noexcept;
132
133template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Function, class _IsVector>
134_ForwardIterator2
135__pattern_walk2(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _Function, _IsVector,
136                /*parallel=*/std::false_type) noexcept;
137
138template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Function, class _IsVector>
139_ForwardIterator2
140__pattern_walk2(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _Function, _IsVector,
141                /*parallel=*/std::true_type);
142
143template <class _ExecutionPolicy, class _ForwardIterator1, class _Size, class _ForwardIterator2, class _Function,
144          class _IsVector>
145_ForwardIterator2
146__pattern_walk2_n(_ExecutionPolicy&&, _ForwardIterator1, _Size, _ForwardIterator2, _Function, _IsVector,
147                  /*parallel=*/std::false_type) noexcept;
148
149template <class _ExecutionPolicy, class _RandomAccessIterator1, class _Size, class _RandomAccessIterator2,
150          class _Function, class _IsVector>
151_RandomAccessIterator2
152__pattern_walk2_n(_ExecutionPolicy&&, _RandomAccessIterator1, _Size, _RandomAccessIterator2, _Function, _IsVector,
153                  /*parallel=*/std::true_type);
154
155template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Brick>
156_ForwardIterator2
157__pattern_walk2_brick(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _Brick,
158                      /*parallel=*/std::false_type) noexcept;
159
160template <class _ExecutionPolicy, class _RandomAccessIterator1, class _RandomAccessIterator2, class _Brick>
161_RandomAccessIterator2
162__pattern_walk2_brick(_ExecutionPolicy&&, _RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2,
163                      _Brick,
164                      /*parallel=*/std::true_type);
165
166template <class _ExecutionPolicy, class _ForwardIterator1, class _Size, class _ForwardIterator2, class _Brick>
167_ForwardIterator2
168__pattern_walk2_brick_n(_ExecutionPolicy&&, _ForwardIterator1, _Size, _ForwardIterator2, _Brick,
169                        /*parallel=*/std::false_type) noexcept;
170
171template <class _ExecutionPolicy, class _RandomAccessIterator1, class _Size, class _RandomAccessIterator2, class _Brick>
172_RandomAccessIterator2
173__pattern_walk2_brick_n(_ExecutionPolicy&&, _RandomAccessIterator1, _Size, _RandomAccessIterator2, _Brick,
174                        /*parallel=*/std::true_type);
175
176//------------------------------------------------------------------------
177// walk3 (pseudo)
178//
179// walk3 evaluates f(x,y,z) for (x,y,z) drawn from [first1,last1), [first2,...), [first3,...)
180//------------------------------------------------------------------------
181
182template <class _ForwardIterator1, class _ForwardIterator2, class _ForwardIterator3, class _Function>
183_ForwardIterator3 __brick_walk3(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator3, _Function,
184                                /*vector=*/std::false_type) noexcept;
185
186template <class _RandomAccessIterator1, class _RandomAccessIterator2, class _RandomAccessIterator3, class _Function>
187_RandomAccessIterator3 __brick_walk3(_RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2,
188                                     _RandomAccessIterator3, _Function,
189                                     /*vector=*/std::true_type) noexcept;
190
191template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _ForwardIterator3,
192          class _Function, class _IsVector>
193_ForwardIterator3
194__pattern_walk3(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator3,
195                _Function, _IsVector,
196                /*parallel=*/std::false_type) noexcept;
197
198template <class _ExecutionPolicy, class _RandomAccessIterator1, class _RandomAccessIterator2,
199          class _RandomAccessIterator3, class _Function, class _IsVector>
200_RandomAccessIterator3
201__pattern_walk3(_ExecutionPolicy&&, _RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2,
202                _RandomAccessIterator3, _Function, _IsVector, /*parallel=*/std::true_type);
203
204//------------------------------------------------------------------------
205// equal
206//------------------------------------------------------------------------
207
208template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
209bool __brick_equal(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _BinaryPredicate,
210                   /* is_vector = */ std::false_type) noexcept;
211
212template <class _RandomAccessIterator1, class _RandomAccessIterator2, class _BinaryPredicate>
213bool __brick_equal(_RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2, _BinaryPredicate,
214                   /* is_vector = */ std::true_type) noexcept;
215
216template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate,
217          class _IsVector>
218bool
219__pattern_equal(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _BinaryPredicate,
220                _IsVector, /* is_parallel = */ std::false_type) noexcept;
221
222template <class _ExecutionPolicy, class _RandomAccessIterator1, class _RandomAccessIterator2, class _BinaryPredicate,
223          class _IsVector>
224bool
225__pattern_equal(_ExecutionPolicy&&, _RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2,
226                _BinaryPredicate, _IsVector, /* is_parallel = */ std::true_type);
227
228template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
229bool __brick_equal(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2, _BinaryPredicate,
230                   /* is_vector = */ std::false_type) noexcept;
231
232template <class _RandomAccessIterator1, class _RandomAccessIterator2, class _BinaryPredicate>
233bool __brick_equal(_RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2, _RandomAccessIterator2,
234                   _BinaryPredicate, /* is_vector = */ std::true_type) noexcept;
235
236template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate,
237          class _IsVector>
238bool
239__pattern_equal(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
240                _BinaryPredicate, _IsVector, /* is_parallel = */ std::false_type) noexcept;
241
242template <class _ExecutionPolicy, class _RandomAccessIterator1, class _RandomAccessIterator2, class _BinaryPredicate,
243          class _IsVector>
244bool
245__pattern_equal(_ExecutionPolicy&&, _RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2,
246                _RandomAccessIterator2, _BinaryPredicate, _IsVector, /* is_parallel = */ std::true_type);
247
248//------------------------------------------------------------------------
249// find_if
250//------------------------------------------------------------------------
251
252template <class _ForwardIterator, class _Predicate>
253_ForwardIterator __brick_find_if(_ForwardIterator, _ForwardIterator, _Predicate,
254                                 /*is_vector=*/std::false_type) noexcept;
255
256template <class _RandomAccessIterator, class _Predicate>
257_RandomAccessIterator __brick_find_if(_RandomAccessIterator, _RandomAccessIterator, _Predicate,
258                                      /*is_vector=*/std::true_type) noexcept;
259
260template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate, class _IsVector>
261_ForwardIterator
262__pattern_find_if(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Predicate, _IsVector,
263                  /*is_parallel=*/std::false_type) noexcept;
264
265template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate, class _IsVector>
266_ForwardIterator
267__pattern_find_if(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Predicate, _IsVector,
268                  /*is_parallel=*/std::true_type);
269
270//------------------------------------------------------------------------
271// find_end
272//------------------------------------------------------------------------
273
274template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
275_ForwardIterator1 __brick_find_end(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
276                                   _BinaryPredicate,
277                                   /*__is_vector=*/std::false_type) noexcept;
278
279template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
280_ForwardIterator1 __brick_find_end(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
281                                   _BinaryPredicate,
282                                   /*__is_vector=*/std::true_type) noexcept;
283
284template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate,
285          class _IsVector>
286_ForwardIterator1
287__pattern_find_end(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
288                   _BinaryPredicate, _IsVector,
289                   /*is_parallel=*/std::false_type) noexcept;
290
291template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate,
292          class _IsVector>
293_ForwardIterator1
294__pattern_find_end(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
295                   _BinaryPredicate, _IsVector,
296                   /*is_parallel=*/std::true_type) noexcept;
297
298//------------------------------------------------------------------------
299// find_first_of
300//------------------------------------------------------------------------
301
302template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
303_ForwardIterator1 __brick_find_first_of(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
304                                        _BinaryPredicate,
305                                        /*__is_vector=*/std::false_type) noexcept;
306
307template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
308_ForwardIterator1 __brick_find_first_of(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
309                                        _BinaryPredicate,
310                                        /*__is_vector=*/std::true_type) noexcept;
311
312template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate,
313          class _IsVector>
314_ForwardIterator1
315__pattern_find_first_of(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
316                        _BinaryPredicate, _IsVector, /*is_parallel=*/std::false_type) noexcept;
317
318template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate,
319          class _IsVector>
320_ForwardIterator1
321__pattern_find_first_of(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
322                        _BinaryPredicate, _IsVector, /*is_parallel=*/std::true_type) noexcept;
323
324//------------------------------------------------------------------------
325// search
326//------------------------------------------------------------------------
327
328template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
329_ForwardIterator1 __brick_search(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
330                                 _BinaryPredicate,
331                                 /*vector=*/std::false_type) noexcept;
332
333template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
334_ForwardIterator1 __brick_search(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
335                                 _BinaryPredicate,
336                                 /*vector=*/std::true_type) noexcept;
337
338template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate,
339          class _IsVector>
340_ForwardIterator1
341__pattern_search(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
342                 _BinaryPredicate, _IsVector,
343                 /*is_parallel=*/std::false_type) noexcept;
344
345template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate,
346          class _IsVector>
347_ForwardIterator1
348__pattern_search(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
349                 _BinaryPredicate, _IsVector,
350                 /*is_parallel=*/std::true_type) noexcept;
351
352//------------------------------------------------------------------------
353// search_n
354//------------------------------------------------------------------------
355
356template <class _ForwardIterator, class _Size, class _Tp, class _BinaryPredicate>
357_ForwardIterator
358__brick_search_n(_ForwardIterator, _ForwardIterator, _Size, const _Tp&, _BinaryPredicate,
359                 /*vector=*/std::false_type) noexcept;
360
361template <class _ForwardIterator, class _Size, class _Tp, class _BinaryPredicate>
362_ForwardIterator
363__brick_search_n(_ForwardIterator, _ForwardIterator, _Size, const _Tp&, _BinaryPredicate,
364                 /*vector=*/std::true_type) noexcept;
365
366template <class _ExecutionPolicy, class _ForwardIterator, class _Size, class _Tp, class _BinaryPredicate,
367          class IsVector>
368_ForwardIterator
369__pattern_search_n(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Size, const _Tp&, _BinaryPredicate,
370                   IsVector,
371                   /*is_parallel=*/std::false_type) noexcept;
372
373template <class _ExecutionPolicy, class _RandomAccessIterator, class _Size, class _Tp, class _BinaryPredicate,
374          class IsVector>
375_RandomAccessIterator
376__pattern_search_n(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _Size, const _Tp&,
377                   _BinaryPredicate, IsVector,
378                   /*is_parallel=*/std::true_type) noexcept;
379
380//------------------------------------------------------------------------
381// copy_n
382//------------------------------------------------------------------------
383
384template <class _ForwardIterator, class _Size, class _OutputIterator>
385_OutputIterator __brick_copy_n(_ForwardIterator, _Size, _OutputIterator,
386                               /*vector=*/std::false_type) noexcept;
387
388template <class _ForwardIterator, class _Size, class _OutputIterator>
389_OutputIterator __brick_copy_n(_ForwardIterator, _Size, _OutputIterator,
390                               /*vector=*/std::true_type) noexcept;
391
392//------------------------------------------------------------------------
393// copy
394//------------------------------------------------------------------------
395
396template <class _ForwardIterator, class _OutputIterator>
397_OutputIterator __brick_copy(_ForwardIterator, _ForwardIterator, _OutputIterator,
398                             /*vector=*/std::false_type) noexcept;
399
400template <class _RandomAccessIterator, class _OutputIterator>
401_OutputIterator __brick_copy(_RandomAccessIterator, _RandomAccessIterator, _OutputIterator,
402                             /*vector=*/std::true_type) noexcept;
403
404//------------------------------------------------------------------------
405// move
406//------------------------------------------------------------------------
407
408template <class _ForwardIterator, class _OutputIterator>
409_OutputIterator __brick_move(_ForwardIterator, _ForwardIterator, _OutputIterator,
410                             /*vector=*/std::false_type) noexcept;
411
412template <class _RandomAccessIterator, class _OutputIterator>
413_OutputIterator __brick_move(_RandomAccessIterator, _RandomAccessIterator, _OutputIterator,
414                             /*vector=*/std::true_type) noexcept;
415
416//------------------------------------------------------------------------
417// swap_ranges
418//------------------------------------------------------------------------
419template <class _ForwardIterator, class _OutputIterator>
420_OutputIterator
421__brick_swap_ranges(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result,
422                    /*vector=*/std::false_type) noexcept;
423
424template <class _ForwardIterator, class _OutputIterator>
425_OutputIterator
426__brick_swap_ranges(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result,
427                    /*vector=*/std::true_type) noexcept;
428
429//------------------------------------------------------------------------
430// copy_if
431//------------------------------------------------------------------------
432
433template <class _ForwardIterator, class _OutputIterator, class _UnaryPredicate>
434_OutputIterator __brick_copy_if(_ForwardIterator, _ForwardIterator, _OutputIterator, _UnaryPredicate,
435                                /*vector=*/std::false_type) noexcept;
436
437template <class _ForwardIterator, class _OutputIterator, class _UnaryPredicate>
438_OutputIterator __brick_copy_if(_ForwardIterator, _ForwardIterator, _OutputIterator, _UnaryPredicate,
439                                /*vector=*/std::true_type) noexcept;
440
441template <class _DifferenceType, class _ForwardIterator, class _UnaryPredicate>
442std::pair<_DifferenceType, _DifferenceType>
443__brick_calc_mask_1(_ForwardIterator, _ForwardIterator, bool* __restrict, _UnaryPredicate,
444                    /*vector=*/std::false_type) noexcept;
445template <class _DifferenceType, class _RandomAccessIterator, class _UnaryPredicate>
446std::pair<_DifferenceType, _DifferenceType>
447__brick_calc_mask_1(_RandomAccessIterator, _RandomAccessIterator, bool* __restrict, _UnaryPredicate,
448                    /*vector=*/std::true_type) noexcept;
449
450template <class _ForwardIterator, class _OutputIterator>
451void
452__brick_copy_by_mask(_ForwardIterator, _ForwardIterator, _OutputIterator, bool*,
453                     /*vector=*/std::false_type) noexcept;
454
455template <class _ForwardIterator, class _OutputIterator>
456void
457__brick_copy_by_mask(_ForwardIterator, _ForwardIterator, _OutputIterator, bool* __restrict,
458                     /*vector=*/std::true_type) noexcept;
459
460template <class _ForwardIterator, class _OutputIterator1, class _OutputIterator2>
461void
462__brick_partition_by_mask(_ForwardIterator, _ForwardIterator, _OutputIterator1, _OutputIterator2, bool*,
463                          /*vector=*/std::false_type) noexcept;
464
465template <class _RandomAccessIterator, class _OutputIterator1, class _OutputIterator2>
466void
467__brick_partition_by_mask(_RandomAccessIterator, _RandomAccessIterator, _OutputIterator1, _OutputIterator2, bool*,
468                          /*vector=*/std::true_type) noexcept;
469
470template <class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator, class _UnaryPredicate, class _IsVector>
471_OutputIterator
472__pattern_copy_if(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _OutputIterator, _UnaryPredicate, _IsVector,
473                  /*parallel=*/std::false_type) noexcept;
474
475template <class _ExecutionPolicy, class _RandomAccessIterator, class _OutputIterator, class _UnaryPredicate,
476          class _IsVector>
477_OutputIterator
478__pattern_copy_if(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _OutputIterator, _UnaryPredicate,
479                  _IsVector, /*parallel=*/std::true_type);
480
481//------------------------------------------------------------------------
482// count
483//------------------------------------------------------------------------
484
485template <class _ForwardIterator, class _Predicate>
486typename std::iterator_traits<_ForwardIterator>::difference_type
487    __brick_count(_ForwardIterator, _ForwardIterator, _Predicate,
488                  /* is_vector = */ std::true_type) noexcept;
489
490template <class _ForwardIterator, class _Predicate>
491typename std::iterator_traits<_ForwardIterator>::difference_type
492    __brick_count(_ForwardIterator, _ForwardIterator, _Predicate,
493                  /* is_vector = */ std::false_type) noexcept;
494
495template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate, class _IsVector>
496typename std::iterator_traits<_ForwardIterator>::difference_type
497__pattern_count(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Predicate,
498                /* is_parallel */ std::false_type, _IsVector) noexcept;
499
500template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate, class _IsVector>
501typename std::iterator_traits<_ForwardIterator>::difference_type
502__pattern_count(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Predicate,
503                /* is_parallel */ std::true_type, _IsVector);
504
505//------------------------------------------------------------------------
506// unique
507//------------------------------------------------------------------------
508
509template <class _ForwardIterator, class _BinaryPredicate>
510_ForwardIterator __brick_unique(_ForwardIterator, _ForwardIterator, _BinaryPredicate,
511                                /*is_vector=*/std::false_type) noexcept;
512
513template <class _ForwardIterator, class _BinaryPredicate>
514_ForwardIterator __brick_unique(_ForwardIterator, _ForwardIterator, _BinaryPredicate,
515                                /*is_vector=*/std::true_type) noexcept;
516
517template <class _ExecutionPolicy, class _ForwardIterator, class _BinaryPredicate, class _IsVector>
518_ForwardIterator
519__pattern_unique(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _BinaryPredicate, _IsVector,
520                 /*is_parallel=*/std::false_type) noexcept;
521
522template <class _ExecutionPolicy, class _ForwardIterator, class _BinaryPredicate, class _IsVector>
523_ForwardIterator
524__pattern_unique(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _BinaryPredicate, _IsVector,
525                 /*is_parallel=*/std::true_type) noexcept;
526
527//------------------------------------------------------------------------
528// unique_copy
529//------------------------------------------------------------------------
530
531template <class _ForwardIterator, class OutputIterator, class _BinaryPredicate>
532OutputIterator __brick_unique_copy(_ForwardIterator, _ForwardIterator, OutputIterator, _BinaryPredicate,
533                                   /*vector=*/std::false_type) noexcept;
534
535template <class _RandomAccessIterator, class _OutputIterator, class _BinaryPredicate>
536_OutputIterator __brick_unique_copy(_RandomAccessIterator, _RandomAccessIterator, _OutputIterator, _BinaryPredicate,
537                                    /*vector=*/std::true_type) noexcept;
538
539template <class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator, class _BinaryPredicate,
540          class _IsVector>
541_OutputIterator
542__pattern_unique_copy(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _OutputIterator, _BinaryPredicate,
543                      _IsVector, /*parallel=*/std::false_type) noexcept;
544
545template <class _ExecutionPolicy, class _DifferenceType, class _RandomAccessIterator, class _BinaryPredicate>
546_DifferenceType
547__brick_calc_mask_2(_RandomAccessIterator, _RandomAccessIterator, bool* __restrict, _BinaryPredicate,
548                    /*vector=*/std::false_type) noexcept;
549
550template <class _DifferenceType, class _RandomAccessIterator, class _BinaryPredicate>
551_DifferenceType
552__brick_calc_mask_2(_RandomAccessIterator, _RandomAccessIterator, bool* __restrict, _BinaryPredicate,
553                    /*vector=*/std::true_type) noexcept;
554
555template <class _ExecutionPolicy, class _RandomAccessIterator, class _OutputIterator, class _BinaryPredicate,
556          class _IsVector>
557_OutputIterator
558__pattern_unique_copy(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _OutputIterator,
559                      _BinaryPredicate, _IsVector, /*parallel=*/std::true_type);
560
561//------------------------------------------------------------------------
562// reverse
563//------------------------------------------------------------------------
564
565template <class _BidirectionalIterator>
566void __brick_reverse(_BidirectionalIterator, _BidirectionalIterator,
567                     /*__is_vector=*/std::false_type) noexcept;
568
569template <class _BidirectionalIterator>
570void __brick_reverse(_BidirectionalIterator, _BidirectionalIterator,
571                     /*__is_vector=*/std::true_type) noexcept;
572
573template <class _BidirectionalIterator>
574void __brick_reverse(_BidirectionalIterator, _BidirectionalIterator, _BidirectionalIterator,
575                     /*is_vector=*/std::false_type) noexcept;
576
577template <class _BidirectionalIterator>
578void __brick_reverse(_BidirectionalIterator, _BidirectionalIterator, _BidirectionalIterator,
579                     /*is_vector=*/std::true_type) noexcept;
580
581template <class _ExecutionPolicy, class _BidirectionalIterator, class _IsVector>
582void
583__pattern_reverse(_ExecutionPolicy&&, _BidirectionalIterator, _BidirectionalIterator, _IsVector,
584                  /*is_parallel=*/std::false_type) noexcept;
585
586template <class _ExecutionPolicy, class _BidirectionalIterator, class _IsVector>
587void
588__pattern_reverse(_ExecutionPolicy&&, _BidirectionalIterator, _BidirectionalIterator, _IsVector,
589                  /*is_parallel=*/std::true_type);
590
591//------------------------------------------------------------------------
592// reverse_copy
593//------------------------------------------------------------------------
594
595template <class _BidirectionalIterator, class _OutputIterator>
596_OutputIterator __brick_reverse_copy(_BidirectionalIterator, _BidirectionalIterator, _OutputIterator,
597                                     /*is_vector=*/std::false_type) noexcept;
598
599template <class _BidirectionalIterator, class _OutputIterator>
600_OutputIterator __brick_reverse_copy(_BidirectionalIterator, _BidirectionalIterator, _OutputIterator,
601                                     /*is_vector=*/std::true_type) noexcept;
602
603template <class _ExecutionPolicy, class _BidirectionalIterator, class _OutputIterator, class _IsVector>
604_OutputIterator
605__pattern_reverse_copy(_ExecutionPolicy&&, _BidirectionalIterator, _BidirectionalIterator, _OutputIterator, _IsVector,
606                       /*is_parallel=*/std::false_type) noexcept;
607
608template <class _ExecutionPolicy, class _BidirectionalIterator, class _OutputIterator, class _IsVector>
609_OutputIterator
610__pattern_reverse_copy(_ExecutionPolicy&&, _BidirectionalIterator, _BidirectionalIterator, _OutputIterator, _IsVector,
611                       /*is_parallel=*/std::true_type);
612
613//------------------------------------------------------------------------
614// rotate
615//------------------------------------------------------------------------
616
617template <class _ForwardIterator>
618_ForwardIterator __brick_rotate(_ForwardIterator, _ForwardIterator, _ForwardIterator,
619                                /*is_vector=*/std::false_type) noexcept;
620
621template <class _ForwardIterator>
622_ForwardIterator __brick_rotate(_ForwardIterator, _ForwardIterator, _ForwardIterator,
623                                /*is_vector=*/std::true_type) noexcept;
624
625template <class _ExecutionPolicy, class _ForwardIterator, class _IsVector>
626_ForwardIterator
627__pattern_rotate(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _ForwardIterator, _IsVector,
628                 /*is_parallel=*/std::false_type) noexcept;
629
630template <class _ExecutionPolicy, class _ForwardIterator, class _IsVector>
631_ForwardIterator
632__pattern_rotate(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _ForwardIterator, _IsVector,
633                 /*is_parallel=*/std::true_type);
634
635//------------------------------------------------------------------------
636// rotate_copy
637//------------------------------------------------------------------------
638
639template <class _ForwardIterator, class _OutputIterator>
640_OutputIterator __brick_rotate_copy(_ForwardIterator, _ForwardIterator, _ForwardIterator, _OutputIterator,
641                                    /*__is_vector=*/std::false_type) noexcept;
642
643template <class _ForwardIterator, class _OutputIterator>
644_OutputIterator __brick_rotate_copy(_ForwardIterator, _ForwardIterator, _ForwardIterator, _OutputIterator,
645                                    /*__is_vector=*/std::true_type) noexcept;
646
647template <class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator, class _IsVector>
648_OutputIterator
649__pattern_rotate_copy(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _ForwardIterator, _OutputIterator,
650                      _IsVector,
651                      /*is_parallel=*/std::false_type) noexcept;
652
653template <class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator, class _IsVector>
654_OutputIterator
655__pattern_rotate_copy(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _ForwardIterator, _OutputIterator,
656                      _IsVector,
657                      /*is_parallel=*/std::true_type);
658
659//------------------------------------------------------------------------
660// is_partitioned
661//------------------------------------------------------------------------
662
663template <class _ForwardIterator, class _UnaryPredicate>
664bool __brick_is_partitioned(_ForwardIterator, _ForwardIterator, _UnaryPredicate,
665                            /*is_vector=*/std::false_type) noexcept;
666
667template <class _ForwardIterator, class _UnaryPredicate>
668bool __brick_is_partitioned(_ForwardIterator, _ForwardIterator, _UnaryPredicate,
669                            /*is_vector=*/std::true_type) noexcept;
670
671template <class _ExecutionPolicy, class _ForwardIterator, class _UnaryPredicate, class _IsVector>
672bool
673__pattern_is_partitioned(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _UnaryPredicate, _IsVector,
674                         /*is_parallel=*/std::false_type) noexcept;
675
676template <class _ExecutionPolicy, class _ForwardIterator, class _UnaryPredicate, class _IsVector>
677bool
678__pattern_is_partitioned(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _UnaryPredicate, _IsVector,
679                         /*is_parallel=*/std::true_type);
680
681//------------------------------------------------------------------------
682// partition
683//------------------------------------------------------------------------
684
685template <class _ForwardIterator, class _UnaryPredicate>
686_ForwardIterator __brick_partition(_ForwardIterator, _ForwardIterator, _UnaryPredicate,
687                                   /*is_vector=*/std::false_type) noexcept;
688
689template <class _ForwardIterator, class _UnaryPredicate>
690_ForwardIterator __brick_partition(_ForwardIterator, _ForwardIterator, _UnaryPredicate,
691                                   /*is_vector=*/std::true_type) noexcept;
692
693template <class _ExecutionPolicy, class _ForwardIterator, class _UnaryPredicate, class _IsVector>
694_ForwardIterator
695__pattern_partition(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _UnaryPredicate, _IsVector,
696                    /*is_parallel=*/std::false_type) noexcept;
697
698template <class _ExecutionPolicy, class _ForwardIterator, class _UnaryPredicate, class _IsVector>
699_ForwardIterator
700__pattern_partition(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _UnaryPredicate, _IsVector,
701                    /*is_parallel=*/std::true_type);
702
703//------------------------------------------------------------------------
704// stable_partition
705//------------------------------------------------------------------------
706
707template <class _BidirectionalIterator, class _UnaryPredicate>
708_BidirectionalIterator __brick_stable_partition(_BidirectionalIterator, _BidirectionalIterator, _UnaryPredicate,
709                                                /*__is_vector=*/std::false_type) noexcept;
710
711template <class _BidirectionalIterator, class _UnaryPredicate>
712_BidirectionalIterator __brick_stable_partition(_BidirectionalIterator, _BidirectionalIterator, _UnaryPredicate,
713                                                /*__is_vector=*/std::true_type) noexcept;
714
715template <class _ExecutionPolicy, class _BidirectionalIterator, class _UnaryPredicate, class _IsVector>
716_BidirectionalIterator
717__pattern_stable_partition(_ExecutionPolicy&&, _BidirectionalIterator, _BidirectionalIterator, _UnaryPredicate,
718                           _IsVector,
719                           /*is_parallelization=*/std::false_type) noexcept;
720
721template <class _ExecutionPolicy, class _BidirectionalIterator, class _UnaryPredicate, class _IsVector>
722_BidirectionalIterator
723__pattern_stable_partition(_ExecutionPolicy&&, _BidirectionalIterator, _BidirectionalIterator, _UnaryPredicate,
724                           _IsVector,
725                           /*is_parallelization=*/std::true_type) noexcept;
726
727//------------------------------------------------------------------------
728// partition_copy
729//------------------------------------------------------------------------
730
731template <class _ForwardIterator, class _OutputIterator1, class _OutputIterator2, class _UnaryPredicate>
732std::pair<_OutputIterator1, _OutputIterator2>
733    __brick_partition_copy(_ForwardIterator, _ForwardIterator, _OutputIterator1, _OutputIterator2, _UnaryPredicate,
734                           /*is_vector=*/std::false_type) noexcept;
735
736template <class _ForwardIterator, class _OutputIterator1, class _OutputIterator2, class _UnaryPredicate>
737std::pair<_OutputIterator1, _OutputIterator2>
738    __brick_partition_copy(_ForwardIterator, _ForwardIterator, _OutputIterator1, _OutputIterator2, _UnaryPredicate,
739                           /*is_vector=*/std::true_type) noexcept;
740
741template <class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator1, class _OutputIterator2,
742          class _UnaryPredicate, class _IsVector>
743std::pair<_OutputIterator1, _OutputIterator2>
744__pattern_partition_copy(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _OutputIterator1, _OutputIterator2,
745                         _UnaryPredicate, _IsVector,
746                         /*is_parallelization=*/std::false_type) noexcept;
747
748template <class _ExecutionPolicy, class _RandomAccessIterator, class _OutputIterator1, class _OutputIterator2,
749          class _UnaryPredicate, class _IsVector>
750std::pair<_OutputIterator1, _OutputIterator2>
751__pattern_partition_copy(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _OutputIterator1,
752                         _OutputIterator2, _UnaryPredicate, _IsVector,
753                         /*is_parallelization=*/std::true_type);
754
755//------------------------------------------------------------------------
756// sort
757//------------------------------------------------------------------------
758
759template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare, class _IsVector,
760          class _IsMoveConstructible>
761void
762__pattern_sort(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _Compare, _IsVector /*is_vector*/,
763               /*is_parallel=*/std::false_type, _IsMoveConstructible) noexcept;
764
765template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare, class _IsVector>
766void
767__pattern_sort(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _Compare, _IsVector /*is_vector*/,
768               /*is_parallel=*/std::true_type,
769               /*is_move_constructible=*/std::true_type);
770
771//------------------------------------------------------------------------
772// stable_sort
773//------------------------------------------------------------------------
774
775template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare, class _IsVector>
776void
777__pattern_stable_sort(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _Compare,
778                      _IsVector /*is_vector*/,
779                      /*is_parallel=*/std::false_type) noexcept;
780
781template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare, class _IsVector>
782void
783__pattern_stable_sort(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _Compare,
784                      _IsVector /*is_vector*/,
785                      /*is_parallel=*/std::true_type);
786
787//------------------------------------------------------------------------
788// partial_sort
789//------------------------------------------------------------------------
790
791template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare, class _IsVector>
792void
793__pattern_partial_sort(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _RandomAccessIterator,
794                       _Compare, _IsVector,
795                       /*is_parallel=*/std::false_type) noexcept;
796
797template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare, class _IsVector>
798void
799__pattern_partial_sort(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _RandomAccessIterator,
800                       _Compare, _IsVector,
801                       /*is_parallel=*/std::true_type);
802
803//------------------------------------------------------------------------
804// partial_sort_copy
805//------------------------------------------------------------------------
806
807template <class _ExecutionPolicy, class _ForwardIterator, class _RandomAccessIterator, class _Compare, class _IsVector>
808_RandomAccessIterator
809__pattern_partial_sort_copy(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _RandomAccessIterator,
810                            _RandomAccessIterator, _Compare, _IsVector,
811                            /*is_parallel=*/std::false_type) noexcept;
812
813template <class _ExecutionPolicy, class _ForwardIterator, class _RandomAccessIterator, class _Compare, class _IsVector>
814_RandomAccessIterator
815__pattern_partial_sort_copy(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _RandomAccessIterator,
816                            _RandomAccessIterator, _Compare, _IsVector,
817                            /*is_parallel=*/std::true_type);
818
819//------------------------------------------------------------------------
820// adjacent_find
821//------------------------------------------------------------------------
822
823template <class _ForwardIterator, class _BinaryPredicate>
824_ForwardIterator
825__brick_adjacent_find(_ForwardIterator, _ForwardIterator, _BinaryPredicate,
826                      /* IsVector = */ std::true_type, bool) noexcept;
827
828template <class _ForwardIterator, class _BinaryPredicate>
829_ForwardIterator
830__brick_adjacent_find(_ForwardIterator, _ForwardIterator, _BinaryPredicate,
831                      /* IsVector = */ std::false_type, bool) noexcept;
832
833template <class _ExecutionPolicy, class _ForwardIterator, class _BinaryPredicate, class _IsVector>
834_ForwardIterator
835__pattern_adjacent_find(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _BinaryPredicate,
836                        /* is_parallel */ std::false_type, _IsVector, bool) noexcept;
837
838template <class _ExecutionPolicy, class _RandomAccessIterator, class _BinaryPredicate, class _IsVector>
839_RandomAccessIterator
840__pattern_adjacent_find(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _BinaryPredicate,
841                        /* is_parallel */ std::true_type, _IsVector, bool);
842
843//------------------------------------------------------------------------
844// nth_element
845//------------------------------------------------------------------------
846template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare, class _IsVector>
847void
848__pattern_nth_element(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _RandomAccessIterator, _Compare,
849                      _IsVector,
850                      /*is_parallel=*/std::false_type) noexcept;
851
852template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare, class _IsVector>
853void
854__pattern_nth_element(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _RandomAccessIterator, _Compare,
855                      _IsVector,
856                      /*is_parallel=*/std::true_type) noexcept;
857
858//------------------------------------------------------------------------
859// fill, fill_n
860//------------------------------------------------------------------------
861template <class _ForwardIterator, class _Tp>
862void
863__brick_fill(_ForwardIterator, _ForwardIterator, const _Tp&,
864             /* __is_vector = */ std::true_type) noexcept;
865
866template <class _ForwardIterator, class _Tp>
867void
868__brick_fill(_ForwardIterator, _ForwardIterator, const _Tp&,
869             /* __is_vector = */ std::false_type) noexcept;
870
871template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _IsVector>
872void
873__pattern_fill(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, const _Tp&,
874               /*is_parallel=*/std::false_type, _IsVector) noexcept;
875
876template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _IsVector>
877_ForwardIterator
878__pattern_fill(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, const _Tp&,
879               /*is_parallel=*/std::true_type, _IsVector);
880
881template <class _OutputIterator, class _Size, class _Tp>
882_OutputIterator
883__brick_fill_n(_OutputIterator, _Size, const _Tp&,
884               /* __is_vector = */ std::true_type) noexcept;
885
886template <class _OutputIterator, class _Size, class _Tp>
887_OutputIterator
888__brick_fill_n(_OutputIterator, _Size, const _Tp&,
889               /* __is_vector = */ std::false_type) noexcept;
890
891template <class _ExecutionPolicy, class _OutputIterator, class _Size, class _Tp, class _IsVector>
892_OutputIterator
893__pattern_fill_n(_ExecutionPolicy&&, _OutputIterator, _Size, const _Tp&,
894                 /*is_parallel=*/std::false_type, _IsVector) noexcept;
895
896template <class _ExecutionPolicy, class _OutputIterator, class _Size, class _Tp, class _IsVector>
897_OutputIterator
898__pattern_fill_n(_ExecutionPolicy&&, _OutputIterator, _Size, const _Tp&,
899                 /*is_parallel=*/std::true_type, _IsVector);
900
901//------------------------------------------------------------------------
902// generate, generate_n
903//------------------------------------------------------------------------
904
905template <class _RandomAccessIterator, class _Generator>
906void __brick_generate(_RandomAccessIterator, _RandomAccessIterator, _Generator,
907                      /* is_vector = */ std::true_type) noexcept;
908
909template <class _ForwardIterator, class _Generator>
910void __brick_generate(_ForwardIterator, _ForwardIterator, _Generator,
911                      /* is_vector = */ std::false_type) noexcept;
912
913template <class _ExecutionPolicy, class _ForwardIterator, class _Generator, class _IsVector>
914void
915__pattern_generate(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Generator,
916                   /*is_parallel=*/std::false_type, _IsVector) noexcept;
917
918template <class _ExecutionPolicy, class _ForwardIterator, class _Generator, class _IsVector>
919_ForwardIterator
920__pattern_generate(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Generator,
921                   /*is_parallel=*/std::true_type, _IsVector);
922
923template <class OutputIterator, class Size, class _Generator>
924OutputIterator __brick_generate_n(OutputIterator, Size, _Generator,
925                                  /* is_vector = */ std::true_type) noexcept;
926
927template <class OutputIterator, class Size, class _Generator>
928OutputIterator __brick_generate_n(OutputIterator, Size, _Generator,
929                                  /* is_vector = */ std::false_type) noexcept;
930
931template <class _ExecutionPolicy, class OutputIterator, class Size, class _Generator, class _IsVector>
932OutputIterator
933__pattern_generate_n(_ExecutionPolicy&&, OutputIterator, Size, _Generator,
934                     /*is_parallel=*/std::false_type, _IsVector) noexcept;
935
936template <class _ExecutionPolicy, class OutputIterator, class Size, class _Generator, class _IsVector>
937OutputIterator
938__pattern_generate_n(_ExecutionPolicy&&, OutputIterator, Size, _Generator,
939                     /*is_parallel=*/std::true_type, _IsVector);
940
941//------------------------------------------------------------------------
942// remove
943//------------------------------------------------------------------------
944template <class _ForwardIterator, class _UnaryPredicate>
945_ForwardIterator __brick_remove_if(_ForwardIterator, _ForwardIterator, _UnaryPredicate,
946                                   /* __is_vector = */ std::false_type) noexcept;
947
948template <class _RandomAccessIterator, class _UnaryPredicate>
949_RandomAccessIterator __brick_remove_if(_RandomAccessIterator, _RandomAccessIterator, _UnaryPredicate,
950                                        /* __is_vector = */ std::true_type) noexcept;
951
952template <class _ExecutionPolicy, class _ForwardIterator, class _UnaryPredicate, class _IsVector>
953_ForwardIterator
954__pattern_remove_if(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _UnaryPredicate, _IsVector,
955                    /*is_parallel*/ std::false_type) noexcept;
956
957template <class _ExecutionPolicy, class _ForwardIterator, class _UnaryPredicate, class _IsVector>
958_ForwardIterator
959__pattern_remove_if(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _UnaryPredicate, _IsVector,
960                    /*is_parallel*/ std::true_type) noexcept;
961
962//------------------------------------------------------------------------
963// merge
964//------------------------------------------------------------------------
965
966template <class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator, class _Compare>
967_OutputIterator __brick_merge(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
968                              _OutputIterator, _Compare,
969                              /* __is_vector = */ std::false_type) noexcept;
970
971template <class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator, class _Compare>
972_OutputIterator __brick_merge(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
973                              _OutputIterator, _Compare,
974                              /* __is_vector = */ std::true_type) noexcept;
975
976template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator,
977          class _Compare, class _IsVector>
978_OutputIterator
979__pattern_merge(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
980                _OutputIterator, _Compare, _IsVector, /* is_parallel = */ std::false_type) noexcept;
981
982template <class _ExecutionPolicy, class _RandomAccessIterator1, class _RandomAccessIterator2, class _OutputIterator,
983          class _Compare, class _IsVector>
984_OutputIterator
985__pattern_merge(_ExecutionPolicy&&, _RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2,
986                _RandomAccessIterator2, _OutputIterator, _Compare, _IsVector,
987                /* is_parallel = */ std::true_type);
988
989//------------------------------------------------------------------------
990// inplace_merge
991//------------------------------------------------------------------------
992
993template <class _BidirectionalIterator, class _Compare>
994void __brick_inplace_merge(_BidirectionalIterator, _BidirectionalIterator, _BidirectionalIterator, _Compare,
995                           /* __is_vector = */ std::false_type) noexcept;
996
997template <class _BidirectionalIterator, class _Compare>
998void __brick_inplace_merge(_BidirectionalIterator, _BidirectionalIterator, _BidirectionalIterator, _Compare,
999                           /* __is_vector = */ std::true_type) noexcept;
1000
1001template <class _ExecutionPolicy, class _BidirectionalIterator, class _Compare, class _IsVector>
1002void
1003__pattern_inplace_merge(_ExecutionPolicy&&, _BidirectionalIterator, _BidirectionalIterator, _BidirectionalIterator,
1004                        _Compare, _IsVector,
1005                        /* is_parallel = */ std::false_type) noexcept;
1006
1007template <class _ExecutionPolicy, class _BidirectionalIterator, class _Compare, class _IsVector>
1008void
1009__pattern_inplace_merge(_ExecutionPolicy&&, _BidirectionalIterator, _BidirectionalIterator, _BidirectionalIterator,
1010                        _Compare, _IsVector,
1011                        /*is_parallel=*/std::true_type);
1012
1013//------------------------------------------------------------------------
1014// includes
1015//------------------------------------------------------------------------
1016
1017template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Compare, class _IsVector>
1018bool
1019__pattern_includes(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
1020                   _Compare, _IsVector,
1021                   /*is_parallel=*/std::false_type) noexcept;
1022
1023template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Compare, class _IsVector>
1024bool
1025__pattern_includes(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
1026                   _Compare, _IsVector,
1027                   /*is_parallel=*/std::true_type);
1028
1029//------------------------------------------------------------------------
1030// set_union
1031//------------------------------------------------------------------------
1032
1033template <class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator, class _Compare>
1034_OutputIterator __brick_set_union(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
1035                                  _OutputIterator, _Compare,
1036                                  /*__is_vector=*/std::false_type) noexcept;
1037
1038template <class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator, class _Compare>
1039_OutputIterator __brick_set_union(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
1040                                  _OutputIterator, _Compare,
1041                                  /*__is_vector=*/std::true_type) noexcept;
1042
1043template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator,
1044          class _Compare, class _IsVector>
1045_OutputIterator
1046__pattern_set_union(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
1047                    _OutputIterator, _Compare, _IsVector, /*is_parallel=*/std::false_type) noexcept;
1048
1049template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator,
1050          class _Compare, class _IsVector>
1051_OutputIterator
1052__pattern_set_union(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
1053                    _OutputIterator, _Compare, _IsVector, /*is_parallel=*/std::true_type);
1054
1055//------------------------------------------------------------------------
1056// set_intersection
1057//------------------------------------------------------------------------
1058
1059template <class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator, class _Compare>
1060_OutputIterator __brick_set_intersection(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
1061                                         _OutputIterator, _Compare,
1062                                         /*__is_vector=*/std::false_type) noexcept;
1063
1064template <class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator, class _Compare>
1065_OutputIterator __brick_set_intersection(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
1066                                         _OutputIterator, _Compare,
1067                                         /*__is_vector=*/std::true_type) noexcept;
1068
1069template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator,
1070          class _Compare, class _IsVector>
1071_OutputIterator
1072__pattern_set_intersection(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2,
1073                           _ForwardIterator2, _OutputIterator, _Compare, _IsVector,
1074                           /*is_parallel=*/std::false_type) noexcept;
1075
1076template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator,
1077          class _Compare, class _IsVector>
1078_OutputIterator
1079__pattern_set_intersection(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2,
1080                           _ForwardIterator2, _OutputIterator, _Compare, _IsVector, /*is_parallel=*/std::true_type);
1081
1082//------------------------------------------------------------------------
1083// set_difference
1084//------------------------------------------------------------------------
1085
1086template <class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator, class _Compare>
1087_OutputIterator __brick_set_difference(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
1088                                       _OutputIterator, _Compare,
1089                                       /*__is_vector=*/std::false_type) noexcept;
1090
1091template <class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator, class _Compare>
1092_OutputIterator __brick_set_difference(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
1093                                       _OutputIterator, _Compare,
1094                                       /*__is_vector=*/std::true_type) noexcept;
1095
1096template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator,
1097          class _Compare, class _IsVector>
1098_OutputIterator
1099__pattern_set_difference(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
1100                         _OutputIterator, _Compare, _IsVector, /*is_parallel=*/std::false_type) noexcept;
1101
1102template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator,
1103          class _Compare, class _IsVector>
1104_OutputIterator
1105__pattern_set_difference(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
1106                         _OutputIterator, _Compare, _IsVector, /*is_parallel=*/std::true_type);
1107
1108//------------------------------------------------------------------------
1109// set_symmetric_difference
1110//------------------------------------------------------------------------
1111
1112template <class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator, class _Compare>
1113_OutputIterator __brick_set_symmetric_difference(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2,
1114                                                 _ForwardIterator2, _OutputIterator, _Compare,
1115                                                 /*__is_vector=*/std::false_type) noexcept;
1116
1117template <class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator, class _Compare>
1118_OutputIterator __brick_set_symmetric_difference(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2,
1119                                                 _ForwardIterator2, _OutputIterator, _Compare,
1120                                                 /*__is_vector=*/std::true_type) noexcept;
1121
1122template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator,
1123          class _Compare, class _IsVector>
1124_OutputIterator
1125__pattern_set_symmetric_difference(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2,
1126                                   _ForwardIterator2, _OutputIterator, _Compare, _IsVector,
1127                                   /*is_parallel=*/std::false_type) noexcept;
1128
1129template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _OutputIterator,
1130          class _Compare, class _IsVector>
1131_OutputIterator
1132__pattern_set_symmetric_difference(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2,
1133                                   _ForwardIterator2, _OutputIterator, _Compare, _IsVector,
1134                                   /*is_parallel=*/std::true_type);
1135
1136//------------------------------------------------------------------------
1137// is_heap_until
1138//------------------------------------------------------------------------
1139
1140template <class _RandomAccessIterator, class _Compare>
1141_RandomAccessIterator __brick_is_heap_until(_RandomAccessIterator, _RandomAccessIterator, _Compare,
1142                                            /* __is_vector = */ std::false_type) noexcept;
1143
1144template <class _RandomAccessIterator, class _Compare>
1145_RandomAccessIterator __brick_is_heap_until(_RandomAccessIterator, _RandomAccessIterator, _Compare,
1146                                            /* __is_vector = */ std::true_type) noexcept;
1147
1148template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare, class _IsVector>
1149_RandomAccessIterator
1150__pattern_is_heap_until(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _Compare, _IsVector,
1151                        /* is_parallel = */ std::false_type) noexcept;
1152
1153template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare, class _IsVector>
1154_RandomAccessIterator
1155__pattern_is_heap_until(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _Compare, _IsVector,
1156                        /* is_parallel = */ std::true_type) noexcept;
1157
1158//------------------------------------------------------------------------
1159// min_element
1160//------------------------------------------------------------------------
1161
1162template <typename _ForwardIterator, typename _Compare>
1163_ForwardIterator __brick_min_element(_ForwardIterator, _ForwardIterator, _Compare,
1164                                     /* __is_vector = */ std::false_type) noexcept;
1165
1166template <typename _ForwardIterator, typename _Compare>
1167_ForwardIterator __brick_min_element(_ForwardIterator, _ForwardIterator, _Compare,
1168                                     /* __is_vector = */ std::true_type) noexcept;
1169
1170template <typename _ExecutionPolicy, typename _ForwardIterator, typename _Compare, typename _IsVector>
1171_ForwardIterator
1172__pattern_min_element(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Compare, _IsVector,
1173                      /* is_parallel = */ std::false_type) noexcept;
1174
1175template <typename _ExecutionPolicy, typename _RandomAccessIterator, typename _Compare, typename _IsVector>
1176_RandomAccessIterator
1177__pattern_min_element(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _Compare, _IsVector,
1178                      /* is_parallel = */ std::true_type);
1179
1180//------------------------------------------------------------------------
1181// minmax_element
1182//------------------------------------------------------------------------
1183
1184template <typename _ForwardIterator, typename _Compare>
1185std::pair<_ForwardIterator, _ForwardIterator> __brick_minmax_element(_ForwardIterator, _ForwardIterator, _Compare,
1186                                                                     /* __is_vector = */ std::false_type) noexcept;
1187
1188template <typename _ForwardIterator, typename _Compare>
1189std::pair<_ForwardIterator, _ForwardIterator> __brick_minmax_element(_ForwardIterator, _ForwardIterator, _Compare,
1190                                                                     /* __is_vector = */ std::true_type) noexcept;
1191
1192template <typename _ExecutionPolicy, typename _ForwardIterator, typename _Compare, typename _IsVector>
1193std::pair<_ForwardIterator, _ForwardIterator>
1194__pattern_minmax_element(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Compare, _IsVector,
1195                         /* is_parallel = */ std::false_type) noexcept;
1196
1197template <typename _ExecutionPolicy, typename _ForwardIterator, typename _Compare, typename _IsVector>
1198std::pair<_ForwardIterator, _ForwardIterator>
1199__pattern_minmax_element(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Compare, _IsVector,
1200                         /* is_parallel = */ std::true_type);
1201
1202//------------------------------------------------------------------------
1203// mismatch
1204//------------------------------------------------------------------------
1205
1206template <class _ForwardIterator1, class _ForwardIterator2, class _Predicate>
1207std::pair<_ForwardIterator1, _ForwardIterator2> __brick_mismatch(_ForwardIterator1, _ForwardIterator1,
1208                                                                 _ForwardIterator2, _ForwardIterator2, _Predicate,
1209                                                                 /* __is_vector = */ std::false_type) noexcept;
1210
1211template <class _ForwardIterator1, class _ForwardIterator2, class _Predicate>
1212std::pair<_ForwardIterator1, _ForwardIterator2> __brick_mismatch(_ForwardIterator1, _ForwardIterator1,
1213                                                                 _ForwardIterator2, _ForwardIterator2, _Predicate,
1214                                                                 /* __is_vector = */ std::true_type) noexcept;
1215
1216template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Predicate, class _IsVector>
1217std::pair<_ForwardIterator1, _ForwardIterator2>
1218__pattern_mismatch(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
1219                   _Predicate, _IsVector,
1220                   /* is_parallel = */ std::false_type) noexcept;
1221
1222template <class _ExecutionPolicy, class _RandomAccessIterator1, class _RandomAccessIterator2, class _Predicate,
1223          class _IsVector>
1224std::pair<_RandomAccessIterator1, _RandomAccessIterator2>
1225__pattern_mismatch(_ExecutionPolicy&&, _RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2,
1226                   _RandomAccessIterator2, _Predicate, _IsVector, /* is_parallel = */ std::true_type) noexcept;
1227
1228//------------------------------------------------------------------------
1229// lexicographical_compare
1230//------------------------------------------------------------------------
1231
1232template <class _ForwardIterator1, class _ForwardIterator2, class _Compare>
1233bool __brick_lexicographical_compare(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
1234                                     _Compare,
1235                                     /* __is_vector = */ std::false_type) noexcept;
1236
1237template <class _ForwardIterator1, class _ForwardIterator2, class _Compare>
1238bool __brick_lexicographical_compare(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2,
1239                                     _Compare,
1240                                     /* __is_vector = */ std::true_type) noexcept;
1241
1242template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Compare, class _IsVector>
1243bool
1244__pattern_lexicographical_compare(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2,
1245                                  _ForwardIterator2, _Compare, _IsVector, /* is_parallel = */ std::false_type) noexcept;
1246
1247template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Compare, class _IsVector>
1248bool
1249__pattern_lexicographical_compare(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2,
1250                                  _ForwardIterator2, _Compare, _IsVector, /* is_parallel = */ std::true_type) noexcept;
1251
1252} // namespace __internal
1253} // namespace __pstl
1254#endif /* _PSTL_ALGORITHM_FWD_H */
1255