1 // <parallel/algorithm> Forward declarations -*- C++ -*-
2 
3 // Copyright (C) 2007-2018 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 
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     bool
134     equal(_IIter1, _IIter1, _IIter2);
135 
136   template<typename _IIter1, typename _IIter2, typename _Predicate>
137     bool
138     equal(_IIter1, _IIter1, _IIter2, _Predicate);
139 
140   template<typename _IIter, typename _Tp>
141     _IIter
142     find(_IIter, _IIter, const _Tp&, __gnu_parallel::sequential_tag);
143 
144   template<typename _IIter, typename _Tp>
145     _IIter
146     find(_IIter, _IIter, const _Tp& __val);
147 
148   template<typename _IIter, typename _Tp, typename _IterTag>
149     _IIter
150     __find_switch(_IIter, _IIter, const _Tp&, _IterTag);
151 
152   template<typename _RAIter, typename _Tp>
153     _RAIter
154     __find_switch(_RAIter, _RAIter, const _Tp&, random_access_iterator_tag);
155 
156   template<typename _IIter, typename _Predicate>
157     _IIter
158     find_if(_IIter, _IIter, _Predicate, __gnu_parallel::sequential_tag);
159 
160   template<typename _IIter, typename _Predicate>
161     _IIter
162     find_if(_IIter, _IIter, _Predicate);
163 
164   template<typename _IIter, typename _Predicate, typename _IterTag>
165     _IIter
166     __find_if_switch(_IIter, _IIter, _Predicate, _IterTag);
167 
168   template<typename _RAIter, typename _Predicate>
169     _RAIter
170     __find_if_switch(_RAIter, _RAIter, _Predicate, random_access_iterator_tag);
171 
172   template<typename _IIter, typename _FIter>
173     _IIter
174     find_first_of(_IIter, _IIter, _FIter, _FIter,
175                   __gnu_parallel::sequential_tag);
176 
177   template<typename _IIter, typename _FIter, typename _BiPredicate>
178     _IIter
179     find_first_of(_IIter, _IIter, _FIter, _FIter, _BiPredicate,
180                   __gnu_parallel::sequential_tag);
181 
182   template<typename _IIter, typename _FIter, typename _BiPredicate>
183     _IIter
184     find_first_of(_IIter, _IIter, _FIter, _FIter, _BiPredicate);
185 
186   template<typename _IIter, typename _FIter>
187     _IIter
188     find_first_of(_IIter, _IIter, _FIter, _FIter);
189 
190   template<typename _IIter, typename _FIter,
191            typename _IterTag1, typename _IterTag2>
192     _IIter
193     __find_first_of_switch(
194       _IIter, _IIter, _FIter, _FIter, _IterTag1, _IterTag2);
195 
196   template<typename _RAIter, typename _FIter, typename _BiPredicate,
197            typename _IterTag>
198     _RAIter
199     __find_first_of_switch(_RAIter, _RAIter, _FIter, _FIter, _BiPredicate,
200                          random_access_iterator_tag, _IterTag);
201 
202   template<typename _IIter, typename _FIter, typename _BiPredicate,
203            typename _IterTag1, typename _IterTag2>
204     _IIter
205     __find_first_of_switch(_IIter, _IIter, _FIter, _FIter, _BiPredicate,
206                          _IterTag1, _IterTag2);
207 
208 
209   template<typename _IIter, typename _Function>
210     _Function
211     for_each(_IIter, _IIter, _Function);
212 
213   template<typename _IIter, typename _Function>
214     _Function
215     for_each(_IIter, _IIter, _Function, __gnu_parallel::sequential_tag);
216 
217   template<typename _Iterator, typename _Function>
218     _Function
219     for_each(_Iterator, _Iterator, _Function, __gnu_parallel::_Parallelism);
220 
221   template<typename _IIter, typename _Function, typename _IterTag>
222     _Function
223     __for_each_switch(_IIter, _IIter, _Function, _IterTag);
224 
225   template<typename _RAIter, typename _Function>
226     _Function
227     __for_each_switch(_RAIter, _RAIter, _Function, random_access_iterator_tag,
228                     __gnu_parallel::_Parallelism  __parallelism
229                     = __gnu_parallel::parallel_balanced);
230 
231 
232   template<typename _FIter, typename _Generator>
233     void
234     generate(_FIter, _FIter, _Generator);
235 
236   template<typename _FIter, typename _Generator>
237     void
238     generate(_FIter, _FIter, _Generator, __gnu_parallel::sequential_tag);
239 
240   template<typename _FIter, typename _Generator>
241     void
242     generate(_FIter, _FIter, _Generator, __gnu_parallel::_Parallelism);
243 
244   template<typename _FIter, typename _Generator, typename _IterTag>
245     void
246     __generate_switch(_FIter, _FIter, _Generator, _IterTag);
247 
248   template<typename _RAIter, typename _Generator>
249     void
250     __generate_switch(_RAIter, _RAIter, _Generator, random_access_iterator_tag,
251                     __gnu_parallel::_Parallelism __parallelism
252                     = __gnu_parallel::parallel_balanced);
253 
254   template<typename _OIter, typename _Size, typename _Generator>
255     _OIter
256     generate_n(_OIter, _Size, _Generator);
257 
258   template<typename _OIter, typename _Size, typename _Generator>
259     _OIter
260     generate_n(_OIter, _Size, _Generator, __gnu_parallel::sequential_tag);
261 
262   template<typename _OIter, typename _Size, typename _Generator>
263     _OIter
264     generate_n(_OIter, _Size, _Generator, __gnu_parallel::_Parallelism);
265 
266   template<typename _OIter, typename _Size, typename _Generator,
267            typename _IterTag>
268     _OIter
269     __generate_n_switch(_OIter, _Size, _Generator, _IterTag);
270 
271   template<typename _RAIter, typename _Size, typename _Generator>
272     _RAIter
273     __generate_n_switch(_RAIter, _Size, _Generator, random_access_iterator_tag,
274                       __gnu_parallel::_Parallelism __parallelism
275                       = __gnu_parallel::parallel_balanced);
276 
277   template<typename _IIter1, typename _IIter2>
278     bool
279     lexicographical_compare(_IIter1, _IIter1, _IIter2, _IIter2,
280                             __gnu_parallel::sequential_tag);
281 
282   template<typename _IIter1, typename _IIter2, typename _Predicate>
283     bool
284     lexicographical_compare(_IIter1, _IIter1, _IIter2, _IIter2, _Predicate,
285                             __gnu_parallel::sequential_tag);
286 
287   template<typename _IIter1, typename _IIter2>
288     bool
289     lexicographical_compare(_IIter1, _IIter1, _IIter2, _IIter2);
290 
291   template<typename _IIter1, typename _IIter2, typename _Predicate>
292     bool
293     lexicographical_compare(_IIter1, _IIter1, _IIter2, _IIter2, _Predicate);
294 
295   template<typename _IIter1, typename _IIter2,
296            typename _Predicate, typename _IterTag1, typename _IterTag2>
297     bool
298     __lexicographical_compare_switch(_IIter1, _IIter1, _IIter2, _IIter2,
299                                    _Predicate, _IterTag1, _IterTag2);
300 
301   template<typename _RAIter1, typename _RAIter2, typename _Predicate>
302     bool
303     __lexicographical_compare_switch(_RAIter1, _RAIter1, _RAIter2, _RAIter2,
304                                    _Predicate, random_access_iterator_tag,
305                                    random_access_iterator_tag);
306 
307   // algo.h
308   template<typename _IIter1, typename _IIter2>
309     pair<_IIter1, _IIter2>
310     mismatch(_IIter1, _IIter1, _IIter2, __gnu_parallel::sequential_tag);
311 
312   template<typename _IIter1, typename _IIter2, typename _Predicate>
313     pair<_IIter1, _IIter2>
314     mismatch(_IIter1, _IIter1, _IIter2, _Predicate,
315              __gnu_parallel::sequential_tag);
316 
317   template<typename _IIter1, typename _IIter2>
318     pair<_IIter1, _IIter2>
319     mismatch(_IIter1, _IIter1, _IIter2);
320 
321   template<typename _IIter1, typename _IIter2, typename _Predicate>
322     pair<_IIter1, _IIter2>
323     mismatch(_IIter1, _IIter1, _IIter2, _Predicate);
324 
325   template<typename _IIter1, typename _IIter2, typename _Predicate,
326            typename _IterTag1, typename _IterTag2>
327     pair<_IIter1, _IIter2>
328     __mismatch_switch(_IIter1, _IIter1, _IIter2, _Predicate,
329                     _IterTag1, _IterTag2);
330 
331   template<typename _RAIter1, typename _RAIter2, typename _Predicate>
332     pair<_RAIter1, _RAIter2>
333     __mismatch_switch(_RAIter1, _RAIter1, _RAIter2, _Predicate,
334                     random_access_iterator_tag, random_access_iterator_tag);
335 
336   template<typename _FIter1, typename _FIter2>
337     _FIter1
338     search(_FIter1, _FIter1, _FIter2, _FIter2, __gnu_parallel::sequential_tag);
339 
340   template<typename _FIter1, typename _FIter2>
341     _FIter1
342     search(_FIter1, _FIter1, _FIter2, _FIter2);
343 
344   template<typename _FIter1, typename _FIter2, typename _BiPredicate>
345     _FIter1
346     search(_FIter1, _FIter1, _FIter2, _FIter2, _BiPredicate,
347            __gnu_parallel::sequential_tag);
348 
349   template<typename _FIter1, typename _FIter2, typename _BiPredicate>
350     _FIter1
351     search(_FIter1, _FIter1, _FIter2, _FIter2, _BiPredicate);
352 
353   template<typename _RAIter1, typename _RAIter2>
354     _RAIter1
355     __search_switch(_RAIter1, _RAIter1, _RAIter2, _RAIter2,
356                   random_access_iterator_tag, random_access_iterator_tag);
357 
358   template<typename _FIter1, typename _FIter2, typename _IterTag1,
359            typename _IterTag2>
360     _FIter1
361     __search_switch(_FIter1, _FIter1, _FIter2, _FIter2, _IterTag1, _IterTag2);
362 
363   template<typename _RAIter1, typename _RAIter2, typename _BiPredicate>
364     _RAIter1
365     __search_switch(_RAIter1, _RAIter1, _RAIter2, _RAIter2, _BiPredicate,
366                   random_access_iterator_tag, random_access_iterator_tag);
367 
368   template<typename _FIter1, typename _FIter2, typename _BiPredicate,
369            typename _IterTag1, typename _IterTag2>
370     _FIter1
371     __search_switch(_FIter1, _FIter1, _FIter2, _FIter2, _BiPredicate,
372                   _IterTag1, _IterTag2);
373 
374   template<typename _FIter, typename _Integer, typename _Tp>
375     _FIter
376     search_n(_FIter, _FIter, _Integer, const _Tp&,
377              __gnu_parallel::sequential_tag);
378 
379   template<typename _FIter, typename _Integer, typename _Tp,
380            typename _BiPredicate>
381     _FIter
382     search_n(_FIter, _FIter, _Integer, const _Tp&, _BiPredicate,
383              __gnu_parallel::sequential_tag);
384 
385   template<typename _FIter, typename _Integer, typename _Tp>
386     _FIter
387     search_n(_FIter, _FIter, _Integer, const _Tp&);
388 
389   template<typename _FIter, typename _Integer, typename _Tp,
390            typename _BiPredicate>
391     _FIter
392     search_n(_FIter, _FIter, _Integer, const _Tp&, _BiPredicate);
393 
394   template<typename _RAIter, typename _Integer, typename _Tp,
395            typename _BiPredicate>
396     _RAIter
397     __search_n_switch(_RAIter, _RAIter, _Integer, const _Tp&,
398                     _BiPredicate, random_access_iterator_tag);
399 
400   template<typename _FIter, typename _Integer, typename _Tp,
401            typename _BiPredicate, typename _IterTag>
402     _FIter
403     __search_n_switch(_FIter, _FIter, _Integer, const _Tp&,
404                     _BiPredicate, _IterTag);
405 
406 
407   template<typename _IIter, typename _OIter, typename _UnaryOperation>
408     _OIter
409     transform(_IIter, _IIter, _OIter, _UnaryOperation);
410 
411   template<typename _IIter, typename _OIter, typename _UnaryOperation>
412     _OIter
413     transform(_IIter, _IIter, _OIter, _UnaryOperation,
414               __gnu_parallel::sequential_tag);
415 
416   template<typename _IIter, typename _OIter, typename _UnaryOperation>
417     _OIter
418     transform(_IIter, _IIter, _OIter, _UnaryOperation,
419               __gnu_parallel::_Parallelism);
420 
421   template<typename _IIter, typename _OIter, typename _UnaryOperation,
422            typename _IterTag1, typename _IterTag2>
423     _OIter
424     __transform1_switch(_IIter, _IIter, _OIter, _UnaryOperation,
425                       _IterTag1, _IterTag2);
426 
427 
428   template<typename _RAIIter, typename _RAOIter, typename _UnaryOperation>
429     _RAOIter
430     __transform1_switch(_RAIIter, _RAIIter, _RAOIter, _UnaryOperation,
431                       random_access_iterator_tag, random_access_iterator_tag,
432                       __gnu_parallel::_Parallelism __parallelism
433                       = __gnu_parallel::parallel_balanced);
434 
435 
436   template<typename _IIter1, typename _IIter2, typename _OIter,
437            typename _BiOperation>
438     _OIter
439     transform(_IIter1, _IIter1, _IIter2, _OIter, _BiOperation);
440 
441   template<typename _IIter1, typename _IIter2, typename _OIter,
442            typename _BiOperation>
443     _OIter
444     transform(_IIter1, _IIter1, _IIter2, _OIter, _BiOperation,
445               __gnu_parallel::sequential_tag);
446 
447   template<typename _IIter1, typename _IIter2, typename _OIter,
448            typename _BiOperation>
449     _OIter
450     transform(_IIter1, _IIter1, _IIter2, _OIter, _BiOperation,
451               __gnu_parallel::_Parallelism);
452 
453   template<typename _RAIter1, typename _RAIter2, typename _RAIter3,
454            typename _BiOperation>
455     _RAIter3
456     __transform2_switch(_RAIter1, _RAIter1, _RAIter2, _RAIter3, _BiOperation,
457                       random_access_iterator_tag, random_access_iterator_tag,
458                       random_access_iterator_tag,
459                       __gnu_parallel::_Parallelism __parallelism
460                       = __gnu_parallel::parallel_balanced);
461 
462   template<typename _IIter1, typename _IIter2, typename _OIter,
463            typename _BiOperation, typename _Tag1,
464            typename _Tag2, typename _Tag3>
465     _OIter
466     __transform2_switch(_IIter1, _IIter1, _IIter2, _OIter, _BiOperation,
467                       _Tag1, _Tag2, _Tag3);
468 
469 
470   template<typename _FIter, typename _Tp>
471     void
472     replace(_FIter, _FIter, const _Tp&, const _Tp&);
473 
474   template<typename _FIter, typename _Tp>
475     void
476     replace(_FIter, _FIter, const _Tp&, const _Tp&,
477             __gnu_parallel::sequential_tag);
478 
479   template<typename _FIter, typename _Tp>
480     void
481     replace(_FIter, _FIter, const _Tp&, const _Tp&,
482             __gnu_parallel::_Parallelism);
483 
484   template<typename _FIter, typename _Tp, typename _IterTag>
485     void
486     __replace_switch(_FIter, _FIter, const _Tp&, const _Tp&, _IterTag);
487 
488   template<typename _RAIter, typename _Tp>
489     void
490     __replace_switch(_RAIter, _RAIter, const _Tp&, const _Tp&,
491                    random_access_iterator_tag, __gnu_parallel::_Parallelism);
492 
493 
494   template<typename _FIter, typename _Predicate, typename _Tp>
495     void
496     replace_if(_FIter, _FIter, _Predicate, const _Tp&);
497 
498   template<typename _FIter, typename _Predicate, typename _Tp>
499     void
500     replace_if(_FIter, _FIter, _Predicate, const _Tp&,
501                __gnu_parallel::sequential_tag);
502 
503   template<typename _FIter, typename _Predicate, typename _Tp>
504     void
505     replace_if(_FIter, _FIter, _Predicate, const _Tp&,
506                __gnu_parallel::_Parallelism);
507 
508   template<typename _FIter, typename _Predicate, typename _Tp,
509            typename _IterTag>
510     void
511     __replace_if_switch(_FIter, _FIter, _Predicate, const _Tp&, _IterTag);
512 
513   template<typename _RAIter, typename _Predicate, typename _Tp>
514     void
515     __replace_if_switch(_RAIter, _RAIter, _Predicate, const _Tp&,
516                       random_access_iterator_tag,
517                       __gnu_parallel::_Parallelism);
518 
519 
520   template<typename _FIter>
521     _FIter
522     max_element(_FIter, _FIter);
523 
524   template<typename _FIter>
525     _FIter
526     max_element(_FIter, _FIter, __gnu_parallel::sequential_tag);
527 
528   template<typename _FIter>
529     _FIter
530     max_element(_FIter, _FIter, __gnu_parallel::_Parallelism);
531 
532   template<typename _FIter, typename _Compare>
533     _FIter
534     max_element(_FIter, _FIter, _Compare);
535 
536   template<typename _FIter, typename _Compare>
537     _FIter
538     max_element(_FIter, _FIter, _Compare, __gnu_parallel::sequential_tag);
539 
540   template<typename _FIter, typename _Compare>
541     _FIter
542     max_element(_FIter, _FIter, _Compare, __gnu_parallel::_Parallelism);
543 
544   template<typename _FIter, typename _Compare, typename _IterTag>
545     _FIter
546     __max_element_switch(_FIter, _FIter, _Compare, _IterTag);
547 
548   template<typename _RAIter, typename _Compare>
549     _RAIter
550     __max_element_switch(
551       _RAIter, _RAIter, _Compare, random_access_iterator_tag,
552       __gnu_parallel::_Parallelism __parallelism
553       = __gnu_parallel::parallel_balanced);
554 
555 
556   template<typename _IIter1, typename _IIter2, typename _OIter>
557     _OIter
558     merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
559           __gnu_parallel::sequential_tag);
560 
561   template<typename _IIter1, typename _IIter2, typename _OIter,
562            typename _Compare>
563     _OIter
564     merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare,
565           __gnu_parallel::sequential_tag);
566 
567   template<typename _IIter1, typename _IIter2, typename _OIter,
568            typename _Compare>
569     _OIter
570     merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);
571 
572   template<typename _IIter1, typename _IIter2, typename _OIter>
573     _OIter
574     merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
575 
576   template<typename _IIter1, typename _IIter2, typename _OIter,
577            typename _Compare, typename _IterTag1, typename _IterTag2,
578            typename _IterTag3>
579     _OIter
580     __merge_switch(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare,
581                  _IterTag1, _IterTag2, _IterTag3);
582 
583   template<typename _IIter1, typename _IIter2, typename _OIter,
584            typename _Compare>
585     _OIter
586     __merge_switch(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare,
587                  random_access_iterator_tag, random_access_iterator_tag,
588                  random_access_iterator_tag);
589 
590 
591   template<typename _FIter>
592     _FIter
593     min_element(_FIter, _FIter);
594 
595   template<typename _FIter>
596     _FIter
597     min_element(_FIter, _FIter, __gnu_parallel::sequential_tag);
598 
599   template<typename _FIter>
600     _FIter
601     min_element(_FIter, _FIter,
602                 __gnu_parallel::_Parallelism __parallelism_tag);
603 
604   template<typename _FIter, typename _Compare>
605     _FIter
606     min_element(_FIter, _FIter, _Compare);
607 
608   template<typename _FIter, typename _Compare>
609     _FIter
610     min_element(_FIter, _FIter, _Compare, __gnu_parallel::sequential_tag);
611 
612   template<typename _FIter, typename _Compare>
613     _FIter
614     min_element(_FIter, _FIter, _Compare, __gnu_parallel::_Parallelism);
615 
616   template<typename _FIter, typename _Compare, typename _IterTag>
617     _FIter
618     __min_element_switch(_FIter, _FIter, _Compare, _IterTag);
619 
620   template<typename _RAIter, typename _Compare>
621     _RAIter
622     __min_element_switch(
623       _RAIter, _RAIter, _Compare, random_access_iterator_tag,
624       __gnu_parallel::_Parallelism __parallelism
625       = __gnu_parallel::parallel_balanced);
626 
627   template<typename _RAIter>
628     void
629     nth_element(_RAIter, _RAIter, _RAIter, __gnu_parallel::sequential_tag);
630 
631   template<typename _RAIter, typename _Compare>
632     void
633     nth_element(_RAIter, _RAIter, _RAIter, _Compare,
634                 __gnu_parallel::sequential_tag);
635 
636   template<typename _RAIter, typename _Compare>
637     void
638     nth_element(_RAIter, _RAIter, _RAIter, _Compare);
639 
640   template<typename _RAIter>
641     void
642     nth_element(_RAIter, _RAIter, _RAIter);
643 
644   template<typename _RAIter, typename _Compare>
645     void
646     partial_sort(_RAIter, _RAIter, _RAIter, _Compare,
647                  __gnu_parallel::sequential_tag);
648 
649   template<typename _RAIter>
650     void
651     partial_sort(_RAIter, _RAIter, _RAIter, __gnu_parallel::sequential_tag);
652 
653   template<typename _RAIter, typename _Compare>
654     void
655     partial_sort(_RAIter, _RAIter, _RAIter, _Compare);
656 
657   template<typename _RAIter>
658     void
659     partial_sort(_RAIter, _RAIter, _RAIter);
660 
661   template<typename _FIter, typename _Predicate>
662     _FIter
663     partition(_FIter, _FIter, _Predicate, __gnu_parallel::sequential_tag);
664 
665   template<typename _FIter, typename _Predicate>
666     _FIter
667     partition(_FIter, _FIter, _Predicate);
668 
669   template<typename _FIter, typename _Predicate, typename _IterTag>
670     _FIter
671     __partition_switch(_FIter, _FIter, _Predicate, _IterTag);
672 
673   template<typename _RAIter, typename _Predicate>
674     _RAIter
675     __partition_switch(
676       _RAIter, _RAIter, _Predicate, random_access_iterator_tag);
677 
678   template<typename _RAIter>
679     void
680     random_shuffle(_RAIter, _RAIter, __gnu_parallel::sequential_tag);
681 
682   template<typename _RAIter, typename _RandomNumberGenerator>
683     void
684     random_shuffle(_RAIter, _RAIter, _RandomNumberGenerator&,
685                    __gnu_parallel::sequential_tag);
686 
687   template<typename _RAIter>
688     void
689     random_shuffle(_RAIter, _RAIter);
690 
691   template<typename _RAIter, typename _RandomNumberGenerator>
692     void
693     random_shuffle(_RAIter, _RAIter,
694 #if __cplusplus >= 201103L
695 		   _RandomNumberGenerator&&);
696 #else
697 		   _RandomNumberGenerator&);
698 #endif
699 
700   template<typename _IIter1, typename _IIter2, typename _OIter>
701     _OIter
702     set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
703             __gnu_parallel::sequential_tag);
704 
705   template<typename _IIter1, typename _IIter2, typename _OIter,
706            typename _Predicate>
707     _OIter
708     set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Predicate,
709               __gnu_parallel::sequential_tag);
710 
711   template<typename _IIter1, typename _IIter2, typename _OIter>
712     _OIter
713     set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
714 
715   template<typename _IIter1, typename _IIter2, typename _OIter,
716            typename _Predicate>
717     _OIter
718     set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Predicate);
719 
720   template<typename _IIter1, typename _IIter2, typename _Predicate,
721            typename _OIter, typename _IterTag1, typename _IterTag2,
722            typename _IterTag3>
723     _OIter
724     __set_union_switch(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
725                      _Predicate, _IterTag1, _IterTag2, _IterTag3);
726 
727   template<typename _RAIter1, typename _RAIter2, typename _Output_RAIter,
728            typename _Predicate>
729     _Output_RAIter
730     __set_union_switch(_RAIter1, _RAIter1, _RAIter2, _RAIter2, _Output_RAIter,
731                      _Predicate, random_access_iterator_tag,
732                      random_access_iterator_tag, random_access_iterator_tag);
733 
734   template<typename _IIter1, typename _IIter2, typename _OIter>
735     _OIter
736     set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
737                      __gnu_parallel::sequential_tag);
738 
739   template<typename _IIter1, typename _IIter2, typename _OIter,
740            typename _Predicate>
741     _OIter
742     set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Predicate,
743                      __gnu_parallel::sequential_tag);
744 
745   template<typename _IIter1, typename _IIter2, typename _OIter>
746     _OIter
747     set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
748 
749   template<typename _IIter1, typename _IIter2, typename _OIter,
750            typename _Predicate>
751     _OIter
752     set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Predicate);
753 
754   template<typename _IIter1, typename _IIter2, typename _Predicate,
755            typename _OIter, typename _IterTag1, typename _IterTag2,
756            typename _IterTag3>
757     _OIter
758     __set_intersection_switch(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
759                             _Predicate, _IterTag1, _IterTag2, _IterTag3);
760 
761   template<typename _RAIter1, typename _RAIter2, typename _Output_RAIter,
762            typename _Predicate>
763     _Output_RAIter
764     __set_intersection_switch(_RAIter1, _RAIter1, _RAIter2, _RAIter2,
765                             _Output_RAIter, _Predicate,
766                             random_access_iterator_tag,
767                             random_access_iterator_tag,
768                             random_access_iterator_tag);
769 
770   template<typename _IIter1, typename _IIter2, typename _OIter>
771     _OIter
772     set_symmetric_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
773                              __gnu_parallel::sequential_tag);
774 
775   template<typename _IIter1, typename _IIter2, typename _OIter,
776            typename _Predicate>
777     _OIter
778     set_symmetric_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
779                              _Predicate, __gnu_parallel::sequential_tag);
780 
781   template<typename _IIter1, typename _IIter2, typename _OIter>
782     _OIter
783     set_symmetric_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
784 
785   template<typename _IIter1, typename _IIter2, typename _OIter,
786            typename _Predicate>
787     _OIter
788     set_symmetric_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
789                              _Predicate);
790 
791   template<typename _IIter1, typename _IIter2, typename _Predicate,
792            typename _OIter, typename _IterTag1, typename _IterTag2,
793            typename _IterTag3>
794     _OIter
795     __set_symmetric_difference_switch(_IIter1, _IIter1, _IIter2, _IIter2,
796                                     _OIter, _Predicate, _IterTag1, _IterTag2,
797                                     _IterTag3);
798 
799   template<typename _RAIter1, typename _RAIter2, typename _Output_RAIter,
800            typename _Predicate>
801     _Output_RAIter
802     __set_symmetric_difference_switch(_RAIter1, _RAIter1, _RAIter2, _RAIter2,
803                                     _Output_RAIter, _Predicate,
804                                     random_access_iterator_tag,
805                                     random_access_iterator_tag,
806                                     random_access_iterator_tag);
807 
808 
809   template<typename _IIter1, typename _IIter2, typename _OIter>
810     _OIter
811     set_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
812                    __gnu_parallel::sequential_tag);
813 
814   template<typename _IIter1, typename _IIter2, typename _OIter,
815            typename _Predicate>
816     _OIter
817     set_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Predicate,
818                    __gnu_parallel::sequential_tag);
819 
820   template<typename _IIter1, typename _IIter2, typename _OIter>
821     _OIter
822     set_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
823 
824   template<typename _IIter1, typename _IIter2, typename _OIter,
825            typename _Predicate>
826     _OIter
827     set_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Predicate);
828 
829   template<typename _IIter1, typename _IIter2, typename _Predicate,
830            typename _OIter, typename _IterTag1, typename _IterTag2,
831            typename _IterTag3>
832     _OIter
833     __set_difference_switch(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
834                           _Predicate, _IterTag1, _IterTag2, _IterTag3);
835 
836   template<typename _RAIter1, typename _RAIter2, typename _Output_RAIter,
837            typename _Predicate>
838     _Output_RAIter
839     __set_difference_switch(_RAIter1, _RAIter1, _RAIter2, _RAIter2,
840                           _Output_RAIter, _Predicate,
841                           random_access_iterator_tag,
842                           random_access_iterator_tag,
843                           random_access_iterator_tag);
844 
845 
846   template<typename _RAIter>
847     void
848     sort(_RAIter, _RAIter, __gnu_parallel::sequential_tag);
849 
850   template<typename _RAIter, typename _Compare>
851     void
852     sort(_RAIter, _RAIter, _Compare, __gnu_parallel::sequential_tag);
853 
854   template<typename _RAIter>
855     void
856     sort(_RAIter, _RAIter);
857 
858   template<typename _RAIter, typename _Compare>
859     void
860     sort(_RAIter, _RAIter, _Compare);
861 
862   template<typename _RAIter>
863     void
864     stable_sort(_RAIter, _RAIter, __gnu_parallel::sequential_tag);
865 
866   template<typename _RAIter, typename _Compare>
867     void
868     stable_sort(_RAIter, _RAIter, _Compare, __gnu_parallel::sequential_tag);
869 
870   template<typename _RAIter>
871     void
872     stable_sort(_RAIter, _RAIter);
873 
874   template<typename _RAIter, typename _Compare>
875     void
876     stable_sort(_RAIter, _RAIter, _Compare);
877 
878   template<typename _IIter, typename _OIter>
879     _OIter
880     unique_copy(_IIter, _IIter, _OIter, __gnu_parallel::sequential_tag);
881 
882   template<typename _IIter, typename _OIter, typename _Predicate>
883     _OIter
884     unique_copy(_IIter, _IIter, _OIter, _Predicate,
885                 __gnu_parallel::sequential_tag);
886 
887   template<typename _IIter, typename _OIter>
888     _OIter
889     unique_copy(_IIter, _IIter, _OIter);
890 
891   template<typename _IIter, typename _OIter, typename _Predicate>
892     _OIter
893     unique_copy(_IIter, _IIter, _OIter, _Predicate);
894 
895   template<typename _IIter, typename _OIter, typename _Predicate,
896            typename _IterTag1, typename _IterTag2>
897     _OIter
898     __unique_copy_switch(_IIter, _IIter, _OIter, _Predicate,
899                        _IterTag1, _IterTag2);
900 
901   template<typename _RAIter, typename _RandomAccess_OIter, typename _Predicate>
902     _RandomAccess_OIter
903     __unique_copy_switch(_RAIter, _RAIter, _RandomAccess_OIter, _Predicate,
904                        random_access_iterator_tag, random_access_iterator_tag);
905 } // end namespace __parallel
906 } // end namespace std
907 
908 #endif /* _GLIBCXX_PARALLEL_ALGORITHMFWD_H */
909