]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/libstdc++-v3/contrib/libstdc++-v3-4.3.3/include/parallel/algorithmfwd.h
Inital import
[l4.git] / l4 / pkg / libstdc++-v3 / contrib / libstdc++-v3-4.3.3 / include / parallel / algorithmfwd.h
1 // <algorithm> parallel extensions -*- C++ -*-
2
3 // Copyright (C) 2007, 2008 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 2, 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 // You should have received a copy of the GNU General Public License
17 // along with this library; see the file COPYING.  If not, write to
18 // the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
19 // MA 02111-1307, USA.
20
21 // As a special exception, you may use this file as part of a free
22 // software library without restriction.  Specifically, if other files
23 // instantiate templates or use macros or inline functions from this
24 // file, or you compile this file and link it with other files to
25 // produce an executable, this file does not by itself cause the
26 // resulting executable to be covered by the GNU General Public
27 // License.  This exception does not however invalidate any other
28 // reasons why the executable file might be covered by the GNU General
29 // Public License.
30
31 /** @file parallel/algorithmfwd.h
32  *  This file is a GNU parallel extension to the Standard C++ Library.
33  */
34
35 #ifndef _GLIBCXX_PARALLEL_ALGORITHMFWD_H
36 #define _GLIBCXX_PARALLEL_ALGORITHMFWD_H 1
37
38 #pragma GCC system_header
39
40 #include <parallel/tags.h>
41 #include <parallel/settings.h>
42
43 namespace std
44 {
45 namespace __parallel
46 {
47   template<typename _FIter>
48     _FIter
49     adjacent_find(_FIter, _FIter);
50
51   template<typename _FIter>
52     _FIter
53     adjacent_find(_FIter, _FIter, __gnu_parallel::sequential_tag);
54
55   template<typename _FIter, typename _IterTag>
56     _FIter
57     adjacent_find_switch(_FIter, _FIter, _IterTag);
58
59   template<typename _RAIter>
60     _RAIter
61     adjacent_find_switch(_RAIter, _RAIter, random_access_iterator_tag);
62
63
64   template<typename _FIter, typename _BiPredicate>
65     _FIter
66     adjacent_find(_FIter, _FIter, _BiPredicate);
67
68   template<typename _FIter, typename _BiPredicate>
69     _FIter
70     adjacent_find(_FIter, _FIter, _BiPredicate,
71                   __gnu_parallel::sequential_tag);
72
73   template<typename _FIter, typename _BiPredicate, typename _IterTag>
74     _FIter
75     adjacent_find_switch(_FIter, _FIter, _BiPredicate, _IterTag);
76
77   template<typename _RAIter, typename _BiPredicate>
78     _RAIter
79     adjacent_find_switch(_RAIter, _RAIter, _BiPredicate, 
80                          random_access_iterator_tag);
81
82
83   template<typename _IIter, typename _Tp>
84     typename iterator_traits<_IIter>::difference_type
85     count(_IIter, _IIter, const _Tp&);
86
87   template<typename _IIter, typename _Tp>
88     typename iterator_traits<_IIter>::difference_type
89     count(_IIter, _IIter, const _Tp&, __gnu_parallel::sequential_tag);
90
91   template<typename _IIter, typename _Tp>
92     typename iterator_traits<_IIter>::difference_type
93     count(_IIter, _IIter, const _Tp&, __gnu_parallel::_Parallelism);
94
95   template<typename _IIter, typename _Tp, typename _IterTag>
96     typename iterator_traits<_IIter>::difference_type
97     count_switch(_IIter, _IIter, const _Tp&, _IterTag);
98
99   template<typename _RAIter, typename _Tp>
100     typename iterator_traits<_RAIter>::difference_type
101     count_switch(_RAIter, _RAIter, const _Tp&, random_access_iterator_tag,
102                  __gnu_parallel::_Parallelism);
103
104
105   template<typename _IIter, typename _Predicate>
106     typename iterator_traits<_IIter>::difference_type
107     count_if(_IIter, _IIter, _Predicate);
108
109   template<typename _IIter, typename _Predicate>
110     typename iterator_traits<_IIter>::difference_type
111     count_if(_IIter, _IIter, _Predicate, __gnu_parallel::sequential_tag);
112
113   template<typename _IIter, typename _Predicate>
114     typename iterator_traits<_IIter>::difference_type
115     count_if(_IIter, _IIter, _Predicate, __gnu_parallel::_Parallelism);
116
117   template<typename _IIter, typename _Predicate, typename _IterTag>
118     typename iterator_traits<_IIter>::difference_type
119     count_if_switch(_IIter, _IIter, _Predicate, _IterTag);
120
121   template<typename _RAIter, typename _Predicate>
122     typename iterator_traits<_RAIter>::difference_type
123     count_if_switch(_RAIter, _RAIter, _Predicate, random_access_iterator_tag,
124                     __gnu_parallel::_Parallelism);
125
126   // algobase.h
127   template<typename _IIter1, typename _IIter2>
128     bool
129     equal(_IIter1, _IIter1, _IIter2, __gnu_parallel::sequential_tag);
130
131   template<typename _IIter1, typename _IIter2, typename Predicate>
132     bool
133     equal(_IIter1, _IIter1, _IIter2, Predicate,
134           __gnu_parallel::sequential_tag);
135
136   template<typename _IIter1, typename _IIter2>
137     bool
138     equal(_IIter1, _IIter1, _IIter2);
139
140   template<typename _IIter1, typename _IIter2, typename Predicate>
141     bool
142     equal(_IIter1, _IIter1, _IIter2, Predicate);
143
144   template<typename _IIter, typename _Tp>
145     _IIter
146     find(_IIter, _IIter, const _Tp&, __gnu_parallel::sequential_tag);
147
148   template<typename _IIter, typename _Tp>
149     _IIter
150     find(_IIter, _IIter, const _Tp& val);
151
152   template<typename _IIter, typename _Tp, typename _IterTag>
153     _IIter
154     find_switch(_IIter, _IIter, const _Tp&, _IterTag);
155
156   template<typename _RAIter, typename _Tp>
157     _RAIter
158     find_switch(_RAIter, _RAIter, const _Tp&, random_access_iterator_tag);
159
160   template<typename _IIter, typename _Predicate>
161     _IIter
162     find_if(_IIter, _IIter, _Predicate, __gnu_parallel::sequential_tag);
163
164   template<typename _IIter, typename _Predicate>
165     _IIter
166     find_if(_IIter, _IIter, _Predicate);
167
168   template<typename _IIter, typename _Predicate, typename _IterTag>
169     _IIter
170     find_if_switch(_IIter, _IIter, _Predicate, _IterTag);
171
172   template<typename _RAIter, typename _Predicate>
173     _RAIter
174     find_if_switch(_RAIter, _RAIter, _Predicate, random_access_iterator_tag);
175
176   template<typename _IIter, typename _FIter>
177     _IIter
178     find_first_of(_IIter, _IIter, _FIter, _FIter,
179                   __gnu_parallel::sequential_tag);
180
181   template<typename _IIter, typename _FIter, typename _BiPredicate>
182     _IIter
183     find_first_of(_IIter, _IIter, _FIter, _FIter, _BiPredicate,
184                   __gnu_parallel::sequential_tag);
185
186   template<typename _IIter, typename _FIter, typename _BiPredicate>
187     _IIter
188     find_first_of(_IIter, _IIter, _FIter, _FIter, _BiPredicate);
189
190   template<typename _IIter, typename _FIter>
191     _IIter
192     find_first_of(_IIter, _IIter, _FIter, _FIter);
193
194   template<typename _IIter, typename _FIter,
195            typename _IterTag1, typename _IterTag2>
196     _IIter
197     find_first_of_switch(_IIter, _IIter, _FIter, _FIter, _IterTag1, _IterTag2);
198
199   template<typename _RAIter, typename _FIter, typename _BiPredicate,
200            typename _IterTag>
201     _RAIter
202     find_first_of_switch(_RAIter, _RAIter, _FIter, _FIter, _BiPredicate,
203                          random_access_iterator_tag, _IterTag);
204
205   template<typename _IIter, typename _FIter, typename _BiPredicate,
206            typename _IterTag1, typename _IterTag2>
207     _IIter
208     find_first_of_switch(_IIter, _IIter, _FIter, _FIter, _BiPredicate,
209                          _IterTag1, _IterTag2);
210
211
212   template<typename _IIter, typename _Function>
213     _Function
214     for_each(_IIter, _IIter, _Function);
215
216   template<typename _IIter, typename _Function>
217     _Function
218     for_each(_IIter, _IIter, _Function, __gnu_parallel::sequential_tag);
219
220   template<typename _Iterator, typename _Function>
221     _Function
222     for_each(_Iterator, _Iterator, _Function, __gnu_parallel::_Parallelism);
223
224   template<typename _IIter, typename _Function, typename _IterTag>
225     _Function
226     for_each_switch(_IIter, _IIter, _Function, _IterTag);
227
228   template<typename _RAIter, typename _Function>
229     _Function
230     for_each_switch(_RAIter, _RAIter, _Function, random_access_iterator_tag, 
231                     __gnu_parallel::_Parallelism);
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);
254
255   template<typename _OIter, typename _Size, typename _Generator>
256     _OIter
257     generate_n(_OIter, _Size, _Generator);
258
259   template<typename _OIter, typename _Size, typename _Generator>
260     _OIter
261     generate_n(_OIter, _Size, _Generator, __gnu_parallel::sequential_tag);
262
263   template<typename _OIter, typename _Size, typename _Generator>
264     _OIter
265     generate_n(_OIter, _Size, _Generator, __gnu_parallel::_Parallelism);
266
267   template<typename _OIter, typename _Size, typename _Generator,
268            typename _IterTag>
269     _OIter
270     generate_n_switch(_OIter, _Size, _Generator, _IterTag);
271
272   template<typename _RAIter, typename _Size, typename _Generator>
273     _RAIter
274     generate_n_switch(_RAIter, _Size, _Generator, random_access_iterator_tag, 
275                       __gnu_parallel::_Parallelism);
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);
433
434
435   template<typename _IIter1, typename _IIter2, typename _OIter,
436            typename _BiOperation>
437     _OIter
438     transform(_IIter1, _IIter1, _IIter2, _OIter, _BiOperation);
439
440   template<typename _IIter1, typename _IIter2, typename _OIter,
441            typename _BiOperation>
442     _OIter
443     transform(_IIter1, _IIter1, _IIter2, _OIter, _BiOperation, 
444               __gnu_parallel::sequential_tag);
445
446   template<typename _IIter1, typename _IIter2, typename _OIter,
447            typename _BiOperation>
448     _OIter
449     transform(_IIter1, _IIter1, _IIter2, _OIter, _BiOperation, 
450               __gnu_parallel::_Parallelism);
451
452   template<typename _RAIter1, typename _RAIter2, typename _RAIter3,
453            typename _BiOperation>
454     _RAIter3
455     transform2_switch(_RAIter1, _RAIter1, _RAIter2, _RAIter3, _BiOperation, 
456                       random_access_iterator_tag, random_access_iterator_tag, 
457                       random_access_iterator_tag,
458                       __gnu_parallel::_Parallelism);
459
460   template<typename _IIter1, typename _IIter2, typename _OIter,
461            typename _BiOperation, typename _Tag1,
462            typename _Tag2, typename _Tag3>
463     _OIter
464     transform2_switch(_IIter1, _IIter1, _IIter2, _OIter, _BiOperation, 
465                       _Tag1, _Tag2, _Tag3);
466
467
468   template<typename _FIter, typename _Tp>
469     void
470     replace(_FIter, _FIter, const _Tp&, const _Tp&);
471
472   template<typename _FIter, typename _Tp>
473     void
474     replace(_FIter, _FIter, const _Tp&, const _Tp&, 
475             __gnu_parallel::sequential_tag);
476
477   template<typename _FIter, typename _Tp>
478     void
479     replace(_FIter, _FIter, const _Tp&, const _Tp&,
480             __gnu_parallel::_Parallelism);
481
482   template<typename _FIter, typename _Tp, typename _IterTag>
483     void
484     replace_switch(_FIter, _FIter, const _Tp&, const _Tp&, _IterTag);
485
486   template<typename _RAIter, typename _Tp>
487     void
488     replace_switch(_RAIter, _RAIter, const _Tp&, const _Tp&, 
489                    random_access_iterator_tag, __gnu_parallel::_Parallelism);
490
491
492   template<typename _FIter, typename _Predicate, typename _Tp>
493     void
494     replace_if(_FIter, _FIter, _Predicate, const _Tp&);
495
496   template<typename _FIter, typename _Predicate, typename _Tp>
497     void
498     replace_if(_FIter, _FIter, _Predicate, const _Tp&,
499                __gnu_parallel::sequential_tag);
500
501   template<typename _FIter, typename _Predicate, typename _Tp>
502     void
503     replace_if(_FIter, _FIter, _Predicate, const _Tp&,
504                __gnu_parallel::_Parallelism);
505
506   template<typename _FIter, typename _Predicate, typename _Tp,
507            typename _IterTag>
508     void
509     replace_if_switch(_FIter, _FIter, _Predicate, const _Tp&, _IterTag);
510  
511   template<typename _RAIter, typename _Predicate, typename _Tp>
512     void
513     replace_if_switch(_RAIter, _RAIter, _Predicate, const _Tp&,
514                       random_access_iterator_tag,
515                       __gnu_parallel::_Parallelism);
516
517
518   template<typename _FIter>
519     _FIter
520     max_element(_FIter, _FIter);
521
522   template<typename _FIter>
523     _FIter
524     max_element(_FIter, _FIter, __gnu_parallel::sequential_tag);
525
526   template<typename _FIter>
527     _FIter
528     max_element(_FIter, _FIter, __gnu_parallel::_Parallelism);
529
530   template<typename _FIter, typename _Compare>
531     _FIter
532     max_element(_FIter, _FIter, _Compare);
533
534   template<typename _FIter, typename _Compare>
535     _FIter
536     max_element(_FIter, _FIter, _Compare, __gnu_parallel::sequential_tag);
537
538   template<typename _FIter, typename _Compare>
539     _FIter
540     max_element(_FIter, _FIter, _Compare, __gnu_parallel::_Parallelism);
541
542   template<typename _FIter, typename _Compare, typename _IterTag>
543     _FIter
544     max_element_switch(_FIter, _FIter, _Compare, _IterTag);
545
546   template<typename _RAIter, typename _Compare>
547     _RAIter
548     max_element_switch(_RAIter, _RAIter, _Compare, random_access_iterator_tag, 
549                        __gnu_parallel::_Parallelism);
550
551
552   template<typename _IIter1, typename _IIter2, typename _OIter>
553     _OIter
554     merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, 
555           __gnu_parallel::sequential_tag);
556
557   template<typename _IIter1, typename _IIter2, typename _OIter,
558            typename _Compare>
559     _OIter
560     merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare, 
561           __gnu_parallel::sequential_tag);
562
563   template<typename _IIter1, typename _IIter2, typename _OIter,
564            typename _Compare>
565     _OIter
566     merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);
567
568   template<typename _IIter1, typename _IIter2, typename _OIter>
569     _OIter
570     merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
571
572   template<typename _IIter1, typename _IIter2, typename _OIter,
573            typename _Compare, typename _IterTag1, typename _IterTag2,
574            typename _IterTag3>
575     _OIter
576     merge_switch(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare, 
577                  _IterTag1, _IterTag2, _IterTag3);
578
579   template<typename _IIter1, typename _IIter2, typename _OIter,
580            typename _Compare>
581     _OIter
582     merge_switch(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare, 
583                  random_access_iterator_tag, random_access_iterator_tag, 
584                  random_access_iterator_tag);
585
586
587   template<typename _FIter>
588     _FIter
589     min_element(_FIter, _FIter);
590
591   template<typename _FIter>
592     _FIter
593     min_element(_FIter, _FIter, __gnu_parallel::sequential_tag);
594
595   template<typename _FIter>
596     _FIter
597     min_element(_FIter, _FIter, __gnu_parallel::_Parallelism parallelism_tag);
598
599   template<typename _FIter, typename _Compare>
600     _FIter
601     min_element(_FIter, _FIter, _Compare);
602
603   template<typename _FIter, typename _Compare>
604     _FIter
605     min_element(_FIter, _FIter, _Compare, __gnu_parallel::sequential_tag);
606
607   template<typename _FIter, typename _Compare>
608     _FIter
609     min_element(_FIter, _FIter, _Compare, __gnu_parallel::_Parallelism);
610
611   template<typename _FIter, typename _Compare, typename _IterTag>
612     _FIter
613     min_element_switch(_FIter, _FIter, _Compare, _IterTag);
614
615   template<typename _RAIter, typename _Compare>
616     _RAIter
617     min_element_switch(_RAIter, _RAIter, _Compare, random_access_iterator_tag, 
618                        __gnu_parallel::_Parallelism);
619
620   template<typename _RAIter>
621     void
622     nth_element(_RAIter, _RAIter, _RAIter, __gnu_parallel::sequential_tag);
623
624   template<typename _RAIter, typename _Compare>
625     void
626     nth_element(_RAIter, _RAIter, _RAIter, _Compare,
627                 __gnu_parallel::sequential_tag);
628
629   template<typename _RAIter, typename _Compare>
630     void
631     nth_element(_RAIter, _RAIter, _RAIter, _Compare);
632
633   template<typename _RAIter>
634     void
635     nth_element(_RAIter, _RAIter, _RAIter);
636
637   template<typename _RAIter, typename _Compare>
638     void
639     partial_sort(_RAIter, _RAIter, _RAIter, _Compare,
640                  __gnu_parallel::sequential_tag);
641
642   template<typename _RAIter>
643     void
644     partial_sort(_RAIter, _RAIter, _RAIter, __gnu_parallel::sequential_tag);
645
646   template<typename _RAIter, typename _Compare>
647     void
648     partial_sort(_RAIter, _RAIter, _RAIter, _Compare);
649
650   template<typename _RAIter>
651     void
652     partial_sort(_RAIter, _RAIter, _RAIter);
653
654   template<typename _FIter, typename Predicate>
655     _FIter
656     partition(_FIter, _FIter, Predicate, __gnu_parallel::sequential_tag);
657     
658   template<typename _FIter, typename Predicate>
659     _FIter
660     partition(_FIter, _FIter, Predicate);
661
662   template<typename _FIter, typename Predicate, typename _IterTag>
663     _FIter
664     partition_switch(_FIter, _FIter, Predicate, _IterTag);
665     
666   template<typename _RAIter, typename Predicate>
667     _RAIter
668     partition_switch(_RAIter, _RAIter, Predicate, random_access_iterator_tag);
669
670   template<typename _RAIter>
671     void
672     random_shuffle(_RAIter, _RAIter, __gnu_parallel::sequential_tag);
673
674   template<typename _RAIter, typename _RandomNumberGenerator>
675     void
676     random_shuffle(_RAIter, _RAIter, _RandomNumberGenerator&,
677                    __gnu_parallel::sequential_tag);
678
679   template<typename _RAIter>
680     void
681     random_shuffle(_RAIter, _RAIter);
682
683   template<typename _RAIter, typename _RandomNumberGenerator>
684     void
685     random_shuffle(_RAIter, _RAIter, _RandomNumberGenerator&);
686
687   template<typename _IIter1, typename _IIter2, typename _OIter>
688     _OIter
689     set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
690             __gnu_parallel::sequential_tag);
691
692   template<typename _IIter1, typename _IIter2, typename _OIter,
693            typename Predicate>
694     _OIter
695     set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, Predicate,
696               __gnu_parallel::sequential_tag);
697
698   template<typename _IIter1, typename _IIter2, typename _OIter>
699     _OIter
700     set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
701
702   template<typename _IIter1, typename _IIter2, typename _OIter,
703            typename _Predicate>
704     _OIter 
705     set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Predicate);
706
707   template<typename _IIter1, typename _IIter2, typename _Predicate,
708            typename _OIter, typename _IterTag1, typename _IterTag2,
709            typename _IterTag3>
710     _OIter
711     set_union_switch(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
712                      _Predicate, _IterTag1, _IterTag2, _IterTag3);
713
714   template<typename _RAIter1, typename _RAIter2, typename _Output_RAIter,
715            typename _Predicate>
716     _Output_RAIter
717     set_union_switch(_RAIter1, _RAIter1, _RAIter2, _RAIter2, _Output_RAIter,
718                      _Predicate, random_access_iterator_tag,
719                      random_access_iterator_tag, random_access_iterator_tag);
720
721   template<typename _IIter1, typename _IIter2, typename _OIter>
722     _OIter
723     set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
724                      __gnu_parallel::sequential_tag);
725
726   template<typename _IIter1, typename _IIter2, typename _OIter,
727            typename _Predicate>
728     _OIter
729     set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Predicate,
730                      __gnu_parallel::sequential_tag);
731
732   template<typename _IIter1, typename _IIter2, typename _OIter>
733     _OIter
734     set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
735
736   template<typename _IIter1, typename _IIter2, typename _OIter,
737            typename _Predicate>
738     _OIter 
739     set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Predicate);
740
741   template<typename _IIter1, typename _IIter2, typename _Predicate,
742            typename _OIter, typename _IterTag1, typename _IterTag2,
743            typename _IterTag3>
744     _OIter
745     set_intersection_switch(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
746                             _Predicate, _IterTag1, _IterTag2, _IterTag3);
747
748   template<typename _RAIter1, typename _RAIter2, typename _Output_RAIter,
749            typename _Predicate>
750     _Output_RAIter
751     set_intersection_switch(_RAIter1, _RAIter1, _RAIter2, _RAIter2,
752                             _Output_RAIter, _Predicate,
753                             random_access_iterator_tag,
754                             random_access_iterator_tag,
755                             random_access_iterator_tag);
756
757   template<typename _IIter1, typename _IIter2, typename _OIter>
758     _OIter
759     set_symmetric_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
760                              __gnu_parallel::sequential_tag);
761
762   template<typename _IIter1, typename _IIter2, typename _OIter,
763            typename _Predicate>
764     _OIter
765     set_symmetric_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
766                              _Predicate, __gnu_parallel::sequential_tag);
767
768   template<typename _IIter1, typename _IIter2, typename _OIter>
769     _OIter 
770     set_symmetric_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
771
772   template<typename _IIter1, typename _IIter2, typename _OIter,
773            typename _Predicate>
774     _OIter 
775     set_symmetric_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
776                              _Predicate);
777
778   template<typename _IIter1, typename _IIter2, typename _Predicate,
779            typename _OIter, typename _IterTag1, typename _IterTag2,
780            typename _IterTag3>
781     _OIter
782     set_symmetric_difference_switch(_IIter1, _IIter1, _IIter2, _IIter2,
783                                     _OIter, _Predicate, _IterTag1, _IterTag2,
784                                     _IterTag3);
785
786   template<typename _RAIter1, typename _RAIter2, typename _Output_RAIter,
787            typename _Predicate>
788     _Output_RAIter
789     set_symmetric_difference_switch(_RAIter1, _RAIter1, _RAIter2, _RAIter2,
790                                     _Output_RAIter, _Predicate,
791                                     random_access_iterator_tag,
792                                     random_access_iterator_tag,
793                                     random_access_iterator_tag);
794
795
796   template<typename _IIter1, typename _IIter2, typename _OIter>
797     _OIter
798     set_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
799                    __gnu_parallel::sequential_tag);
800
801   template<typename _IIter1, typename _IIter2, typename _OIter,
802            typename _Predicate>
803     _OIter
804     set_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Predicate,
805                    __gnu_parallel::sequential_tag);
806
807   template<typename _IIter1, typename _IIter2, typename _OIter>
808     _OIter
809     set_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
810
811   template<typename _IIter1, typename _IIter2, typename _OIter,
812            typename _Predicate>
813     _OIter
814     set_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Predicate);
815
816   template<typename _IIter1, typename _IIter2, typename _Predicate,
817            typename _OIter, typename _IterTag1, typename _IterTag2,
818            typename _IterTag3>
819     _OIter
820     set_difference_switch(_IIter1, _IIter1, _IIter2, _IIter2, _OIter,
821                           _Predicate, _IterTag1, _IterTag2, _IterTag3);
822
823   template<typename _RAIter1, typename _RAIter2, typename _Output_RAIter,
824            typename _Predicate>
825     _Output_RAIter
826     set_difference_switch(_RAIter1, _RAIter1, _RAIter2, _RAIter2,
827                           _Output_RAIter, _Predicate,
828                           random_access_iterator_tag,
829                           random_access_iterator_tag,
830                           random_access_iterator_tag);
831
832
833   template<typename _RAIter>
834     void
835     sort(_RAIter, _RAIter, __gnu_parallel::sequential_tag);
836
837   template<typename _RAIter, typename _Compare>
838     void
839     sort(_RAIter, _RAIter, _Compare, __gnu_parallel::sequential_tag);
840
841   template<typename _RAIter>
842     void
843     sort(_RAIter, _RAIter);
844
845   template<typename _RAIter, typename _Compare>
846     void
847     sort(_RAIter, _RAIter, _Compare);
848
849   template<typename _RAIter>
850     void
851     stable_sort(_RAIter, _RAIter, __gnu_parallel::sequential_tag);
852
853   template<typename _RAIter, typename _Compare>
854     void
855     stable_sort(_RAIter, _RAIter, _Compare, __gnu_parallel::sequential_tag);
856
857   template<typename _RAIter>
858     void
859     stable_sort(_RAIter, _RAIter);
860
861   template<typename _RAIter, typename _Compare>
862     void
863     stable_sort(_RAIter, _RAIter, _Compare);
864
865   template<typename _IIter, typename _OIter>
866     _OIter
867     unique_copy(_IIter, _IIter, _OIter, __gnu_parallel::sequential_tag);
868
869   template<typename _IIter, typename _OIter, typename _Predicate>
870     _OIter
871     unique_copy(_IIter, _IIter, _OIter, _Predicate,
872                 __gnu_parallel::sequential_tag);
873
874   template<typename _IIter, typename _OIter>
875     _OIter
876     unique_copy(_IIter, _IIter, _OIter);
877
878   template<typename _IIter, typename _OIter, typename _Predicate>
879     _OIter
880     unique_copy(_IIter, _IIter, _OIter, _Predicate);
881
882   template<typename _IIter, typename _OIter, typename _Predicate,
883            typename _IterTag1, typename _IterTag2>
884     _OIter
885     unique_copy_switch(_IIter, _IIter, _OIter, _Predicate,
886                        _IterTag1, _IterTag2);
887
888   template<typename _RAIter, typename _RandomAccess_OIter, typename _Predicate>
889     _RandomAccess_OIter
890     unique_copy_switch(_RAIter, _RAIter, _RandomAccess_OIter, _Predicate,
891                        random_access_iterator_tag, random_access_iterator_tag);
892 } // end namespace __parallel
893 } // end namespace std
894
895 #endif