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