1 // <parallel/algorithm> Forward declarations -*- C++ -*-
2 
3 // Copyright (C) 2007-2021 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 
_GLIBCXX_VISIBILITY(default)37 namespace std _GLIBCXX_VISIBILITY(default)
38 {
39 namespace __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