OSDN Git Service

2010-03-22 Paolo Carlini <paolo.carlini@oracle.com>
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / include / parallel / algorithmfwd.h
1 // <algorithm> parallel extensions -*- C++ -*-
2
3 // Copyright (C) 2007, 2008, 2009, 2010 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
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 #ifdef __GXX_EXPERIMENTAL_CXX0X__
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 */