1// <parallel/algorithm> Forward declarations -*- C++ -*-
2
3// Copyright (C) 2007-2022 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library.  This library is free
6// software; you can redistribute it and/or modify it under the terms
7// of the GNU General Public License as published by the Free Software
8// Foundation; either version 3, or (at your option) any later
9// version.
10
11// This library is distributed in the hope that it will be useful, but
12// WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14// General Public License for more details.
15
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23// <http://www.gnu.org/licenses/>.
24
25/** @file parallel/algorithmfwd.h
26 *  This file is a GNU parallel extension to the Standard C++ Library.
27 */
28
29#ifndef _GLIBCXX_PARALLEL_ALGORITHMFWD_H
30#define _GLIBCXX_PARALLEL_ALGORITHMFWD_H 1
31
32#pragma GCC system_header
33
34#include <parallel/tags.h>
35#include <parallel/settings.h>
36
37namespace std _GLIBCXX_VISIBILITY(default)
38{
39namespace __parallel
40{
41  template<typename _FIter>
42    _FIter
43    adjacent_find(_FIter, _FIter);
44
45  template<typename _FIter>
46    _FIter
47    adjacent_find(_FIter, _FIter, __gnu_parallel::sequential_tag);
48
49  template<typename _FIter, typename _IterTag>
50    _FIter
51    __adjacent_find_switch(_FIter, _FIter, _IterTag);
52
53  template<typename _RAIter>
54    _RAIter
55    __adjacent_find_switch(_RAIter, _RAIter, random_access_iterator_tag);
56
57
58  template<typename _FIter, typename _BiPredicate>
59    _FIter
60    adjacent_find(_FIter, _FIter, _BiPredicate);
61
62  template<typename _FIter, typename _BiPredicate>
63    _FIter
64    adjacent_find(_FIter, _FIter, _BiPredicate,
65                  __gnu_parallel::sequential_tag);
66
67  template<typename _FIter, typename _BiPredicate, typename _IterTag>
68    _FIter
69    __adjacent_find_switch(_FIter, _FIter, _BiPredicate, _IterTag);
70
71  template<typename _RAIter, typename _BiPredicate>
72    _RAIter
73    __adjacent_find_switch(_RAIter, _RAIter, _BiPredicate,
74                         random_access_iterator_tag);
75
76
77  template<typename _IIter, typename _Tp>
78    typename iterator_traits<_IIter>::difference_type
79    count(_IIter, _IIter, const _Tp&);
80
81  template<typename _IIter, typename _Tp>
82    typename iterator_traits<_IIter>::difference_type
83    count(_IIter, _IIter, const _Tp&, __gnu_parallel::sequential_tag);
84
85  template<typename _IIter, typename _Tp>
86    typename iterator_traits<_IIter>::difference_type
87    count(_IIter, _IIter, const _Tp&, __gnu_parallel::_Parallelism);
88
89  template<typename _IIter, typename _Tp, typename _IterTag>
90    typename iterator_traits<_IIter>::difference_type
91    __count_switch(_IIter, _IIter, const _Tp&, _IterTag);
92
93  template<typename _RAIter, typename _Tp>
94    typename iterator_traits<_RAIter>::difference_type
95    __count_switch(_RAIter, _RAIter, const _Tp&, random_access_iterator_tag,
96                 __gnu_parallel::_Parallelism __parallelism
97                 = __gnu_parallel::parallel_unbalanced);
98
99
100  template<typename _IIter, typename _Predicate>
101    typename iterator_traits<_IIter>::difference_type
102    count_if(_IIter, _IIter, _Predicate);
103
104  template<typename _IIter, typename _Predicate>
105    typename iterator_traits<_IIter>::difference_type
106    count_if(_IIter, _IIter, _Predicate, __gnu_parallel::sequential_tag);
107
108  template<typename _IIter, typename _Predicate>
109    typename iterator_traits<_IIter>::difference_type
110    count_if(_IIter, _IIter, _Predicate, __gnu_parallel::_Parallelism);
111
112  template<typename _IIter, typename _Predicate, typename _IterTag>
113    typename iterator_traits<_IIter>::difference_type
114    __count_if_switch(_IIter, _IIter, _Predicate, _IterTag);
115
116  template<typename _RAIter, typename _Predicate>
117    typename iterator_traits<_RAIter>::difference_type
118    __count_if_switch(_RAIter, _RAIter, _Predicate, random_access_iterator_tag,
119                    __gnu_parallel::_Parallelism __parallelism
120                    = __gnu_parallel::parallel_unbalanced);
121
122  // algobase.h
123  template<typename _IIter1, typename _IIter2>
124    bool
125    equal(_IIter1, _IIter1, _IIter2, __gnu_parallel::sequential_tag);
126
127  template<typename _IIter1, typename _IIter2, typename _Predicate>
128    bool
129    equal(_IIter1, _IIter1, _IIter2, _Predicate,
130          __gnu_parallel::sequential_tag);
131
132  template<typename _IIter1, typename _IIter2>
133    _GLIBCXX20_CONSTEXPR
134    bool
135    equal(_IIter1, _IIter1, _IIter2);
136
137  template<typename _IIter1, typename _IIter2, typename _Predicate>
138    _GLIBCXX20_CONSTEXPR
139    bool
140    equal(_IIter1, _IIter1, _IIter2, _Predicate);
141
142  template<typename _IIter, typename _Tp>
143    _IIter
144    find(_IIter, _IIter, const _Tp&, __gnu_parallel::sequential_tag);
145
146  template<typename _IIter, typename _Tp>
147    _IIter
148    find(_IIter, _IIter, const _Tp& __val);
149
150  template<typename _IIter, typename _Tp, typename _IterTag>
151    _IIter
152    __find_switch(_IIter, _IIter, const _Tp&, _IterTag);
153
154  template<typename _RAIter, typename _Tp>
155    _RAIter
156    __find_switch(_RAIter, _RAIter, const _Tp&, random_access_iterator_tag);
157
158  template<typename _IIter, typename _Predicate>
159    _IIter
160    find_if(_IIter, _IIter, _Predicate, __gnu_parallel::sequential_tag);
161
162  template<typename _IIter, typename _Predicate>
163    _IIter
164    find_if(_IIter, _IIter, _Predicate);
165
166  template<typename _IIter, typename _Predicate, typename _IterTag>
167    _IIter
168    __find_if_switch(_IIter, _IIter, _Predicate, _IterTag);
169
170  template<typename _RAIter, typename _Predicate>
171    _RAIter
172    __find_if_switch(_RAIter, _RAIter, _Predicate, random_access_iterator_tag);
173
174  template<typename _IIter, typename _FIter>
175    _IIter
176    find_first_of(_IIter, _IIter, _FIter, _FIter,
177                  __gnu_parallel::sequential_tag);
178
179  template<typename _IIter, typename _FIter, typename _BiPredicate>
180    _IIter
181    find_first_of(_IIter, _IIter, _FIter, _FIter, _BiPredicate,
182                  __gnu_parallel::sequential_tag);
183
184  template<typename _IIter, typename _FIter, typename _BiPredicate>
185    _IIter
186    find_first_of(_IIter, _IIter, _FIter, _FIter, _BiPredicate);
187
188  template<typename _IIter, typename _FIter>
189    _IIter
190    find_first_of(_IIter, _IIter, _FIter, _FIter);
191
192  template<typename _IIter, typename _FIter,
193           typename _IterTag1, typename _IterTag2>
194    _IIter
195    __find_first_of_switch(
196      _IIter, _IIter, _FIter, _FIter, _IterTag1, _IterTag2);
197
198  template<typename _RAIter, typename _FIter, typename _BiPredicate,
199           typename _IterTag>
200    _RAIter
201    __find_first_of_switch(_RAIter, _RAIter, _FIter, _FIter, _BiPredicate,
202                         random_access_iterator_tag, _IterTag);
203
204  template<typename _IIter, typename _FIter, typename _BiPredicate,
205           typename _IterTag1, typename _IterTag2>
206    _IIter
207    __find_first_of_switch(_IIter, _IIter, _FIter, _FIter, _BiPredicate,
208                         _IterTag1, _IterTag2);
209
210
211  template<typename _IIter, typename _Function>
212    _Function
213    for_each(_IIter, _IIter, _Function);
214
215  template<typename _IIter, typename _Function>
216    _Function
217    for_each(_IIter, _IIter, _Function, __gnu_parallel::sequential_tag);
218
219  template<typename _Iterator, typename _Function>
220    _Function
221    for_each(_Iterator, _Iterator, _Function, __gnu_parallel::_Parallelism);
222
223  template<typename _IIter, typename _Function, typename _IterTag>
224    _Function
225    __for_each_switch(_IIter, _IIter, _Function, _IterTag);
226
227  template<typename _RAIter, typename _Function>
228    _Function
229    __for_each_switch(_RAIter, _RAIter, _Function, random_access_iterator_tag,
230                    __gnu_parallel::_Parallelism  __parallelism
231                    = __gnu_parallel::parallel_balanced);
232
233
234  template<typename _FIter, typename _Generator>
235    void
236    generate(_FIter, _FIter, _Generator);
237
238  template<typename _FIter, typename _Generator>
239    void
240    generate(_FIter, _FIter, _Generator, __gnu_parallel::sequential_tag);
241
242  template<typename _FIter, typename _Generator>
243    void
244    generate(_FIter, _FIter, _Generator, __gnu_parallel::_Parallelism);
245
246  template<typename _FIter, typename _Generator, typename _IterTag>
247    void
248    __generate_switch(_FIter, _FIter, _Generator, _IterTag);
249
250  template<typename _RAIter, typename _Generator>
251    void
252    __generate_switch(_RAIter, _RAIter, _Generator, random_access_iterator_tag,
253                    __gnu_parallel::_Parallelism __parallelism
254                    = __gnu_parallel::parallel_balanced);
255
256  template<typename _OIter, typename _Size, typename _Generator>
257    _OIter
258    generate_n(_OIter, _Size, _Generator);
259
260  template<typename _OIter, typename _Size, typename _Generator>
261    _OIter
262    generate_n(_OIter, _Size, _Generator, __gnu_parallel::sequential_tag);
263
264  template<typename _OIter, typename _Size, typename _Generator>
265    _OIter
266    generate_n(_OIter, _Size, _Generator, __gnu_parallel::_Parallelism);
267
268  template<typename _OIter, typename _Size, typename _Generator,
269           typename _IterTag>
270    _OIter
271    __generate_n_switch(_OIter, _Size, _Generator, _IterTag);
272
273  template<typename _RAIter, typename _Size, typename _Generator>
274    _RAIter
275    __generate_n_switch(_RAIter, _Size, _Generator, random_access_iterator_tag,
276                      __gnu_parallel::_Parallelism __parallelism
277                      = __gnu_parallel::parallel_balanced);
278
279  template<typename _IIter1, typename _IIter2>
280    bool
281    lexicographical_compare(_IIter1, _IIter1, _IIter2, _IIter2,
282                            __gnu_parallel::sequential_tag);
283
284  template<typename _IIter1, typename _IIter2, typename _Predicate>
285    bool
286    lexicographical_compare(_IIter1, _IIter1, _IIter2, _IIter2, _Predicate,
287                            __gnu_parallel::sequential_tag);
288
289  template<typename _IIter1, typename _IIter2>
290    _GLIBCXX20_CONSTEXPR
291    bool
292    lexicographical_compare(_IIter1, _IIter1, _IIter2, _IIter2);
293
294  template<typename _IIter1, typename _IIter2, typename _Predicate>
295    _GLIBCXX20_CONSTEXPR
296    bool
297    lexicographical_compare(_IIter1, _IIter1, _IIter2, _IIter2, _Predicate);
298
299  template<typename _IIter1, typename _IIter2,
300           typename _Predicate, typename _IterTag1, typename _IterTag2>
301    bool
302    __lexicographical_compare_switch(_IIter1, _IIter1, _IIter2, _IIter2,
303                                   _Predicate, _IterTag1, _IterTag2);
304
305  template<typename _RAIter1, typename _RAIter2, typename _Predicate>
306    bool
307    __lexicographical_compare_switch(_RAIter1, _RAIter1, _RAIter2, _RAIter2,
308                                   _Predicate, random_access_iterator_tag,
309                                   random_access_iterator_tag);
310
311  // algo.h
312  template<typename _IIter1, typename _IIter2>
313    pair<_IIter1, _IIter2>
314    mismatch(_IIter1, _IIter1, _IIter2, __gnu_parallel::sequential_tag);
315
316  template<typename _IIter1, typename _IIter2, typename _Predicate>
317    pair<_IIter1, _IIter2>
318    mismatch(_IIter1, _IIter1, _IIter2, _Predicate,
319             __gnu_parallel::sequential_tag);
320
321  template<typename _IIter1, typename _IIter2>
322    pair<_IIter1, _IIter2>
323    mismatch(_IIter1, _IIter1, _IIter2);
324
325  template<typename _IIter1, typename _IIter2, typename _Predicate>
326    pair<_IIter1, _IIter2>
327    mismatch(_IIter1, _IIter1, _IIter2, _Predicate);
328
329  template<typename _IIter1, typename _IIter2, typename _Predicate,
330           typename _IterTag1, typename _IterTag2>
331    pair<_IIter1, _IIter2>
332    __mismatch_switch(_IIter1, _IIter1, _IIter2, _Predicate,
333                    _IterTag1, _IterTag2);
334
335  template<typename _RAIter1, typename _RAIter2, typename _Predicate>
336    pair<_RAIter1, _RAIter2>
337    __mismatch_switch(_RAIter1, _RAIter1, _RAIter2, _Predicate,
338                    random_access_iterator_tag, random_access_iterator_tag);
339
340  template<typename _FIter1, typename _FIter2>
341    _FIter1
342    search(_FIter1, _FIter1, _FIter2, _FIter2, __gnu_parallel::sequential_tag);
343
344  template<typename _FIter1, typename _FIter2>
345    _FIter1
346    search(_FIter1, _FIter1, _FIter2, _FIter2);
347
348  template<typename _FIter1, typename _FIter2, typename _BiPredicate>
349    _FIter1
350    search(_FIter1, _FIter1, _FIter2, _FIter2, _BiPredicate,
351           __gnu_parallel::sequential_tag);
352
353  template<typename _FIter1, typename _FIter2, typename _BiPredicate>
354    _FIter1
355    search(_FIter1, _FIter1, _FIter2, _FIter2, _BiPredicate);
356
357  template<typename _RAIter1, typename _RAIter2>
358    _RAIter1
359    __search_switch(_RAIter1, _RAIter1, _RAIter2, _RAIter2,
360                  random_access_iterator_tag, random_access_iterator_tag);
361
362  template<typename _FIter1, typename _FIter2, typename _IterTag1,
363           typename _IterTag2>
364    _FIter1
365    __search_switch(_FIter1, _FIter1, _FIter2, _FIter2, _IterTag1, _IterTag2);
366
367  template<typename _RAIter1, typename _RAIter2, typename _BiPredicate>
368    _RAIter1
369    __search_switch(_RAIter1, _RAIter1, _RAIter2, _RAIter2, _BiPredicate,
370                  random_access_iterator_tag, random_access_iterator_tag);
371
372  template<typename _FIter1, typename _FIter2, typename _BiPredicate,
373           typename _IterTag1, typename _IterTag2>
374    _FIter1
375    __search_switch(_FIter1, _FIter1, _FIter2, _FIter2, _BiPredicate,
376                  _IterTag1, _IterTag2);
377
378  template<typename _FIter, typename _Integer, typename _Tp>
379    _FIter
380    search_n(_FIter, _FIter, _Integer, const _Tp&,
381             __gnu_parallel::sequential_tag);
382
383  template<typename _FIter, typename _Integer, typename _Tp,
384           typename _BiPredicate>
385    _FIter
386    search_n(_FIter, _FIter, _Integer, const _Tp&, _BiPredicate,
387             __gnu_parallel::sequential_tag);
388
389  template<typename _FIter, typename _Integer, typename _Tp>
390    _FIter
391    search_n(_FIter, _FIter, _Integer, const _Tp&);
392
393  template<typename _FIter, typename _Integer, typename _Tp,
394           typename _BiPredicate>
395    _FIter
396    search_n(_FIter, _FIter, _Integer, const _Tp&, _BiPredicate);
397
398  template<typename _RAIter, typename _Integer, typename _Tp,
399           typename _BiPredicate>
400    _RAIter
401    __search_n_switch(_RAIter, _RAIter, _Integer, const _Tp&,
402                    _BiPredicate, random_access_iterator_tag);
403
404  template<typename _FIter, typename _Integer, typename _Tp,
405           typename _BiPredicate, typename _IterTag>
406    _FIter
407    __search_n_switch(_FIter, _FIter, _Integer, const _Tp&,
408                    _BiPredicate, _IterTag);
409
410
411  template<typename _IIter, typename _OIter, typename _UnaryOperation>
412    _OIter
413    transform(_IIter, _IIter, _OIter, _UnaryOperation);
414
415  template<typename _IIter, typename _OIter, typename _UnaryOperation>
416    _OIter
417    transform(_IIter, _IIter, _OIter, _UnaryOperation,
418              __gnu_parallel::sequential_tag);
419
420  template<typename _IIter, typename _OIter, typename _UnaryOperation>
421    _OIter
422    transform(_IIter, _IIter, _OIter, _UnaryOperation,
423              __gnu_parallel::_Parallelism);
424
425  template<typename _IIter, typename _OIter, typename _UnaryOperation,
426           typename _IterTag1, typename _IterTag2>
427    _OIter
428    __transform1_switch(_IIter, _IIter, _OIter, _UnaryOperation,
429                      _IterTag1, _IterTag2);
430
431
432  template<typename _RAIIter, typename _RAOIter, typename _UnaryOperation>
433    _RAOIter
434    __transform1_switch(_RAIIter, _RAIIter, _RAOIter, _UnaryOperation,
435                      random_access_iterator_tag, random_access_iterator_tag,
436                      __gnu_parallel::_Parallelism __parallelism
437                      = __gnu_parallel::parallel_balanced);
438
439
440  template<typename _IIter1, typename _IIter2, typename _OIter,
441           typename _BiOperation>
442    _OIter
443    transform(_IIter1, _IIter1, _IIter2, _OIter, _BiOperation);
444
445  template<typename _IIter1, typename _IIter2, typename _OIter,
446           typename _BiOperation>
447    _OIter
448    transform(_IIter1, _IIter1, _IIter2, _OIter, _BiOperation,
449              __gnu_parallel::sequential_tag);
450
451  template<typename _IIter1, typename _IIter2, typename _OIter,
452           typename _BiOperation>
453    _OIter
454    transform(_IIter1, _IIter1, _IIter2, _OIter, _BiOperation,
455              __gnu_parallel::_Parallelism);
456
457  template<typename _RAIter1, typename _RAIter2, typename _RAIter3,
458           typename _BiOperation>
459    _RAIter3
460    __transform2_switch(_RAIter1, _RAIter1, _RAIter2, _RAIter3, _BiOperation,
461                      random_access_iterator_tag, random_access_iterator_tag,
462                      random_access_iterator_tag,
463                      __gnu_parallel::_Parallelism __parallelism
464                      = __gnu_parallel::parallel_balanced);
465
466  template<typename _IIter1, typename _IIter2, typename _OIter,
467           typename _BiOperation, typename _Tag1,
468           typename _Tag2, typename _Tag3>
469    _OIter
470    __transform2_switch(_IIter1, _IIter1, _IIter2, _OIter, _BiOperation,
471                      _Tag1, _Tag2, _Tag3);
472
473
474  template<typename _FIter, typename _Tp>
475    void
476    replace(_FIter, _FIter, const _Tp&, const _Tp&);
477
478  template<typename _FIter, typename _Tp>
479    void
480    replace(_FIter, _FIter, const _Tp&, const _Tp&,
481            __gnu_parallel::sequential_tag);
482
483  template<typename _FIter, typename _Tp>
484    void
485    replace(_FIter, _FIter, const _Tp&, const _Tp&,
486            __gnu_parallel::_Parallelism);
487
488  template<typename _FIter, typename _Tp, typename _IterTag>
489    void
490    __replace_switch(_FIter, _FIter, const _Tp&, const _Tp&, _IterTag);
491
492  template<typename _RAIter, typename _Tp>
493    void
494    __replace_switch(_RAIter, _RAIter, const _Tp&, const _Tp&,
495                   random_access_iterator_tag, __gnu_parallel::_Parallelism);
496
497
498  template<typename _FIter, typename _Predicate, typename _Tp>
499    void
500    replace_if(_FIter, _FIter, _Predicate, const _Tp&);
501
502  template<typename _FIter, typename _Predicate, typename _Tp>
503    void
504    replace_if(_FIter, _FIter, _Predicate, const _Tp&,
505               __gnu_parallel::sequential_tag);
506
507  template<typename _FIter, typename _Predicate, typename _Tp>
508    void
509    replace_if(_FIter, _FIter, _Predicate, const _Tp&,
510               __gnu_parallel::_Parallelism);
511
512  template<typename _FIter, typename _Predicate, typename _Tp,
513           typename _IterTag>
514    void
515    __replace_if_switch(_FIter, _FIter, _Predicate, const _Tp&, _IterTag);
516
517  template<typename _RAIter, typename _Predicate, typename _Tp>
518    void
519    __replace_if_switch(_RAIter, _RAIter, _Predicate, const _Tp&,
520                      random_access_iterator_tag,
521                      __gnu_parallel::_Parallelism);
522
523
524  template<typename _FIter>
525    _FIter
526    max_element(_FIter, _FIter);
527
528  template<typename _FIter>
529    _FIter
530    max_element(_FIter, _FIter, __gnu_parallel::sequential_tag);
531
532  template<typename _FIter>
533    _FIter
534    max_element(_FIter, _FIter, __gnu_parallel::_Parallelism);
535
536  template<typename _FIter, typename _Compare>
537    _FIter
538    max_element(_FIter, _FIter, _Compare);
539
540  template<typename _FIter, typename _Compare>
541    _FIter
542    max_element(_FIter, _FIter, _Compare, __gnu_parallel::sequential_tag);
543
544  template<typename _FIter, typename _Compare>
545    _FIter
546    max_element(_FIter, _FIter, _Compare, __gnu_parallel::_Parallelism);
547
548  template<typename _FIter, typename _Compare, typename _IterTag>
549    _FIter
550    __max_element_switch(_FIter, _FIter, _Compare, _IterTag);
551
552  template<typename _RAIter, typename _Compare>
553    _RAIter
554    __max_element_switch(
555      _RAIter, _RAIter, _Compare, random_access_iterator_tag,
556      __gnu_parallel::_Parallelism __parallelism
557      = __gnu_parallel::parallel_balanced);
558
559
560  template<typename _IIter1, typename _IIter2, typename _OIter>
561    _OIter
562    merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
563          __gnu_parallel::sequential_tag);
564
565  template<typename _IIter1, typename _IIter2, typename _OIter,
566           typename _Compare>
567    _OIter
568    merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare,
569          __gnu_parallel::sequential_tag);
570
571  template<typename _IIter1, typename _IIter2, typename _OIter,
572           typename _Compare>
573    _OIter
574    merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);
575
576  template<typename _IIter1, typename _IIter2, typename _OIter>
577    _OIter
578    merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
579
580  template<typename _IIter1, typename _IIter2, typename _OIter,
581           typename _Compare, typename _IterTag1, typename _IterTag2,
582           typename _IterTag3>
583    _OIter
584    __merge_switch(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare,
585                 _IterTag1, _IterTag2, _IterTag3);
586
587  template<typename _IIter1, typename _IIter2, typename _OIter,
588           typename _Compare>
589    _OIter
590    __merge_switch(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare,
591                 random_access_iterator_tag, random_access_iterator_tag,
592                 random_access_iterator_tag);
593
594
595  template<typename _FIter>
596    _FIter
597    min_element(_FIter, _FIter);
598
599  template<typename _FIter>
600    _FIter
601    min_element(_FIter, _FIter, __gnu_parallel::sequential_tag);
602
603  template<typename _FIter>
604    _FIter
605    min_element(_FIter, _FIter,
606                __gnu_parallel::_Parallelism __parallelism_tag);
607
608  template<typename _FIter, typename _Compare>
609    _FIter
610    min_element(_FIter, _FIter, _Compare);
611
612  template<typename _FIter, typename _Compare>
613    _FIter
614    min_element(_FIter, _FIter, _Compare, __gnu_parallel::sequential_tag);
615
616  template<typename _FIter, typename _Compare>
617    _FIter
618    min_element(_FIter, _FIter, _Compare, __gnu_parallel::_Parallelism);
619
620  template<typename _FIter, typename _Compare, typename _IterTag>
621    _FIter
622    __min_element_switch(_FIter, _FIter, _Compare, _IterTag);
623
624  template<typename _RAIter, typename _Compare>
625    _RAIter
626    __min_element_switch(
627      _RAIter, _RAIter, _Compare, random_access_iterator_tag,
628      __gnu_parallel::_Parallelism __parallelism
629      = __gnu_parallel::parallel_balanced);
630
631  template<typename _RAIter>
632    void
633    nth_element(_RAIter, _RAIter, _RAIter, __gnu_parallel::sequential_tag);
634
635  template<typename _RAIter, typename _Compare>
636    void
637    nth_element(_RAIter, _RAIter, _RAIter, _Compare,
638                __gnu_parallel::sequential_tag);
639
640  template<typename _RAIter, typename _Compare>
641    void
642    nth_element(_RAIter, _RAIter, _RAIter, _Compare);
643
644  template<typename _RAIter>
645    void
646    nth_element(_RAIter, _RAIter, _RAIter);
647
648  template<typename _RAIter, typename _Compare>
649    void
650    partial_sort(_RAIter, _RAIter, _RAIter, _Compare,
651                 __gnu_parallel::sequential_tag);
652
653  template<typename _RAIter>
654    void
655    partial_sort(_RAIter, _RAIter, _RAIter, __gnu_parallel::sequential_tag);
656
657  template<typename _RAIter, typename _Compare>
658    void
659    partial_sort(_RAIter, _RAIter, _RAIter, _Compare);
660
661  template<typename _RAIter>
662    void
663    partial_sort(_RAIter, _RAIter, _RAIter);
664
665  template<typename _FIter, typename _Predicate>
666    _FIter
667    partition(_FIter, _FIter, _Predicate, __gnu_parallel::sequential_tag);
668
669  template<typename _FIter, typename _Predicate>
670    _FIter
671    partition(_FIter, _FIter, _Predicate);
672
673  template<typename _FIter, typename _Predicate, typename _IterTag>
674    _FIter
675    __partition_switch(_FIter, _FIter, _Predicate, _IterTag);
676
677  template<typename _RAIter, typename _Predicate>
678    _RAIter
679    __partition_switch(
680      _RAIter, _RAIter, _Predicate, random_access_iterator_tag);
681
682  template<typename _RAIter>
683    void
684    random_shuffle(_RAIter, _RAIter, __gnu_parallel::sequential_tag);
685
686  template<typename _RAIter, typename _RandomNumberGenerator>
687    void
688    random_shuffle(_RAIter, _RAIter, _RandomNumberGenerator&,
689                   __gnu_parallel::sequential_tag);
690
691  template<typename _RAIter>
692    void
693    random_shuffle(_RAIter, _RAIter);
694
695  template<typename _RAIter, typename _RandomNumberGenerator>
696    void
697    random_shuffle(_RAIter, _RAIter,
698#if __cplusplus >= 201103L
699		   _RandomNumberGenerator&&);
700#else
701		   _RandomNumberGenerator&);
702#endif
703
704  template<typename _IIter1, typename _IIter2, typename _OIter>
705    _OIter
706    set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
707            __gnu_parallel::sequential_tag);
708
709  template<typename _IIter1, typename _IIter2, typename _OIter,
710           typename _Predicate>
711    _OIter
712    set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Predicate,
713              __gnu_parallel::sequential_tag);
714
715  template<typename _IIter1, typename _IIter2, typename _OIter>
716    _OIter
717    set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
718
719  template<typename _IIter1, typename _IIter2, typename _OIter,
720           typename _Predicate>
721    _OIter
722    set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Predicate);
723
724  template<typename _IIter1, typename _IIter2, typename _Predicate,
725           typename _OIter, typename _IterTag1, typename _IterTag2,
726           typename _IterTag3>
727    _OIter
728    __set_union_switch(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
729                     _Predicate, _IterTag1, _IterTag2, _IterTag3);
730
731  template<typename _RAIter1, typename _RAIter2, typename _Output_RAIter,
732           typename _Predicate>
733    _Output_RAIter
734    __set_union_switch(_RAIter1, _RAIter1, _RAIter2, _RAIter2, _Output_RAIter,
735                     _Predicate, random_access_iterator_tag,
736                     random_access_iterator_tag, random_access_iterator_tag);
737
738  template<typename _IIter1, typename _IIter2, typename _OIter>
739    _OIter
740    set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
741                     __gnu_parallel::sequential_tag);
742
743  template<typename _IIter1, typename _IIter2, typename _OIter,
744           typename _Predicate>
745    _OIter
746    set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Predicate,
747                     __gnu_parallel::sequential_tag);
748
749  template<typename _IIter1, typename _IIter2, typename _OIter>
750    _OIter
751    set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
752
753  template<typename _IIter1, typename _IIter2, typename _OIter,
754           typename _Predicate>
755    _OIter
756    set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Predicate);
757
758  template<typename _IIter1, typename _IIter2, typename _Predicate,
759           typename _OIter, typename _IterTag1, typename _IterTag2,
760           typename _IterTag3>
761    _OIter
762    __set_intersection_switch(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
763                            _Predicate, _IterTag1, _IterTag2, _IterTag3);
764
765  template<typename _RAIter1, typename _RAIter2, typename _Output_RAIter,
766           typename _Predicate>
767    _Output_RAIter
768    __set_intersection_switch(_RAIter1, _RAIter1, _RAIter2, _RAIter2,
769                            _Output_RAIter, _Predicate,
770                            random_access_iterator_tag,
771                            random_access_iterator_tag,
772                            random_access_iterator_tag);
773
774  template<typename _IIter1, typename _IIter2, typename _OIter>
775    _OIter
776    set_symmetric_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
777                             __gnu_parallel::sequential_tag);
778
779  template<typename _IIter1, typename _IIter2, typename _OIter,
780           typename _Predicate>
781    _OIter
782    set_symmetric_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
783                             _Predicate, __gnu_parallel::sequential_tag);
784
785  template<typename _IIter1, typename _IIter2, typename _OIter>
786    _OIter
787    set_symmetric_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
788
789  template<typename _IIter1, typename _IIter2, typename _OIter,
790           typename _Predicate>
791    _OIter
792    set_symmetric_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
793                             _Predicate);
794
795  template<typename _IIter1, typename _IIter2, typename _Predicate,
796           typename _OIter, typename _IterTag1, typename _IterTag2,
797           typename _IterTag3>
798    _OIter
799    __set_symmetric_difference_switch(_IIter1, _IIter1, _IIter2, _IIter2,
800                                    _OIter, _Predicate, _IterTag1, _IterTag2,
801                                    _IterTag3);
802
803  template<typename _RAIter1, typename _RAIter2, typename _Output_RAIter,
804           typename _Predicate>
805    _Output_RAIter
806    __set_symmetric_difference_switch(_RAIter1, _RAIter1, _RAIter2, _RAIter2,
807                                    _Output_RAIter, _Predicate,
808                                    random_access_iterator_tag,
809                                    random_access_iterator_tag,
810                                    random_access_iterator_tag);
811
812
813  template<typename _IIter1, typename _IIter2, typename _OIter>
814    _OIter
815    set_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
816                   __gnu_parallel::sequential_tag);
817
818  template<typename _IIter1, typename _IIter2, typename _OIter,
819           typename _Predicate>
820    _OIter
821    set_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Predicate,
822                   __gnu_parallel::sequential_tag);
823
824  template<typename _IIter1, typename _IIter2, typename _OIter>
825    _OIter
826    set_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
827
828  template<typename _IIter1, typename _IIter2, typename _OIter,
829           typename _Predicate>
830    _OIter
831    set_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Predicate);
832
833  template<typename _IIter1, typename _IIter2, typename _Predicate,
834           typename _OIter, typename _IterTag1, typename _IterTag2,
835           typename _IterTag3>
836    _OIter
837    __set_difference_switch(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
838                          _Predicate, _IterTag1, _IterTag2, _IterTag3);
839
840  template<typename _RAIter1, typename _RAIter2, typename _Output_RAIter,
841           typename _Predicate>
842    _Output_RAIter
843    __set_difference_switch(_RAIter1, _RAIter1, _RAIter2, _RAIter2,
844                          _Output_RAIter, _Predicate,
845                          random_access_iterator_tag,
846                          random_access_iterator_tag,
847                          random_access_iterator_tag);
848
849
850  template<typename _RAIter>
851    void
852    sort(_RAIter, _RAIter, __gnu_parallel::sequential_tag);
853
854  template<typename _RAIter, typename _Compare>
855    void
856    sort(_RAIter, _RAIter, _Compare, __gnu_parallel::sequential_tag);
857
858  template<typename _RAIter>
859    void
860    sort(_RAIter, _RAIter);
861
862  template<typename _RAIter, typename _Compare>
863    void
864    sort(_RAIter, _RAIter, _Compare);
865
866  template<typename _RAIter>
867    void
868    stable_sort(_RAIter, _RAIter, __gnu_parallel::sequential_tag);
869
870  template<typename _RAIter, typename _Compare>
871    void
872    stable_sort(_RAIter, _RAIter, _Compare, __gnu_parallel::sequential_tag);
873
874  template<typename _RAIter>
875    void
876    stable_sort(_RAIter, _RAIter);
877
878  template<typename _RAIter, typename _Compare>
879    void
880    stable_sort(_RAIter, _RAIter, _Compare);
881
882  template<typename _IIter, typename _OIter>
883    _OIter
884    unique_copy(_IIter, _IIter, _OIter, __gnu_parallel::sequential_tag);
885
886  template<typename _IIter, typename _OIter, typename _Predicate>
887    _OIter
888    unique_copy(_IIter, _IIter, _OIter, _Predicate,
889                __gnu_parallel::sequential_tag);
890
891  template<typename _IIter, typename _OIter>
892    _OIter
893    unique_copy(_IIter, _IIter, _OIter);
894
895  template<typename _IIter, typename _OIter, typename _Predicate>
896    _OIter
897    unique_copy(_IIter, _IIter, _OIter, _Predicate);
898
899  template<typename _IIter, typename _OIter, typename _Predicate,
900           typename _IterTag1, typename _IterTag2>
901    _OIter
902    __unique_copy_switch(_IIter, _IIter, _OIter, _Predicate,
903                       _IterTag1, _IterTag2);
904
905  template<typename _RAIter, typename _RandomAccess_OIter, typename _Predicate>
906    _RandomAccess_OIter
907    __unique_copy_switch(_RAIter, _RAIter, _RandomAccess_OIter, _Predicate,
908                       random_access_iterator_tag, random_access_iterator_tag);
909} // end namespace __parallel
910} // end namespace std
911
912#endif /* _GLIBCXX_PARALLEL_ALGORITHMFWD_H */
913