Home | History | Annotate | Download | only in parallel
      1 // <parallel/algorithm> Forward declarations -*- C++ -*-
      2 
      3 // Copyright (C) 2007-2013 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