LCOV - code coverage report
Current view: top level - usr/include/c++/12/bits - stl_algo.h (source / functions) Hit Total Coverage
Test: gcc.info Lines: 2 2 100.0 %
Date: 2023-07-19 08:18:47 Functions: 0 0 -

          Line data    Source code
       1             : // Algorithm implementation -*- C++ -*-
       2             : 
       3             : // Copyright (C) 2001-2022 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
       7             : // terms of the GNU General Public License as published by the
       8             : // Free Software Foundation; either version 3, or (at your option)
       9             : // any later version.
      10             : 
      11             : // This library is distributed in the hope that it will be useful,
      12             : // but WITHOUT ANY WARRANTY; without even the implied warranty of
      13             : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14             : // GNU 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             : /*
      26             :  *
      27             :  * Copyright (c) 1994
      28             :  * Hewlett-Packard Company
      29             :  *
      30             :  * Permission to use, copy, modify, distribute and sell this software
      31             :  * and its documentation for any purpose is hereby granted without fee,
      32             :  * provided that the above copyright notice appear in all copies and
      33             :  * that both that copyright notice and this permission notice appear
      34             :  * in supporting documentation.  Hewlett-Packard Company makes no
      35             :  * representations about the suitability of this software for any
      36             :  * purpose.  It is provided "as is" without express or implied warranty.
      37             :  *
      38             :  *
      39             :  * Copyright (c) 1996
      40             :  * Silicon Graphics Computer Systems, Inc.
      41             :  *
      42             :  * Permission to use, copy, modify, distribute and sell this software
      43             :  * and its documentation for any purpose is hereby granted without fee,
      44             :  * provided that the above copyright notice appear in all copies and
      45             :  * that both that copyright notice and this permission notice appear
      46             :  * in supporting documentation.  Silicon Graphics makes no
      47             :  * representations about the suitability of this software for any
      48             :  * purpose.  It is provided "as is" without express or implied warranty.
      49             :  */
      50             : 
      51             : /** @file bits/stl_algo.h
      52             :  *  This is an internal header file, included by other library headers.
      53             :  *  Do not attempt to use it directly. @headername{algorithm}
      54             :  */
      55             : 
      56             : #ifndef _STL_ALGO_H
      57             : #define _STL_ALGO_H 1
      58             : 
      59             : #include <bits/algorithmfwd.h>
      60             : #include <bits/stl_heap.h>
      61             : #include <bits/stl_tempbuf.h>  // for _Temporary_buffer
      62             : #include <bits/predefined_ops.h>
      63             : 
      64             : #if __cplusplus >= 201103L
      65             : #include <bits/uniform_int_dist.h>
      66             : #endif
      67             : 
      68             : #if _GLIBCXX_HOSTED && (__cplusplus <= 201103L || _GLIBCXX_USE_DEPRECATED)
      69             : #include <cstdlib>             // for rand
      70             : #endif
      71             : 
      72             : // See concept_check.h for the __glibcxx_*_requires macros.
      73             : 
      74             : namespace std _GLIBCXX_VISIBILITY(default)
      75             : {
      76             : _GLIBCXX_BEGIN_NAMESPACE_VERSION
      77             : 
      78             :   /// Swaps the median value of *__a, *__b and *__c under __comp to *__result
      79             :   template<typename _Iterator, typename _Compare>
      80             :     _GLIBCXX20_CONSTEXPR
      81             :     void
      82             :     __move_median_to_first(_Iterator __result,_Iterator __a, _Iterator __b,
      83             :                            _Iterator __c, _Compare __comp)
      84             :     {
      85             :       if (__comp(__a, __b))
      86             :         {
      87             :           if (__comp(__b, __c))
      88             :             std::iter_swap(__result, __b);
      89             :           else if (__comp(__a, __c))
      90             :             std::iter_swap(__result, __c);
      91             :           else
      92             :             std::iter_swap(__result, __a);
      93             :         }
      94             :       else if (__comp(__a, __c))
      95             :         std::iter_swap(__result, __a);
      96             :       else if (__comp(__b, __c))
      97             :         std::iter_swap(__result, __c);
      98             :       else
      99             :         std::iter_swap(__result, __b);
     100             :     }
     101             : 
     102             :   /// Provided for stable_partition to use.
     103             :   template<typename _InputIterator, typename _Predicate>
     104             :     _GLIBCXX20_CONSTEXPR
     105             :     inline _InputIterator
     106             :     __find_if_not(_InputIterator __first, _InputIterator __last,
     107             :                   _Predicate __pred)
     108             :     {
     109             :       return std::__find_if(__first, __last,
     110             :                             __gnu_cxx::__ops::__negate(__pred),
     111             :                             std::__iterator_category(__first));
     112             :     }
     113             : 
     114             :   /// Like find_if_not(), but uses and updates a count of the
     115             :   /// remaining range length instead of comparing against an end
     116             :   /// iterator.
     117             :   template<typename _InputIterator, typename _Predicate, typename _Distance>
     118             :     _GLIBCXX20_CONSTEXPR
     119             :     _InputIterator
     120             :     __find_if_not_n(_InputIterator __first, _Distance& __len, _Predicate __pred)
     121             :     {
     122             :       for (; __len; --__len,  (void) ++__first)
     123             :         if (!__pred(__first))
     124             :           break;
     125             :       return __first;
     126             :     }
     127             : 
     128             :   // set_difference
     129             :   // set_intersection
     130             :   // set_symmetric_difference
     131             :   // set_union
     132             :   // for_each
     133             :   // find
     134             :   // find_if
     135             :   // find_first_of
     136             :   // adjacent_find
     137             :   // count
     138             :   // count_if
     139             :   // search
     140             : 
     141             :   template<typename _ForwardIterator1, typename _ForwardIterator2,
     142             :            typename _BinaryPredicate>
     143             :     _GLIBCXX20_CONSTEXPR
     144             :     _ForwardIterator1
     145             :     __search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
     146             :              _ForwardIterator2 __first2, _ForwardIterator2 __last2,
     147             :              _BinaryPredicate  __predicate)
     148             :     {
     149             :       // Test for empty ranges
     150             :       if (__first1 == __last1 || __first2 == __last2)
     151             :         return __first1;
     152             : 
     153             :       // Test for a pattern of length 1.
     154             :       _ForwardIterator2 __p1(__first2);
     155             :       if (++__p1 == __last2)
     156             :         return std::__find_if(__first1, __last1,
     157             :                 __gnu_cxx::__ops::__iter_comp_iter(__predicate, __first2));
     158             : 
     159             :       // General case.
     160             :       _ForwardIterator1 __current = __first1;
     161             : 
     162             :       for (;;)
     163             :         {
     164             :           __first1 =
     165             :             std::__find_if(__first1, __last1,
     166             :                 __gnu_cxx::__ops::__iter_comp_iter(__predicate, __first2));
     167             : 
     168             :           if (__first1 == __last1)
     169             :             return __last1;
     170             : 
     171             :           _ForwardIterator2 __p = __p1;
     172             :           __current = __first1;
     173             :           if (++__current == __last1)
     174             :             return __last1;
     175             : 
     176             :           while (__predicate(__current, __p))
     177             :             {
     178             :               if (++__p == __last2)
     179             :                 return __first1;
     180             :               if (++__current == __last1)
     181             :                 return __last1;
     182             :             }
     183             :           ++__first1;
     184             :         }
     185             :       return __first1;
     186             :     }
     187             : 
     188             :   // search_n
     189             : 
     190             :   /**
     191             :    *  This is an helper function for search_n overloaded for forward iterators.
     192             :   */
     193             :   template<typename _ForwardIterator, typename _Integer,
     194             :            typename _UnaryPredicate>
     195             :     _GLIBCXX20_CONSTEXPR
     196             :     _ForwardIterator
     197             :     __search_n_aux(_ForwardIterator __first, _ForwardIterator __last,
     198             :                    _Integer __count, _UnaryPredicate __unary_pred,
     199             :                    std::forward_iterator_tag)
     200             :     {
     201             :       __first = std::__find_if(__first, __last, __unary_pred);
     202             :       while (__first != __last)
     203             :         {
     204             :           typename iterator_traits<_ForwardIterator>::difference_type
     205             :             __n = __count;
     206             :           _ForwardIterator __i = __first;
     207             :           ++__i;
     208             :           while (__i != __last && __n != 1 && __unary_pred(__i))
     209             :             {
     210             :               ++__i;
     211             :               --__n;
     212             :             }
     213             :           if (__n == 1)
     214             :             return __first;
     215             :           if (__i == __last)
     216             :             return __last;
     217             :           __first = std::__find_if(++__i, __last, __unary_pred);
     218             :         }
     219             :       return __last;
     220             :     }
     221             : 
     222             :   /**
     223             :    *  This is an helper function for search_n overloaded for random access
     224             :    *  iterators.
     225             :   */
     226             :   template<typename _RandomAccessIter, typename _Integer,
     227             :            typename _UnaryPredicate>
     228             :     _GLIBCXX20_CONSTEXPR
     229             :     _RandomAccessIter
     230             :     __search_n_aux(_RandomAccessIter __first, _RandomAccessIter __last,
     231             :                    _Integer __count, _UnaryPredicate __unary_pred,
     232             :                    std::random_access_iterator_tag)
     233             :     {
     234             :       typedef typename std::iterator_traits<_RandomAccessIter>::difference_type
     235             :         _DistanceType;
     236             : 
     237             :       _DistanceType __tailSize = __last - __first;
     238             :       _DistanceType __remainder = __count;
     239             : 
     240             :       while (__remainder <= __tailSize) // the main loop...
     241             :         {
     242             :           __first += __remainder;
     243             :           __tailSize -= __remainder;
     244             :           // __first here is always pointing to one past the last element of
     245             :           // next possible match.
     246             :           _RandomAccessIter __backTrack = __first; 
     247             :           while (__unary_pred(--__backTrack))
     248             :             {
     249             :               if (--__remainder == 0)
     250             :                 return (__first - __count); // Success
     251             :             }
     252             :           __remainder = __count + 1 - (__first - __backTrack);
     253             :         }
     254             :       return __last; // Failure
     255             :     }
     256             : 
     257             :   template<typename _ForwardIterator, typename _Integer,
     258             :            typename _UnaryPredicate>
     259             :     _GLIBCXX20_CONSTEXPR
     260             :     _ForwardIterator
     261             :     __search_n(_ForwardIterator __first, _ForwardIterator __last,
     262             :                _Integer __count,
     263             :                _UnaryPredicate __unary_pred)
     264             :     {
     265             :       if (__count <= 0)
     266             :         return __first;
     267             : 
     268             :       if (__count == 1)
     269             :         return std::__find_if(__first, __last, __unary_pred);
     270             : 
     271             :       return std::__search_n_aux(__first, __last, __count, __unary_pred,
     272             :                                  std::__iterator_category(__first));
     273             :     }
     274             : 
     275             :   // find_end for forward iterators.
     276             :   template<typename _ForwardIterator1, typename _ForwardIterator2,
     277             :            typename _BinaryPredicate>
     278             :     _GLIBCXX20_CONSTEXPR
     279             :     _ForwardIterator1
     280             :     __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
     281             :                _ForwardIterator2 __first2, _ForwardIterator2 __last2,
     282             :                forward_iterator_tag, forward_iterator_tag,
     283             :                _BinaryPredicate __comp)
     284             :     {
     285             :       if (__first2 == __last2)
     286             :         return __last1;
     287             : 
     288             :       _ForwardIterator1 __result = __last1;
     289             :       while (1)
     290             :         {
     291             :           _ForwardIterator1 __new_result
     292             :             = std::__search(__first1, __last1, __first2, __last2, __comp);
     293             :           if (__new_result == __last1)
     294             :             return __result;
     295             :           else
     296             :             {
     297             :               __result = __new_result;
     298             :               __first1 = __new_result;
     299             :               ++__first1;
     300             :             }
     301             :         }
     302             :     }
     303             : 
     304             :   // find_end for bidirectional iterators (much faster).
     305             :   template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
     306             :            typename _BinaryPredicate>
     307             :     _GLIBCXX20_CONSTEXPR
     308             :     _BidirectionalIterator1
     309             :     __find_end(_BidirectionalIterator1 __first1,
     310             :                _BidirectionalIterator1 __last1,
     311             :                _BidirectionalIterator2 __first2,
     312             :                _BidirectionalIterator2 __last2,
     313             :                bidirectional_iterator_tag, bidirectional_iterator_tag,
     314             :                _BinaryPredicate __comp)
     315             :     {
     316             :       // concept requirements
     317             :       __glibcxx_function_requires(_BidirectionalIteratorConcept<
     318             :                                   _BidirectionalIterator1>)
     319             :       __glibcxx_function_requires(_BidirectionalIteratorConcept<
     320             :                                   _BidirectionalIterator2>)
     321             : 
     322             :       typedef reverse_iterator<_BidirectionalIterator1> _RevIterator1;
     323             :       typedef reverse_iterator<_BidirectionalIterator2> _RevIterator2;
     324             : 
     325             :       _RevIterator1 __rlast1(__first1);
     326             :       _RevIterator2 __rlast2(__first2);
     327             :       _RevIterator1 __rresult = std::__search(_RevIterator1(__last1), __rlast1,
     328             :                                               _RevIterator2(__last2), __rlast2,
     329             :                                               __comp);
     330             : 
     331             :       if (__rresult == __rlast1)
     332             :         return __last1;
     333             :       else
     334             :         {
     335             :           _BidirectionalIterator1 __result = __rresult.base();
     336             :           std::advance(__result, -std::distance(__first2, __last2));
     337             :           return __result;
     338             :         }
     339             :     }
     340             : 
     341             :   /**
     342             :    *  @brief  Find last matching subsequence in a sequence.
     343             :    *  @ingroup non_mutating_algorithms
     344             :    *  @param  __first1  Start of range to search.
     345             :    *  @param  __last1   End of range to search.
     346             :    *  @param  __first2  Start of sequence to match.
     347             :    *  @param  __last2   End of sequence to match.
     348             :    *  @return   The last iterator @c i in the range
     349             :    *  @p [__first1,__last1-(__last2-__first2)) such that @c *(i+N) ==
     350             :    *  @p *(__first2+N) for each @c N in the range @p
     351             :    *  [0,__last2-__first2), or @p __last1 if no such iterator exists.
     352             :    *
     353             :    *  Searches the range @p [__first1,__last1) for a sub-sequence that
     354             :    *  compares equal value-by-value with the sequence given by @p
     355             :    *  [__first2,__last2) and returns an iterator to the __first
     356             :    *  element of the sub-sequence, or @p __last1 if the sub-sequence
     357             :    *  is not found.  The sub-sequence will be the last such
     358             :    *  subsequence contained in [__first1,__last1).
     359             :    *
     360             :    *  Because the sub-sequence must lie completely within the range @p
     361             :    *  [__first1,__last1) it must start at a position less than @p
     362             :    *  __last1-(__last2-__first2) where @p __last2-__first2 is the
     363             :    *  length of the sub-sequence.  This means that the returned
     364             :    *  iterator @c i will be in the range @p
     365             :    *  [__first1,__last1-(__last2-__first2))
     366             :   */
     367             :   template<typename _ForwardIterator1, typename _ForwardIterator2>
     368             :     _GLIBCXX20_CONSTEXPR
     369             :     inline _ForwardIterator1
     370             :     find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
     371             :              _ForwardIterator2 __first2, _ForwardIterator2 __last2)
     372             :     {
     373             :       // concept requirements
     374             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
     375             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
     376             :       __glibcxx_function_requires(_EqualOpConcept<
     377             :             typename iterator_traits<_ForwardIterator1>::value_type,
     378             :             typename iterator_traits<_ForwardIterator2>::value_type>)
     379             :       __glibcxx_requires_valid_range(__first1, __last1);
     380             :       __glibcxx_requires_valid_range(__first2, __last2);
     381             : 
     382             :       return std::__find_end(__first1, __last1, __first2, __last2,
     383             :                              std::__iterator_category(__first1),
     384             :                              std::__iterator_category(__first2),
     385             :                              __gnu_cxx::__ops::__iter_equal_to_iter());
     386             :     }
     387             : 
     388             :   /**
     389             :    *  @brief  Find last matching subsequence in a sequence using a predicate.
     390             :    *  @ingroup non_mutating_algorithms
     391             :    *  @param  __first1  Start of range to search.
     392             :    *  @param  __last1   End of range to search.
     393             :    *  @param  __first2  Start of sequence to match.
     394             :    *  @param  __last2   End of sequence to match.
     395             :    *  @param  __comp    The predicate to use.
     396             :    *  @return The last iterator @c i in the range @p
     397             :    *  [__first1,__last1-(__last2-__first2)) such that @c
     398             :    *  predicate(*(i+N), @p (__first2+N)) is true for each @c N in the
     399             :    *  range @p [0,__last2-__first2), or @p __last1 if no such iterator
     400             :    *  exists.
     401             :    *
     402             :    *  Searches the range @p [__first1,__last1) for a sub-sequence that
     403             :    *  compares equal value-by-value with the sequence given by @p
     404             :    *  [__first2,__last2) using comp as a predicate and returns an
     405             :    *  iterator to the first element of the sub-sequence, or @p __last1
     406             :    *  if the sub-sequence is not found.  The sub-sequence will be the
     407             :    *  last such subsequence contained in [__first,__last1).
     408             :    *
     409             :    *  Because the sub-sequence must lie completely within the range @p
     410             :    *  [__first1,__last1) it must start at a position less than @p
     411             :    *  __last1-(__last2-__first2) where @p __last2-__first2 is the
     412             :    *  length of the sub-sequence.  This means that the returned
     413             :    *  iterator @c i will be in the range @p
     414             :    *  [__first1,__last1-(__last2-__first2))
     415             :   */
     416             :   template<typename _ForwardIterator1, typename _ForwardIterator2,
     417             :            typename _BinaryPredicate>
     418             :     _GLIBCXX20_CONSTEXPR
     419             :     inline _ForwardIterator1
     420             :     find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
     421             :              _ForwardIterator2 __first2, _ForwardIterator2 __last2,
     422             :              _BinaryPredicate __comp)
     423             :     {
     424             :       // concept requirements
     425             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
     426             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
     427             :       __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
     428             :             typename iterator_traits<_ForwardIterator1>::value_type,
     429             :             typename iterator_traits<_ForwardIterator2>::value_type>)
     430             :       __glibcxx_requires_valid_range(__first1, __last1);
     431             :       __glibcxx_requires_valid_range(__first2, __last2);
     432             : 
     433             :       return std::__find_end(__first1, __last1, __first2, __last2,
     434             :                              std::__iterator_category(__first1),
     435             :                              std::__iterator_category(__first2),
     436             :                              __gnu_cxx::__ops::__iter_comp_iter(__comp));
     437             :     }
     438             : 
     439             : #if __cplusplus >= 201103L
     440             :   /**
     441             :    *  @brief  Checks that a predicate is true for all the elements
     442             :    *          of a sequence.
     443             :    *  @ingroup non_mutating_algorithms
     444             :    *  @param  __first   An input iterator.
     445             :    *  @param  __last    An input iterator.
     446             :    *  @param  __pred    A predicate.
     447             :    *  @return  True if the check is true, false otherwise.
     448             :    *
     449             :    *  Returns true if @p __pred is true for each element in the range
     450             :    *  @p [__first,__last), and false otherwise.
     451             :   */
     452             :   template<typename _InputIterator, typename _Predicate>
     453             :     _GLIBCXX20_CONSTEXPR
     454             :     inline bool
     455             :     all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
     456             :     { return __last == std::find_if_not(__first, __last, __pred); }
     457             : 
     458             :   /**
     459             :    *  @brief  Checks that a predicate is false for all the elements
     460             :    *          of a sequence.
     461             :    *  @ingroup non_mutating_algorithms
     462             :    *  @param  __first   An input iterator.
     463             :    *  @param  __last    An input iterator.
     464             :    *  @param  __pred    A predicate.
     465             :    *  @return  True if the check is true, false otherwise.
     466             :    *
     467             :    *  Returns true if @p __pred is false for each element in the range
     468             :    *  @p [__first,__last), and false otherwise.
     469             :   */
     470             :   template<typename _InputIterator, typename _Predicate>
     471             :     _GLIBCXX20_CONSTEXPR
     472             :     inline bool
     473             :     none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
     474             :     { return __last == _GLIBCXX_STD_A::find_if(__first, __last, __pred); }
     475             : 
     476             :   /**
     477             :    *  @brief  Checks that a predicate is true for at least one element
     478             :    *          of a sequence.
     479             :    *  @ingroup non_mutating_algorithms
     480             :    *  @param  __first   An input iterator.
     481             :    *  @param  __last    An input iterator.
     482             :    *  @param  __pred    A predicate.
     483             :    *  @return  True if the check is true, false otherwise.
     484             :    *
     485             :    *  Returns true if an element exists in the range @p
     486             :    *  [__first,__last) such that @p __pred is true, and false
     487             :    *  otherwise.
     488             :   */
     489             :   template<typename _InputIterator, typename _Predicate>
     490             :     _GLIBCXX20_CONSTEXPR
     491             :     inline bool
     492             :     any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
     493             :     { return !std::none_of(__first, __last, __pred); }
     494             : 
     495             :   /**
     496             :    *  @brief  Find the first element in a sequence for which a
     497             :    *          predicate is false.
     498             :    *  @ingroup non_mutating_algorithms
     499             :    *  @param  __first  An input iterator.
     500             :    *  @param  __last   An input iterator.
     501             :    *  @param  __pred   A predicate.
     502             :    *  @return   The first iterator @c i in the range @p [__first,__last)
     503             :    *  such that @p __pred(*i) is false, or @p __last if no such iterator exists.
     504             :   */
     505             :   template<typename _InputIterator, typename _Predicate>
     506             :     _GLIBCXX20_CONSTEXPR
     507             :     inline _InputIterator
     508             :     find_if_not(_InputIterator __first, _InputIterator __last,
     509             :                 _Predicate __pred)
     510             :     {
     511             :       // concept requirements
     512             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
     513             :       __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
     514             :               typename iterator_traits<_InputIterator>::value_type>)
     515             :       __glibcxx_requires_valid_range(__first, __last);
     516             :       return std::__find_if_not(__first, __last,
     517             :                                 __gnu_cxx::__ops::__pred_iter(__pred));
     518             :     }
     519             : 
     520             :   /**
     521             :    *  @brief  Checks whether the sequence is partitioned.
     522             :    *  @ingroup mutating_algorithms
     523             :    *  @param  __first  An input iterator.
     524             :    *  @param  __last   An input iterator.
     525             :    *  @param  __pred   A predicate.
     526             :    *  @return  True if the range @p [__first,__last) is partioned by @p __pred,
     527             :    *  i.e. if all elements that satisfy @p __pred appear before those that
     528             :    *  do not.
     529             :   */
     530             :   template<typename _InputIterator, typename _Predicate>
     531             :     _GLIBCXX20_CONSTEXPR
     532             :     inline bool
     533             :     is_partitioned(_InputIterator __first, _InputIterator __last,
     534             :                    _Predicate __pred)
     535             :     {
     536             :       __first = std::find_if_not(__first, __last, __pred);
     537             :       if (__first == __last)
     538             :         return true;
     539             :       ++__first;
     540             :       return std::none_of(__first, __last, __pred);
     541             :     }
     542             : 
     543             :   /**
     544             :    *  @brief  Find the partition point of a partitioned range.
     545             :    *  @ingroup mutating_algorithms
     546             :    *  @param  __first   An iterator.
     547             :    *  @param  __last    Another iterator.
     548             :    *  @param  __pred    A predicate.
     549             :    *  @return  An iterator @p mid such that @p all_of(__first, mid, __pred)
     550             :    *           and @p none_of(mid, __last, __pred) are both true.
     551             :   */
     552             :   template<typename _ForwardIterator, typename _Predicate>
     553             :     _GLIBCXX20_CONSTEXPR
     554             :     _ForwardIterator
     555             :     partition_point(_ForwardIterator __first, _ForwardIterator __last,
     556             :                     _Predicate __pred)
     557             :     {
     558             :       // concept requirements
     559             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
     560             :       __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
     561             :               typename iterator_traits<_ForwardIterator>::value_type>)
     562             : 
     563             :       // A specific debug-mode test will be necessary...
     564             :       __glibcxx_requires_valid_range(__first, __last);
     565             : 
     566             :       typedef typename iterator_traits<_ForwardIterator>::difference_type
     567             :         _DistanceType;
     568             : 
     569             :       _DistanceType __len = std::distance(__first, __last);
     570             : 
     571             :       while (__len > 0)
     572             :         {
     573             :           _DistanceType __half = __len >> 1;
     574             :           _ForwardIterator __middle = __first;
     575             :           std::advance(__middle, __half);
     576             :           if (__pred(*__middle))
     577             :             {
     578             :               __first = __middle;
     579             :               ++__first;
     580             :               __len = __len - __half - 1;
     581             :             }
     582             :           else
     583             :             __len = __half;
     584             :         }
     585             :       return __first;
     586             :     }
     587             : #endif
     588             : 
     589             :   template<typename _InputIterator, typename _OutputIterator,
     590             :            typename _Predicate>
     591             :     _GLIBCXX20_CONSTEXPR
     592             :     _OutputIterator
     593             :     __remove_copy_if(_InputIterator __first, _InputIterator __last,
     594             :                      _OutputIterator __result, _Predicate __pred)
     595             :     {
     596             :       for (; __first != __last; ++__first)
     597             :         if (!__pred(__first))
     598             :           {
     599             :             *__result = *__first;
     600             :             ++__result;
     601             :           }
     602             :       return __result;
     603             :     }
     604             : 
     605             :   /**
     606             :    *  @brief Copy a sequence, removing elements of a given value.
     607             :    *  @ingroup mutating_algorithms
     608             :    *  @param  __first   An input iterator.
     609             :    *  @param  __last    An input iterator.
     610             :    *  @param  __result  An output iterator.
     611             :    *  @param  __value   The value to be removed.
     612             :    *  @return   An iterator designating the end of the resulting sequence.
     613             :    *
     614             :    *  Copies each element in the range @p [__first,__last) not equal
     615             :    *  to @p __value to the range beginning at @p __result.
     616             :    *  remove_copy() is stable, so the relative order of elements that
     617             :    *  are copied is unchanged.
     618             :   */
     619             :   template<typename _InputIterator, typename _OutputIterator, typename _Tp>
     620             :     _GLIBCXX20_CONSTEXPR
     621             :     inline _OutputIterator
     622             :     remove_copy(_InputIterator __first, _InputIterator __last,
     623             :                 _OutputIterator __result, const _Tp& __value)
     624             :     {
     625             :       // concept requirements
     626             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
     627             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
     628             :             typename iterator_traits<_InputIterator>::value_type>)
     629             :       __glibcxx_function_requires(_EqualOpConcept<
     630             :             typename iterator_traits<_InputIterator>::value_type, _Tp>)
     631             :       __glibcxx_requires_valid_range(__first, __last);
     632             : 
     633             :       return std::__remove_copy_if(__first, __last, __result,
     634             :         __gnu_cxx::__ops::__iter_equals_val(__value));
     635             :     }
     636             : 
     637             :   /**
     638             :    *  @brief Copy a sequence, removing elements for which a predicate is true.
     639             :    *  @ingroup mutating_algorithms
     640             :    *  @param  __first   An input iterator.
     641             :    *  @param  __last    An input iterator.
     642             :    *  @param  __result  An output iterator.
     643             :    *  @param  __pred    A predicate.
     644             :    *  @return   An iterator designating the end of the resulting sequence.
     645             :    *
     646             :    *  Copies each element in the range @p [__first,__last) for which
     647             :    *  @p __pred returns false to the range beginning at @p __result.
     648             :    *
     649             :    *  remove_copy_if() is stable, so the relative order of elements that are
     650             :    *  copied is unchanged.
     651             :   */
     652             :   template<typename _InputIterator, typename _OutputIterator,
     653             :            typename _Predicate>
     654             :     _GLIBCXX20_CONSTEXPR
     655             :     inline _OutputIterator
     656             :     remove_copy_if(_InputIterator __first, _InputIterator __last,
     657             :                    _OutputIterator __result, _Predicate __pred)
     658             :     {
     659             :       // concept requirements
     660             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
     661             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
     662             :             typename iterator_traits<_InputIterator>::value_type>)
     663             :       __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
     664             :             typename iterator_traits<_InputIterator>::value_type>)
     665             :       __glibcxx_requires_valid_range(__first, __last);
     666             : 
     667             :       return std::__remove_copy_if(__first, __last, __result,
     668             :                                    __gnu_cxx::__ops::__pred_iter(__pred));
     669             :     }
     670             : 
     671             : #if __cplusplus >= 201103L
     672             :   /**
     673             :    *  @brief Copy the elements of a sequence for which a predicate is true.
     674             :    *  @ingroup mutating_algorithms
     675             :    *  @param  __first   An input iterator.
     676             :    *  @param  __last    An input iterator.
     677             :    *  @param  __result  An output iterator.
     678             :    *  @param  __pred    A predicate.
     679             :    *  @return   An iterator designating the end of the resulting sequence.
     680             :    *
     681             :    *  Copies each element in the range @p [__first,__last) for which
     682             :    *  @p __pred returns true to the range beginning at @p __result.
     683             :    *
     684             :    *  copy_if() is stable, so the relative order of elements that are
     685             :    *  copied is unchanged.
     686             :   */
     687             :   template<typename _InputIterator, typename _OutputIterator,
     688             :            typename _Predicate>
     689             :     _GLIBCXX20_CONSTEXPR
     690             :     _OutputIterator
     691             :     copy_if(_InputIterator __first, _InputIterator __last,
     692             :             _OutputIterator __result, _Predicate __pred)
     693             :     {
     694             :       // concept requirements
     695             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
     696             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
     697             :             typename iterator_traits<_InputIterator>::value_type>)
     698             :       __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
     699             :             typename iterator_traits<_InputIterator>::value_type>)
     700             :       __glibcxx_requires_valid_range(__first, __last);
     701             : 
     702             :       for (; __first != __last; ++__first)
     703             :         if (__pred(*__first))
     704             :           {
     705             :             *__result = *__first;
     706             :             ++__result;
     707             :           }
     708             :       return __result;
     709             :     }
     710             : 
     711             :   template<typename _InputIterator, typename _Size, typename _OutputIterator>
     712             :     _GLIBCXX20_CONSTEXPR
     713             :     _OutputIterator
     714             :     __copy_n(_InputIterator __first, _Size __n,
     715             :              _OutputIterator __result, input_iterator_tag)
     716             :     {
     717             :       return std::__niter_wrap(__result,
     718             :                                __copy_n_a(__first, __n,
     719             :                                           std::__niter_base(__result), true));
     720             :     }
     721             : 
     722             :   template<typename _RandomAccessIterator, typename _Size,
     723             :            typename _OutputIterator>
     724             :     _GLIBCXX20_CONSTEXPR
     725             :     inline _OutputIterator
     726             :     __copy_n(_RandomAccessIterator __first, _Size __n,
     727             :              _OutputIterator __result, random_access_iterator_tag)
     728             :     { return std::copy(__first, __first + __n, __result); }
     729             : 
     730             :   /**
     731             :    *  @brief Copies the range [first,first+n) into [result,result+n).
     732             :    *  @ingroup mutating_algorithms
     733             :    *  @param  __first  An input iterator.
     734             :    *  @param  __n      The number of elements to copy.
     735             :    *  @param  __result An output iterator.
     736             :    *  @return  result+n.
     737             :    *
     738             :    *  This inline function will boil down to a call to @c memmove whenever
     739             :    *  possible.  Failing that, if random access iterators are passed, then the
     740             :    *  loop count will be known (and therefore a candidate for compiler
     741             :    *  optimizations such as unrolling).
     742             :   */
     743             :   template<typename _InputIterator, typename _Size, typename _OutputIterator>
     744             :     _GLIBCXX20_CONSTEXPR
     745             :     inline _OutputIterator
     746             :     copy_n(_InputIterator __first, _Size __n, _OutputIterator __result)
     747             :     {
     748             :       // concept requirements
     749             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
     750             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
     751             :             typename iterator_traits<_InputIterator>::value_type>)
     752             : 
     753             :       const auto __n2 = std::__size_to_integer(__n);
     754             :       if (__n2 <= 0)
     755             :         return __result;
     756             : 
     757             :       __glibcxx_requires_can_increment(__first, __n2);
     758             :       __glibcxx_requires_can_increment(__result, __n2);
     759             : 
     760             :       return std::__copy_n(__first, __n2, __result,
     761             :                            std::__iterator_category(__first));
     762             :     }
     763             : 
     764             :   /**
     765             :    *  @brief Copy the elements of a sequence to separate output sequences
     766             :    *         depending on the truth value of a predicate.
     767             :    *  @ingroup mutating_algorithms
     768             :    *  @param  __first   An input iterator.
     769             :    *  @param  __last    An input iterator.
     770             :    *  @param  __out_true   An output iterator.
     771             :    *  @param  __out_false  An output iterator.
     772             :    *  @param  __pred    A predicate.
     773             :    *  @return   A pair designating the ends of the resulting sequences.
     774             :    *
     775             :    *  Copies each element in the range @p [__first,__last) for which
     776             :    *  @p __pred returns true to the range beginning at @p out_true
     777             :    *  and each element for which @p __pred returns false to @p __out_false.
     778             :   */
     779             :   template<typename _InputIterator, typename _OutputIterator1,
     780             :            typename _OutputIterator2, typename _Predicate>
     781             :     _GLIBCXX20_CONSTEXPR
     782             :     pair<_OutputIterator1, _OutputIterator2>
     783             :     partition_copy(_InputIterator __first, _InputIterator __last,
     784             :                    _OutputIterator1 __out_true, _OutputIterator2 __out_false,
     785             :                    _Predicate __pred)
     786             :     {
     787             :       // concept requirements
     788             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
     789             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator1,
     790             :             typename iterator_traits<_InputIterator>::value_type>)
     791             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator2,
     792             :             typename iterator_traits<_InputIterator>::value_type>)
     793             :       __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
     794             :             typename iterator_traits<_InputIterator>::value_type>)
     795             :       __glibcxx_requires_valid_range(__first, __last);
     796             :       
     797             :       for (; __first != __last; ++__first)
     798             :         if (__pred(*__first))
     799             :           {
     800             :             *__out_true = *__first;
     801             :             ++__out_true;
     802             :           }
     803             :         else
     804             :           {
     805             :             *__out_false = *__first;
     806             :             ++__out_false;
     807             :           }
     808             : 
     809             :       return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false);
     810             :     }
     811             : #endif // C++11
     812             : 
     813             :   /**
     814             :    *  @brief Remove elements from a sequence.
     815             :    *  @ingroup mutating_algorithms
     816             :    *  @param  __first  An input iterator.
     817             :    *  @param  __last   An input iterator.
     818             :    *  @param  __value  The value to be removed.
     819             :    *  @return   An iterator designating the end of the resulting sequence.
     820             :    *
     821             :    *  All elements equal to @p __value are removed from the range
     822             :    *  @p [__first,__last).
     823             :    *
     824             :    *  remove() is stable, so the relative order of elements that are
     825             :    *  not removed is unchanged.
     826             :    *
     827             :    *  Elements between the end of the resulting sequence and @p __last
     828             :    *  are still present, but their value is unspecified.
     829             :   */
     830             :   template<typename _ForwardIterator, typename _Tp>
     831             :     _GLIBCXX20_CONSTEXPR
     832             :     inline _ForwardIterator
     833             :     remove(_ForwardIterator __first, _ForwardIterator __last,
     834             :            const _Tp& __value)
     835             :     {
     836             :       // concept requirements
     837             :       __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
     838             :                                   _ForwardIterator>)
     839             :       __glibcxx_function_requires(_EqualOpConcept<
     840             :             typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
     841             :       __glibcxx_requires_valid_range(__first, __last);
     842             : 
     843             :       return std::__remove_if(__first, __last,
     844             :                 __gnu_cxx::__ops::__iter_equals_val(__value));
     845             :     }
     846             : 
     847             :   /**
     848             :    *  @brief Remove elements from a sequence using a predicate.
     849             :    *  @ingroup mutating_algorithms
     850             :    *  @param  __first  A forward iterator.
     851             :    *  @param  __last   A forward iterator.
     852             :    *  @param  __pred   A predicate.
     853             :    *  @return   An iterator designating the end of the resulting sequence.
     854             :    *
     855             :    *  All elements for which @p __pred returns true are removed from the range
     856             :    *  @p [__first,__last).
     857             :    *
     858             :    *  remove_if() is stable, so the relative order of elements that are
     859             :    *  not removed is unchanged.
     860             :    *
     861             :    *  Elements between the end of the resulting sequence and @p __last
     862             :    *  are still present, but their value is unspecified.
     863             :   */
     864             :   template<typename _ForwardIterator, typename _Predicate>
     865             :     _GLIBCXX20_CONSTEXPR
     866             :     inline _ForwardIterator
     867             :     remove_if(_ForwardIterator __first, _ForwardIterator __last,
     868             :               _Predicate __pred)
     869             :     {
     870             :       // concept requirements
     871             :       __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
     872             :                                   _ForwardIterator>)
     873             :       __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
     874             :             typename iterator_traits<_ForwardIterator>::value_type>)
     875             :       __glibcxx_requires_valid_range(__first, __last);
     876             : 
     877             :       return std::__remove_if(__first, __last,
     878             :                               __gnu_cxx::__ops::__pred_iter(__pred));
     879             :     }
     880             : 
     881             :   template<typename _ForwardIterator, typename _BinaryPredicate>
     882             :     _GLIBCXX20_CONSTEXPR
     883             :     _ForwardIterator
     884             :     __adjacent_find(_ForwardIterator __first, _ForwardIterator __last,
     885             :                     _BinaryPredicate __binary_pred)
     886             :     {
     887             :       if (__first == __last)
     888             :         return __last;
     889             :       _ForwardIterator __next = __first;
     890             :       while (++__next != __last)
     891             :         {
     892             :           if (__binary_pred(__first, __next))
     893             :             return __first;
     894             :           __first = __next;
     895             :         }
     896             :       return __last;
     897             :     }
     898             : 
     899             :   template<typename _ForwardIterator, typename _BinaryPredicate>
     900             :     _GLIBCXX20_CONSTEXPR
     901             :     _ForwardIterator
     902             :     __unique(_ForwardIterator __first, _ForwardIterator __last,
     903             :              _BinaryPredicate __binary_pred)
     904             :     {
     905             :       // Skip the beginning, if already unique.
     906             :       __first = std::__adjacent_find(__first, __last, __binary_pred);
     907             :       if (__first == __last)
     908             :         return __last;
     909             : 
     910             :       // Do the real copy work.
     911             :       _ForwardIterator __dest = __first;
     912             :       ++__first;
     913             :       while (++__first != __last)
     914             :         if (!__binary_pred(__dest, __first))
     915             :           *++__dest = _GLIBCXX_MOVE(*__first);
     916             :       return ++__dest;
     917             :     }
     918             : 
     919             :   /**
     920             :    *  @brief Remove consecutive duplicate values from a sequence.
     921             :    *  @ingroup mutating_algorithms
     922             :    *  @param  __first  A forward iterator.
     923             :    *  @param  __last   A forward iterator.
     924             :    *  @return  An iterator designating the end of the resulting sequence.
     925             :    *
     926             :    *  Removes all but the first element from each group of consecutive
     927             :    *  values that compare equal.
     928             :    *  unique() is stable, so the relative order of elements that are
     929             :    *  not removed is unchanged.
     930             :    *  Elements between the end of the resulting sequence and @p __last
     931             :    *  are still present, but their value is unspecified.
     932             :   */
     933             :   template<typename _ForwardIterator>
     934             :     _GLIBCXX20_CONSTEXPR
     935             :     inline _ForwardIterator
     936             :     unique(_ForwardIterator __first, _ForwardIterator __last)
     937             :     {
     938             :       // concept requirements
     939             :       __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
     940             :                                   _ForwardIterator>)
     941             :       __glibcxx_function_requires(_EqualityComparableConcept<
     942             :                      typename iterator_traits<_ForwardIterator>::value_type>)
     943             :       __glibcxx_requires_valid_range(__first, __last);
     944             : 
     945             :       return std::__unique(__first, __last,
     946             :                            __gnu_cxx::__ops::__iter_equal_to_iter());
     947             :     }
     948             : 
     949             :   /**
     950             :    *  @brief Remove consecutive values from a sequence using a predicate.
     951             :    *  @ingroup mutating_algorithms
     952             :    *  @param  __first        A forward iterator.
     953             :    *  @param  __last         A forward iterator.
     954             :    *  @param  __binary_pred  A binary predicate.
     955             :    *  @return  An iterator designating the end of the resulting sequence.
     956             :    *
     957             :    *  Removes all but the first element from each group of consecutive
     958             :    *  values for which @p __binary_pred returns true.
     959             :    *  unique() is stable, so the relative order of elements that are
     960             :    *  not removed is unchanged.
     961             :    *  Elements between the end of the resulting sequence and @p __last
     962             :    *  are still present, but their value is unspecified.
     963             :   */
     964             :   template<typename _ForwardIterator, typename _BinaryPredicate>
     965             :     _GLIBCXX20_CONSTEXPR
     966             :     inline _ForwardIterator
     967             :     unique(_ForwardIterator __first, _ForwardIterator __last,
     968             :            _BinaryPredicate __binary_pred)
     969             :     {
     970             :       // concept requirements
     971             :       __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
     972             :                                   _ForwardIterator>)
     973             :       __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
     974             :                 typename iterator_traits<_ForwardIterator>::value_type,
     975             :                 typename iterator_traits<_ForwardIterator>::value_type>)
     976             :       __glibcxx_requires_valid_range(__first, __last);
     977             : 
     978             :       return std::__unique(__first, __last,
     979             :                            __gnu_cxx::__ops::__iter_comp_iter(__binary_pred));
     980             :     }
     981             : 
     982             :   /**
     983             :    *  This is an uglified
     984             :    *  unique_copy(_InputIterator, _InputIterator, _OutputIterator,
     985             :    *              _BinaryPredicate)
     986             :    *  overloaded for forward iterators and output iterator as result.
     987             :   */
     988             :   template<typename _ForwardIterator, typename _OutputIterator,
     989             :            typename _BinaryPredicate>
     990             :     _GLIBCXX20_CONSTEXPR
     991             :     _OutputIterator
     992             :     __unique_copy(_ForwardIterator __first, _ForwardIterator __last,
     993             :                   _OutputIterator __result, _BinaryPredicate __binary_pred,
     994             :                   forward_iterator_tag, output_iterator_tag)
     995             :     {
     996             :       // concept requirements -- iterators already checked
     997             :       __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
     998             :           typename iterator_traits<_ForwardIterator>::value_type,
     999             :           typename iterator_traits<_ForwardIterator>::value_type>)
    1000             : 
    1001             :       _ForwardIterator __next = __first;
    1002             :       *__result = *__first;
    1003             :       while (++__next != __last)
    1004             :         if (!__binary_pred(__first, __next))
    1005             :           {
    1006             :             __first = __next;
    1007             :             *++__result = *__first;
    1008             :           }
    1009             :       return ++__result;
    1010             :     }
    1011             : 
    1012             :   /**
    1013             :    *  This is an uglified
    1014             :    *  unique_copy(_InputIterator, _InputIterator, _OutputIterator,
    1015             :    *              _BinaryPredicate)
    1016             :    *  overloaded for input iterators and output iterator as result.
    1017             :   */
    1018             :   template<typename _InputIterator, typename _OutputIterator,
    1019             :            typename _BinaryPredicate>
    1020             :     _GLIBCXX20_CONSTEXPR
    1021             :     _OutputIterator
    1022             :     __unique_copy(_InputIterator __first, _InputIterator __last,
    1023             :                   _OutputIterator __result, _BinaryPredicate __binary_pred,
    1024             :                   input_iterator_tag, output_iterator_tag)
    1025             :     {
    1026             :       // concept requirements -- iterators already checked
    1027             :       __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
    1028             :           typename iterator_traits<_InputIterator>::value_type,
    1029             :           typename iterator_traits<_InputIterator>::value_type>)
    1030             : 
    1031             :       typename iterator_traits<_InputIterator>::value_type __value = *__first;
    1032             :       __decltype(__gnu_cxx::__ops::__iter_comp_val(__binary_pred))
    1033             :         __rebound_pred
    1034             :         = __gnu_cxx::__ops::__iter_comp_val(__binary_pred);
    1035             :       *__result = __value;
    1036             :       while (++__first != __last)
    1037             :         if (!__rebound_pred(__first, __value))
    1038             :           {
    1039             :             __value = *__first;
    1040             :             *++__result = __value;
    1041             :           }
    1042             :       return ++__result;
    1043             :     }
    1044             : 
    1045             :   /**
    1046             :    *  This is an uglified
    1047             :    *  unique_copy(_InputIterator, _InputIterator, _OutputIterator,
    1048             :    *              _BinaryPredicate)
    1049             :    *  overloaded for input iterators and forward iterator as result.
    1050             :   */
    1051             :   template<typename _InputIterator, typename _ForwardIterator,
    1052             :            typename _BinaryPredicate>
    1053             :     _GLIBCXX20_CONSTEXPR
    1054             :     _ForwardIterator
    1055             :     __unique_copy(_InputIterator __first, _InputIterator __last,
    1056             :                   _ForwardIterator __result, _BinaryPredicate __binary_pred,
    1057             :                   input_iterator_tag, forward_iterator_tag)
    1058             :     {
    1059             :       // concept requirements -- iterators already checked
    1060             :       __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
    1061             :           typename iterator_traits<_ForwardIterator>::value_type,
    1062             :           typename iterator_traits<_InputIterator>::value_type>)
    1063             :       *__result = *__first;
    1064             :       while (++__first != __last)
    1065             :         if (!__binary_pred(__result, __first))
    1066             :           *++__result = *__first;
    1067             :       return ++__result;
    1068             :     }
    1069             : 
    1070             :   /**
    1071             :    *  This is an uglified reverse(_BidirectionalIterator,
    1072             :    *                              _BidirectionalIterator)
    1073             :    *  overloaded for bidirectional iterators.
    1074             :   */
    1075             :   template<typename _BidirectionalIterator>
    1076             :     _GLIBCXX20_CONSTEXPR
    1077             :     void
    1078             :     __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last,
    1079             :               bidirectional_iterator_tag)
    1080             :     {
    1081             :       while (true)
    1082             :         if (__first == __last || __first == --__last)
    1083             :           return;
    1084             :         else
    1085             :           {
    1086             :             std::iter_swap(__first, __last);
    1087             :             ++__first;
    1088             :           }
    1089             :     }
    1090             : 
    1091             :   /**
    1092             :    *  This is an uglified reverse(_BidirectionalIterator,
    1093             :    *                              _BidirectionalIterator)
    1094             :    *  overloaded for random access iterators.
    1095             :   */
    1096             :   template<typename _RandomAccessIterator>
    1097             :     _GLIBCXX20_CONSTEXPR
    1098             :     void
    1099             :     __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last,
    1100             :               random_access_iterator_tag)
    1101             :     {
    1102             :       if (__first == __last)
    1103             :         return;
    1104             :       --__last;
    1105             :       while (__first < __last)
    1106             :         {
    1107             :           std::iter_swap(__first, __last);
    1108             :           ++__first;
    1109             :           --__last;
    1110             :         }
    1111             :     }
    1112             : 
    1113             :   /**
    1114             :    *  @brief Reverse a sequence.
    1115             :    *  @ingroup mutating_algorithms
    1116             :    *  @param  __first  A bidirectional iterator.
    1117             :    *  @param  __last   A bidirectional iterator.
    1118             :    *  @return   reverse() returns no value.
    1119             :    *
    1120             :    *  Reverses the order of the elements in the range @p [__first,__last),
    1121             :    *  so that the first element becomes the last etc.
    1122             :    *  For every @c i such that @p 0<=i<=(__last-__first)/2), @p reverse()
    1123             :    *  swaps @p *(__first+i) and @p *(__last-(i+1))
    1124             :   */
    1125             :   template<typename _BidirectionalIterator>
    1126             :     _GLIBCXX20_CONSTEXPR
    1127             :     inline void
    1128             :     reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
    1129             :     {
    1130             :       // concept requirements
    1131             :       __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
    1132             :                                   _BidirectionalIterator>)
    1133             :       __glibcxx_requires_valid_range(__first, __last);
    1134             :       std::__reverse(__first, __last, std::__iterator_category(__first));
    1135             :     }
    1136             : 
    1137             :   /**
    1138             :    *  @brief Copy a sequence, reversing its elements.
    1139             :    *  @ingroup mutating_algorithms
    1140             :    *  @param  __first   A bidirectional iterator.
    1141             :    *  @param  __last    A bidirectional iterator.
    1142             :    *  @param  __result  An output iterator.
    1143             :    *  @return  An iterator designating the end of the resulting sequence.
    1144             :    *
    1145             :    *  Copies the elements in the range @p [__first,__last) to the
    1146             :    *  range @p [__result,__result+(__last-__first)) such that the
    1147             :    *  order of the elements is reversed.  For every @c i such that @p
    1148             :    *  0<=i<=(__last-__first), @p reverse_copy() performs the
    1149             :    *  assignment @p *(__result+(__last-__first)-1-i) = *(__first+i).
    1150             :    *  The ranges @p [__first,__last) and @p
    1151             :    *  [__result,__result+(__last-__first)) must not overlap.
    1152             :   */
    1153             :   template<typename _BidirectionalIterator, typename _OutputIterator>
    1154             :     _GLIBCXX20_CONSTEXPR
    1155             :     _OutputIterator
    1156             :     reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last,
    1157             :                  _OutputIterator __result)
    1158             :     {
    1159             :       // concept requirements
    1160             :       __glibcxx_function_requires(_BidirectionalIteratorConcept<
    1161             :                                   _BidirectionalIterator>)
    1162             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    1163             :                 typename iterator_traits<_BidirectionalIterator>::value_type>)
    1164             :       __glibcxx_requires_valid_range(__first, __last);
    1165             : 
    1166             :       while (__first != __last)
    1167             :         {
    1168             :           --__last;
    1169             :           *__result = *__last;
    1170             :           ++__result;
    1171             :         }
    1172             :       return __result;
    1173             :     }
    1174             : 
    1175             :   /**
    1176             :    *  This is a helper function for the rotate algorithm specialized on RAIs.
    1177             :    *  It returns the greatest common divisor of two integer values.
    1178             :   */
    1179             :   template<typename _EuclideanRingElement>
    1180             :     _GLIBCXX20_CONSTEXPR
    1181             :     _EuclideanRingElement
    1182             :     __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)
    1183             :     {
    1184             :       while (__n != 0)
    1185             :         {
    1186             :           _EuclideanRingElement __t = __m % __n;
    1187             :           __m = __n;
    1188             :           __n = __t;
    1189             :         }
    1190             :       return __m;
    1191             :     }
    1192             : 
    1193             :   inline namespace _V2
    1194             :   {
    1195             : 
    1196             :   /// This is a helper function for the rotate algorithm.
    1197             :   template<typename _ForwardIterator>
    1198             :     _GLIBCXX20_CONSTEXPR
    1199             :     _ForwardIterator
    1200             :     __rotate(_ForwardIterator __first,
    1201             :              _ForwardIterator __middle,
    1202             :              _ForwardIterator __last,
    1203             :              forward_iterator_tag)
    1204             :     {
    1205             :       if (__first == __middle)
    1206             :         return __last;
    1207             :       else if (__last == __middle)
    1208             :         return __first;
    1209             : 
    1210             :       _ForwardIterator __first2 = __middle;
    1211             :       do
    1212             :         {
    1213             :           std::iter_swap(__first, __first2);
    1214             :           ++__first;
    1215             :           ++__first2;
    1216             :           if (__first == __middle)
    1217             :             __middle = __first2;
    1218             :         }
    1219             :       while (__first2 != __last);
    1220             : 
    1221             :       _ForwardIterator __ret = __first;
    1222             : 
    1223             :       __first2 = __middle;
    1224             : 
    1225             :       while (__first2 != __last)
    1226             :         {
    1227             :           std::iter_swap(__first, __first2);
    1228             :           ++__first;
    1229             :           ++__first2;
    1230             :           if (__first == __middle)
    1231             :             __middle = __first2;
    1232             :           else if (__first2 == __last)
    1233             :             __first2 = __middle;
    1234             :         }
    1235             :       return __ret;
    1236             :     }
    1237             : 
    1238             :    /// This is a helper function for the rotate algorithm.
    1239             :   template<typename _BidirectionalIterator>
    1240             :     _GLIBCXX20_CONSTEXPR
    1241             :     _BidirectionalIterator
    1242             :     __rotate(_BidirectionalIterator __first,
    1243             :              _BidirectionalIterator __middle,
    1244             :              _BidirectionalIterator __last,
    1245             :               bidirectional_iterator_tag)
    1246             :     {
    1247             :       // concept requirements
    1248             :       __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
    1249             :                                   _BidirectionalIterator>)
    1250             : 
    1251             :       if (__first == __middle)
    1252             :         return __last;
    1253             :       else if (__last == __middle)
    1254             :         return __first;
    1255             : 
    1256             :       std::__reverse(__first,  __middle, bidirectional_iterator_tag());
    1257             :       std::__reverse(__middle, __last,   bidirectional_iterator_tag());
    1258             : 
    1259             :       while (__first != __middle && __middle != __last)
    1260             :         {
    1261             :           std::iter_swap(__first, --__last);
    1262             :           ++__first;
    1263             :         }
    1264             : 
    1265             :       if (__first == __middle)
    1266             :         {
    1267             :           std::__reverse(__middle, __last,   bidirectional_iterator_tag());
    1268             :           return __last;
    1269             :         }
    1270             :       else
    1271             :         {
    1272             :           std::__reverse(__first,  __middle, bidirectional_iterator_tag());
    1273             :           return __first;
    1274             :         }
    1275             :     }
    1276             : 
    1277             :   /// This is a helper function for the rotate algorithm.
    1278             :   template<typename _RandomAccessIterator>
    1279             :     _GLIBCXX20_CONSTEXPR
    1280             :     _RandomAccessIterator
    1281             :     __rotate(_RandomAccessIterator __first,
    1282             :              _RandomAccessIterator __middle,
    1283             :              _RandomAccessIterator __last,
    1284             :              random_access_iterator_tag)
    1285             :     {
    1286             :       // concept requirements
    1287             :       __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
    1288             :                                   _RandomAccessIterator>)
    1289             : 
    1290             :       if (__first == __middle)
    1291             :         return __last;
    1292             :       else if (__last == __middle)
    1293             :         return __first;
    1294             : 
    1295             :       typedef typename iterator_traits<_RandomAccessIterator>::difference_type
    1296             :         _Distance;
    1297             :       typedef typename iterator_traits<_RandomAccessIterator>::value_type
    1298             :         _ValueType;
    1299             : 
    1300             :       _Distance __n = __last   - __first;
    1301             :       _Distance __k = __middle - __first;
    1302             : 
    1303             :       if (__k == __n - __k)
    1304             :         {
    1305             :           std::swap_ranges(__first, __middle, __middle);
    1306             :           return __middle;
    1307             :         }
    1308             : 
    1309             :       _RandomAccessIterator __p = __first;
    1310             :       _RandomAccessIterator __ret = __first + (__last - __middle);
    1311             : 
    1312             :       for (;;)
    1313             :         {
    1314             :           if (__k < __n - __k)
    1315             :             {
    1316             :               if (__is_pod(_ValueType) && __k == 1)
    1317             :                 {
    1318             :                   _ValueType __t = _GLIBCXX_MOVE(*__p);
    1319             :                   _GLIBCXX_MOVE3(__p + 1, __p + __n, __p);
    1320             :                   *(__p + __n - 1) = _GLIBCXX_MOVE(__t);
    1321             :                   return __ret;
    1322             :                 }
    1323             :               _RandomAccessIterator __q = __p + __k;
    1324             :               for (_Distance __i = 0; __i < __n - __k; ++ __i)
    1325             :                 {
    1326             :                   std::iter_swap(__p, __q);
    1327             :                   ++__p;
    1328             :                   ++__q;
    1329             :                 }
    1330             :               __n %= __k;
    1331             :               if (__n == 0)
    1332             :                 return __ret;
    1333             :               std::swap(__n, __k);
    1334             :               __k = __n - __k;
    1335             :             }
    1336             :           else
    1337             :             {
    1338             :               __k = __n - __k;
    1339             :               if (__is_pod(_ValueType) && __k == 1)
    1340             :                 {
    1341             :                   _ValueType __t = _GLIBCXX_MOVE(*(__p + __n - 1));
    1342             :                   _GLIBCXX_MOVE_BACKWARD3(__p, __p + __n - 1, __p + __n);
    1343             :                   *__p = _GLIBCXX_MOVE(__t);
    1344             :                   return __ret;
    1345             :                 }
    1346             :               _RandomAccessIterator __q = __p + __n;
    1347             :               __p = __q - __k;
    1348             :               for (_Distance __i = 0; __i < __n - __k; ++ __i)
    1349             :                 {
    1350             :                   --__p;
    1351             :                   --__q;
    1352             :                   std::iter_swap(__p, __q);
    1353             :                 }
    1354             :               __n %= __k;
    1355             :               if (__n == 0)
    1356             :                 return __ret;
    1357             :               std::swap(__n, __k);
    1358             :             }
    1359             :         }
    1360             :     }
    1361             : 
    1362             :    // _GLIBCXX_RESOLVE_LIB_DEFECTS
    1363             :    // DR 488. rotate throws away useful information
    1364             :   /**
    1365             :    *  @brief Rotate the elements of a sequence.
    1366             :    *  @ingroup mutating_algorithms
    1367             :    *  @param  __first   A forward iterator.
    1368             :    *  @param  __middle  A forward iterator.
    1369             :    *  @param  __last    A forward iterator.
    1370             :    *  @return  first + (last - middle).
    1371             :    *
    1372             :    *  Rotates the elements of the range @p [__first,__last) by 
    1373             :    *  @p (__middle - __first) positions so that the element at @p __middle
    1374             :    *  is moved to @p __first, the element at @p __middle+1 is moved to
    1375             :    *  @p __first+1 and so on for each element in the range
    1376             :    *  @p [__first,__last).
    1377             :    *
    1378             :    *  This effectively swaps the ranges @p [__first,__middle) and
    1379             :    *  @p [__middle,__last).
    1380             :    *
    1381             :    *  Performs
    1382             :    *   @p *(__first+(n+(__last-__middle))%(__last-__first))=*(__first+n)
    1383             :    *  for each @p n in the range @p [0,__last-__first).
    1384             :   */
    1385             :   template<typename _ForwardIterator>
    1386             :     _GLIBCXX20_CONSTEXPR
    1387             :     inline _ForwardIterator
    1388             :     rotate(_ForwardIterator __first, _ForwardIterator __middle,
    1389             :            _ForwardIterator __last)
    1390             :     {
    1391             :       // concept requirements
    1392             :       __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
    1393             :                                   _ForwardIterator>)
    1394             :       __glibcxx_requires_valid_range(__first, __middle);
    1395             :       __glibcxx_requires_valid_range(__middle, __last);
    1396             : 
    1397             :       return std::__rotate(__first, __middle, __last,
    1398             :                            std::__iterator_category(__first));
    1399             :     }
    1400             : 
    1401             :   } // namespace _V2
    1402             : 
    1403             :   /**
    1404             :    *  @brief Copy a sequence, rotating its elements.
    1405             :    *  @ingroup mutating_algorithms
    1406             :    *  @param  __first   A forward iterator.
    1407             :    *  @param  __middle  A forward iterator.
    1408             :    *  @param  __last    A forward iterator.
    1409             :    *  @param  __result  An output iterator.
    1410             :    *  @return   An iterator designating the end of the resulting sequence.
    1411             :    *
    1412             :    *  Copies the elements of the range @p [__first,__last) to the
    1413             :    *  range beginning at @result, rotating the copied elements by 
    1414             :    *  @p (__middle-__first) positions so that the element at @p __middle
    1415             :    *  is moved to @p __result, the element at @p __middle+1 is moved
    1416             :    *  to @p __result+1 and so on for each element in the range @p
    1417             :    *  [__first,__last).
    1418             :    *
    1419             :    *  Performs 
    1420             :    *  @p *(__result+(n+(__last-__middle))%(__last-__first))=*(__first+n)
    1421             :    *  for each @p n in the range @p [0,__last-__first).
    1422             :   */
    1423             :   template<typename _ForwardIterator, typename _OutputIterator>
    1424             :     _GLIBCXX20_CONSTEXPR
    1425             :     inline _OutputIterator
    1426             :     rotate_copy(_ForwardIterator __first, _ForwardIterator __middle,
    1427             :                 _ForwardIterator __last, _OutputIterator __result)
    1428             :     {
    1429             :       // concept requirements
    1430             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
    1431             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    1432             :                 typename iterator_traits<_ForwardIterator>::value_type>)
    1433             :       __glibcxx_requires_valid_range(__first, __middle);
    1434             :       __glibcxx_requires_valid_range(__middle, __last);
    1435             : 
    1436             :       return std::copy(__first, __middle,
    1437             :                        std::copy(__middle, __last, __result));
    1438             :     }
    1439             : 
    1440             :   /// This is a helper function...
    1441             :   template<typename _ForwardIterator, typename _Predicate>
    1442             :     _GLIBCXX20_CONSTEXPR
    1443             :     _ForwardIterator
    1444             :     __partition(_ForwardIterator __first, _ForwardIterator __last,
    1445             :                 _Predicate __pred, forward_iterator_tag)
    1446             :     {
    1447             :       if (__first == __last)
    1448             :         return __first;
    1449             : 
    1450             :       while (__pred(*__first))
    1451             :         if (++__first == __last)
    1452             :           return __first;
    1453             : 
    1454             :       _ForwardIterator __next = __first;
    1455             : 
    1456             :       while (++__next != __last)
    1457             :         if (__pred(*__next))
    1458             :           {
    1459             :             std::iter_swap(__first, __next);
    1460             :             ++__first;
    1461             :           }
    1462             : 
    1463             :       return __first;
    1464             :     }
    1465             : 
    1466             :   /// This is a helper function...
    1467             :   template<typename _BidirectionalIterator, typename _Predicate>
    1468             :     _GLIBCXX20_CONSTEXPR
    1469             :     _BidirectionalIterator
    1470             :     __partition(_BidirectionalIterator __first, _BidirectionalIterator __last,
    1471             :                 _Predicate __pred, bidirectional_iterator_tag)
    1472             :     {
    1473             :       while (true)
    1474             :         {
    1475             :           while (true)
    1476             :             if (__first == __last)
    1477             :               return __first;
    1478             :             else if (__pred(*__first))
    1479             :               ++__first;
    1480             :             else
    1481             :               break;
    1482             :           --__last;
    1483             :           while (true)
    1484             :             if (__first == __last)
    1485             :               return __first;
    1486             :             else if (!bool(__pred(*__last)))
    1487             :               --__last;
    1488             :             else
    1489             :               break;
    1490             :           std::iter_swap(__first, __last);
    1491             :           ++__first;
    1492             :         }
    1493             :     }
    1494             : 
    1495             :   // partition
    1496             : 
    1497             :   /// This is a helper function...
    1498             :   /// Requires __first != __last and !__pred(__first)
    1499             :   /// and __len == distance(__first, __last).
    1500             :   ///
    1501             :   /// !__pred(__first) allows us to guarantee that we don't
    1502             :   /// move-assign an element onto itself.
    1503             :   template<typename _ForwardIterator, typename _Pointer, typename _Predicate,
    1504             :            typename _Distance>
    1505             :     _ForwardIterator
    1506             :     __stable_partition_adaptive(_ForwardIterator __first,
    1507             :                                 _ForwardIterator __last,
    1508             :                                 _Predicate __pred, _Distance __len,
    1509             :                                 _Pointer __buffer,
    1510             :                                 _Distance __buffer_size)
    1511             :     {
    1512             :       if (__len == 1)
    1513             :         return __first;
    1514             : 
    1515             :       if (__len <= __buffer_size)
    1516             :         {
    1517             :           _ForwardIterator __result1 = __first;
    1518             :           _Pointer __result2 = __buffer;
    1519             : 
    1520             :           // The precondition guarantees that !__pred(__first), so
    1521             :           // move that element to the buffer before starting the loop.
    1522             :           // This ensures that we only call __pred once per element.
    1523             :           *__result2 = _GLIBCXX_MOVE(*__first);
    1524             :           ++__result2;
    1525             :           ++__first;
    1526             :           for (; __first != __last; ++__first)
    1527             :             if (__pred(__first))
    1528             :               {
    1529             :                 *__result1 = _GLIBCXX_MOVE(*__first);
    1530             :                 ++__result1;
    1531             :               }
    1532             :             else
    1533             :               {
    1534             :                 *__result2 = _GLIBCXX_MOVE(*__first);
    1535             :                 ++__result2;
    1536             :               }
    1537             : 
    1538             :           _GLIBCXX_MOVE3(__buffer, __result2, __result1);
    1539             :           return __result1;
    1540             :         }
    1541             : 
    1542             :       _ForwardIterator __middle = __first;
    1543             :       std::advance(__middle, __len / 2);
    1544             :       _ForwardIterator __left_split =
    1545             :         std::__stable_partition_adaptive(__first, __middle, __pred,
    1546             :                                          __len / 2, __buffer,
    1547             :                                          __buffer_size);
    1548             : 
    1549             :       // Advance past true-predicate values to satisfy this
    1550             :       // function's preconditions.
    1551             :       _Distance __right_len = __len - __len / 2;
    1552             :       _ForwardIterator __right_split =
    1553             :         std::__find_if_not_n(__middle, __right_len, __pred);
    1554             : 
    1555             :       if (__right_len)
    1556             :         __right_split =
    1557             :           std::__stable_partition_adaptive(__right_split, __last, __pred,
    1558             :                                            __right_len,
    1559             :                                            __buffer, __buffer_size);
    1560             : 
    1561             :       return std::rotate(__left_split, __middle, __right_split);
    1562             :     }
    1563             : 
    1564             :   template<typename _ForwardIterator, typename _Predicate>
    1565             :     _ForwardIterator
    1566             :     __stable_partition(_ForwardIterator __first, _ForwardIterator __last,
    1567             :                        _Predicate __pred)
    1568             :     {
    1569             :       __first = std::__find_if_not(__first, __last, __pred);
    1570             : 
    1571             :       if (__first == __last)
    1572             :         return __first;
    1573             : 
    1574             :       typedef typename iterator_traits<_ForwardIterator>::value_type
    1575             :         _ValueType;
    1576             :       typedef typename iterator_traits<_ForwardIterator>::difference_type
    1577             :         _DistanceType;
    1578             : 
    1579             :       _Temporary_buffer<_ForwardIterator, _ValueType>
    1580             :         __buf(__first, std::distance(__first, __last));
    1581             :       return
    1582             :         std::__stable_partition_adaptive(__first, __last, __pred,
    1583             :                                          _DistanceType(__buf.requested_size()),
    1584             :                                          __buf.begin(),
    1585             :                                          _DistanceType(__buf.size()));
    1586             :     }
    1587             : 
    1588             :   /**
    1589             :    *  @brief Move elements for which a predicate is true to the beginning
    1590             :    *         of a sequence, preserving relative ordering.
    1591             :    *  @ingroup mutating_algorithms
    1592             :    *  @param  __first   A forward iterator.
    1593             :    *  @param  __last    A forward iterator.
    1594             :    *  @param  __pred    A predicate functor.
    1595             :    *  @return  An iterator @p middle such that @p __pred(i) is true for each
    1596             :    *  iterator @p i in the range @p [first,middle) and false for each @p i
    1597             :    *  in the range @p [middle,last).
    1598             :    *
    1599             :    *  Performs the same function as @p partition() with the additional
    1600             :    *  guarantee that the relative ordering of elements in each group is
    1601             :    *  preserved, so any two elements @p x and @p y in the range
    1602             :    *  @p [__first,__last) such that @p __pred(x)==__pred(y) will have the same
    1603             :    *  relative ordering after calling @p stable_partition().
    1604             :   */
    1605             :   template<typename _ForwardIterator, typename _Predicate>
    1606             :     inline _ForwardIterator
    1607             :     stable_partition(_ForwardIterator __first, _ForwardIterator __last,
    1608             :                      _Predicate __pred)
    1609             :     {
    1610             :       // concept requirements
    1611             :       __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
    1612             :                                   _ForwardIterator>)
    1613             :       __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
    1614             :             typename iterator_traits<_ForwardIterator>::value_type>)
    1615             :       __glibcxx_requires_valid_range(__first, __last);
    1616             : 
    1617             :       return std::__stable_partition(__first, __last,
    1618             :                                      __gnu_cxx::__ops::__pred_iter(__pred));
    1619             :     }
    1620             : 
    1621             :   /// This is a helper function for the sort routines.
    1622             :   template<typename _RandomAccessIterator, typename _Compare>
    1623             :     _GLIBCXX20_CONSTEXPR
    1624             :     void
    1625             :     __heap_select(_RandomAccessIterator __first,
    1626             :                   _RandomAccessIterator __middle,
    1627             :                   _RandomAccessIterator __last, _Compare __comp)
    1628             :     {
    1629             :       std::__make_heap(__first, __middle, __comp);
    1630             :       for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
    1631             :         if (__comp(__i, __first))
    1632             :           std::__pop_heap(__first, __middle, __i, __comp);
    1633             :     }
    1634             : 
    1635             :   // partial_sort
    1636             : 
    1637             :   template<typename _InputIterator, typename _RandomAccessIterator,
    1638             :            typename _Compare>
    1639             :     _GLIBCXX20_CONSTEXPR
    1640             :     _RandomAccessIterator
    1641             :     __partial_sort_copy(_InputIterator __first, _InputIterator __last,
    1642             :                         _RandomAccessIterator __result_first,
    1643             :                         _RandomAccessIterator __result_last,
    1644             :                         _Compare __comp)
    1645             :     {
    1646             :       typedef typename iterator_traits<_InputIterator>::value_type
    1647             :         _InputValueType;
    1648             :       typedef iterator_traits<_RandomAccessIterator> _RItTraits;
    1649             :       typedef typename _RItTraits::difference_type _DistanceType;
    1650             : 
    1651             :       if (__result_first == __result_last)
    1652             :         return __result_last;
    1653             :       _RandomAccessIterator __result_real_last = __result_first;
    1654             :       while (__first != __last && __result_real_last != __result_last)
    1655             :         {
    1656             :           *__result_real_last = *__first;
    1657             :           ++__result_real_last;
    1658             :           ++__first;
    1659             :         }
    1660             :       
    1661             :       std::__make_heap(__result_first, __result_real_last, __comp);
    1662             :       while (__first != __last)
    1663             :         {
    1664             :           if (__comp(__first, __result_first))
    1665             :             std::__adjust_heap(__result_first, _DistanceType(0),
    1666             :                                _DistanceType(__result_real_last
    1667             :                                              - __result_first),
    1668             :                                _InputValueType(*__first), __comp);
    1669             :           ++__first;
    1670             :         }
    1671             :       std::__sort_heap(__result_first, __result_real_last, __comp);
    1672             :       return __result_real_last;
    1673             :     }
    1674             : 
    1675             :   /**
    1676             :    *  @brief Copy the smallest elements of a sequence.
    1677             :    *  @ingroup sorting_algorithms
    1678             :    *  @param  __first   An iterator.
    1679             :    *  @param  __last    Another iterator.
    1680             :    *  @param  __result_first   A random-access iterator.
    1681             :    *  @param  __result_last    Another random-access iterator.
    1682             :    *  @return   An iterator indicating the end of the resulting sequence.
    1683             :    *
    1684             :    *  Copies and sorts the smallest N values from the range @p [__first,__last)
    1685             :    *  to the range beginning at @p __result_first, where the number of
    1686             :    *  elements to be copied, @p N, is the smaller of @p (__last-__first) and
    1687             :    *  @p (__result_last-__result_first).
    1688             :    *  After the sort if @e i and @e j are iterators in the range
    1689             :    *  @p [__result_first,__result_first+N) such that i precedes j then
    1690             :    *  *j<*i is false.
    1691             :    *  The value returned is @p __result_first+N.
    1692             :   */
    1693             :   template<typename _InputIterator, typename _RandomAccessIterator>
    1694             :     _GLIBCXX20_CONSTEXPR
    1695             :     inline _RandomAccessIterator
    1696             :     partial_sort_copy(_InputIterator __first, _InputIterator __last,
    1697             :                       _RandomAccessIterator __result_first,
    1698             :                       _RandomAccessIterator __result_last)
    1699             :     {
    1700             : #ifdef _GLIBCXX_CONCEPT_CHECKS
    1701             :       typedef typename iterator_traits<_InputIterator>::value_type
    1702             :         _InputValueType;
    1703             :       typedef typename iterator_traits<_RandomAccessIterator>::value_type
    1704             :         _OutputValueType;
    1705             : #endif
    1706             : 
    1707             :       // concept requirements
    1708             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
    1709             :       __glibcxx_function_requires(_ConvertibleConcept<_InputValueType,
    1710             :                                   _OutputValueType>)
    1711             :       __glibcxx_function_requires(_LessThanOpConcept<_InputValueType,
    1712             :                                                      _OutputValueType>)
    1713             :       __glibcxx_function_requires(_LessThanComparableConcept<_OutputValueType>)
    1714             :       __glibcxx_requires_valid_range(__first, __last);
    1715             :       __glibcxx_requires_irreflexive(__first, __last);
    1716             :       __glibcxx_requires_valid_range(__result_first, __result_last);
    1717             : 
    1718             :       return std::__partial_sort_copy(__first, __last,
    1719             :                                       __result_first, __result_last,
    1720             :                                       __gnu_cxx::__ops::__iter_less_iter());
    1721             :     }
    1722             : 
    1723             :   /**
    1724             :    *  @brief Copy the smallest elements of a sequence using a predicate for
    1725             :    *         comparison.
    1726             :    *  @ingroup sorting_algorithms
    1727             :    *  @param  __first   An input iterator.
    1728             :    *  @param  __last    Another input iterator.
    1729             :    *  @param  __result_first   A random-access iterator.
    1730             :    *  @param  __result_last    Another random-access iterator.
    1731             :    *  @param  __comp    A comparison functor.
    1732             :    *  @return   An iterator indicating the end of the resulting sequence.
    1733             :    *
    1734             :    *  Copies and sorts the smallest N values from the range @p [__first,__last)
    1735             :    *  to the range beginning at @p result_first, where the number of
    1736             :    *  elements to be copied, @p N, is the smaller of @p (__last-__first) and
    1737             :    *  @p (__result_last-__result_first).
    1738             :    *  After the sort if @e i and @e j are iterators in the range
    1739             :    *  @p [__result_first,__result_first+N) such that i precedes j then
    1740             :    *  @p __comp(*j,*i) is false.
    1741             :    *  The value returned is @p __result_first+N.
    1742             :   */
    1743             :   template<typename _InputIterator, typename _RandomAccessIterator,
    1744             :            typename _Compare>
    1745             :     _GLIBCXX20_CONSTEXPR
    1746             :     inline _RandomAccessIterator
    1747             :     partial_sort_copy(_InputIterator __first, _InputIterator __last,
    1748             :                       _RandomAccessIterator __result_first,
    1749             :                       _RandomAccessIterator __result_last,
    1750             :                       _Compare __comp)
    1751             :     {
    1752             : #ifdef _GLIBCXX_CONCEPT_CHECKS
    1753             :       typedef typename iterator_traits<_InputIterator>::value_type
    1754             :         _InputValueType;
    1755             :       typedef typename iterator_traits<_RandomAccessIterator>::value_type
    1756             :         _OutputValueType;
    1757             : #endif
    1758             : 
    1759             :       // concept requirements
    1760             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
    1761             :       __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
    1762             :                                   _RandomAccessIterator>)
    1763             :       __glibcxx_function_requires(_ConvertibleConcept<_InputValueType,
    1764             :                                   _OutputValueType>)
    1765             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    1766             :                                   _InputValueType, _OutputValueType>)
    1767             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    1768             :                                   _OutputValueType, _OutputValueType>)
    1769             :       __glibcxx_requires_valid_range(__first, __last);
    1770             :       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
    1771             :       __glibcxx_requires_valid_range(__result_first, __result_last);
    1772             : 
    1773             :       return std::__partial_sort_copy(__first, __last,
    1774             :                                       __result_first, __result_last,
    1775             :                                 __gnu_cxx::__ops::__iter_comp_iter(__comp));
    1776             :     }
    1777             : 
    1778             :   /// This is a helper function for the sort routine.
    1779             :   template<typename _RandomAccessIterator, typename _Compare>
    1780             :     _GLIBCXX20_CONSTEXPR
    1781             :     void
    1782             :     __unguarded_linear_insert(_RandomAccessIterator __last,
    1783             :                               _Compare __comp)
    1784             :     {
    1785             :       typename iterator_traits<_RandomAccessIterator>::value_type
    1786             :         __val = _GLIBCXX_MOVE(*__last);
    1787             :       _RandomAccessIterator __next = __last;
    1788             :       --__next;
    1789             :       while (__comp(__val, __next))
    1790             :         {
    1791             :           *__last = _GLIBCXX_MOVE(*__next);
    1792             :           __last = __next;
    1793             :           --__next;
    1794             :         }
    1795             :       *__last = _GLIBCXX_MOVE(__val);
    1796             :     }
    1797             : 
    1798             :   /// This is a helper function for the sort routine.
    1799             :   template<typename _RandomAccessIterator, typename _Compare>
    1800             :     _GLIBCXX20_CONSTEXPR
    1801             :     void
    1802             :     __insertion_sort(_RandomAccessIterator __first,
    1803             :                      _RandomAccessIterator __last, _Compare __comp)
    1804             :     {
    1805             :       if (__first == __last) return;
    1806             : 
    1807             :       for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
    1808             :         {
    1809             :           if (__comp(__i, __first))
    1810             :             {
    1811             :               typename iterator_traits<_RandomAccessIterator>::value_type
    1812             :                 __val = _GLIBCXX_MOVE(*__i);
    1813             :               _GLIBCXX_MOVE_BACKWARD3(__first, __i, __i + 1);
    1814             :               *__first = _GLIBCXX_MOVE(__val);
    1815             :             }
    1816             :           else
    1817             :             std::__unguarded_linear_insert(__i,
    1818             :                                 __gnu_cxx::__ops::__val_comp_iter(__comp));
    1819             :         }
    1820             :     }
    1821             : 
    1822             :   /// This is a helper function for the sort routine.
    1823             :   template<typename _RandomAccessIterator, typename _Compare>
    1824             :     _GLIBCXX20_CONSTEXPR
    1825             :     inline void
    1826             :     __unguarded_insertion_sort(_RandomAccessIterator __first,
    1827             :                                _RandomAccessIterator __last, _Compare __comp)
    1828             :     {
    1829             :       for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
    1830             :         std::__unguarded_linear_insert(__i,
    1831             :                                 __gnu_cxx::__ops::__val_comp_iter(__comp));
    1832             :     }
    1833             : 
    1834             :   /**
    1835             :    *  @doctodo
    1836             :    *  This controls some aspect of the sort routines.
    1837             :   */
    1838             :   enum { _S_threshold = 16 };
    1839             : 
    1840             :   /// This is a helper function for the sort routine.
    1841             :   template<typename _RandomAccessIterator, typename _Compare>
    1842             :     _GLIBCXX20_CONSTEXPR
    1843             :     void
    1844             :     __final_insertion_sort(_RandomAccessIterator __first,
    1845             :                            _RandomAccessIterator __last, _Compare __comp)
    1846             :     {
    1847             :       if (__last - __first > int(_S_threshold))
    1848             :         {
    1849             :           std::__insertion_sort(__first, __first + int(_S_threshold), __comp);
    1850             :           std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,
    1851             :                                           __comp);
    1852             :         }
    1853             :       else
    1854             :         std::__insertion_sort(__first, __last, __comp);
    1855             :     }
    1856             : 
    1857             :   /// This is a helper function...
    1858             :   template<typename _RandomAccessIterator, typename _Compare>
    1859             :     _GLIBCXX20_CONSTEXPR
    1860             :     _RandomAccessIterator
    1861             :     __unguarded_partition(_RandomAccessIterator __first,
    1862             :                           _RandomAccessIterator __last,
    1863             :                           _RandomAccessIterator __pivot, _Compare __comp)
    1864             :     {
    1865             :       while (true)
    1866             :         {
    1867             :           while (__comp(__first, __pivot))
    1868             :             ++__first;
    1869             :           --__last;
    1870             :           while (__comp(__pivot, __last))
    1871             :             --__last;
    1872             :           if (!(__first < __last))
    1873             :             return __first;
    1874             :           std::iter_swap(__first, __last);
    1875             :           ++__first;
    1876             :         }
    1877             :     }
    1878             : 
    1879             :   /// This is a helper function...
    1880             :   template<typename _RandomAccessIterator, typename _Compare>
    1881             :     _GLIBCXX20_CONSTEXPR
    1882             :     inline _RandomAccessIterator
    1883             :     __unguarded_partition_pivot(_RandomAccessIterator __first,
    1884             :                                 _RandomAccessIterator __last, _Compare __comp)
    1885             :     {
    1886             :       _RandomAccessIterator __mid = __first + (__last - __first) / 2;
    1887             :       std::__move_median_to_first(__first, __first + 1, __mid, __last - 1,
    1888             :                                   __comp);
    1889             :       return std::__unguarded_partition(__first + 1, __last, __first, __comp);
    1890             :     }
    1891             : 
    1892             :   template<typename _RandomAccessIterator, typename _Compare>
    1893             :     _GLIBCXX20_CONSTEXPR
    1894             :     inline void
    1895             :     __partial_sort(_RandomAccessIterator __first,
    1896             :                    _RandomAccessIterator __middle,
    1897             :                    _RandomAccessIterator __last,
    1898             :                    _Compare __comp)
    1899             :     {
    1900             :       std::__heap_select(__first, __middle, __last, __comp);
    1901             :       std::__sort_heap(__first, __middle, __comp);
    1902             :     }
    1903             : 
    1904             :   /// This is a helper function for the sort routine.
    1905             :   template<typename _RandomAccessIterator, typename _Size, typename _Compare>
    1906             :     _GLIBCXX20_CONSTEXPR
    1907             :     void
    1908             :     __introsort_loop(_RandomAccessIterator __first,
    1909             :                      _RandomAccessIterator __last,
    1910             :                      _Size __depth_limit, _Compare __comp)
    1911             :     {
    1912             :       while (__last - __first > int(_S_threshold))
    1913             :         {
    1914             :           if (__depth_limit == 0)
    1915             :             {
    1916             :               std::__partial_sort(__first, __last, __last, __comp);
    1917             :               return;
    1918             :             }
    1919             :           --__depth_limit;
    1920             :           _RandomAccessIterator __cut =
    1921             :             std::__unguarded_partition_pivot(__first, __last, __comp);
    1922             :           std::__introsort_loop(__cut, __last, __depth_limit, __comp);
    1923             :           __last = __cut;
    1924             :         }
    1925             :     }
    1926             : 
    1927             :   // sort
    1928             : 
    1929             :   template<typename _RandomAccessIterator, typename _Compare>
    1930             :     _GLIBCXX20_CONSTEXPR
    1931             :     inline void
    1932             :     __sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
    1933             :            _Compare __comp)
    1934             :     {
    1935             :       if (__first != __last)
    1936             :         {
    1937             :           std::__introsort_loop(__first, __last,
    1938             :                                 std::__lg(__last - __first) * 2,
    1939             :                                 __comp);
    1940             :           std::__final_insertion_sort(__first, __last, __comp);
    1941             :         }
    1942             :     }
    1943             : 
    1944             :   template<typename _RandomAccessIterator, typename _Size, typename _Compare>
    1945             :     _GLIBCXX20_CONSTEXPR
    1946             :     void
    1947             :     __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth,
    1948             :                   _RandomAccessIterator __last, _Size __depth_limit,
    1949             :                   _Compare __comp)
    1950             :     {
    1951             :       while (__last - __first > 3)
    1952             :         {
    1953             :           if (__depth_limit == 0)
    1954             :             {
    1955             :               std::__heap_select(__first, __nth + 1, __last, __comp);
    1956             :               // Place the nth largest element in its final position.
    1957             :               std::iter_swap(__first, __nth);
    1958             :               return;
    1959             :             }
    1960             :           --__depth_limit;
    1961             :           _RandomAccessIterator __cut =
    1962             :             std::__unguarded_partition_pivot(__first, __last, __comp);
    1963             :           if (__cut <= __nth)
    1964             :             __first = __cut;
    1965             :           else
    1966             :             __last = __cut;
    1967             :         }
    1968             :       std::__insertion_sort(__first, __last, __comp);
    1969             :     }
    1970             : 
    1971             :   // nth_element
    1972             : 
    1973             :   // lower_bound moved to stl_algobase.h
    1974             : 
    1975             :   /**
    1976             :    *  @brief Finds the first position in which @p __val could be inserted
    1977             :    *         without changing the ordering.
    1978             :    *  @ingroup binary_search_algorithms
    1979             :    *  @param  __first   An iterator.
    1980             :    *  @param  __last    Another iterator.
    1981             :    *  @param  __val     The search term.
    1982             :    *  @param  __comp    A functor to use for comparisons.
    1983             :    *  @return An iterator pointing to the first element <em>not less
    1984             :    *           than</em> @p __val, or end() if every element is less
    1985             :    *           than @p __val.
    1986             :    *  @ingroup binary_search_algorithms
    1987             :    *
    1988             :    *  The comparison function should have the same effects on ordering as
    1989             :    *  the function used for the initial sort.
    1990             :   */
    1991             :   template<typename _ForwardIterator, typename _Tp, typename _Compare>
    1992             :     _GLIBCXX20_CONSTEXPR
    1993             :     inline _ForwardIterator
    1994             :     lower_bound(_ForwardIterator __first, _ForwardIterator __last,
    1995             :                 const _Tp& __val, _Compare __comp)
    1996             :     {
    1997             :       // concept requirements
    1998             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
    1999             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    2000             :         typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
    2001             :       __glibcxx_requires_partitioned_lower_pred(__first, __last,
    2002             :                                                 __val, __comp);
    2003             : 
    2004             :       return std::__lower_bound(__first, __last, __val,
    2005             :                                 __gnu_cxx::__ops::__iter_comp_val(__comp));
    2006             :     }
    2007             : 
    2008             :   template<typename _ForwardIterator, typename _Tp, typename _Compare>
    2009             :     _GLIBCXX20_CONSTEXPR
    2010             :     _ForwardIterator
    2011             :     __upper_bound(_ForwardIterator __first, _ForwardIterator __last,
    2012             :                   const _Tp& __val, _Compare __comp)
    2013             :     {
    2014             :       typedef typename iterator_traits<_ForwardIterator>::difference_type
    2015             :         _DistanceType;
    2016             : 
    2017             :       _DistanceType __len = std::distance(__first, __last);
    2018             : 
    2019             :       while (__len > 0)
    2020             :         {
    2021             :           _DistanceType __half = __len >> 1;
    2022             :           _ForwardIterator __middle = __first;
    2023             :           std::advance(__middle, __half);
    2024             :           if (__comp(__val, __middle))
    2025             :             __len = __half;
    2026             :           else
    2027             :             {
    2028             :               __first = __middle;
    2029             :               ++__first;
    2030             :               __len = __len - __half - 1;
    2031             :             }
    2032             :         }
    2033             :       return __first;
    2034             :     }
    2035             : 
    2036             :   /**
    2037             :    *  @brief Finds the last position in which @p __val could be inserted
    2038             :    *         without changing the ordering.
    2039             :    *  @ingroup binary_search_algorithms
    2040             :    *  @param  __first   An iterator.
    2041             :    *  @param  __last    Another iterator.
    2042             :    *  @param  __val     The search term.
    2043             :    *  @return  An iterator pointing to the first element greater than @p __val,
    2044             :    *           or end() if no elements are greater than @p __val.
    2045             :    *  @ingroup binary_search_algorithms
    2046             :   */
    2047             :   template<typename _ForwardIterator, typename _Tp>
    2048             :     _GLIBCXX20_CONSTEXPR
    2049             :     inline _ForwardIterator
    2050             :     upper_bound(_ForwardIterator __first, _ForwardIterator __last,
    2051             :                 const _Tp& __val)
    2052             :     {
    2053             :       // concept requirements
    2054             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
    2055             :       __glibcxx_function_requires(_LessThanOpConcept<
    2056             :         _Tp, typename iterator_traits<_ForwardIterator>::value_type>)
    2057             :       __glibcxx_requires_partitioned_upper(__first, __last, __val);
    2058             : 
    2059             :       return std::__upper_bound(__first, __last, __val,
    2060             :                                 __gnu_cxx::__ops::__val_less_iter());
    2061             :     }
    2062             : 
    2063             :   /**
    2064             :    *  @brief Finds the last position in which @p __val could be inserted
    2065             :    *         without changing the ordering.
    2066             :    *  @ingroup binary_search_algorithms
    2067             :    *  @param  __first   An iterator.
    2068             :    *  @param  __last    Another iterator.
    2069             :    *  @param  __val     The search term.
    2070             :    *  @param  __comp    A functor to use for comparisons.
    2071             :    *  @return  An iterator pointing to the first element greater than @p __val,
    2072             :    *           or end() if no elements are greater than @p __val.
    2073             :    *  @ingroup binary_search_algorithms
    2074             :    *
    2075             :    *  The comparison function should have the same effects on ordering as
    2076             :    *  the function used for the initial sort.
    2077             :   */
    2078             :   template<typename _ForwardIterator, typename _Tp, typename _Compare>
    2079             :     _GLIBCXX20_CONSTEXPR
    2080             :     inline _ForwardIterator
    2081             :     upper_bound(_ForwardIterator __first, _ForwardIterator __last,
    2082             :                 const _Tp& __val, _Compare __comp)
    2083             :     {
    2084             :       // concept requirements
    2085             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
    2086             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    2087             :         _Tp, typename iterator_traits<_ForwardIterator>::value_type>)
    2088             :       __glibcxx_requires_partitioned_upper_pred(__first, __last,
    2089             :                                                 __val, __comp);
    2090             : 
    2091             :       return std::__upper_bound(__first, __last, __val,
    2092             :                                 __gnu_cxx::__ops::__val_comp_iter(__comp));
    2093             :     }
    2094             : 
    2095             :   template<typename _ForwardIterator, typename _Tp,
    2096             :            typename _CompareItTp, typename _CompareTpIt>
    2097             :     _GLIBCXX20_CONSTEXPR
    2098             :     pair<_ForwardIterator, _ForwardIterator>
    2099             :     __equal_range(_ForwardIterator __first, _ForwardIterator __last,
    2100             :                   const _Tp& __val,
    2101             :                   _CompareItTp __comp_it_val, _CompareTpIt __comp_val_it)
    2102             :     {
    2103             :       typedef typename iterator_traits<_ForwardIterator>::difference_type
    2104             :         _DistanceType;
    2105             : 
    2106             :       _DistanceType __len = std::distance(__first, __last);
    2107             : 
    2108             :       while (__len > 0)
    2109             :         {
    2110             :           _DistanceType __half = __len >> 1;
    2111             :           _ForwardIterator __middle = __first;
    2112             :           std::advance(__middle, __half);
    2113             :           if (__comp_it_val(__middle, __val))
    2114             :             {
    2115             :               __first = __middle;
    2116             :               ++__first;
    2117             :               __len = __len - __half - 1;
    2118             :             }
    2119             :           else if (__comp_val_it(__val, __middle))
    2120             :             __len = __half;
    2121             :           else
    2122             :             {
    2123             :               _ForwardIterator __left
    2124             :                 = std::__lower_bound(__first, __middle, __val, __comp_it_val);
    2125             :               std::advance(__first, __len);
    2126             :               _ForwardIterator __right
    2127             :                 = std::__upper_bound(++__middle, __first, __val, __comp_val_it);
    2128             :               return pair<_ForwardIterator, _ForwardIterator>(__left, __right);
    2129             :             }
    2130             :         }
    2131             :       return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
    2132             :     }
    2133             : 
    2134             :   /**
    2135             :    *  @brief Finds the largest subrange in which @p __val could be inserted
    2136             :    *         at any place in it without changing the ordering.
    2137             :    *  @ingroup binary_search_algorithms
    2138             :    *  @param  __first   An iterator.
    2139             :    *  @param  __last    Another iterator.
    2140             :    *  @param  __val     The search term.
    2141             :    *  @return  An pair of iterators defining the subrange.
    2142             :    *  @ingroup binary_search_algorithms
    2143             :    *
    2144             :    *  This is equivalent to
    2145             :    *  @code
    2146             :    *    std::make_pair(lower_bound(__first, __last, __val),
    2147             :    *                   upper_bound(__first, __last, __val))
    2148             :    *  @endcode
    2149             :    *  but does not actually call those functions.
    2150             :   */
    2151             :   template<typename _ForwardIterator, typename _Tp>
    2152             :     _GLIBCXX20_CONSTEXPR
    2153             :     inline pair<_ForwardIterator, _ForwardIterator>
    2154             :     equal_range(_ForwardIterator __first, _ForwardIterator __last,
    2155             :                 const _Tp& __val)
    2156             :     {
    2157             :       // concept requirements
    2158             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
    2159             :       __glibcxx_function_requires(_LessThanOpConcept<
    2160             :         typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
    2161             :       __glibcxx_function_requires(_LessThanOpConcept<
    2162             :         _Tp, typename iterator_traits<_ForwardIterator>::value_type>)
    2163             :       __glibcxx_requires_partitioned_lower(__first, __last, __val);
    2164             :       __glibcxx_requires_partitioned_upper(__first, __last, __val);
    2165             : 
    2166             :       return std::__equal_range(__first, __last, __val,
    2167             :                                 __gnu_cxx::__ops::__iter_less_val(),
    2168             :                                 __gnu_cxx::__ops::__val_less_iter());
    2169             :     }
    2170             : 
    2171             :   /**
    2172             :    *  @brief Finds the largest subrange in which @p __val could be inserted
    2173             :    *         at any place in it without changing the ordering.
    2174             :    *  @param  __first   An iterator.
    2175             :    *  @param  __last    Another iterator.
    2176             :    *  @param  __val     The search term.
    2177             :    *  @param  __comp    A functor to use for comparisons.
    2178             :    *  @return  An pair of iterators defining the subrange.
    2179             :    *  @ingroup binary_search_algorithms
    2180             :    *
    2181             :    *  This is equivalent to
    2182             :    *  @code
    2183             :    *    std::make_pair(lower_bound(__first, __last, __val, __comp),
    2184             :    *                   upper_bound(__first, __last, __val, __comp))
    2185             :    *  @endcode
    2186             :    *  but does not actually call those functions.
    2187             :   */
    2188             :   template<typename _ForwardIterator, typename _Tp, typename _Compare>
    2189             :     _GLIBCXX20_CONSTEXPR
    2190             :     inline pair<_ForwardIterator, _ForwardIterator>
    2191             :     equal_range(_ForwardIterator __first, _ForwardIterator __last,
    2192             :                 const _Tp& __val, _Compare __comp)
    2193             :     {
    2194             :       // concept requirements
    2195             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
    2196             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    2197             :         typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
    2198             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    2199             :         _Tp, typename iterator_traits<_ForwardIterator>::value_type>)
    2200             :       __glibcxx_requires_partitioned_lower_pred(__first, __last,
    2201             :                                                 __val, __comp);
    2202             :       __glibcxx_requires_partitioned_upper_pred(__first, __last,
    2203             :                                                 __val, __comp);
    2204             : 
    2205             :       return std::__equal_range(__first, __last, __val,
    2206             :                                 __gnu_cxx::__ops::__iter_comp_val(__comp),
    2207             :                                 __gnu_cxx::__ops::__val_comp_iter(__comp));
    2208             :     }
    2209             : 
    2210             :   /**
    2211             :    *  @brief Determines whether an element exists in a range.
    2212             :    *  @ingroup binary_search_algorithms
    2213             :    *  @param  __first   An iterator.
    2214             :    *  @param  __last    Another iterator.
    2215             :    *  @param  __val     The search term.
    2216             :    *  @return True if @p __val (or its equivalent) is in [@p
    2217             :    *  __first,@p __last ].
    2218             :    *
    2219             :    *  Note that this does not actually return an iterator to @p __val.  For
    2220             :    *  that, use std::find or a container's specialized find member functions.
    2221             :   */
    2222             :   template<typename _ForwardIterator, typename _Tp>
    2223             :     _GLIBCXX20_CONSTEXPR
    2224             :     bool
    2225             :     binary_search(_ForwardIterator __first, _ForwardIterator __last,
    2226             :                   const _Tp& __val)
    2227             :     {
    2228             :       // concept requirements
    2229             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
    2230             :       __glibcxx_function_requires(_LessThanOpConcept<
    2231             :         _Tp, typename iterator_traits<_ForwardIterator>::value_type>)
    2232             :       __glibcxx_requires_partitioned_lower(__first, __last, __val);
    2233             :       __glibcxx_requires_partitioned_upper(__first, __last, __val);
    2234             : 
    2235             :       _ForwardIterator __i
    2236             :         = std::__lower_bound(__first, __last, __val,
    2237             :                              __gnu_cxx::__ops::__iter_less_val());
    2238             :       return __i != __last && !(__val < *__i);
    2239             :     }
    2240             : 
    2241             :   /**
    2242             :    *  @brief Determines whether an element exists in a range.
    2243             :    *  @ingroup binary_search_algorithms
    2244             :    *  @param  __first   An iterator.
    2245             :    *  @param  __last    Another iterator.
    2246             :    *  @param  __val     The search term.
    2247             :    *  @param  __comp    A functor to use for comparisons.
    2248             :    *  @return  True if @p __val (or its equivalent) is in @p [__first,__last].
    2249             :    *
    2250             :    *  Note that this does not actually return an iterator to @p __val.  For
    2251             :    *  that, use std::find or a container's specialized find member functions.
    2252             :    *
    2253             :    *  The comparison function should have the same effects on ordering as
    2254             :    *  the function used for the initial sort.
    2255             :   */
    2256             :   template<typename _ForwardIterator, typename _Tp, typename _Compare>
    2257             :     _GLIBCXX20_CONSTEXPR
    2258             :     bool
    2259             :     binary_search(_ForwardIterator __first, _ForwardIterator __last,
    2260             :                   const _Tp& __val, _Compare __comp)
    2261             :     {
    2262             :       // concept requirements
    2263             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
    2264             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    2265             :         _Tp, typename iterator_traits<_ForwardIterator>::value_type>)
    2266             :       __glibcxx_requires_partitioned_lower_pred(__first, __last,
    2267             :                                                 __val, __comp);
    2268             :       __glibcxx_requires_partitioned_upper_pred(__first, __last,
    2269             :                                                 __val, __comp);
    2270             : 
    2271             :       _ForwardIterator __i
    2272             :         = std::__lower_bound(__first, __last, __val,
    2273             :                              __gnu_cxx::__ops::__iter_comp_val(__comp));
    2274             :       return __i != __last && !bool(__comp(__val, *__i));
    2275             :     }
    2276             : 
    2277             :   // merge
    2278             : 
    2279             :   /// This is a helper function for the __merge_adaptive routines.
    2280             :   template<typename _InputIterator1, typename _InputIterator2,
    2281             :            typename _OutputIterator, typename _Compare>
    2282             :     void
    2283             :     __move_merge_adaptive(_InputIterator1 __first1, _InputIterator1 __last1,
    2284             :                           _InputIterator2 __first2, _InputIterator2 __last2,
    2285             :                           _OutputIterator __result, _Compare __comp)
    2286             :     {
    2287             :       while (__first1 != __last1 && __first2 != __last2)
    2288             :         {
    2289             :           if (__comp(__first2, __first1))
    2290             :             {
    2291             :               *__result = _GLIBCXX_MOVE(*__first2);
    2292             :               ++__first2;
    2293             :             }
    2294             :           else
    2295             :             {
    2296             :               *__result = _GLIBCXX_MOVE(*__first1);
    2297             :               ++__first1;
    2298             :             }
    2299             :           ++__result;
    2300             :         }
    2301             :       if (__first1 != __last1)
    2302             :         _GLIBCXX_MOVE3(__first1, __last1, __result);
    2303             :     }
    2304             : 
    2305             :   /// This is a helper function for the __merge_adaptive routines.
    2306             :   template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
    2307             :            typename _BidirectionalIterator3, typename _Compare>
    2308             :     void
    2309             :     __move_merge_adaptive_backward(_BidirectionalIterator1 __first1,
    2310             :                                    _BidirectionalIterator1 __last1,
    2311             :                                    _BidirectionalIterator2 __first2,
    2312             :                                    _BidirectionalIterator2 __last2,
    2313             :                                    _BidirectionalIterator3 __result,
    2314             :                                    _Compare __comp)
    2315             :     {
    2316             :       if (__first1 == __last1)
    2317             :         {
    2318             :           _GLIBCXX_MOVE_BACKWARD3(__first2, __last2, __result);
    2319             :           return;
    2320             :         }
    2321             :       else if (__first2 == __last2)
    2322             :         return;
    2323             : 
    2324             :       --__last1;
    2325             :       --__last2;
    2326             :       while (true)
    2327             :         {
    2328             :           if (__comp(__last2, __last1))
    2329             :             {
    2330             :               *--__result = _GLIBCXX_MOVE(*__last1);
    2331             :               if (__first1 == __last1)
    2332             :                 {
    2333             :                   _GLIBCXX_MOVE_BACKWARD3(__first2, ++__last2, __result);
    2334             :                   return;
    2335             :                 }
    2336             :               --__last1;
    2337             :             }
    2338             :           else
    2339             :             {
    2340             :               *--__result = _GLIBCXX_MOVE(*__last2);
    2341             :               if (__first2 == __last2)
    2342             :                 return;
    2343             :               --__last2;
    2344             :             }
    2345             :         }
    2346             :     }
    2347             : 
    2348             :   /// This is a helper function for the merge routines.
    2349             :   template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
    2350             :            typename _Distance>
    2351             :     _BidirectionalIterator1
    2352             :     __rotate_adaptive(_BidirectionalIterator1 __first,
    2353             :                       _BidirectionalIterator1 __middle,
    2354             :                       _BidirectionalIterator1 __last,
    2355             :                       _Distance __len1, _Distance __len2,
    2356             :                       _BidirectionalIterator2 __buffer,
    2357             :                       _Distance __buffer_size)
    2358             :     {
    2359             :       _BidirectionalIterator2 __buffer_end;
    2360             :       if (__len1 > __len2 && __len2 <= __buffer_size)
    2361             :         {
    2362             :           if (__len2)
    2363             :             {
    2364             :               __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
    2365             :               _GLIBCXX_MOVE_BACKWARD3(__first, __middle, __last);
    2366             :               return _GLIBCXX_MOVE3(__buffer, __buffer_end, __first);
    2367             :             }
    2368             :           else
    2369             :             return __first;
    2370             :         }
    2371             :       else if (__len1 <= __buffer_size)
    2372             :         {
    2373             :           if (__len1)
    2374             :             {
    2375             :               __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
    2376             :               _GLIBCXX_MOVE3(__middle, __last, __first);
    2377             :               return _GLIBCXX_MOVE_BACKWARD3(__buffer, __buffer_end, __last);
    2378             :             }
    2379             :           else
    2380             :             return __last;
    2381             :         }
    2382             :       else
    2383             :         return std::rotate(__first, __middle, __last);
    2384             :     }
    2385             : 
    2386             :   /// This is a helper function for the merge routines.
    2387             :   template<typename _BidirectionalIterator, typename _Distance, 
    2388             :            typename _Pointer, typename _Compare>
    2389             :     void
    2390             :     __merge_adaptive(_BidirectionalIterator __first,
    2391             :                      _BidirectionalIterator __middle,
    2392             :                      _BidirectionalIterator __last,
    2393             :                      _Distance __len1, _Distance __len2,
    2394             :                      _Pointer __buffer, _Distance __buffer_size,
    2395             :                      _Compare __comp)
    2396             :     {
    2397             :       if (__len1 <= __len2 && __len1 <= __buffer_size)
    2398             :         {
    2399             :           _Pointer __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
    2400             :           std::__move_merge_adaptive(__buffer, __buffer_end, __middle, __last,
    2401             :                                      __first, __comp);
    2402             :         }
    2403             :       else if (__len2 <= __buffer_size)
    2404             :         {
    2405             :           _Pointer __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
    2406             :           std::__move_merge_adaptive_backward(__first, __middle, __buffer,
    2407             :                                               __buffer_end, __last, __comp);
    2408             :         }
    2409             :       else
    2410             :         {
    2411             :           _BidirectionalIterator __first_cut = __first;
    2412             :           _BidirectionalIterator __second_cut = __middle;
    2413             :           _Distance __len11 = 0;
    2414             :           _Distance __len22 = 0;
    2415             :           if (__len1 > __len2)
    2416             :             {
    2417             :               __len11 = __len1 / 2;
    2418             :               std::advance(__first_cut, __len11);
    2419             :               __second_cut
    2420             :                 = std::__lower_bound(__middle, __last, *__first_cut,
    2421             :                                      __gnu_cxx::__ops::__iter_comp_val(__comp));
    2422             :               __len22 = std::distance(__middle, __second_cut);
    2423             :             }
    2424             :           else
    2425             :             {
    2426             :               __len22 = __len2 / 2;
    2427             :               std::advance(__second_cut, __len22);
    2428             :               __first_cut
    2429             :                 = std::__upper_bound(__first, __middle, *__second_cut,
    2430             :                                      __gnu_cxx::__ops::__val_comp_iter(__comp));
    2431             :               __len11 = std::distance(__first, __first_cut);
    2432             :             }
    2433             : 
    2434             :           _BidirectionalIterator __new_middle
    2435             :             = std::__rotate_adaptive(__first_cut, __middle, __second_cut,
    2436             :                                      __len1 - __len11, __len22, __buffer,
    2437             :                                      __buffer_size);
    2438             :           std::__merge_adaptive(__first, __first_cut, __new_middle, __len11,
    2439             :                                 __len22, __buffer, __buffer_size, __comp);
    2440             :           std::__merge_adaptive(__new_middle, __second_cut, __last,
    2441             :                                 __len1 - __len11,
    2442             :                                 __len2 - __len22, __buffer,
    2443             :                                 __buffer_size, __comp);
    2444             :         }
    2445             :     }
    2446             : 
    2447             :   /// This is a helper function for the merge routines.
    2448             :   template<typename _BidirectionalIterator, typename _Distance,
    2449             :            typename _Compare>
    2450             :     void
    2451             :     __merge_without_buffer(_BidirectionalIterator __first,
    2452             :                            _BidirectionalIterator __middle,
    2453             :                            _BidirectionalIterator __last,
    2454             :                            _Distance __len1, _Distance __len2,
    2455             :                            _Compare __comp)
    2456             :     {
    2457             :       if (__len1 == 0 || __len2 == 0)
    2458             :         return;
    2459             : 
    2460             :       if (__len1 + __len2 == 2)
    2461             :         {
    2462             :           if (__comp(__middle, __first))
    2463             :             std::iter_swap(__first, __middle);
    2464             :           return;
    2465             :         }
    2466             : 
    2467             :       _BidirectionalIterator __first_cut = __first;
    2468             :       _BidirectionalIterator __second_cut = __middle;
    2469             :       _Distance __len11 = 0;
    2470             :       _Distance __len22 = 0;
    2471             :       if (__len1 > __len2)
    2472             :         {
    2473             :           __len11 = __len1 / 2;
    2474             :           std::advance(__first_cut, __len11);
    2475             :           __second_cut
    2476             :             = std::__lower_bound(__middle, __last, *__first_cut,
    2477             :                                  __gnu_cxx::__ops::__iter_comp_val(__comp));
    2478             :           __len22 = std::distance(__middle, __second_cut);
    2479             :         }
    2480             :       else
    2481             :         {
    2482             :           __len22 = __len2 / 2;
    2483             :           std::advance(__second_cut, __len22);
    2484             :           __first_cut
    2485             :             = std::__upper_bound(__first, __middle, *__second_cut,
    2486             :                                  __gnu_cxx::__ops::__val_comp_iter(__comp));
    2487             :           __len11 = std::distance(__first, __first_cut);
    2488             :         }
    2489             : 
    2490             :       _BidirectionalIterator __new_middle
    2491             :         = std::rotate(__first_cut, __middle, __second_cut);
    2492             :       std::__merge_without_buffer(__first, __first_cut, __new_middle,
    2493             :                                   __len11, __len22, __comp);
    2494             :       std::__merge_without_buffer(__new_middle, __second_cut, __last,
    2495             :                                   __len1 - __len11, __len2 - __len22, __comp);
    2496             :     }
    2497             : 
    2498             :   template<typename _BidirectionalIterator, typename _Compare>
    2499             :     void
    2500             :     __inplace_merge(_BidirectionalIterator __first,
    2501             :                     _BidirectionalIterator __middle,
    2502             :                     _BidirectionalIterator __last,
    2503             :                     _Compare __comp)
    2504             :     {
    2505             :       typedef typename iterator_traits<_BidirectionalIterator>::value_type
    2506             :           _ValueType;
    2507             :       typedef typename iterator_traits<_BidirectionalIterator>::difference_type
    2508             :           _DistanceType;
    2509             :       typedef _Temporary_buffer<_BidirectionalIterator, _ValueType> _TmpBuf;
    2510             : 
    2511             :       if (__first == __middle || __middle == __last)
    2512             :         return;
    2513             : 
    2514             :       const _DistanceType __len1 = std::distance(__first, __middle);
    2515             :       const _DistanceType __len2 = std::distance(__middle, __last);
    2516             : 
    2517             :       // __merge_adaptive will use a buffer for the smaller of
    2518             :       // [first,middle) and [middle,last).
    2519             :       _TmpBuf __buf(__first, std::min(__len1, __len2));
    2520             : 
    2521             :       if (__buf.begin() == 0)
    2522             :         std::__merge_without_buffer
    2523             :           (__first, __middle, __last, __len1, __len2, __comp);
    2524             :       else
    2525             :         std::__merge_adaptive
    2526             :           (__first, __middle, __last, __len1, __len2, __buf.begin(),
    2527             :            _DistanceType(__buf.size()), __comp);
    2528             :     }
    2529             : 
    2530             :   /**
    2531             :    *  @brief Merges two sorted ranges in place.
    2532             :    *  @ingroup sorting_algorithms
    2533             :    *  @param  __first   An iterator.
    2534             :    *  @param  __middle  Another iterator.
    2535             :    *  @param  __last    Another iterator.
    2536             :    *  @return  Nothing.
    2537             :    *
    2538             :    *  Merges two sorted and consecutive ranges, [__first,__middle) and
    2539             :    *  [__middle,__last), and puts the result in [__first,__last).  The
    2540             :    *  output will be sorted.  The sort is @e stable, that is, for
    2541             :    *  equivalent elements in the two ranges, elements from the first
    2542             :    *  range will always come before elements from the second.
    2543             :    *
    2544             :    *  If enough additional memory is available, this takes (__last-__first)-1
    2545             :    *  comparisons.  Otherwise an NlogN algorithm is used, where N is
    2546             :    *  distance(__first,__last).
    2547             :   */
    2548             :   template<typename _BidirectionalIterator>
    2549             :     inline void
    2550             :     inplace_merge(_BidirectionalIterator __first,
    2551             :                   _BidirectionalIterator __middle,
    2552             :                   _BidirectionalIterator __last)
    2553             :     {
    2554             :       // concept requirements
    2555             :       __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
    2556             :             _BidirectionalIterator>)
    2557             :       __glibcxx_function_requires(_LessThanComparableConcept<
    2558             :             typename iterator_traits<_BidirectionalIterator>::value_type>)
    2559             :       __glibcxx_requires_sorted(__first, __middle);
    2560             :       __glibcxx_requires_sorted(__middle, __last);
    2561             :       __glibcxx_requires_irreflexive(__first, __last);
    2562             : 
    2563             :       std::__inplace_merge(__first, __middle, __last,
    2564             :                            __gnu_cxx::__ops::__iter_less_iter());
    2565             :     }
    2566             : 
    2567             :   /**
    2568             :    *  @brief Merges two sorted ranges in place.
    2569             :    *  @ingroup sorting_algorithms
    2570             :    *  @param  __first   An iterator.
    2571             :    *  @param  __middle  Another iterator.
    2572             :    *  @param  __last    Another iterator.
    2573             :    *  @param  __comp    A functor to use for comparisons.
    2574             :    *  @return  Nothing.
    2575             :    *
    2576             :    *  Merges two sorted and consecutive ranges, [__first,__middle) and
    2577             :    *  [middle,last), and puts the result in [__first,__last).  The output will
    2578             :    *  be sorted.  The sort is @e stable, that is, for equivalent
    2579             :    *  elements in the two ranges, elements from the first range will always
    2580             :    *  come before elements from the second.
    2581             :    *
    2582             :    *  If enough additional memory is available, this takes (__last-__first)-1
    2583             :    *  comparisons.  Otherwise an NlogN algorithm is used, where N is
    2584             :    *  distance(__first,__last).
    2585             :    *
    2586             :    *  The comparison function should have the same effects on ordering as
    2587             :    *  the function used for the initial sort.
    2588             :   */
    2589             :   template<typename _BidirectionalIterator, typename _Compare>
    2590             :     inline void
    2591             :     inplace_merge(_BidirectionalIterator __first,
    2592             :                   _BidirectionalIterator __middle,
    2593             :                   _BidirectionalIterator __last,
    2594             :                   _Compare __comp)
    2595             :     {
    2596             :       // concept requirements
    2597             :       __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
    2598             :             _BidirectionalIterator>)
    2599             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    2600             :             typename iterator_traits<_BidirectionalIterator>::value_type,
    2601             :             typename iterator_traits<_BidirectionalIterator>::value_type>)
    2602             :       __glibcxx_requires_sorted_pred(__first, __middle, __comp);
    2603             :       __glibcxx_requires_sorted_pred(__middle, __last, __comp);
    2604             :       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
    2605             : 
    2606             :       std::__inplace_merge(__first, __middle, __last,
    2607             :                            __gnu_cxx::__ops::__iter_comp_iter(__comp));
    2608             :     }
    2609             : 
    2610             : 
    2611             :   /// This is a helper function for the __merge_sort_loop routines.
    2612             :   template<typename _InputIterator, typename _OutputIterator,
    2613             :            typename _Compare>
    2614             :     _OutputIterator
    2615             :     __move_merge(_InputIterator __first1, _InputIterator __last1,
    2616             :                  _InputIterator __first2, _InputIterator __last2,
    2617             :                  _OutputIterator __result, _Compare __comp)
    2618             :     {
    2619             :       while (__first1 != __last1 && __first2 != __last2)
    2620             :         {
    2621             :           if (__comp(__first2, __first1))
    2622             :             {
    2623             :               *__result = _GLIBCXX_MOVE(*__first2);
    2624             :               ++__first2;
    2625             :             }
    2626             :           else
    2627             :             {
    2628             :               *__result = _GLIBCXX_MOVE(*__first1);
    2629             :               ++__first1;
    2630             :             }
    2631             :           ++__result;
    2632             :         }
    2633             :       return _GLIBCXX_MOVE3(__first2, __last2,
    2634             :                             _GLIBCXX_MOVE3(__first1, __last1,
    2635             :                                            __result));
    2636             :     }
    2637             : 
    2638             :   template<typename _RandomAccessIterator1, typename _RandomAccessIterator2,
    2639             :            typename _Distance, typename _Compare>
    2640             :     void
    2641             :     __merge_sort_loop(_RandomAccessIterator1 __first,
    2642             :                       _RandomAccessIterator1 __last,
    2643             :                       _RandomAccessIterator2 __result, _Distance __step_size,
    2644             :                       _Compare __comp)
    2645             :     {
    2646             :       const _Distance __two_step = 2 * __step_size;
    2647             : 
    2648             :       while (__last - __first >= __two_step)
    2649             :         {
    2650             :           __result = std::__move_merge(__first, __first + __step_size,
    2651             :                                        __first + __step_size,
    2652             :                                        __first + __two_step,
    2653             :                                        __result, __comp);
    2654             :           __first += __two_step;
    2655             :         }
    2656             :       __step_size = std::min(_Distance(__last - __first), __step_size);
    2657             : 
    2658             :       std::__move_merge(__first, __first + __step_size,
    2659             :                         __first + __step_size, __last, __result, __comp);
    2660             :     }
    2661             : 
    2662             :   template<typename _RandomAccessIterator, typename _Distance,
    2663             :            typename _Compare>
    2664             :     _GLIBCXX20_CONSTEXPR
    2665             :     void
    2666             :     __chunk_insertion_sort(_RandomAccessIterator __first,
    2667             :                            _RandomAccessIterator __last,
    2668             :                            _Distance __chunk_size, _Compare __comp)
    2669             :     {
    2670             :       while (__last - __first >= __chunk_size)
    2671             :         {
    2672             :           std::__insertion_sort(__first, __first + __chunk_size, __comp);
    2673             :           __first += __chunk_size;
    2674             :         }
    2675             :       std::__insertion_sort(__first, __last, __comp);
    2676             :     }
    2677             : 
    2678             :   enum { _S_chunk_size = 7 };
    2679             : 
    2680             :   template<typename _RandomAccessIterator, typename _Pointer, typename _Compare>
    2681             :     void
    2682             :     __merge_sort_with_buffer(_RandomAccessIterator __first,
    2683             :                              _RandomAccessIterator __last,
    2684             :                              _Pointer __buffer, _Compare __comp)
    2685             :     {
    2686             :       typedef typename iterator_traits<_RandomAccessIterator>::difference_type
    2687             :         _Distance;
    2688             : 
    2689             :       const _Distance __len = __last - __first;
    2690             :       const _Pointer __buffer_last = __buffer + __len;
    2691             : 
    2692             :       _Distance __step_size = _S_chunk_size;
    2693             :       std::__chunk_insertion_sort(__first, __last, __step_size, __comp);
    2694             : 
    2695             :       while (__step_size < __len)
    2696             :         {
    2697             :           std::__merge_sort_loop(__first, __last, __buffer,
    2698             :                                  __step_size, __comp);
    2699             :           __step_size *= 2;
    2700             :           std::__merge_sort_loop(__buffer, __buffer_last, __first,
    2701             :                                  __step_size, __comp);
    2702             :           __step_size *= 2;
    2703             :         }
    2704             :     }
    2705             : 
    2706             :   template<typename _RandomAccessIterator, typename _Pointer,
    2707             :            typename _Distance, typename _Compare>
    2708             :     void
    2709             :     __stable_sort_adaptive(_RandomAccessIterator __first,
    2710             :                            _RandomAccessIterator __last,
    2711             :                            _Pointer __buffer, _Distance __buffer_size,
    2712             :                            _Compare __comp)
    2713             :     {
    2714             :       const _Distance __len = (__last - __first + 1) / 2;
    2715             :       const _RandomAccessIterator __middle = __first + __len;
    2716             :       if (__len > __buffer_size)
    2717             :         {
    2718             :           std::__stable_sort_adaptive(__first, __middle, __buffer,
    2719             :                                       __buffer_size, __comp);
    2720             :           std::__stable_sort_adaptive(__middle, __last, __buffer,
    2721             :                                       __buffer_size, __comp);
    2722             :         }
    2723             :       else
    2724             :         {
    2725             :           std::__merge_sort_with_buffer(__first, __middle, __buffer, __comp);
    2726             :           std::__merge_sort_with_buffer(__middle, __last, __buffer, __comp);
    2727             :         }
    2728             : 
    2729             :       std::__merge_adaptive(__first, __middle, __last,
    2730             :                             _Distance(__middle - __first),
    2731             :                             _Distance(__last - __middle),
    2732             :                             __buffer, __buffer_size,
    2733             :                             __comp);
    2734             :     }
    2735             : 
    2736             :   /// This is a helper function for the stable sorting routines.
    2737             :   template<typename _RandomAccessIterator, typename _Compare>
    2738             :     void
    2739             :     __inplace_stable_sort(_RandomAccessIterator __first,
    2740             :                           _RandomAccessIterator __last, _Compare __comp)
    2741             :     {
    2742             :       if (__last - __first < 15)
    2743             :         {
    2744             :           std::__insertion_sort(__first, __last, __comp);
    2745             :           return;
    2746             :         }
    2747             :       _RandomAccessIterator __middle = __first + (__last - __first) / 2;
    2748             :       std::__inplace_stable_sort(__first, __middle, __comp);
    2749             :       std::__inplace_stable_sort(__middle, __last, __comp);
    2750             :       std::__merge_without_buffer(__first, __middle, __last,
    2751             :                                   __middle - __first,
    2752             :                                   __last - __middle,
    2753             :                                   __comp);
    2754             :     }
    2755             : 
    2756             :   // stable_sort
    2757             : 
    2758             :   // Set algorithms: includes, set_union, set_intersection, set_difference,
    2759             :   // set_symmetric_difference.  All of these algorithms have the precondition
    2760             :   // that their input ranges are sorted and the postcondition that their output
    2761             :   // ranges are sorted.
    2762             : 
    2763             :   template<typename _InputIterator1, typename _InputIterator2,
    2764             :            typename _Compare>
    2765             :     _GLIBCXX20_CONSTEXPR
    2766             :     bool
    2767             :     __includes(_InputIterator1 __first1, _InputIterator1 __last1,
    2768             :                _InputIterator2 __first2, _InputIterator2 __last2,
    2769             :                _Compare __comp)
    2770             :     {
    2771             :       while (__first1 != __last1 && __first2 != __last2)
    2772             :         {
    2773             :           if (__comp(__first2, __first1))
    2774             :             return false;
    2775             :           if (!__comp(__first1, __first2))
    2776             :             ++__first2;
    2777             :           ++__first1;
    2778             :         }
    2779             : 
    2780             :       return __first2 == __last2;
    2781             :     }
    2782             : 
    2783             :   /**
    2784             :    *  @brief Determines whether all elements of a sequence exists in a range.
    2785             :    *  @param  __first1  Start of search range.
    2786             :    *  @param  __last1   End of search range.
    2787             :    *  @param  __first2  Start of sequence
    2788             :    *  @param  __last2   End of sequence.
    2789             :    *  @return  True if each element in [__first2,__last2) is contained in order
    2790             :    *  within [__first1,__last1).  False otherwise.
    2791             :    *  @ingroup set_algorithms
    2792             :    *
    2793             :    *  This operation expects both [__first1,__last1) and
    2794             :    *  [__first2,__last2) to be sorted.  Searches for the presence of
    2795             :    *  each element in [__first2,__last2) within [__first1,__last1).
    2796             :    *  The iterators over each range only move forward, so this is a
    2797             :    *  linear algorithm.  If an element in [__first2,__last2) is not
    2798             :    *  found before the search iterator reaches @p __last2, false is
    2799             :    *  returned.
    2800             :   */
    2801             :   template<typename _InputIterator1, typename _InputIterator2>
    2802             :     _GLIBCXX20_CONSTEXPR
    2803             :     inline bool
    2804             :     includes(_InputIterator1 __first1, _InputIterator1 __last1,
    2805             :              _InputIterator2 __first2, _InputIterator2 __last2)
    2806             :     {
    2807             :       // concept requirements
    2808             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
    2809             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
    2810             :       __glibcxx_function_requires(_LessThanOpConcept<
    2811             :             typename iterator_traits<_InputIterator1>::value_type,
    2812             :             typename iterator_traits<_InputIterator2>::value_type>)
    2813             :       __glibcxx_function_requires(_LessThanOpConcept<
    2814             :             typename iterator_traits<_InputIterator2>::value_type,
    2815             :             typename iterator_traits<_InputIterator1>::value_type>)
    2816             :       __glibcxx_requires_sorted_set(__first1, __last1, __first2);
    2817             :       __glibcxx_requires_sorted_set(__first2, __last2, __first1);
    2818             :       __glibcxx_requires_irreflexive2(__first1, __last1);
    2819             :       __glibcxx_requires_irreflexive2(__first2, __last2);
    2820             : 
    2821             :       return std::__includes(__first1, __last1, __first2, __last2,
    2822             :                              __gnu_cxx::__ops::__iter_less_iter());
    2823             :     }
    2824             : 
    2825             :   /**
    2826             :    *  @brief Determines whether all elements of a sequence exists in a range
    2827             :    *  using comparison.
    2828             :    *  @ingroup set_algorithms
    2829             :    *  @param  __first1  Start of search range.
    2830             :    *  @param  __last1   End of search range.
    2831             :    *  @param  __first2  Start of sequence
    2832             :    *  @param  __last2   End of sequence.
    2833             :    *  @param  __comp    Comparison function to use.
    2834             :    *  @return True if each element in [__first2,__last2) is contained
    2835             :    *  in order within [__first1,__last1) according to comp.  False
    2836             :    *  otherwise.  @ingroup set_algorithms
    2837             :    *
    2838             :    *  This operation expects both [__first1,__last1) and
    2839             :    *  [__first2,__last2) to be sorted.  Searches for the presence of
    2840             :    *  each element in [__first2,__last2) within [__first1,__last1),
    2841             :    *  using comp to decide.  The iterators over each range only move
    2842             :    *  forward, so this is a linear algorithm.  If an element in
    2843             :    *  [__first2,__last2) is not found before the search iterator
    2844             :    *  reaches @p __last2, false is returned.
    2845             :   */
    2846             :   template<typename _InputIterator1, typename _InputIterator2,
    2847             :            typename _Compare>
    2848             :     _GLIBCXX20_CONSTEXPR
    2849             :     inline bool
    2850             :     includes(_InputIterator1 __first1, _InputIterator1 __last1,
    2851             :              _InputIterator2 __first2, _InputIterator2 __last2,
    2852             :              _Compare __comp)
    2853             :     {
    2854             :       // concept requirements
    2855             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
    2856             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
    2857             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    2858             :             typename iterator_traits<_InputIterator1>::value_type,
    2859             :             typename iterator_traits<_InputIterator2>::value_type>)
    2860             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    2861             :             typename iterator_traits<_InputIterator2>::value_type,
    2862             :             typename iterator_traits<_InputIterator1>::value_type>)
    2863             :       __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
    2864             :       __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
    2865             :       __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
    2866             :       __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
    2867             : 
    2868             :       return std::__includes(__first1, __last1, __first2, __last2,
    2869             :                              __gnu_cxx::__ops::__iter_comp_iter(__comp));
    2870             :     }
    2871             : 
    2872             :   // nth_element
    2873             :   // merge
    2874             :   // set_difference
    2875             :   // set_intersection
    2876             :   // set_union
    2877             :   // stable_sort
    2878             :   // set_symmetric_difference
    2879             :   // min_element
    2880             :   // max_element
    2881             : 
    2882             :   template<typename _BidirectionalIterator, typename _Compare>
    2883             :     _GLIBCXX20_CONSTEXPR
    2884             :     bool
    2885             :     __next_permutation(_BidirectionalIterator __first,
    2886             :                        _BidirectionalIterator __last, _Compare __comp)
    2887             :     {
    2888             :       if (__first == __last)
    2889             :         return false;
    2890             :       _BidirectionalIterator __i = __first;
    2891             :       ++__i;
    2892             :       if (__i == __last)
    2893             :         return false;
    2894             :       __i = __last;
    2895             :       --__i;
    2896             : 
    2897             :       for(;;)
    2898             :         {
    2899             :           _BidirectionalIterator __ii = __i;
    2900             :           --__i;
    2901             :           if (__comp(__i, __ii))
    2902             :             {
    2903             :               _BidirectionalIterator __j = __last;
    2904             :               while (!__comp(__i, --__j))
    2905             :                 {}
    2906             :               std::iter_swap(__i, __j);
    2907             :               std::__reverse(__ii, __last,
    2908             :                              std::__iterator_category(__first));
    2909             :               return true;
    2910             :             }
    2911             :           if (__i == __first)
    2912             :             {
    2913             :               std::__reverse(__first, __last,
    2914             :                              std::__iterator_category(__first));
    2915             :               return false;
    2916             :             }
    2917             :         }
    2918             :     }
    2919             : 
    2920             :   /**
    2921             :    *  @brief  Permute range into the next @e dictionary ordering.
    2922             :    *  @ingroup sorting_algorithms
    2923             :    *  @param  __first  Start of range.
    2924             :    *  @param  __last   End of range.
    2925             :    *  @return  False if wrapped to first permutation, true otherwise.
    2926             :    *
    2927             :    *  Treats all permutations of the range as a set of @e dictionary sorted
    2928             :    *  sequences.  Permutes the current sequence into the next one of this set.
    2929             :    *  Returns true if there are more sequences to generate.  If the sequence
    2930             :    *  is the largest of the set, the smallest is generated and false returned.
    2931             :   */
    2932             :   template<typename _BidirectionalIterator>
    2933             :     _GLIBCXX20_CONSTEXPR
    2934             :     inline bool
    2935             :     next_permutation(_BidirectionalIterator __first,
    2936             :                      _BidirectionalIterator __last)
    2937             :     {
    2938             :       // concept requirements
    2939             :       __glibcxx_function_requires(_BidirectionalIteratorConcept<
    2940             :                                   _BidirectionalIterator>)
    2941             :       __glibcxx_function_requires(_LessThanComparableConcept<
    2942             :             typename iterator_traits<_BidirectionalIterator>::value_type>)
    2943             :       __glibcxx_requires_valid_range(__first, __last);
    2944             :       __glibcxx_requires_irreflexive(__first, __last);
    2945             : 
    2946             :       return std::__next_permutation
    2947             :         (__first, __last, __gnu_cxx::__ops::__iter_less_iter());
    2948             :     }
    2949             : 
    2950             :   /**
    2951             :    *  @brief  Permute range into the next @e dictionary ordering using
    2952             :    *          comparison functor.
    2953             :    *  @ingroup sorting_algorithms
    2954             :    *  @param  __first  Start of range.
    2955             :    *  @param  __last   End of range.
    2956             :    *  @param  __comp   A comparison functor.
    2957             :    *  @return  False if wrapped to first permutation, true otherwise.
    2958             :    *
    2959             :    *  Treats all permutations of the range [__first,__last) as a set of
    2960             :    *  @e dictionary sorted sequences ordered by @p __comp.  Permutes the current
    2961             :    *  sequence into the next one of this set.  Returns true if there are more
    2962             :    *  sequences to generate.  If the sequence is the largest of the set, the
    2963             :    *  smallest is generated and false returned.
    2964             :   */
    2965             :   template<typename _BidirectionalIterator, typename _Compare>
    2966             :     _GLIBCXX20_CONSTEXPR
    2967             :     inline bool
    2968             :     next_permutation(_BidirectionalIterator __first,
    2969             :                      _BidirectionalIterator __last, _Compare __comp)
    2970             :     {
    2971             :       // concept requirements
    2972             :       __glibcxx_function_requires(_BidirectionalIteratorConcept<
    2973             :                                   _BidirectionalIterator>)
    2974             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    2975             :             typename iterator_traits<_BidirectionalIterator>::value_type,
    2976             :             typename iterator_traits<_BidirectionalIterator>::value_type>)
    2977             :       __glibcxx_requires_valid_range(__first, __last);
    2978             :       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
    2979             : 
    2980             :       return std::__next_permutation
    2981             :         (__first, __last, __gnu_cxx::__ops::__iter_comp_iter(__comp));
    2982             :     }
    2983             : 
    2984             :   template<typename _BidirectionalIterator, typename _Compare>
    2985             :     _GLIBCXX20_CONSTEXPR
    2986             :     bool
    2987             :     __prev_permutation(_BidirectionalIterator __first,
    2988             :                        _BidirectionalIterator __last, _Compare __comp)
    2989             :     {
    2990             :       if (__first == __last)
    2991             :         return false;
    2992             :       _BidirectionalIterator __i = __first;
    2993             :       ++__i;
    2994             :       if (__i == __last)
    2995             :         return false;
    2996             :       __i = __last;
    2997             :       --__i;
    2998             : 
    2999             :       for(;;)
    3000             :         {
    3001             :           _BidirectionalIterator __ii = __i;
    3002             :           --__i;
    3003             :           if (__comp(__ii, __i))
    3004             :             {
    3005             :               _BidirectionalIterator __j = __last;
    3006             :               while (!__comp(--__j, __i))
    3007             :                 {}
    3008             :               std::iter_swap(__i, __j);
    3009             :               std::__reverse(__ii, __last,
    3010             :                              std::__iterator_category(__first));
    3011             :               return true;
    3012             :             }
    3013             :           if (__i == __first)
    3014             :             {
    3015             :               std::__reverse(__first, __last,
    3016             :                              std::__iterator_category(__first));
    3017             :               return false;
    3018             :             }
    3019             :         }
    3020             :     }
    3021             : 
    3022             :   /**
    3023             :    *  @brief  Permute range into the previous @e dictionary ordering.
    3024             :    *  @ingroup sorting_algorithms
    3025             :    *  @param  __first  Start of range.
    3026             :    *  @param  __last   End of range.
    3027             :    *  @return  False if wrapped to last permutation, true otherwise.
    3028             :    *
    3029             :    *  Treats all permutations of the range as a set of @e dictionary sorted
    3030             :    *  sequences.  Permutes the current sequence into the previous one of this
    3031             :    *  set.  Returns true if there are more sequences to generate.  If the
    3032             :    *  sequence is the smallest of the set, the largest is generated and false
    3033             :    *  returned.
    3034             :   */
    3035             :   template<typename _BidirectionalIterator>
    3036             :     _GLIBCXX20_CONSTEXPR
    3037             :     inline bool
    3038             :     prev_permutation(_BidirectionalIterator __first,
    3039             :                      _BidirectionalIterator __last)
    3040             :     {
    3041             :       // concept requirements
    3042             :       __glibcxx_function_requires(_BidirectionalIteratorConcept<
    3043             :                                   _BidirectionalIterator>)
    3044             :       __glibcxx_function_requires(_LessThanComparableConcept<
    3045             :             typename iterator_traits<_BidirectionalIterator>::value_type>)
    3046             :       __glibcxx_requires_valid_range(__first, __last);
    3047             :       __glibcxx_requires_irreflexive(__first, __last);
    3048             : 
    3049             :       return std::__prev_permutation(__first, __last,
    3050             :                                      __gnu_cxx::__ops::__iter_less_iter());
    3051             :     }
    3052             : 
    3053             :   /**
    3054             :    *  @brief  Permute range into the previous @e dictionary ordering using
    3055             :    *          comparison functor.
    3056             :    *  @ingroup sorting_algorithms
    3057             :    *  @param  __first  Start of range.
    3058             :    *  @param  __last   End of range.
    3059             :    *  @param  __comp   A comparison functor.
    3060             :    *  @return  False if wrapped to last permutation, true otherwise.
    3061             :    *
    3062             :    *  Treats all permutations of the range [__first,__last) as a set of
    3063             :    *  @e dictionary sorted sequences ordered by @p __comp.  Permutes the current
    3064             :    *  sequence into the previous one of this set.  Returns true if there are
    3065             :    *  more sequences to generate.  If the sequence is the smallest of the set,
    3066             :    *  the largest is generated and false returned.
    3067             :   */
    3068             :   template<typename _BidirectionalIterator, typename _Compare>
    3069             :     _GLIBCXX20_CONSTEXPR
    3070             :     inline bool
    3071             :     prev_permutation(_BidirectionalIterator __first,
    3072             :                      _BidirectionalIterator __last, _Compare __comp)
    3073             :     {
    3074             :       // concept requirements
    3075             :       __glibcxx_function_requires(_BidirectionalIteratorConcept<
    3076             :                                   _BidirectionalIterator>)
    3077             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    3078             :             typename iterator_traits<_BidirectionalIterator>::value_type,
    3079             :             typename iterator_traits<_BidirectionalIterator>::value_type>)
    3080             :       __glibcxx_requires_valid_range(__first, __last);
    3081             :       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
    3082             : 
    3083             :       return std::__prev_permutation(__first, __last,
    3084             :                                 __gnu_cxx::__ops::__iter_comp_iter(__comp));
    3085             :     }
    3086             : 
    3087             :   // replace
    3088             :   // replace_if
    3089             : 
    3090             :   template<typename _InputIterator, typename _OutputIterator,
    3091             :            typename _Predicate, typename _Tp>
    3092             :     _GLIBCXX20_CONSTEXPR
    3093             :     _OutputIterator
    3094             :     __replace_copy_if(_InputIterator __first, _InputIterator __last,
    3095             :                       _OutputIterator __result,
    3096             :                       _Predicate __pred, const _Tp& __new_value)
    3097             :     {
    3098             :       for (; __first != __last; ++__first, (void)++__result)
    3099             :         if (__pred(__first))
    3100             :           *__result = __new_value;
    3101             :         else
    3102             :           *__result = *__first;
    3103             :       return __result;
    3104             :     }
    3105             : 
    3106             :   /**
    3107             :    *  @brief Copy a sequence, replacing each element of one value with another
    3108             :    *         value.
    3109             :    *  @param  __first      An input iterator.
    3110             :    *  @param  __last       An input iterator.
    3111             :    *  @param  __result     An output iterator.
    3112             :    *  @param  __old_value  The value to be replaced.
    3113             :    *  @param  __new_value  The replacement value.
    3114             :    *  @return   The end of the output sequence, @p result+(last-first).
    3115             :    *
    3116             :    *  Copies each element in the input range @p [__first,__last) to the
    3117             :    *  output range @p [__result,__result+(__last-__first)) replacing elements
    3118             :    *  equal to @p __old_value with @p __new_value.
    3119             :   */
    3120             :   template<typename _InputIterator, typename _OutputIterator, typename _Tp>
    3121             :     _GLIBCXX20_CONSTEXPR
    3122             :     inline _OutputIterator
    3123             :     replace_copy(_InputIterator __first, _InputIterator __last,
    3124             :                  _OutputIterator __result,
    3125             :                  const _Tp& __old_value, const _Tp& __new_value)
    3126             :     {
    3127             :       // concept requirements
    3128             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
    3129             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    3130             :             typename iterator_traits<_InputIterator>::value_type>)
    3131             :       __glibcxx_function_requires(_EqualOpConcept<
    3132             :             typename iterator_traits<_InputIterator>::value_type, _Tp>)
    3133             :       __glibcxx_requires_valid_range(__first, __last);
    3134             : 
    3135             :       return std::__replace_copy_if(__first, __last, __result,
    3136             :                         __gnu_cxx::__ops::__iter_equals_val(__old_value),
    3137             :                                               __new_value);
    3138             :     }
    3139             : 
    3140             :   /**
    3141             :    *  @brief Copy a sequence, replacing each value for which a predicate
    3142             :    *         returns true with another value.
    3143             :    *  @ingroup mutating_algorithms
    3144             :    *  @param  __first      An input iterator.
    3145             :    *  @param  __last       An input iterator.
    3146             :    *  @param  __result     An output iterator.
    3147             :    *  @param  __pred       A predicate.
    3148             :    *  @param  __new_value  The replacement value.
    3149             :    *  @return   The end of the output sequence, @p __result+(__last-__first).
    3150             :    *
    3151             :    *  Copies each element in the range @p [__first,__last) to the range
    3152             :    *  @p [__result,__result+(__last-__first)) replacing elements for which
    3153             :    *  @p __pred returns true with @p __new_value.
    3154             :   */
    3155             :   template<typename _InputIterator, typename _OutputIterator,
    3156             :            typename _Predicate, typename _Tp>
    3157             :     _GLIBCXX20_CONSTEXPR
    3158             :     inline _OutputIterator
    3159             :     replace_copy_if(_InputIterator __first, _InputIterator __last,
    3160             :                     _OutputIterator __result,
    3161             :                     _Predicate __pred, const _Tp& __new_value)
    3162             :     {
    3163             :       // concept requirements
    3164             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
    3165             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    3166             :             typename iterator_traits<_InputIterator>::value_type>)
    3167             :       __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
    3168             :             typename iterator_traits<_InputIterator>::value_type>)
    3169             :       __glibcxx_requires_valid_range(__first, __last);
    3170             : 
    3171             :       return std::__replace_copy_if(__first, __last, __result,
    3172             :                                 __gnu_cxx::__ops::__pred_iter(__pred),
    3173             :                                               __new_value);
    3174             :     }
    3175             : 
    3176             : #if __cplusplus >= 201103L
    3177             :   /**
    3178             :    *  @brief  Determines whether the elements of a sequence are sorted.
    3179             :    *  @ingroup sorting_algorithms
    3180             :    *  @param  __first   An iterator.
    3181             :    *  @param  __last    Another iterator.
    3182             :    *  @return  True if the elements are sorted, false otherwise.
    3183             :   */
    3184             :   template<typename _ForwardIterator>
    3185             :     _GLIBCXX20_CONSTEXPR
    3186             :     inline bool
    3187             :     is_sorted(_ForwardIterator __first, _ForwardIterator __last)
    3188             :     { return std::is_sorted_until(__first, __last) == __last; }
    3189             : 
    3190             :   /**
    3191             :    *  @brief  Determines whether the elements of a sequence are sorted
    3192             :    *          according to a comparison functor.
    3193             :    *  @ingroup sorting_algorithms
    3194             :    *  @param  __first   An iterator.
    3195             :    *  @param  __last    Another iterator.
    3196             :    *  @param  __comp    A comparison functor.
    3197             :    *  @return  True if the elements are sorted, false otherwise.
    3198             :   */
    3199             :   template<typename _ForwardIterator, typename _Compare>
    3200             :     _GLIBCXX20_CONSTEXPR
    3201             :     inline bool
    3202             :     is_sorted(_ForwardIterator __first, _ForwardIterator __last,
    3203             :               _Compare __comp)
    3204             :     { return std::is_sorted_until(__first, __last, __comp) == __last; }
    3205             : 
    3206             :   template<typename _ForwardIterator, typename _Compare>
    3207             :     _GLIBCXX20_CONSTEXPR
    3208             :     _ForwardIterator
    3209             :     __is_sorted_until(_ForwardIterator __first, _ForwardIterator __last,
    3210             :                       _Compare __comp)
    3211             :     {
    3212             :       if (__first == __last)
    3213             :         return __last;
    3214             : 
    3215             :       _ForwardIterator __next = __first;
    3216             :       for (++__next; __next != __last; __first = __next, (void)++__next)
    3217             :         if (__comp(__next, __first))
    3218             :           return __next;
    3219             :       return __next;
    3220             :     }
    3221             : 
    3222             :   /**
    3223             :    *  @brief  Determines the end of a sorted sequence.
    3224             :    *  @ingroup sorting_algorithms
    3225             :    *  @param  __first   An iterator.
    3226             :    *  @param  __last    Another iterator.
    3227             :    *  @return  An iterator pointing to the last iterator i in [__first, __last)
    3228             :    *           for which the range [__first, i) is sorted.
    3229             :   */
    3230             :   template<typename _ForwardIterator>
    3231             :     _GLIBCXX20_CONSTEXPR
    3232             :     inline _ForwardIterator
    3233             :     is_sorted_until(_ForwardIterator __first, _ForwardIterator __last)
    3234             :     {
    3235             :       // concept requirements
    3236             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
    3237             :       __glibcxx_function_requires(_LessThanComparableConcept<
    3238             :             typename iterator_traits<_ForwardIterator>::value_type>)
    3239             :       __glibcxx_requires_valid_range(__first, __last);
    3240             :       __glibcxx_requires_irreflexive(__first, __last);
    3241             : 
    3242             :       return std::__is_sorted_until(__first, __last,
    3243             :                                     __gnu_cxx::__ops::__iter_less_iter());
    3244             :     }
    3245             : 
    3246             :   /**
    3247             :    *  @brief  Determines the end of a sorted sequence using comparison functor.
    3248             :    *  @ingroup sorting_algorithms
    3249             :    *  @param  __first   An iterator.
    3250             :    *  @param  __last    Another iterator.
    3251             :    *  @param  __comp    A comparison functor.
    3252             :    *  @return  An iterator pointing to the last iterator i in [__first, __last)
    3253             :    *           for which the range [__first, i) is sorted.
    3254             :   */
    3255             :   template<typename _ForwardIterator, typename _Compare>
    3256             :     _GLIBCXX20_CONSTEXPR
    3257             :     inline _ForwardIterator
    3258             :     is_sorted_until(_ForwardIterator __first, _ForwardIterator __last,
    3259             :                     _Compare __comp)
    3260             :     {
    3261             :       // concept requirements
    3262             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
    3263             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    3264             :             typename iterator_traits<_ForwardIterator>::value_type,
    3265             :             typename iterator_traits<_ForwardIterator>::value_type>)
    3266             :       __glibcxx_requires_valid_range(__first, __last);
    3267             :       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
    3268             : 
    3269             :       return std::__is_sorted_until(__first, __last,
    3270             :                                     __gnu_cxx::__ops::__iter_comp_iter(__comp));
    3271             :     }
    3272             : 
    3273             :   /**
    3274             :    *  @brief  Determines min and max at once as an ordered pair.
    3275             :    *  @ingroup sorting_algorithms
    3276             :    *  @param  __a  A thing of arbitrary type.
    3277             :    *  @param  __b  Another thing of arbitrary type.
    3278             :    *  @return A pair(__b, __a) if __b is smaller than __a, pair(__a,
    3279             :    *  __b) otherwise.
    3280             :   */
    3281             :   template<typename _Tp>
    3282             :     _GLIBCXX14_CONSTEXPR
    3283             :     inline pair<const _Tp&, const _Tp&>
    3284             :     minmax(const _Tp& __a, const _Tp& __b)
    3285             :     {
    3286             :       // concept requirements
    3287             :       __glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
    3288             : 
    3289             :       return __b < __a ? pair<const _Tp&, const _Tp&>(__b, __a)
    3290             :                        : pair<const _Tp&, const _Tp&>(__a, __b);
    3291             :     }
    3292             : 
    3293             :   /**
    3294             :    *  @brief  Determines min and max at once as an ordered pair.
    3295             :    *  @ingroup sorting_algorithms
    3296             :    *  @param  __a  A thing of arbitrary type.
    3297             :    *  @param  __b  Another thing of arbitrary type.
    3298             :    *  @param  __comp  A @link comparison_functors comparison functor @endlink.
    3299             :    *  @return A pair(__b, __a) if __b is smaller than __a, pair(__a,
    3300             :    *  __b) otherwise.
    3301             :   */
    3302             :   template<typename _Tp, typename _Compare>
    3303             :     _GLIBCXX14_CONSTEXPR
    3304             :     inline pair<const _Tp&, const _Tp&>
    3305             :     minmax(const _Tp& __a, const _Tp& __b, _Compare __comp)
    3306             :     {
    3307             :       return __comp(__b, __a) ? pair<const _Tp&, const _Tp&>(__b, __a)
    3308             :                               : pair<const _Tp&, const _Tp&>(__a, __b);
    3309             :     }
    3310             : 
    3311             :   template<typename _ForwardIterator, typename _Compare>
    3312             :     _GLIBCXX14_CONSTEXPR
    3313             :     pair<_ForwardIterator, _ForwardIterator>
    3314             :     __minmax_element(_ForwardIterator __first, _ForwardIterator __last,
    3315             :                      _Compare __comp)
    3316             :     {
    3317             :       _ForwardIterator __next = __first;
    3318             :       if (__first == __last
    3319             :           || ++__next == __last)
    3320             :         return std::make_pair(__first, __first);
    3321             : 
    3322             :       _ForwardIterator __min{}, __max{};
    3323             :       if (__comp(__next, __first))
    3324             :         {
    3325             :           __min = __next;
    3326             :           __max = __first;
    3327             :         }
    3328             :       else
    3329             :         {
    3330             :           __min = __first;
    3331             :           __max = __next;
    3332             :         }
    3333             : 
    3334             :       __first = __next;
    3335             :       ++__first;
    3336             : 
    3337             :       while (__first != __last)
    3338             :         {
    3339             :           __next = __first;
    3340             :           if (++__next == __last)
    3341             :             {
    3342             :               if (__comp(__first, __min))
    3343             :                 __min = __first;
    3344             :               else if (!__comp(__first, __max))
    3345             :                 __max = __first;
    3346             :               break;
    3347             :             }
    3348             : 
    3349             :           if (__comp(__next, __first))
    3350             :             {
    3351             :               if (__comp(__next, __min))
    3352             :                 __min = __next;
    3353             :               if (!__comp(__first, __max))
    3354             :                 __max = __first;
    3355             :             }
    3356             :           else
    3357             :             {
    3358             :               if (__comp(__first, __min))
    3359             :                 __min = __first;
    3360             :               if (!__comp(__next, __max))
    3361             :                 __max = __next;
    3362             :             }
    3363             : 
    3364             :           __first = __next;
    3365             :           ++__first;
    3366             :         }
    3367             : 
    3368             :       return std::make_pair(__min, __max);
    3369             :     }
    3370             : 
    3371             :   /**
    3372             :    *  @brief  Return a pair of iterators pointing to the minimum and maximum
    3373             :    *          elements in a range.
    3374             :    *  @ingroup sorting_algorithms
    3375             :    *  @param  __first  Start of range.
    3376             :    *  @param  __last   End of range.
    3377             :    *  @return  make_pair(m, M), where m is the first iterator i in 
    3378             :    *           [__first, __last) such that no other element in the range is
    3379             :    *           smaller, and where M is the last iterator i in [__first, __last)
    3380             :    *           such that no other element in the range is larger.
    3381             :   */
    3382             :   template<typename _ForwardIterator>
    3383             :     _GLIBCXX14_CONSTEXPR
    3384             :     inline pair<_ForwardIterator, _ForwardIterator>
    3385             :     minmax_element(_ForwardIterator __first, _ForwardIterator __last)
    3386             :     {
    3387             :       // concept requirements
    3388             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
    3389             :       __glibcxx_function_requires(_LessThanComparableConcept<
    3390             :             typename iterator_traits<_ForwardIterator>::value_type>)
    3391             :       __glibcxx_requires_valid_range(__first, __last);
    3392             :       __glibcxx_requires_irreflexive(__first, __last);
    3393             : 
    3394             :       return std::__minmax_element(__first, __last,
    3395             :                                    __gnu_cxx::__ops::__iter_less_iter());
    3396             :     }
    3397             : 
    3398             :   /**
    3399             :    *  @brief  Return a pair of iterators pointing to the minimum and maximum
    3400             :    *          elements in a range.
    3401             :    *  @ingroup sorting_algorithms
    3402             :    *  @param  __first  Start of range.
    3403             :    *  @param  __last   End of range.
    3404             :    *  @param  __comp   Comparison functor.
    3405             :    *  @return  make_pair(m, M), where m is the first iterator i in 
    3406             :    *           [__first, __last) such that no other element in the range is
    3407             :    *           smaller, and where M is the last iterator i in [__first, __last)
    3408             :    *           such that no other element in the range is larger.
    3409             :   */
    3410             :   template<typename _ForwardIterator, typename _Compare>
    3411             :     _GLIBCXX14_CONSTEXPR
    3412             :     inline pair<_ForwardIterator, _ForwardIterator>
    3413             :     minmax_element(_ForwardIterator __first, _ForwardIterator __last,
    3414             :                    _Compare __comp)
    3415             :     {
    3416             :       // concept requirements
    3417             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
    3418             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    3419             :             typename iterator_traits<_ForwardIterator>::value_type,
    3420             :             typename iterator_traits<_ForwardIterator>::value_type>)
    3421             :       __glibcxx_requires_valid_range(__first, __last);
    3422             :       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
    3423             : 
    3424             :       return std::__minmax_element(__first, __last,
    3425             :                                    __gnu_cxx::__ops::__iter_comp_iter(__comp));
    3426             :     }
    3427             : 
    3428             :   template<typename _Tp>
    3429             :     _GLIBCXX14_CONSTEXPR
    3430             :     inline pair<_Tp, _Tp>
    3431             :     minmax(initializer_list<_Tp> __l)
    3432             :     {
    3433             :       __glibcxx_requires_irreflexive(__l.begin(), __l.end());
    3434             :       pair<const _Tp*, const _Tp*> __p =
    3435             :         std::__minmax_element(__l.begin(), __l.end(),
    3436             :                               __gnu_cxx::__ops::__iter_less_iter());
    3437             :       return std::make_pair(*__p.first, *__p.second);
    3438             :     }
    3439             : 
    3440             :   template<typename _Tp, typename _Compare>
    3441             :     _GLIBCXX14_CONSTEXPR
    3442             :     inline pair<_Tp, _Tp>
    3443             :     minmax(initializer_list<_Tp> __l, _Compare __comp)
    3444             :     {
    3445             :       __glibcxx_requires_irreflexive_pred(__l.begin(), __l.end(), __comp);
    3446             :       pair<const _Tp*, const _Tp*> __p =
    3447             :         std::__minmax_element(__l.begin(), __l.end(),
    3448             :                               __gnu_cxx::__ops::__iter_comp_iter(__comp));
    3449             :       return std::make_pair(*__p.first, *__p.second);
    3450             :     }
    3451             : 
    3452             :   /**
    3453             :    *  @brief  Checks whether a permutation of the second sequence is equal
    3454             :    *          to the first sequence.
    3455             :    *  @ingroup non_mutating_algorithms
    3456             :    *  @param  __first1  Start of first range.
    3457             :    *  @param  __last1   End of first range.
    3458             :    *  @param  __first2  Start of second range.
    3459             :    *  @param  __pred    A binary predicate.
    3460             :    *  @return true if there exists a permutation of the elements in
    3461             :    *          the range [__first2, __first2 + (__last1 - __first1)),
    3462             :    *          beginning with ForwardIterator2 begin, such that
    3463             :    *          equal(__first1, __last1, __begin, __pred) returns true;
    3464             :    *          otherwise, returns false.
    3465             :   */
    3466             :   template<typename _ForwardIterator1, typename _ForwardIterator2,
    3467             :            typename _BinaryPredicate>
    3468             :     _GLIBCXX20_CONSTEXPR
    3469             :     inline bool
    3470             :     is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
    3471             :                    _ForwardIterator2 __first2, _BinaryPredicate __pred)
    3472             :     {
    3473             :       // concept requirements
    3474             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
    3475             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
    3476             :       __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
    3477             :             typename iterator_traits<_ForwardIterator1>::value_type,
    3478             :             typename iterator_traits<_ForwardIterator2>::value_type>)
    3479             :       __glibcxx_requires_valid_range(__first1, __last1);
    3480             : 
    3481             :       return std::__is_permutation(__first1, __last1, __first2,
    3482             :                                    __gnu_cxx::__ops::__iter_comp_iter(__pred));
    3483             :     }
    3484             : 
    3485             : #if __cplusplus > 201103L
    3486             :   template<typename _ForwardIterator1, typename _ForwardIterator2,
    3487             :            typename _BinaryPredicate>
    3488             :     _GLIBCXX20_CONSTEXPR
    3489             :     bool
    3490             :     __is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
    3491             :                      _ForwardIterator2 __first2, _ForwardIterator2 __last2,
    3492             :                      _BinaryPredicate __pred)
    3493             :     {
    3494             :       using _Cat1
    3495             :         = typename iterator_traits<_ForwardIterator1>::iterator_category;
    3496             :       using _Cat2
    3497             :         = typename iterator_traits<_ForwardIterator2>::iterator_category;
    3498             :       using _It1_is_RA = is_same<_Cat1, random_access_iterator_tag>;
    3499             :       using _It2_is_RA = is_same<_Cat2, random_access_iterator_tag>;
    3500             :       constexpr bool __ra_iters = _It1_is_RA() && _It2_is_RA();
    3501             :       if (__ra_iters)
    3502             :         {
    3503             :           auto __d1 = std::distance(__first1, __last1);
    3504             :           auto __d2 = std::distance(__first2, __last2);
    3505             :           if (__d1 != __d2)
    3506             :             return false;
    3507             :         }
    3508             : 
    3509             :       // Efficiently compare identical prefixes:  O(N) if sequences
    3510             :       // have the same elements in the same order.
    3511             :       for (; __first1 != __last1 && __first2 != __last2;
    3512             :           ++__first1, (void)++__first2)
    3513             :         if (!__pred(__first1, __first2))
    3514             :           break;
    3515             : 
    3516             :       if (__ra_iters)
    3517             :         {
    3518             :           if (__first1 == __last1)
    3519             :             return true;
    3520             :         }
    3521             :       else
    3522             :         {
    3523             :           auto __d1 = std::distance(__first1, __last1);
    3524             :           auto __d2 = std::distance(__first2, __last2);
    3525             :           if (__d1 == 0 && __d2 == 0)
    3526             :             return true;
    3527             :           if (__d1 != __d2)
    3528             :             return false;
    3529             :         }
    3530             : 
    3531             :       for (_ForwardIterator1 __scan = __first1; __scan != __last1; ++__scan)
    3532             :         {
    3533             :           if (__scan != std::__find_if(__first1, __scan,
    3534             :                         __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan)))
    3535             :             continue; // We've seen this one before.
    3536             : 
    3537             :           auto __matches = std::__count_if(__first2, __last2,
    3538             :                 __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan));
    3539             :           if (0 == __matches
    3540             :               || std::__count_if(__scan, __last1,
    3541             :                         __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan))
    3542             :               != __matches)
    3543             :             return false;
    3544             :         }
    3545             :       return true;
    3546             :     }
    3547             : 
    3548             :   /**
    3549             :    *  @brief  Checks whether a permutaion of the second sequence is equal
    3550             :    *          to the first sequence.
    3551             :    *  @ingroup non_mutating_algorithms
    3552             :    *  @param  __first1  Start of first range.
    3553             :    *  @param  __last1   End of first range.
    3554             :    *  @param  __first2  Start of second range.
    3555             :    *  @param  __last2   End of first range.
    3556             :    *  @return true if there exists a permutation of the elements in the range
    3557             :    *          [__first2, __last2), beginning with ForwardIterator2 begin,
    3558             :    *          such that equal(__first1, __last1, begin) returns true;
    3559             :    *          otherwise, returns false.
    3560             :   */
    3561             :   template<typename _ForwardIterator1, typename _ForwardIterator2>
    3562             :     _GLIBCXX20_CONSTEXPR
    3563             :     inline bool
    3564             :     is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
    3565             :                    _ForwardIterator2 __first2, _ForwardIterator2 __last2)
    3566             :     {
    3567             :       __glibcxx_requires_valid_range(__first1, __last1);
    3568             :       __glibcxx_requires_valid_range(__first2, __last2);
    3569             : 
    3570             :       return
    3571             :         std::__is_permutation(__first1, __last1, __first2, __last2,
    3572             :                               __gnu_cxx::__ops::__iter_equal_to_iter());
    3573             :     }
    3574             : 
    3575             :   /**
    3576             :    *  @brief  Checks whether a permutation of the second sequence is equal
    3577             :    *          to the first sequence.
    3578             :    *  @ingroup non_mutating_algorithms
    3579             :    *  @param  __first1  Start of first range.
    3580             :    *  @param  __last1   End of first range.
    3581             :    *  @param  __first2  Start of second range.
    3582             :    *  @param  __last2   End of first range.
    3583             :    *  @param  __pred    A binary predicate.
    3584             :    *  @return true if there exists a permutation of the elements in the range
    3585             :    *          [__first2, __last2), beginning with ForwardIterator2 begin,
    3586             :    *          such that equal(__first1, __last1, __begin, __pred) returns true;
    3587             :    *          otherwise, returns false.
    3588             :   */
    3589             :   template<typename _ForwardIterator1, typename _ForwardIterator2,
    3590             :            typename _BinaryPredicate>
    3591             :     _GLIBCXX20_CONSTEXPR
    3592             :     inline bool
    3593             :     is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
    3594             :                    _ForwardIterator2 __first2, _ForwardIterator2 __last2,
    3595             :                    _BinaryPredicate __pred)
    3596             :     {
    3597             :       __glibcxx_requires_valid_range(__first1, __last1);
    3598             :       __glibcxx_requires_valid_range(__first2, __last2);
    3599             : 
    3600             :       return std::__is_permutation(__first1, __last1, __first2, __last2,
    3601             :                                    __gnu_cxx::__ops::__iter_comp_iter(__pred));
    3602             :     }
    3603             : 
    3604             : #if __cplusplus >= 201703L
    3605             : 
    3606             : #define __cpp_lib_clamp 201603L
    3607             : 
    3608             :   /**
    3609             :    *  @brief  Returns the value clamped between lo and hi.
    3610             :    *  @ingroup sorting_algorithms
    3611             :    *  @param  __val  A value of arbitrary type.
    3612             :    *  @param  __lo   A lower limit of arbitrary type.
    3613             :    *  @param  __hi   An upper limit of arbitrary type.
    3614             :    *  @retval `__lo` if `__val < __lo`
    3615             :    *  @retval `__hi` if `__hi < __val`
    3616             :    *  @retval `__val` otherwise.
    3617             :    *  @pre `_Tp` is LessThanComparable and `(__hi < __lo)` is false.
    3618             :    */
    3619             :   template<typename _Tp>
    3620             :     constexpr const _Tp&
    3621             :     clamp(const _Tp& __val, const _Tp& __lo, const _Tp& __hi)
    3622             :     {
    3623             :       __glibcxx_assert(!(__hi < __lo));
    3624             :       return std::min(std::max(__val, __lo), __hi);
    3625             :     }
    3626             : 
    3627             :   /**
    3628             :    *  @brief  Returns the value clamped between lo and hi.
    3629             :    *  @ingroup sorting_algorithms
    3630             :    *  @param  __val   A value of arbitrary type.
    3631             :    *  @param  __lo    A lower limit of arbitrary type.
    3632             :    *  @param  __hi    An upper limit of arbitrary type.
    3633             :    *  @param  __comp  A comparison functor.
    3634             :    *  @retval `__lo` if `__comp(__val, __lo)`
    3635             :    *  @retval `__hi` if `__comp(__hi, __val)`
    3636             :    *  @retval `__val` otherwise.
    3637             :    *  @pre `__comp(__hi, __lo)` is false.
    3638             :    */
    3639             :   template<typename _Tp, typename _Compare>
    3640             :     constexpr const _Tp&
    3641             :     clamp(const _Tp& __val, const _Tp& __lo, const _Tp& __hi, _Compare __comp)
    3642             :     {
    3643             :       __glibcxx_assert(!__comp(__hi, __lo));
    3644             :       return std::min(std::max(__val, __lo, __comp), __hi, __comp);
    3645             :     }
    3646             : #endif // C++17
    3647             : #endif // C++14
    3648             : 
    3649             : #ifdef _GLIBCXX_USE_C99_STDINT_TR1
    3650             :   /**
    3651             :    *  @brief Generate two uniformly distributed integers using a
    3652             :    *         single distribution invocation.
    3653             :    *  @param  __b0    The upper bound for the first integer.
    3654             :    *  @param  __b1    The upper bound for the second integer.
    3655             :    *  @param  __g     A UniformRandomBitGenerator.
    3656             :    *  @return  A pair (i, j) with i and j uniformly distributed
    3657             :    *           over [0, __b0) and [0, __b1), respectively.
    3658             :    *
    3659             :    *  Requires: __b0 * __b1 <= __g.max() - __g.min().
    3660             :    *
    3661             :    *  Using uniform_int_distribution with a range that is very
    3662             :    *  small relative to the range of the generator ends up wasting
    3663             :    *  potentially expensively generated randomness, since
    3664             :    *  uniform_int_distribution does not store leftover randomness
    3665             :    *  between invocations.
    3666             :    *
    3667             :    *  If we know we want two integers in ranges that are sufficiently
    3668             :    *  small, we can compose the ranges, use a single distribution
    3669             :    *  invocation, and significantly reduce the waste.
    3670             :   */
    3671             :   template<typename _IntType, typename _UniformRandomBitGenerator>
    3672             :     pair<_IntType, _IntType>
    3673             :     __gen_two_uniform_ints(_IntType __b0, _IntType __b1,
    3674             :                            _UniformRandomBitGenerator&& __g)
    3675             :     {
    3676             :       _IntType __x
    3677             :         = uniform_int_distribution<_IntType>{0, (__b0 * __b1) - 1}(__g);
    3678             :       return std::make_pair(__x / __b1, __x % __b1);
    3679             :     }
    3680             : 
    3681             :   /**
    3682             :    *  @brief Shuffle the elements of a sequence using a uniform random
    3683             :    *         number generator.
    3684             :    *  @ingroup mutating_algorithms
    3685             :    *  @param  __first   A forward iterator.
    3686             :    *  @param  __last    A forward iterator.
    3687             :    *  @param  __g       A UniformRandomNumberGenerator (26.5.1.3).
    3688             :    *  @return  Nothing.
    3689             :    *
    3690             :    *  Reorders the elements in the range @p [__first,__last) using @p __g to
    3691             :    *  provide random numbers.
    3692             :   */
    3693             :   template<typename _RandomAccessIterator,
    3694             :            typename _UniformRandomNumberGenerator>
    3695             :     void
    3696             :     shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
    3697             :             _UniformRandomNumberGenerator&& __g)
    3698             :     {
    3699             :       // concept requirements
    3700             :       __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
    3701             :             _RandomAccessIterator>)
    3702             :       __glibcxx_requires_valid_range(__first, __last);
    3703             : 
    3704             :       if (__first == __last)
    3705             :         return;
    3706             : 
    3707             :       typedef typename iterator_traits<_RandomAccessIterator>::difference_type
    3708             :         _DistanceType;
    3709             : 
    3710             :       typedef typename std::make_unsigned<_DistanceType>::type __ud_type;
    3711             :       typedef typename std::uniform_int_distribution<__ud_type> __distr_type;
    3712             :       typedef typename __distr_type::param_type __p_type;
    3713             : 
    3714             :       typedef typename remove_reference<_UniformRandomNumberGenerator>::type
    3715             :         _Gen;
    3716             :       typedef typename common_type<typename _Gen::result_type, __ud_type>::type
    3717             :         __uc_type;
    3718             : 
    3719             :       const __uc_type __urngrange = __g.max() - __g.min();
    3720             :       const __uc_type __urange = __uc_type(__last - __first);
    3721             : 
    3722             :       if (__urngrange / __urange >= __urange)
    3723             :         // I.e. (__urngrange >= __urange * __urange) but without wrap issues.
    3724             :       {
    3725             :         _RandomAccessIterator __i = __first + 1;
    3726             : 
    3727             :         // Since we know the range isn't empty, an even number of elements
    3728             :         // means an uneven number of elements /to swap/, in which case we
    3729             :         // do the first one up front:
    3730             : 
    3731             :         if ((__urange % 2) == 0)
    3732             :         {
    3733             :           __distr_type __d{0, 1};
    3734             :           std::iter_swap(__i++, __first + __d(__g));
    3735             :         }
    3736             : 
    3737             :         // Now we know that __last - __i is even, so we do the rest in pairs,
    3738             :         // using a single distribution invocation to produce swap positions
    3739             :         // for two successive elements at a time:
    3740             : 
    3741             :         while (__i != __last)
    3742             :         {
    3743             :           const __uc_type __swap_range = __uc_type(__i - __first) + 1;
    3744             : 
    3745             :           const pair<__uc_type, __uc_type> __pospos =
    3746             :             __gen_two_uniform_ints(__swap_range, __swap_range + 1, __g);
    3747             : 
    3748             :           std::iter_swap(__i++, __first + __pospos.first);
    3749             :           std::iter_swap(__i++, __first + __pospos.second);
    3750             :         }
    3751             : 
    3752             :         return;
    3753             :       }
    3754             : 
    3755             :       __distr_type __d;
    3756             : 
    3757             :       for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
    3758             :         std::iter_swap(__i, __first + __d(__g, __p_type(0, __i - __first)));
    3759             :     }
    3760             : #endif // USE C99_STDINT
    3761             : 
    3762             : #endif // C++11
    3763             : 
    3764             : _GLIBCXX_BEGIN_NAMESPACE_ALGO
    3765             : 
    3766             :   /**
    3767             :    *  @brief Apply a function to every element of a sequence.
    3768             :    *  @ingroup non_mutating_algorithms
    3769             :    *  @param  __first  An input iterator.
    3770             :    *  @param  __last   An input iterator.
    3771             :    *  @param  __f      A unary function object.
    3772             :    *  @return   @p __f
    3773             :    *
    3774             :    *  Applies the function object @p __f to each element in the range
    3775             :    *  @p [first,last).  @p __f must not modify the order of the sequence.
    3776             :    *  If @p __f has a return value it is ignored.
    3777             :   */
    3778             :   template<typename _InputIterator, typename _Function>
    3779             :     _GLIBCXX20_CONSTEXPR
    3780             :     _Function
    3781             :     for_each(_InputIterator __first, _InputIterator __last, _Function __f)
    3782             :     {
    3783             :       // concept requirements
    3784             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
    3785             :       __glibcxx_requires_valid_range(__first, __last);
    3786             :       for (; __first != __last; ++__first)
    3787             :         __f(*__first);
    3788             :       return __f; // N.B. [alg.foreach] says std::move(f) but it's redundant.
    3789             :     }
    3790             : 
    3791             : #if __cplusplus >= 201703L
    3792             :   /**
    3793             :    *  @brief Apply a function to every element of a sequence.
    3794             :    *  @ingroup non_mutating_algorithms
    3795             :    *  @param  __first  An input iterator.
    3796             :    *  @param  __n      A value convertible to an integer.
    3797             :    *  @param  __f      A unary function object.
    3798             :    *  @return   `__first+__n`
    3799             :    *
    3800             :    *  Applies the function object `__f` to each element in the range
    3801             :    *  `[first, first+n)`.  `__f` must not modify the order of the sequence.
    3802             :    *  If `__f` has a return value it is ignored.
    3803             :   */
    3804             :   template<typename _InputIterator, typename _Size, typename _Function>
    3805             :     _GLIBCXX20_CONSTEXPR
    3806             :     _InputIterator
    3807             :     for_each_n(_InputIterator __first, _Size __n, _Function __f)
    3808             :     {
    3809             :       auto __n2 = std::__size_to_integer(__n);
    3810             :       using _Cat = typename iterator_traits<_InputIterator>::iterator_category;
    3811             :       if constexpr (is_base_of_v<random_access_iterator_tag, _Cat>)
    3812             :         {
    3813             :           if (__n2 <= 0)
    3814             :             return __first;
    3815             :           auto __last = __first + __n2;
    3816             :           std::for_each(__first, __last, std::move(__f));
    3817             :           return __last;
    3818             :         }
    3819             :       else
    3820             :         {
    3821             :           while (__n2-->0)
    3822             :             {
    3823             :               __f(*__first);
    3824             :               ++__first;
    3825             :             }
    3826             :           return __first;
    3827             :         }
    3828             :     }
    3829             : #endif // C++17
    3830             : 
    3831             :   /**
    3832             :    *  @brief Find the first occurrence of a value in a sequence.
    3833             :    *  @ingroup non_mutating_algorithms
    3834             :    *  @param  __first  An input iterator.
    3835             :    *  @param  __last   An input iterator.
    3836             :    *  @param  __val    The value to find.
    3837             :    *  @return   The first iterator @c i in the range @p [__first,__last)
    3838             :    *  such that @c *i == @p __val, or @p __last if no such iterator exists.
    3839             :   */
    3840             :   template<typename _InputIterator, typename _Tp>
    3841             :     _GLIBCXX20_CONSTEXPR
    3842             :     inline _InputIterator
    3843          42 :     find(_InputIterator __first, _InputIterator __last,
    3844             :          const _Tp& __val)
    3845             :     {
    3846             :       // concept requirements
    3847             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
    3848             :       __glibcxx_function_requires(_EqualOpConcept<
    3849             :                 typename iterator_traits<_InputIterator>::value_type, _Tp>)
    3850             :       __glibcxx_requires_valid_range(__first, __last);
    3851          42 :       return std::__find_if(__first, __last,
    3852             :                             __gnu_cxx::__ops::__iter_equals_val(__val));
    3853             :     }
    3854             : 
    3855             :   /**
    3856             :    *  @brief Find the first element in a sequence for which a
    3857             :    *         predicate is true.
    3858             :    *  @ingroup non_mutating_algorithms
    3859             :    *  @param  __first  An input iterator.
    3860             :    *  @param  __last   An input iterator.
    3861             :    *  @param  __pred   A predicate.
    3862             :    *  @return   The first iterator @c i in the range @p [__first,__last)
    3863             :    *  such that @p __pred(*i) is true, or @p __last if no such iterator exists.
    3864             :   */
    3865             :   template<typename _InputIterator, typename _Predicate>
    3866             :     _GLIBCXX20_CONSTEXPR
    3867             :     inline _InputIterator
    3868             :     find_if(_InputIterator __first, _InputIterator __last,
    3869             :             _Predicate __pred)
    3870             :     {
    3871             :       // concept requirements
    3872             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
    3873             :       __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
    3874             :               typename iterator_traits<_InputIterator>::value_type>)
    3875             :       __glibcxx_requires_valid_range(__first, __last);
    3876             : 
    3877             :       return std::__find_if(__first, __last,
    3878             :                             __gnu_cxx::__ops::__pred_iter(__pred));
    3879             :     }
    3880             : 
    3881             :   /**
    3882             :    *  @brief  Find element from a set in a sequence.
    3883             :    *  @ingroup non_mutating_algorithms
    3884             :    *  @param  __first1  Start of range to search.
    3885             :    *  @param  __last1   End of range to search.
    3886             :    *  @param  __first2  Start of match candidates.
    3887             :    *  @param  __last2   End of match candidates.
    3888             :    *  @return   The first iterator @c i in the range
    3889             :    *  @p [__first1,__last1) such that @c *i == @p *(i2) such that i2 is an
    3890             :    *  iterator in [__first2,__last2), or @p __last1 if no such iterator exists.
    3891             :    *
    3892             :    *  Searches the range @p [__first1,__last1) for an element that is
    3893             :    *  equal to some element in the range [__first2,__last2).  If
    3894             :    *  found, returns an iterator in the range [__first1,__last1),
    3895             :    *  otherwise returns @p __last1.
    3896             :   */
    3897             :   template<typename _InputIterator, typename _ForwardIterator>
    3898             :     _GLIBCXX20_CONSTEXPR
    3899             :     _InputIterator
    3900             :     find_first_of(_InputIterator __first1, _InputIterator __last1,
    3901             :                   _ForwardIterator __first2, _ForwardIterator __last2)
    3902             :     {
    3903             :       // concept requirements
    3904             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
    3905             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
    3906             :       __glibcxx_function_requires(_EqualOpConcept<
    3907             :             typename iterator_traits<_InputIterator>::value_type,
    3908             :             typename iterator_traits<_ForwardIterator>::value_type>)
    3909             :       __glibcxx_requires_valid_range(__first1, __last1);
    3910             :       __glibcxx_requires_valid_range(__first2, __last2);
    3911             : 
    3912             :       for (; __first1 != __last1; ++__first1)
    3913             :         for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
    3914             :           if (*__first1 == *__iter)
    3915             :             return __first1;
    3916             :       return __last1;
    3917             :     }
    3918             : 
    3919             :   /**
    3920             :    *  @brief  Find element from a set in a sequence using a predicate.
    3921             :    *  @ingroup non_mutating_algorithms
    3922             :    *  @param  __first1  Start of range to search.
    3923             :    *  @param  __last1   End of range to search.
    3924             :    *  @param  __first2  Start of match candidates.
    3925             :    *  @param  __last2   End of match candidates.
    3926             :    *  @param  __comp    Predicate to use.
    3927             :    *  @return   The first iterator @c i in the range
    3928             :    *  @p [__first1,__last1) such that @c comp(*i, @p *(i2)) is true
    3929             :    *  and i2 is an iterator in [__first2,__last2), or @p __last1 if no
    3930             :    *  such iterator exists.
    3931             :    *
    3932             : 
    3933             :    *  Searches the range @p [__first1,__last1) for an element that is
    3934             :    *  equal to some element in the range [__first2,__last2).  If
    3935             :    *  found, returns an iterator in the range [__first1,__last1),
    3936             :    *  otherwise returns @p __last1.
    3937             :   */
    3938             :   template<typename _InputIterator, typename _ForwardIterator,
    3939             :            typename _BinaryPredicate>
    3940             :     _GLIBCXX20_CONSTEXPR
    3941             :     _InputIterator
    3942             :     find_first_of(_InputIterator __first1, _InputIterator __last1,
    3943             :                   _ForwardIterator __first2, _ForwardIterator __last2,
    3944             :                   _BinaryPredicate __comp)
    3945             :     {
    3946             :       // concept requirements
    3947             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
    3948             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
    3949             :       __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
    3950             :             typename iterator_traits<_InputIterator>::value_type,
    3951             :             typename iterator_traits<_ForwardIterator>::value_type>)
    3952             :       __glibcxx_requires_valid_range(__first1, __last1);
    3953             :       __glibcxx_requires_valid_range(__first2, __last2);
    3954             : 
    3955             :       for (; __first1 != __last1; ++__first1)
    3956             :         for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
    3957             :           if (__comp(*__first1, *__iter))
    3958             :             return __first1;
    3959             :       return __last1;
    3960             :     }
    3961             : 
    3962             :   /**
    3963             :    *  @brief Find two adjacent values in a sequence that are equal.
    3964             :    *  @ingroup non_mutating_algorithms
    3965             :    *  @param  __first  A forward iterator.
    3966             :    *  @param  __last   A forward iterator.
    3967             :    *  @return   The first iterator @c i such that @c i and @c i+1 are both
    3968             :    *  valid iterators in @p [__first,__last) and such that @c *i == @c *(i+1),
    3969             :    *  or @p __last if no such iterator exists.
    3970             :   */
    3971             :   template<typename _ForwardIterator>
    3972             :     _GLIBCXX20_CONSTEXPR
    3973             :     inline _ForwardIterator
    3974             :     adjacent_find(_ForwardIterator __first, _ForwardIterator __last)
    3975             :     {
    3976             :       // concept requirements
    3977             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
    3978             :       __glibcxx_function_requires(_EqualityComparableConcept<
    3979             :             typename iterator_traits<_ForwardIterator>::value_type>)
    3980             :       __glibcxx_requires_valid_range(__first, __last);
    3981             : 
    3982             :       return std::__adjacent_find(__first, __last,
    3983             :                                   __gnu_cxx::__ops::__iter_equal_to_iter());
    3984             :     }
    3985             : 
    3986             :   /**
    3987             :    *  @brief Find two adjacent values in a sequence using a predicate.
    3988             :    *  @ingroup non_mutating_algorithms
    3989             :    *  @param  __first         A forward iterator.
    3990             :    *  @param  __last          A forward iterator.
    3991             :    *  @param  __binary_pred   A binary predicate.
    3992             :    *  @return   The first iterator @c i such that @c i and @c i+1 are both
    3993             :    *  valid iterators in @p [__first,__last) and such that
    3994             :    *  @p __binary_pred(*i,*(i+1)) is true, or @p __last if no such iterator
    3995             :    *  exists.
    3996             :   */
    3997             :   template<typename _ForwardIterator, typename _BinaryPredicate>
    3998             :     _GLIBCXX20_CONSTEXPR
    3999             :     inline _ForwardIterator
    4000             :     adjacent_find(_ForwardIterator __first, _ForwardIterator __last,
    4001             :                   _BinaryPredicate __binary_pred)
    4002             :     {
    4003             :       // concept requirements
    4004             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
    4005             :       __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
    4006             :             typename iterator_traits<_ForwardIterator>::value_type,
    4007             :             typename iterator_traits<_ForwardIterator>::value_type>)
    4008             :       __glibcxx_requires_valid_range(__first, __last);
    4009             : 
    4010             :       return std::__adjacent_find(__first, __last,
    4011             :                         __gnu_cxx::__ops::__iter_comp_iter(__binary_pred));
    4012             :     }
    4013             : 
    4014             :   /**
    4015             :    *  @brief Count the number of copies of a value in a sequence.
    4016             :    *  @ingroup non_mutating_algorithms
    4017             :    *  @param  __first  An input iterator.
    4018             :    *  @param  __last   An input iterator.
    4019             :    *  @param  __value  The value to be counted.
    4020             :    *  @return   The number of iterators @c i in the range @p [__first,__last)
    4021             :    *  for which @c *i == @p __value
    4022             :   */
    4023             :   template<typename _InputIterator, typename _Tp>
    4024             :     _GLIBCXX20_CONSTEXPR
    4025             :     inline typename iterator_traits<_InputIterator>::difference_type
    4026             :     count(_InputIterator __first, _InputIterator __last, const _Tp& __value)
    4027             :     {
    4028             :       // concept requirements
    4029             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
    4030             :       __glibcxx_function_requires(_EqualOpConcept<
    4031             :             typename iterator_traits<_InputIterator>::value_type, _Tp>)
    4032             :       __glibcxx_requires_valid_range(__first, __last);
    4033             : 
    4034             :       return std::__count_if(__first, __last,
    4035             :                              __gnu_cxx::__ops::__iter_equals_val(__value));
    4036             :     }
    4037             : 
    4038             :   /**
    4039             :    *  @brief Count the elements of a sequence for which a predicate is true.
    4040             :    *  @ingroup non_mutating_algorithms
    4041             :    *  @param  __first  An input iterator.
    4042             :    *  @param  __last   An input iterator.
    4043             :    *  @param  __pred   A predicate.
    4044             :    *  @return   The number of iterators @c i in the range @p [__first,__last)
    4045             :    *  for which @p __pred(*i) is true.
    4046             :   */
    4047             :   template<typename _InputIterator, typename _Predicate>
    4048             :     _GLIBCXX20_CONSTEXPR
    4049             :     inline typename iterator_traits<_InputIterator>::difference_type
    4050             :     count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
    4051             :     {
    4052             :       // concept requirements
    4053             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
    4054             :       __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
    4055             :             typename iterator_traits<_InputIterator>::value_type>)
    4056             :       __glibcxx_requires_valid_range(__first, __last);
    4057             : 
    4058             :       return std::__count_if(__first, __last,
    4059             :                              __gnu_cxx::__ops::__pred_iter(__pred));
    4060             :     }
    4061             : 
    4062             :   /**
    4063             :    *  @brief Search a sequence for a matching sub-sequence.
    4064             :    *  @ingroup non_mutating_algorithms
    4065             :    *  @param  __first1  A forward iterator.
    4066             :    *  @param  __last1   A forward iterator.
    4067             :    *  @param  __first2  A forward iterator.
    4068             :    *  @param  __last2   A forward iterator.
    4069             :    *  @return The first iterator @c i in the range @p
    4070             :    *  [__first1,__last1-(__last2-__first2)) such that @c *(i+N) == @p
    4071             :    *  *(__first2+N) for each @c N in the range @p
    4072             :    *  [0,__last2-__first2), or @p __last1 if no such iterator exists.
    4073             :    *
    4074             :    *  Searches the range @p [__first1,__last1) for a sub-sequence that
    4075             :    *  compares equal value-by-value with the sequence given by @p
    4076             :    *  [__first2,__last2) and returns an iterator to the first element
    4077             :    *  of the sub-sequence, or @p __last1 if the sub-sequence is not
    4078             :    *  found.
    4079             :    *
    4080             :    *  Because the sub-sequence must lie completely within the range @p
    4081             :    *  [__first1,__last1) it must start at a position less than @p
    4082             :    *  __last1-(__last2-__first2) where @p __last2-__first2 is the
    4083             :    *  length of the sub-sequence.
    4084             :    *
    4085             :    *  This means that the returned iterator @c i will be in the range
    4086             :    *  @p [__first1,__last1-(__last2-__first2))
    4087             :   */
    4088             :   template<typename _ForwardIterator1, typename _ForwardIterator2>
    4089             :     _GLIBCXX20_CONSTEXPR
    4090             :     inline _ForwardIterator1
    4091             :     search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
    4092             :            _ForwardIterator2 __first2, _ForwardIterator2 __last2)
    4093             :     {
    4094             :       // concept requirements
    4095             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
    4096             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
    4097             :       __glibcxx_function_requires(_EqualOpConcept<
    4098             :             typename iterator_traits<_ForwardIterator1>::value_type,
    4099             :             typename iterator_traits<_ForwardIterator2>::value_type>)
    4100             :       __glibcxx_requires_valid_range(__first1, __last1);
    4101             :       __glibcxx_requires_valid_range(__first2, __last2);
    4102             : 
    4103             :       return std::__search(__first1, __last1, __first2, __last2,
    4104             :                            __gnu_cxx::__ops::__iter_equal_to_iter());
    4105             :     }
    4106             : 
    4107             :   /**
    4108             :    *  @brief Search a sequence for a matching sub-sequence using a predicate.
    4109             :    *  @ingroup non_mutating_algorithms
    4110             :    *  @param  __first1     A forward iterator.
    4111             :    *  @param  __last1      A forward iterator.
    4112             :    *  @param  __first2     A forward iterator.
    4113             :    *  @param  __last2      A forward iterator.
    4114             :    *  @param  __predicate  A binary predicate.
    4115             :    *  @return   The first iterator @c i in the range
    4116             :    *  @p [__first1,__last1-(__last2-__first2)) such that
    4117             :    *  @p __predicate(*(i+N),*(__first2+N)) is true for each @c N in the range
    4118             :    *  @p [0,__last2-__first2), or @p __last1 if no such iterator exists.
    4119             :    *
    4120             :    *  Searches the range @p [__first1,__last1) for a sub-sequence that
    4121             :    *  compares equal value-by-value with the sequence given by @p
    4122             :    *  [__first2,__last2), using @p __predicate to determine equality,
    4123             :    *  and returns an iterator to the first element of the
    4124             :    *  sub-sequence, or @p __last1 if no such iterator exists.
    4125             :    *
    4126             :    *  @see search(_ForwardIter1, _ForwardIter1, _ForwardIter2, _ForwardIter2)
    4127             :   */
    4128             :   template<typename _ForwardIterator1, typename _ForwardIterator2,
    4129             :            typename _BinaryPredicate>
    4130             :     _GLIBCXX20_CONSTEXPR
    4131             :     inline _ForwardIterator1
    4132             :     search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
    4133             :            _ForwardIterator2 __first2, _ForwardIterator2 __last2,
    4134             :            _BinaryPredicate  __predicate)
    4135             :     {
    4136             :       // concept requirements
    4137             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
    4138             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
    4139             :       __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
    4140             :             typename iterator_traits<_ForwardIterator1>::value_type,
    4141             :             typename iterator_traits<_ForwardIterator2>::value_type>)
    4142             :       __glibcxx_requires_valid_range(__first1, __last1);
    4143             :       __glibcxx_requires_valid_range(__first2, __last2);
    4144             : 
    4145             :       return std::__search(__first1, __last1, __first2, __last2,
    4146             :                            __gnu_cxx::__ops::__iter_comp_iter(__predicate));
    4147             :     }
    4148             : 
    4149             :   /**
    4150             :    *  @brief Search a sequence for a number of consecutive values.
    4151             :    *  @ingroup non_mutating_algorithms
    4152             :    *  @param  __first  A forward iterator.
    4153             :    *  @param  __last   A forward iterator.
    4154             :    *  @param  __count  The number of consecutive values.
    4155             :    *  @param  __val    The value to find.
    4156             :    *  @return The first iterator @c i in the range @p
    4157             :    *  [__first,__last-__count) such that @c *(i+N) == @p __val for
    4158             :    *  each @c N in the range @p [0,__count), or @p __last if no such
    4159             :    *  iterator exists.
    4160             :    *
    4161             :    *  Searches the range @p [__first,__last) for @p count consecutive elements
    4162             :    *  equal to @p __val.
    4163             :   */
    4164             :   template<typename _ForwardIterator, typename _Integer, typename _Tp>
    4165             :     _GLIBCXX20_CONSTEXPR
    4166             :     inline _ForwardIterator
    4167             :     search_n(_ForwardIterator __first, _ForwardIterator __last,
    4168             :              _Integer __count, const _Tp& __val)
    4169             :     {
    4170             :       // concept requirements
    4171             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
    4172             :       __glibcxx_function_requires(_EqualOpConcept<
    4173             :             typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
    4174             :       __glibcxx_requires_valid_range(__first, __last);
    4175             : 
    4176             :       return std::__search_n(__first, __last, __count,
    4177             :                              __gnu_cxx::__ops::__iter_equals_val(__val));
    4178             :     }
    4179             : 
    4180             : 
    4181             :   /**
    4182             :    *  @brief Search a sequence for a number of consecutive values using a
    4183             :    *         predicate.
    4184             :    *  @ingroup non_mutating_algorithms
    4185             :    *  @param  __first        A forward iterator.
    4186             :    *  @param  __last         A forward iterator.
    4187             :    *  @param  __count        The number of consecutive values.
    4188             :    *  @param  __val          The value to find.
    4189             :    *  @param  __binary_pred  A binary predicate.
    4190             :    *  @return The first iterator @c i in the range @p
    4191             :    *  [__first,__last-__count) such that @p
    4192             :    *  __binary_pred(*(i+N),__val) is true for each @c N in the range
    4193             :    *  @p [0,__count), or @p __last if no such iterator exists.
    4194             :    *
    4195             :    *  Searches the range @p [__first,__last) for @p __count
    4196             :    *  consecutive elements for which the predicate returns true.
    4197             :   */
    4198             :   template<typename _ForwardIterator, typename _Integer, typename _Tp,
    4199             :            typename _BinaryPredicate>
    4200             :     _GLIBCXX20_CONSTEXPR
    4201             :     inline _ForwardIterator
    4202             :     search_n(_ForwardIterator __first, _ForwardIterator __last,
    4203             :              _Integer __count, const _Tp& __val,
    4204             :              _BinaryPredicate __binary_pred)
    4205             :     {
    4206             :       // concept requirements
    4207             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
    4208             :       __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
    4209             :             typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
    4210             :       __glibcxx_requires_valid_range(__first, __last);
    4211             : 
    4212             :       return std::__search_n(__first, __last, __count,
    4213             :                 __gnu_cxx::__ops::__iter_comp_val(__binary_pred, __val));
    4214             :     }
    4215             : 
    4216             : #if __cplusplus >= 201703L
    4217             :   /** @brief Search a sequence using a Searcher object.
    4218             :    *
    4219             :    *  @param  __first        A forward iterator.
    4220             :    *  @param  __last         A forward iterator.
    4221             :    *  @param  __searcher     A callable object.
    4222             :    *  @return @p __searcher(__first,__last).first
    4223             :   */
    4224             :   template<typename _ForwardIterator, typename _Searcher>
    4225             :     _GLIBCXX20_CONSTEXPR
    4226             :     inline _ForwardIterator
    4227             :     search(_ForwardIterator __first, _ForwardIterator __last,
    4228             :            const _Searcher& __searcher)
    4229             :     { return __searcher(__first, __last).first; }
    4230             : #endif
    4231             : 
    4232             :   /**
    4233             :    *  @brief Perform an operation on a sequence.
    4234             :    *  @ingroup mutating_algorithms
    4235             :    *  @param  __first     An input iterator.
    4236             :    *  @param  __last      An input iterator.
    4237             :    *  @param  __result    An output iterator.
    4238             :    *  @param  __unary_op  A unary operator.
    4239             :    *  @return   An output iterator equal to @p __result+(__last-__first).
    4240             :    *
    4241             :    *  Applies the operator to each element in the input range and assigns
    4242             :    *  the results to successive elements of the output sequence.
    4243             :    *  Evaluates @p *(__result+N)=unary_op(*(__first+N)) for each @c N in the
    4244             :    *  range @p [0,__last-__first).
    4245             :    *
    4246             :    *  @p unary_op must not alter its argument.
    4247             :   */
    4248             :   template<typename _InputIterator, typename _OutputIterator,
    4249             :            typename _UnaryOperation>
    4250             :     _GLIBCXX20_CONSTEXPR
    4251             :     _OutputIterator
    4252             :     transform(_InputIterator __first, _InputIterator __last,
    4253             :               _OutputIterator __result, _UnaryOperation __unary_op)
    4254             :     {
    4255             :       // concept requirements
    4256             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
    4257             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    4258             :             // "the type returned by a _UnaryOperation"
    4259             :             __typeof__(__unary_op(*__first))>)
    4260             :       __glibcxx_requires_valid_range(__first, __last);
    4261             : 
    4262             :       for (; __first != __last; ++__first, (void)++__result)
    4263             :         *__result = __unary_op(*__first);
    4264             :       return __result;
    4265             :     }
    4266             : 
    4267             :   /**
    4268             :    *  @brief Perform an operation on corresponding elements of two sequences.
    4269             :    *  @ingroup mutating_algorithms
    4270             :    *  @param  __first1     An input iterator.
    4271             :    *  @param  __last1      An input iterator.
    4272             :    *  @param  __first2     An input iterator.
    4273             :    *  @param  __result     An output iterator.
    4274             :    *  @param  __binary_op  A binary operator.
    4275             :    *  @return   An output iterator equal to @p result+(last-first).
    4276             :    *
    4277             :    *  Applies the operator to the corresponding elements in the two
    4278             :    *  input ranges and assigns the results to successive elements of the
    4279             :    *  output sequence.
    4280             :    *  Evaluates @p
    4281             :    *  *(__result+N)=__binary_op(*(__first1+N),*(__first2+N)) for each
    4282             :    *  @c N in the range @p [0,__last1-__first1).
    4283             :    *
    4284             :    *  @p binary_op must not alter either of its arguments.
    4285             :   */
    4286             :   template<typename _InputIterator1, typename _InputIterator2,
    4287             :            typename _OutputIterator, typename _BinaryOperation>
    4288             :     _GLIBCXX20_CONSTEXPR
    4289             :     _OutputIterator
    4290             :     transform(_InputIterator1 __first1, _InputIterator1 __last1,
    4291             :               _InputIterator2 __first2, _OutputIterator __result,
    4292             :               _BinaryOperation __binary_op)
    4293             :     {
    4294             :       // concept requirements
    4295             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
    4296             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
    4297             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    4298             :             // "the type returned by a _BinaryOperation"
    4299             :             __typeof__(__binary_op(*__first1,*__first2))>)
    4300             :       __glibcxx_requires_valid_range(__first1, __last1);
    4301             : 
    4302             :       for (; __first1 != __last1; ++__first1, (void)++__first2, ++__result)
    4303             :         *__result = __binary_op(*__first1, *__first2);
    4304             :       return __result;
    4305             :     }
    4306             : 
    4307             :   /**
    4308             :    *  @brief Replace each occurrence of one value in a sequence with another
    4309             :    *         value.
    4310             :    *  @ingroup mutating_algorithms
    4311             :    *  @param  __first      A forward iterator.
    4312             :    *  @param  __last       A forward iterator.
    4313             :    *  @param  __old_value  The value to be replaced.
    4314             :    *  @param  __new_value  The replacement value.
    4315             :    *  @return   replace() returns no value.
    4316             :    *
    4317             :    *  For each iterator @c i in the range @p [__first,__last) if @c *i ==
    4318             :    *  @p __old_value then the assignment @c *i = @p __new_value is performed.
    4319             :   */
    4320             :   template<typename _ForwardIterator, typename _Tp>
    4321             :     _GLIBCXX20_CONSTEXPR
    4322             :     void
    4323             :     replace(_ForwardIterator __first, _ForwardIterator __last,
    4324             :             const _Tp& __old_value, const _Tp& __new_value)
    4325             :     {
    4326             :       // concept requirements
    4327             :       __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
    4328             :                                   _ForwardIterator>)
    4329             :       __glibcxx_function_requires(_EqualOpConcept<
    4330             :             typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
    4331             :       __glibcxx_function_requires(_ConvertibleConcept<_Tp,
    4332             :             typename iterator_traits<_ForwardIterator>::value_type>)
    4333             :       __glibcxx_requires_valid_range(__first, __last);
    4334             : 
    4335             :       for (; __first != __last; ++__first)
    4336             :         if (*__first == __old_value)
    4337             :           *__first = __new_value;
    4338             :     }
    4339             : 
    4340             :   /**
    4341             :    *  @brief Replace each value in a sequence for which a predicate returns
    4342             :    *         true with another value.
    4343             :    *  @ingroup mutating_algorithms
    4344             :    *  @param  __first      A forward iterator.
    4345             :    *  @param  __last       A forward iterator.
    4346             :    *  @param  __pred       A predicate.
    4347             :    *  @param  __new_value  The replacement value.
    4348             :    *  @return   replace_if() returns no value.
    4349             :    *
    4350             :    *  For each iterator @c i in the range @p [__first,__last) if @p __pred(*i)
    4351             :    *  is true then the assignment @c *i = @p __new_value is performed.
    4352             :   */
    4353             :   template<typename _ForwardIterator, typename _Predicate, typename _Tp>
    4354             :     _GLIBCXX20_CONSTEXPR
    4355             :     void
    4356             :     replace_if(_ForwardIterator __first, _ForwardIterator __last,
    4357             :                _Predicate __pred, const _Tp& __new_value)
    4358             :     {
    4359             :       // concept requirements
    4360             :       __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
    4361             :                                   _ForwardIterator>)
    4362             :       __glibcxx_function_requires(_ConvertibleConcept<_Tp,
    4363             :             typename iterator_traits<_ForwardIterator>::value_type>)
    4364             :       __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
    4365             :             typename iterator_traits<_ForwardIterator>::value_type>)
    4366             :       __glibcxx_requires_valid_range(__first, __last);
    4367             : 
    4368             :       for (; __first != __last; ++__first)
    4369             :         if (__pred(*__first))
    4370             :           *__first = __new_value;
    4371             :     }
    4372             : 
    4373             :   /**
    4374             :    *  @brief Assign the result of a function object to each value in a
    4375             :    *         sequence.
    4376             :    *  @ingroup mutating_algorithms
    4377             :    *  @param  __first  A forward iterator.
    4378             :    *  @param  __last   A forward iterator.
    4379             :    *  @param  __gen    A function object taking no arguments and returning
    4380             :    *                 std::iterator_traits<_ForwardIterator>::value_type
    4381             :    *  @return   generate() returns no value.
    4382             :    *
    4383             :    *  Performs the assignment @c *i = @p __gen() for each @c i in the range
    4384             :    *  @p [__first,__last).
    4385             :   */
    4386             :   template<typename _ForwardIterator, typename _Generator>
    4387             :     _GLIBCXX20_CONSTEXPR
    4388             :     void
    4389             :     generate(_ForwardIterator __first, _ForwardIterator __last,
    4390             :              _Generator __gen)
    4391             :     {
    4392             :       // concept requirements
    4393             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
    4394             :       __glibcxx_function_requires(_GeneratorConcept<_Generator,
    4395             :             typename iterator_traits<_ForwardIterator>::value_type>)
    4396             :       __glibcxx_requires_valid_range(__first, __last);
    4397             : 
    4398             :       for (; __first != __last; ++__first)
    4399             :         *__first = __gen();
    4400             :     }
    4401             : 
    4402             :   /**
    4403             :    *  @brief Assign the result of a function object to each value in a
    4404             :    *         sequence.
    4405             :    *  @ingroup mutating_algorithms
    4406             :    *  @param  __first  A forward iterator.
    4407             :    *  @param  __n      The length of the sequence.
    4408             :    *  @param  __gen    A function object taking no arguments and returning
    4409             :    *                 std::iterator_traits<_ForwardIterator>::value_type
    4410             :    *  @return   The end of the sequence, @p __first+__n
    4411             :    *
    4412             :    *  Performs the assignment @c *i = @p __gen() for each @c i in the range
    4413             :    *  @p [__first,__first+__n).
    4414             :    *
    4415             :    * If @p __n is negative, the function does nothing and returns @p __first.
    4416             :   */
    4417             :   // _GLIBCXX_RESOLVE_LIB_DEFECTS
    4418             :   // DR 865. More algorithms that throw away information
    4419             :   // DR 426. search_n(), fill_n(), and generate_n() with negative n
    4420             :   template<typename _OutputIterator, typename _Size, typename _Generator>
    4421             :     _GLIBCXX20_CONSTEXPR
    4422             :     _OutputIterator
    4423             :     generate_n(_OutputIterator __first, _Size __n, _Generator __gen)
    4424             :     {
    4425             :       // concept requirements
    4426             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    4427             :             // "the type returned by a _Generator"
    4428             :             __typeof__(__gen())>)
    4429             : 
    4430             :       typedef __decltype(std::__size_to_integer(__n)) _IntSize;
    4431             :       for (_IntSize __niter = std::__size_to_integer(__n);
    4432             :            __niter > 0; --__niter, (void) ++__first)
    4433             :         *__first = __gen();
    4434             :       return __first;
    4435             :     }
    4436             : 
    4437             :   /**
    4438             :    *  @brief Copy a sequence, removing consecutive duplicate values.
    4439             :    *  @ingroup mutating_algorithms
    4440             :    *  @param  __first   An input iterator.
    4441             :    *  @param  __last    An input iterator.
    4442             :    *  @param  __result  An output iterator.
    4443             :    *  @return   An iterator designating the end of the resulting sequence.
    4444             :    *
    4445             :    *  Copies each element in the range @p [__first,__last) to the range
    4446             :    *  beginning at @p __result, except that only the first element is copied
    4447             :    *  from groups of consecutive elements that compare equal.
    4448             :    *  unique_copy() is stable, so the relative order of elements that are
    4449             :    *  copied is unchanged.
    4450             :    *
    4451             :    *  _GLIBCXX_RESOLVE_LIB_DEFECTS
    4452             :    *  DR 241. Does unique_copy() require CopyConstructible and Assignable?
    4453             :    *  
    4454             :    *  _GLIBCXX_RESOLVE_LIB_DEFECTS
    4455             :    *  DR 538. 241 again: Does unique_copy() require CopyConstructible and 
    4456             :    *  Assignable?
    4457             :   */
    4458             :   template<typename _InputIterator, typename _OutputIterator>
    4459             :     _GLIBCXX20_CONSTEXPR
    4460             :     inline _OutputIterator
    4461             :     unique_copy(_InputIterator __first, _InputIterator __last,
    4462             :                 _OutputIterator __result)
    4463             :     {
    4464             :       // concept requirements
    4465             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
    4466             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    4467             :             typename iterator_traits<_InputIterator>::value_type>)
    4468             :       __glibcxx_function_requires(_EqualityComparableConcept<
    4469             :             typename iterator_traits<_InputIterator>::value_type>)
    4470             :       __glibcxx_requires_valid_range(__first, __last);
    4471             : 
    4472             :       if (__first == __last)
    4473             :         return __result;
    4474             :       return std::__unique_copy(__first, __last, __result,
    4475             :                                 __gnu_cxx::__ops::__iter_equal_to_iter(),
    4476             :                                 std::__iterator_category(__first),
    4477             :                                 std::__iterator_category(__result));
    4478             :     }
    4479             : 
    4480             :   /**
    4481             :    *  @brief Copy a sequence, removing consecutive values using a predicate.
    4482             :    *  @ingroup mutating_algorithms
    4483             :    *  @param  __first        An input iterator.
    4484             :    *  @param  __last         An input iterator.
    4485             :    *  @param  __result       An output iterator.
    4486             :    *  @param  __binary_pred  A binary predicate.
    4487             :    *  @return   An iterator designating the end of the resulting sequence.
    4488             :    *
    4489             :    *  Copies each element in the range @p [__first,__last) to the range
    4490             :    *  beginning at @p __result, except that only the first element is copied
    4491             :    *  from groups of consecutive elements for which @p __binary_pred returns
    4492             :    *  true.
    4493             :    *  unique_copy() is stable, so the relative order of elements that are
    4494             :    *  copied is unchanged.
    4495             :    *
    4496             :    *  _GLIBCXX_RESOLVE_LIB_DEFECTS
    4497             :    *  DR 241. Does unique_copy() require CopyConstructible and Assignable?
    4498             :   */
    4499             :   template<typename _InputIterator, typename _OutputIterator,
    4500             :            typename _BinaryPredicate>
    4501             :     _GLIBCXX20_CONSTEXPR
    4502             :     inline _OutputIterator
    4503             :     unique_copy(_InputIterator __first, _InputIterator __last,
    4504             :                 _OutputIterator __result,
    4505             :                 _BinaryPredicate __binary_pred)
    4506             :     {
    4507             :       // concept requirements -- predicates checked later
    4508             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
    4509             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    4510             :             typename iterator_traits<_InputIterator>::value_type>)
    4511             :       __glibcxx_requires_valid_range(__first, __last);
    4512             : 
    4513             :       if (__first == __last)
    4514             :         return __result;
    4515             :       return std::__unique_copy(__first, __last, __result,
    4516             :                         __gnu_cxx::__ops::__iter_comp_iter(__binary_pred),
    4517             :                                 std::__iterator_category(__first),
    4518             :                                 std::__iterator_category(__result));
    4519             :     }
    4520             : 
    4521             : #if __cplusplus <= 201103L || _GLIBCXX_USE_DEPRECATED
    4522             : #if _GLIBCXX_HOSTED
    4523             :   /**
    4524             :    *  @brief Randomly shuffle the elements of a sequence.
    4525             :    *  @ingroup mutating_algorithms
    4526             :    *  @param  __first   A forward iterator.
    4527             :    *  @param  __last    A forward iterator.
    4528             :    *  @return  Nothing.
    4529             :    *
    4530             :    *  Reorder the elements in the range @p [__first,__last) using a random
    4531             :    *  distribution, so that every possible ordering of the sequence is
    4532             :    *  equally likely.
    4533             :    *
    4534             :    *  @deprecated
    4535             :    *  Since C++14 `std::random_shuffle` is not part of the C++ standard.
    4536             :    *  Use `std::shuffle` instead, which was introduced in C++11.
    4537             :   */
    4538             :   template<typename _RandomAccessIterator>
    4539             :     _GLIBCXX14_DEPRECATED_SUGGEST("std::shuffle")
    4540             :     inline void
    4541             :     random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
    4542             :     {
    4543             :       // concept requirements
    4544             :       __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
    4545             :             _RandomAccessIterator>)
    4546             :       __glibcxx_requires_valid_range(__first, __last);
    4547             : 
    4548             :       if (__first != __last)
    4549             :         for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
    4550             :           {
    4551             :             // XXX rand() % N is not uniformly distributed
    4552             :             _RandomAccessIterator __j = __first
    4553             :                                         + std::rand() % ((__i - __first) + 1);
    4554             :             if (__i != __j)
    4555             :               std::iter_swap(__i, __j);
    4556             :           }
    4557             :     }
    4558             : #endif
    4559             : 
    4560             :   /**
    4561             :    *  @brief Shuffle the elements of a sequence using a random number
    4562             :    *         generator.
    4563             :    *  @ingroup mutating_algorithms
    4564             :    *  @param  __first   A forward iterator.
    4565             :    *  @param  __last    A forward iterator.
    4566             :    *  @param  __rand    The RNG functor or function.
    4567             :    *  @return  Nothing.
    4568             :    *
    4569             :    *  Reorders the elements in the range @p [__first,__last) using @p __rand to
    4570             :    *  provide a random distribution. Calling @p __rand(N) for a positive
    4571             :    *  integer @p N should return a randomly chosen integer from the
    4572             :    *  range [0,N).
    4573             :    *
    4574             :    *  @deprecated
    4575             :    *  Since C++14 `std::random_shuffle` is not part of the C++ standard.
    4576             :    *  Use `std::shuffle` instead, which was introduced in C++11.
    4577             :   */
    4578             :   template<typename _RandomAccessIterator, typename _RandomNumberGenerator>
    4579             :     _GLIBCXX14_DEPRECATED_SUGGEST("std::shuffle")
    4580             :     void
    4581             :     random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
    4582             : #if __cplusplus >= 201103L
    4583             :                    _RandomNumberGenerator&& __rand)
    4584             : #else
    4585             :                    _RandomNumberGenerator& __rand)
    4586             : #endif
    4587             :     {
    4588             :       // concept requirements
    4589             :       __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
    4590             :             _RandomAccessIterator>)
    4591             :       __glibcxx_requires_valid_range(__first, __last);
    4592             : 
    4593             :       if (__first == __last)
    4594             :         return;
    4595             :       for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
    4596             :         {
    4597             :           _RandomAccessIterator __j = __first + __rand((__i - __first) + 1);
    4598             :           if (__i != __j)
    4599             :             std::iter_swap(__i, __j);
    4600             :         }
    4601             :     }
    4602             : #endif // C++11 || USE_DEPRECATED
    4603             : 
    4604             :   /**
    4605             :    *  @brief Move elements for which a predicate is true to the beginning
    4606             :    *         of a sequence.
    4607             :    *  @ingroup mutating_algorithms
    4608             :    *  @param  __first   A forward iterator.
    4609             :    *  @param  __last    A forward iterator.
    4610             :    *  @param  __pred    A predicate functor.
    4611             :    *  @return  An iterator @p middle such that @p __pred(i) is true for each
    4612             :    *  iterator @p i in the range @p [__first,middle) and false for each @p i
    4613             :    *  in the range @p [middle,__last).
    4614             :    *
    4615             :    *  @p __pred must not modify its operand. @p partition() does not preserve
    4616             :    *  the relative ordering of elements in each group, use
    4617             :    *  @p stable_partition() if this is needed.
    4618             :   */
    4619             :   template<typename _ForwardIterator, typename _Predicate>
    4620             :     _GLIBCXX20_CONSTEXPR
    4621             :     inline _ForwardIterator
    4622             :     partition(_ForwardIterator __first, _ForwardIterator __last,
    4623             :               _Predicate   __pred)
    4624             :     {
    4625             :       // concept requirements
    4626             :       __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
    4627             :                                   _ForwardIterator>)
    4628             :       __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
    4629             :             typename iterator_traits<_ForwardIterator>::value_type>)
    4630             :       __glibcxx_requires_valid_range(__first, __last);
    4631             : 
    4632             :       return std::__partition(__first, __last, __pred,
    4633             :                               std::__iterator_category(__first));
    4634             :     }
    4635             : 
    4636             : 
    4637             :   /**
    4638             :    *  @brief Sort the smallest elements of a sequence.
    4639             :    *  @ingroup sorting_algorithms
    4640             :    *  @param  __first   An iterator.
    4641             :    *  @param  __middle  Another iterator.
    4642             :    *  @param  __last    Another iterator.
    4643             :    *  @return  Nothing.
    4644             :    *
    4645             :    *  Sorts the smallest @p (__middle-__first) elements in the range
    4646             :    *  @p [first,last) and moves them to the range @p [__first,__middle). The
    4647             :    *  order of the remaining elements in the range @p [__middle,__last) is
    4648             :    *  undefined.
    4649             :    *  After the sort if @e i and @e j are iterators in the range
    4650             :    *  @p [__first,__middle) such that i precedes j and @e k is an iterator in
    4651             :    *  the range @p [__middle,__last) then *j<*i and *k<*i are both false.
    4652             :   */
    4653             :   template<typename _RandomAccessIterator>
    4654             :     _GLIBCXX20_CONSTEXPR
    4655             :     inline void
    4656             :     partial_sort(_RandomAccessIterator __first,
    4657             :                  _RandomAccessIterator __middle,
    4658             :                  _RandomAccessIterator __last)
    4659             :     {
    4660             :       // concept requirements
    4661             :       __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
    4662             :             _RandomAccessIterator>)
    4663             :       __glibcxx_function_requires(_LessThanComparableConcept<
    4664             :             typename iterator_traits<_RandomAccessIterator>::value_type>)
    4665             :       __glibcxx_requires_valid_range(__first, __middle);
    4666             :       __glibcxx_requires_valid_range(__middle, __last);
    4667             :       __glibcxx_requires_irreflexive(__first, __last);
    4668             : 
    4669             :       std::__partial_sort(__first, __middle, __last,
    4670             :                           __gnu_cxx::__ops::__iter_less_iter());
    4671             :     }
    4672             : 
    4673             :   /**
    4674             :    *  @brief Sort the smallest elements of a sequence using a predicate
    4675             :    *         for comparison.
    4676             :    *  @ingroup sorting_algorithms
    4677             :    *  @param  __first   An iterator.
    4678             :    *  @param  __middle  Another iterator.
    4679             :    *  @param  __last    Another iterator.
    4680             :    *  @param  __comp    A comparison functor.
    4681             :    *  @return  Nothing.
    4682             :    *
    4683             :    *  Sorts the smallest @p (__middle-__first) elements in the range
    4684             :    *  @p [__first,__last) and moves them to the range @p [__first,__middle). The
    4685             :    *  order of the remaining elements in the range @p [__middle,__last) is
    4686             :    *  undefined.
    4687             :    *  After the sort if @e i and @e j are iterators in the range
    4688             :    *  @p [__first,__middle) such that i precedes j and @e k is an iterator in
    4689             :    *  the range @p [__middle,__last) then @p *__comp(j,*i) and @p __comp(*k,*i)
    4690             :    *  are both false.
    4691             :   */
    4692             :   template<typename _RandomAccessIterator, typename _Compare>
    4693             :     _GLIBCXX20_CONSTEXPR
    4694             :     inline void
    4695             :     partial_sort(_RandomAccessIterator __first,
    4696             :                  _RandomAccessIterator __middle,
    4697             :                  _RandomAccessIterator __last,
    4698             :                  _Compare __comp)
    4699             :     {
    4700             :       // concept requirements
    4701             :       __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
    4702             :             _RandomAccessIterator>)
    4703             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    4704             :             typename iterator_traits<_RandomAccessIterator>::value_type,
    4705             :             typename iterator_traits<_RandomAccessIterator>::value_type>)
    4706             :       __glibcxx_requires_valid_range(__first, __middle);
    4707             :       __glibcxx_requires_valid_range(__middle, __last);
    4708             :       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
    4709             : 
    4710             :       std::__partial_sort(__first, __middle, __last,
    4711             :                           __gnu_cxx::__ops::__iter_comp_iter(__comp));
    4712             :     }
    4713             : 
    4714             :   /**
    4715             :    *  @brief Sort a sequence just enough to find a particular position.
    4716             :    *  @ingroup sorting_algorithms
    4717             :    *  @param  __first   An iterator.
    4718             :    *  @param  __nth     Another iterator.
    4719             :    *  @param  __last    Another iterator.
    4720             :    *  @return  Nothing.
    4721             :    *
    4722             :    *  Rearranges the elements in the range @p [__first,__last) so that @p *__nth
    4723             :    *  is the same element that would have been in that position had the
    4724             :    *  whole sequence been sorted. The elements either side of @p *__nth are
    4725             :    *  not completely sorted, but for any iterator @e i in the range
    4726             :    *  @p [__first,__nth) and any iterator @e j in the range @p [__nth,__last) it
    4727             :    *  holds that *j < *i is false.
    4728             :   */
    4729             :   template<typename _RandomAccessIterator>
    4730             :     _GLIBCXX20_CONSTEXPR
    4731             :     inline void
    4732             :     nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
    4733             :                 _RandomAccessIterator __last)
    4734             :     {
    4735             :       // concept requirements
    4736             :       __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
    4737             :                                   _RandomAccessIterator>)
    4738             :       __glibcxx_function_requires(_LessThanComparableConcept<
    4739             :             typename iterator_traits<_RandomAccessIterator>::value_type>)
    4740             :       __glibcxx_requires_valid_range(__first, __nth);
    4741             :       __glibcxx_requires_valid_range(__nth, __last);
    4742             :       __glibcxx_requires_irreflexive(__first, __last);
    4743             : 
    4744             :       if (__first == __last || __nth == __last)
    4745             :         return;
    4746             : 
    4747             :       std::__introselect(__first, __nth, __last,
    4748             :                          std::__lg(__last - __first) * 2,
    4749             :                          __gnu_cxx::__ops::__iter_less_iter());
    4750             :     }
    4751             : 
    4752             :   /**
    4753             :    *  @brief Sort a sequence just enough to find a particular position
    4754             :    *         using a predicate for comparison.
    4755             :    *  @ingroup sorting_algorithms
    4756             :    *  @param  __first   An iterator.
    4757             :    *  @param  __nth     Another iterator.
    4758             :    *  @param  __last    Another iterator.
    4759             :    *  @param  __comp    A comparison functor.
    4760             :    *  @return  Nothing.
    4761             :    *
    4762             :    *  Rearranges the elements in the range @p [__first,__last) so that @p *__nth
    4763             :    *  is the same element that would have been in that position had the
    4764             :    *  whole sequence been sorted. The elements either side of @p *__nth are
    4765             :    *  not completely sorted, but for any iterator @e i in the range
    4766             :    *  @p [__first,__nth) and any iterator @e j in the range @p [__nth,__last) it
    4767             :    *  holds that @p __comp(*j,*i) is false.
    4768             :   */
    4769             :   template<typename _RandomAccessIterator, typename _Compare>
    4770             :     _GLIBCXX20_CONSTEXPR
    4771             :     inline void
    4772             :     nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
    4773             :                 _RandomAccessIterator __last, _Compare __comp)
    4774             :     {
    4775             :       // concept requirements
    4776             :       __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
    4777             :                                   _RandomAccessIterator>)
    4778             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    4779             :             typename iterator_traits<_RandomAccessIterator>::value_type,
    4780             :             typename iterator_traits<_RandomAccessIterator>::value_type>)
    4781             :       __glibcxx_requires_valid_range(__first, __nth);
    4782             :       __glibcxx_requires_valid_range(__nth, __last);
    4783             :       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
    4784             : 
    4785             :       if (__first == __last || __nth == __last)
    4786             :         return;
    4787             : 
    4788             :       std::__introselect(__first, __nth, __last,
    4789             :                          std::__lg(__last - __first) * 2,
    4790             :                          __gnu_cxx::__ops::__iter_comp_iter(__comp));
    4791             :     }
    4792             : 
    4793             :   /**
    4794             :    *  @brief Sort the elements of a sequence.
    4795             :    *  @ingroup sorting_algorithms
    4796             :    *  @param  __first   An iterator.
    4797             :    *  @param  __last    Another iterator.
    4798             :    *  @return  Nothing.
    4799             :    *
    4800             :    *  Sorts the elements in the range @p [__first,__last) in ascending order,
    4801             :    *  such that for each iterator @e i in the range @p [__first,__last-1),  
    4802             :    *  *(i+1)<*i is false.
    4803             :    *
    4804             :    *  The relative ordering of equivalent elements is not preserved, use
    4805             :    *  @p stable_sort() if this is needed.
    4806             :   */
    4807             :   template<typename _RandomAccessIterator>
    4808             :     _GLIBCXX20_CONSTEXPR
    4809             :     inline void
    4810             :     sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
    4811             :     {
    4812             :       // concept requirements
    4813             :       __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
    4814             :             _RandomAccessIterator>)
    4815             :       __glibcxx_function_requires(_LessThanComparableConcept<
    4816             :             typename iterator_traits<_RandomAccessIterator>::value_type>)
    4817             :       __glibcxx_requires_valid_range(__first, __last);
    4818             :       __glibcxx_requires_irreflexive(__first, __last);
    4819             : 
    4820             :       std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());
    4821             :     }
    4822             : 
    4823             :   /**
    4824             :    *  @brief Sort the elements of a sequence using a predicate for comparison.
    4825             :    *  @ingroup sorting_algorithms
    4826             :    *  @param  __first   An iterator.
    4827             :    *  @param  __last    Another iterator.
    4828             :    *  @param  __comp    A comparison functor.
    4829             :    *  @return  Nothing.
    4830             :    *
    4831             :    *  Sorts the elements in the range @p [__first,__last) in ascending order,
    4832             :    *  such that @p __comp(*(i+1),*i) is false for every iterator @e i in the
    4833             :    *  range @p [__first,__last-1).
    4834             :    *
    4835             :    *  The relative ordering of equivalent elements is not preserved, use
    4836             :    *  @p stable_sort() if this is needed.
    4837             :   */
    4838             :   template<typename _RandomAccessIterator, typename _Compare>
    4839             :     _GLIBCXX20_CONSTEXPR
    4840             :     inline void
    4841             :     sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
    4842             :          _Compare __comp)
    4843             :     {
    4844             :       // concept requirements
    4845             :       __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
    4846             :             _RandomAccessIterator>)
    4847             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    4848             :             typename iterator_traits<_RandomAccessIterator>::value_type,
    4849             :             typename iterator_traits<_RandomAccessIterator>::value_type>)
    4850             :       __glibcxx_requires_valid_range(__first, __last);
    4851             :       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
    4852             : 
    4853             :       std::__sort(__first, __last, __gnu_cxx::__ops::__iter_comp_iter(__comp));
    4854             :     }
    4855             : 
    4856             :   template<typename _InputIterator1, typename _InputIterator2,
    4857             :            typename _OutputIterator, typename _Compare>
    4858             :     _GLIBCXX20_CONSTEXPR
    4859             :     _OutputIterator
    4860             :     __merge(_InputIterator1 __first1, _InputIterator1 __last1,
    4861             :             _InputIterator2 __first2, _InputIterator2 __last2,
    4862             :             _OutputIterator __result, _Compare __comp)
    4863             :     {
    4864             :       while (__first1 != __last1 && __first2 != __last2)
    4865             :         {
    4866             :           if (__comp(__first2, __first1))
    4867             :             {
    4868             :               *__result = *__first2;
    4869             :               ++__first2;
    4870             :             }
    4871             :           else
    4872             :             {
    4873             :               *__result = *__first1;
    4874             :               ++__first1;
    4875             :             }
    4876             :           ++__result;
    4877             :         }
    4878             :       return std::copy(__first2, __last2,
    4879             :                        std::copy(__first1, __last1, __result));
    4880             :     }
    4881             : 
    4882             :   /**
    4883             :    *  @brief Merges two sorted ranges.
    4884             :    *  @ingroup sorting_algorithms
    4885             :    *  @param  __first1  An iterator.
    4886             :    *  @param  __first2  Another iterator.
    4887             :    *  @param  __last1   Another iterator.
    4888             :    *  @param  __last2   Another iterator.
    4889             :    *  @param  __result  An iterator pointing to the end of the merged range.
    4890             :    *  @return   An output iterator equal to @p __result + (__last1 - __first1)
    4891             :    *            + (__last2 - __first2).
    4892             :    *
    4893             :    *  Merges the ranges @p [__first1,__last1) and @p [__first2,__last2) into
    4894             :    *  the sorted range @p [__result, __result + (__last1-__first1) +
    4895             :    *  (__last2-__first2)).  Both input ranges must be sorted, and the
    4896             :    *  output range must not overlap with either of the input ranges.
    4897             :    *  The sort is @e stable, that is, for equivalent elements in the
    4898             :    *  two ranges, elements from the first range will always come
    4899             :    *  before elements from the second.
    4900             :   */
    4901             :   template<typename _InputIterator1, typename _InputIterator2,
    4902             :            typename _OutputIterator>
    4903             :     _GLIBCXX20_CONSTEXPR
    4904             :     inline _OutputIterator
    4905             :     merge(_InputIterator1 __first1, _InputIterator1 __last1,
    4906             :           _InputIterator2 __first2, _InputIterator2 __last2,
    4907             :           _OutputIterator __result)
    4908             :     {
    4909             :       // concept requirements
    4910             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
    4911             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
    4912             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    4913             :             typename iterator_traits<_InputIterator1>::value_type>)
    4914             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    4915             :             typename iterator_traits<_InputIterator2>::value_type>)
    4916             :       __glibcxx_function_requires(_LessThanOpConcept<
    4917             :             typename iterator_traits<_InputIterator2>::value_type,
    4918             :             typename iterator_traits<_InputIterator1>::value_type>)    
    4919             :       __glibcxx_requires_sorted_set(__first1, __last1, __first2);
    4920             :       __glibcxx_requires_sorted_set(__first2, __last2, __first1);
    4921             :       __glibcxx_requires_irreflexive2(__first1, __last1);
    4922             :       __glibcxx_requires_irreflexive2(__first2, __last2);
    4923             : 
    4924             :       return _GLIBCXX_STD_A::__merge(__first1, __last1,
    4925             :                                      __first2, __last2, __result,
    4926             :                                      __gnu_cxx::__ops::__iter_less_iter());
    4927             :     }
    4928             : 
    4929             :   /**
    4930             :    *  @brief Merges two sorted ranges.
    4931             :    *  @ingroup sorting_algorithms
    4932             :    *  @param  __first1  An iterator.
    4933             :    *  @param  __first2  Another iterator.
    4934             :    *  @param  __last1   Another iterator.
    4935             :    *  @param  __last2   Another iterator.
    4936             :    *  @param  __result  An iterator pointing to the end of the merged range.
    4937             :    *  @param  __comp    A functor to use for comparisons.
    4938             :    *  @return   An output iterator equal to @p __result + (__last1 - __first1)
    4939             :    *            + (__last2 - __first2).
    4940             :    *
    4941             :    *  Merges the ranges @p [__first1,__last1) and @p [__first2,__last2) into
    4942             :    *  the sorted range @p [__result, __result + (__last1-__first1) +
    4943             :    *  (__last2-__first2)).  Both input ranges must be sorted, and the
    4944             :    *  output range must not overlap with either of the input ranges.
    4945             :    *  The sort is @e stable, that is, for equivalent elements in the
    4946             :    *  two ranges, elements from the first range will always come
    4947             :    *  before elements from the second.
    4948             :    *
    4949             :    *  The comparison function should have the same effects on ordering as
    4950             :    *  the function used for the initial sort.
    4951             :   */
    4952             :   template<typename _InputIterator1, typename _InputIterator2,
    4953             :            typename _OutputIterator, typename _Compare>
    4954             :     _GLIBCXX20_CONSTEXPR
    4955             :     inline _OutputIterator
    4956             :     merge(_InputIterator1 __first1, _InputIterator1 __last1,
    4957             :           _InputIterator2 __first2, _InputIterator2 __last2,
    4958             :           _OutputIterator __result, _Compare __comp)
    4959             :     {
    4960             :       // concept requirements
    4961             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
    4962             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
    4963             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    4964             :             typename iterator_traits<_InputIterator1>::value_type>)
    4965             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    4966             :             typename iterator_traits<_InputIterator2>::value_type>)
    4967             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    4968             :             typename iterator_traits<_InputIterator2>::value_type,
    4969             :             typename iterator_traits<_InputIterator1>::value_type>)
    4970             :       __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
    4971             :       __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
    4972             :       __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
    4973             :       __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
    4974             : 
    4975             :       return _GLIBCXX_STD_A::__merge(__first1, __last1,
    4976             :                                 __first2, __last2, __result,
    4977             :                                 __gnu_cxx::__ops::__iter_comp_iter(__comp));
    4978             :     }
    4979             : 
    4980             :   template<typename _RandomAccessIterator, typename _Compare>
    4981             :     inline void
    4982             :     __stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
    4983             :                   _Compare __comp)
    4984             :     {
    4985             :       typedef typename iterator_traits<_RandomAccessIterator>::value_type
    4986             :         _ValueType;
    4987             :       typedef typename iterator_traits<_RandomAccessIterator>::difference_type
    4988             :         _DistanceType;
    4989             :       typedef _Temporary_buffer<_RandomAccessIterator, _ValueType> _TmpBuf;
    4990             : 
    4991             :       if (__first == __last)
    4992             :         return;
    4993             : 
    4994             :       // __stable_sort_adaptive sorts the range in two halves,
    4995             :       // so the buffer only needs to fit half the range at once.
    4996             :       _TmpBuf __buf(__first, (__last - __first + 1) / 2);
    4997             : 
    4998             :       if (__buf.begin() == 0)
    4999             :         std::__inplace_stable_sort(__first, __last, __comp);
    5000             :       else
    5001             :         std::__stable_sort_adaptive(__first, __last, __buf.begin(),
    5002             :                                     _DistanceType(__buf.size()), __comp);
    5003             :     }
    5004             : 
    5005             :   /**
    5006             :    *  @brief Sort the elements of a sequence, preserving the relative order
    5007             :    *         of equivalent elements.
    5008             :    *  @ingroup sorting_algorithms
    5009             :    *  @param  __first   An iterator.
    5010             :    *  @param  __last    Another iterator.
    5011             :    *  @return  Nothing.
    5012             :    *
    5013             :    *  Sorts the elements in the range @p [__first,__last) in ascending order,
    5014             :    *  such that for each iterator @p i in the range @p [__first,__last-1),
    5015             :    *  @p *(i+1)<*i is false.
    5016             :    *
    5017             :    *  The relative ordering of equivalent elements is preserved, so any two
    5018             :    *  elements @p x and @p y in the range @p [__first,__last) such that
    5019             :    *  @p x<y is false and @p y<x is false will have the same relative
    5020             :    *  ordering after calling @p stable_sort().
    5021             :   */
    5022             :   template<typename _RandomAccessIterator>
    5023             :     inline void
    5024             :     stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
    5025             :     {
    5026             :       // concept requirements
    5027             :       __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
    5028             :             _RandomAccessIterator>)
    5029             :       __glibcxx_function_requires(_LessThanComparableConcept<
    5030             :             typename iterator_traits<_RandomAccessIterator>::value_type>)
    5031             :       __glibcxx_requires_valid_range(__first, __last);
    5032             :       __glibcxx_requires_irreflexive(__first, __last);
    5033             : 
    5034             :       _GLIBCXX_STD_A::__stable_sort(__first, __last,
    5035             :                                     __gnu_cxx::__ops::__iter_less_iter());
    5036             :     }
    5037             : 
    5038             :   /**
    5039             :    *  @brief Sort the elements of a sequence using a predicate for comparison,
    5040             :    *         preserving the relative order of equivalent elements.
    5041             :    *  @ingroup sorting_algorithms
    5042             :    *  @param  __first   An iterator.
    5043             :    *  @param  __last    Another iterator.
    5044             :    *  @param  __comp    A comparison functor.
    5045             :    *  @return  Nothing.
    5046             :    *
    5047             :    *  Sorts the elements in the range @p [__first,__last) in ascending order,
    5048             :    *  such that for each iterator @p i in the range @p [__first,__last-1),
    5049             :    *  @p __comp(*(i+1),*i) is false.
    5050             :    *
    5051             :    *  The relative ordering of equivalent elements is preserved, so any two
    5052             :    *  elements @p x and @p y in the range @p [__first,__last) such that
    5053             :    *  @p __comp(x,y) is false and @p __comp(y,x) is false will have the same
    5054             :    *  relative ordering after calling @p stable_sort().
    5055             :   */
    5056             :   template<typename _RandomAccessIterator, typename _Compare>
    5057             :     inline void
    5058             :     stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
    5059             :                 _Compare __comp)
    5060             :     {
    5061             :       // concept requirements
    5062             :       __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
    5063             :             _RandomAccessIterator>)
    5064             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    5065             :             typename iterator_traits<_RandomAccessIterator>::value_type,
    5066             :             typename iterator_traits<_RandomAccessIterator>::value_type>)
    5067             :       __glibcxx_requires_valid_range(__first, __last);
    5068             :       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
    5069             : 
    5070             :       _GLIBCXX_STD_A::__stable_sort(__first, __last,
    5071             :                                     __gnu_cxx::__ops::__iter_comp_iter(__comp));
    5072             :     }
    5073             : 
    5074             :   template<typename _InputIterator1, typename _InputIterator2,
    5075             :            typename _OutputIterator,
    5076             :            typename _Compare>
    5077             :     _GLIBCXX20_CONSTEXPR
    5078             :     _OutputIterator
    5079             :     __set_union(_InputIterator1 __first1, _InputIterator1 __last1,
    5080             :                 _InputIterator2 __first2, _InputIterator2 __last2,
    5081             :                 _OutputIterator __result, _Compare __comp)
    5082             :     {
    5083             :       while (__first1 != __last1 && __first2 != __last2)
    5084             :         {
    5085             :           if (__comp(__first1, __first2))
    5086             :             {
    5087             :               *__result = *__first1;
    5088             :               ++__first1;
    5089             :             }
    5090             :           else if (__comp(__first2, __first1))
    5091             :             {
    5092             :               *__result = *__first2;
    5093             :               ++__first2;
    5094             :             }
    5095             :           else
    5096             :             {
    5097             :               *__result = *__first1;
    5098             :               ++__first1;
    5099             :               ++__first2;
    5100             :             }
    5101             :           ++__result;
    5102             :         }
    5103             :       return std::copy(__first2, __last2,
    5104             :                        std::copy(__first1, __last1, __result));
    5105             :     }
    5106             : 
    5107             :   /**
    5108             :    *  @brief Return the union of two sorted ranges.
    5109             :    *  @ingroup set_algorithms
    5110             :    *  @param  __first1  Start of first range.
    5111             :    *  @param  __last1   End of first range.
    5112             :    *  @param  __first2  Start of second range.
    5113             :    *  @param  __last2   End of second range.
    5114             :    *  @param  __result  Start of output range.
    5115             :    *  @return  End of the output range.
    5116             :    *  @ingroup set_algorithms
    5117             :    *
    5118             :    *  This operation iterates over both ranges, copying elements present in
    5119             :    *  each range in order to the output range.  Iterators increment for each
    5120             :    *  range.  When the current element of one range is less than the other,
    5121             :    *  that element is copied and the iterator advanced.  If an element is
    5122             :    *  contained in both ranges, the element from the first range is copied and
    5123             :    *  both ranges advance.  The output range may not overlap either input
    5124             :    *  range.
    5125             :   */
    5126             :   template<typename _InputIterator1, typename _InputIterator2,
    5127             :            typename _OutputIterator>
    5128             :     _GLIBCXX20_CONSTEXPR
    5129             :     inline _OutputIterator
    5130             :     set_union(_InputIterator1 __first1, _InputIterator1 __last1,
    5131             :               _InputIterator2 __first2, _InputIterator2 __last2,
    5132             :               _OutputIterator __result)
    5133             :     {
    5134             :       // concept requirements
    5135             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
    5136             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
    5137             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    5138             :             typename iterator_traits<_InputIterator1>::value_type>)
    5139             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    5140             :             typename iterator_traits<_InputIterator2>::value_type>)
    5141             :       __glibcxx_function_requires(_LessThanOpConcept<
    5142             :             typename iterator_traits<_InputIterator1>::value_type,
    5143             :             typename iterator_traits<_InputIterator2>::value_type>)
    5144             :       __glibcxx_function_requires(_LessThanOpConcept<
    5145             :             typename iterator_traits<_InputIterator2>::value_type,
    5146             :             typename iterator_traits<_InputIterator1>::value_type>)
    5147             :       __glibcxx_requires_sorted_set(__first1, __last1, __first2);
    5148             :       __glibcxx_requires_sorted_set(__first2, __last2, __first1);
    5149             :       __glibcxx_requires_irreflexive2(__first1, __last1);
    5150             :       __glibcxx_requires_irreflexive2(__first2, __last2);
    5151             : 
    5152             :       return _GLIBCXX_STD_A::__set_union(__first1, __last1,
    5153             :                                 __first2, __last2, __result,
    5154             :                                 __gnu_cxx::__ops::__iter_less_iter());
    5155             :     }
    5156             : 
    5157             :   /**
    5158             :    *  @brief Return the union of two sorted ranges using a comparison functor.
    5159             :    *  @ingroup set_algorithms
    5160             :    *  @param  __first1  Start of first range.
    5161             :    *  @param  __last1   End of first range.
    5162             :    *  @param  __first2  Start of second range.
    5163             :    *  @param  __last2   End of second range.
    5164             :    *  @param  __result  Start of output range.
    5165             :    *  @param  __comp    The comparison functor.
    5166             :    *  @return  End of the output range.
    5167             :    *  @ingroup set_algorithms
    5168             :    *
    5169             :    *  This operation iterates over both ranges, copying elements present in
    5170             :    *  each range in order to the output range.  Iterators increment for each
    5171             :    *  range.  When the current element of one range is less than the other
    5172             :    *  according to @p __comp, that element is copied and the iterator advanced.
    5173             :    *  If an equivalent element according to @p __comp is contained in both
    5174             :    *  ranges, the element from the first range is copied and both ranges
    5175             :    *  advance.  The output range may not overlap either input range.
    5176             :   */
    5177             :   template<typename _InputIterator1, typename _InputIterator2,
    5178             :            typename _OutputIterator, typename _Compare>
    5179             :     _GLIBCXX20_CONSTEXPR
    5180             :     inline _OutputIterator
    5181             :     set_union(_InputIterator1 __first1, _InputIterator1 __last1,
    5182             :               _InputIterator2 __first2, _InputIterator2 __last2,
    5183             :               _OutputIterator __result, _Compare __comp)
    5184             :     {
    5185             :       // concept requirements
    5186             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
    5187             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
    5188             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    5189             :             typename iterator_traits<_InputIterator1>::value_type>)
    5190             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    5191             :             typename iterator_traits<_InputIterator2>::value_type>)
    5192             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    5193             :             typename iterator_traits<_InputIterator1>::value_type,
    5194             :             typename iterator_traits<_InputIterator2>::value_type>)
    5195             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    5196             :             typename iterator_traits<_InputIterator2>::value_type,
    5197             :             typename iterator_traits<_InputIterator1>::value_type>)
    5198             :       __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
    5199             :       __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
    5200             :       __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
    5201             :       __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
    5202             : 
    5203             :       return _GLIBCXX_STD_A::__set_union(__first1, __last1,
    5204             :                                 __first2, __last2, __result,
    5205             :                                 __gnu_cxx::__ops::__iter_comp_iter(__comp));
    5206             :     }
    5207             : 
    5208             :   template<typename _InputIterator1, typename _InputIterator2,
    5209             :            typename _OutputIterator,
    5210             :            typename _Compare>
    5211             :     _GLIBCXX20_CONSTEXPR
    5212             :     _OutputIterator
    5213             :     __set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
    5214             :                        _InputIterator2 __first2, _InputIterator2 __last2,
    5215             :                        _OutputIterator __result, _Compare __comp)
    5216             :     {
    5217             :       while (__first1 != __last1 && __first2 != __last2)
    5218             :         if (__comp(__first1, __first2))
    5219             :           ++__first1;
    5220             :         else if (__comp(__first2, __first1))
    5221             :           ++__first2;
    5222             :         else
    5223             :           {
    5224             :             *__result = *__first1;
    5225             :             ++__first1;
    5226             :             ++__first2;
    5227             :             ++__result;
    5228             :           }
    5229             :       return __result;
    5230             :     }
    5231             : 
    5232             :   /**
    5233             :    *  @brief Return the intersection of two sorted ranges.
    5234             :    *  @ingroup set_algorithms
    5235             :    *  @param  __first1  Start of first range.
    5236             :    *  @param  __last1   End of first range.
    5237             :    *  @param  __first2  Start of second range.
    5238             :    *  @param  __last2   End of second range.
    5239             :    *  @param  __result  Start of output range.
    5240             :    *  @return  End of the output range.
    5241             :    *  @ingroup set_algorithms
    5242             :    *
    5243             :    *  This operation iterates over both ranges, copying elements present in
    5244             :    *  both ranges in order to the output range.  Iterators increment for each
    5245             :    *  range.  When the current element of one range is less than the other,
    5246             :    *  that iterator advances.  If an element is contained in both ranges, the
    5247             :    *  element from the first range is copied and both ranges advance.  The
    5248             :    *  output range may not overlap either input range.
    5249             :   */
    5250             :   template<typename _InputIterator1, typename _InputIterator2,
    5251             :            typename _OutputIterator>
    5252             :     _GLIBCXX20_CONSTEXPR
    5253             :     inline _OutputIterator
    5254             :     set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
    5255             :                      _InputIterator2 __first2, _InputIterator2 __last2,
    5256             :                      _OutputIterator __result)
    5257             :     {
    5258             :       // concept requirements
    5259             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
    5260             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
    5261             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    5262             :             typename iterator_traits<_InputIterator1>::value_type>)
    5263             :       __glibcxx_function_requires(_LessThanOpConcept<
    5264             :             typename iterator_traits<_InputIterator1>::value_type,
    5265             :             typename iterator_traits<_InputIterator2>::value_type>)
    5266             :       __glibcxx_function_requires(_LessThanOpConcept<
    5267             :             typename iterator_traits<_InputIterator2>::value_type,
    5268             :             typename iterator_traits<_InputIterator1>::value_type>)
    5269             :       __glibcxx_requires_sorted_set(__first1, __last1, __first2);
    5270             :       __glibcxx_requires_sorted_set(__first2, __last2, __first1);
    5271             :       __glibcxx_requires_irreflexive2(__first1, __last1);
    5272             :       __glibcxx_requires_irreflexive2(__first2, __last2);
    5273             : 
    5274             :       return _GLIBCXX_STD_A::__set_intersection(__first1, __last1,
    5275             :                                      __first2, __last2, __result,
    5276             :                                      __gnu_cxx::__ops::__iter_less_iter());
    5277             :     }
    5278             : 
    5279             :   /**
    5280             :    *  @brief Return the intersection of two sorted ranges using comparison
    5281             :    *  functor.
    5282             :    *  @ingroup set_algorithms
    5283             :    *  @param  __first1  Start of first range.
    5284             :    *  @param  __last1   End of first range.
    5285             :    *  @param  __first2  Start of second range.
    5286             :    *  @param  __last2   End of second range.
    5287             :    *  @param  __result  Start of output range.
    5288             :    *  @param  __comp    The comparison functor.
    5289             :    *  @return  End of the output range.
    5290             :    *  @ingroup set_algorithms
    5291             :    *
    5292             :    *  This operation iterates over both ranges, copying elements present in
    5293             :    *  both ranges in order to the output range.  Iterators increment for each
    5294             :    *  range.  When the current element of one range is less than the other
    5295             :    *  according to @p __comp, that iterator advances.  If an element is
    5296             :    *  contained in both ranges according to @p __comp, the element from the
    5297             :    *  first range is copied and both ranges advance.  The output range may not
    5298             :    *  overlap either input range.
    5299             :   */
    5300             :   template<typename _InputIterator1, typename _InputIterator2,
    5301             :            typename _OutputIterator, typename _Compare>
    5302             :     _GLIBCXX20_CONSTEXPR
    5303             :     inline _OutputIterator
    5304             :     set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
    5305             :                      _InputIterator2 __first2, _InputIterator2 __last2,
    5306             :                      _OutputIterator __result, _Compare __comp)
    5307             :     {
    5308             :       // concept requirements
    5309             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
    5310             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
    5311             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    5312             :             typename iterator_traits<_InputIterator1>::value_type>)
    5313             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    5314             :             typename iterator_traits<_InputIterator1>::value_type,
    5315             :             typename iterator_traits<_InputIterator2>::value_type>)
    5316             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    5317             :             typename iterator_traits<_InputIterator2>::value_type,
    5318             :             typename iterator_traits<_InputIterator1>::value_type>)
    5319             :       __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
    5320             :       __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
    5321             :       __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
    5322             :       __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
    5323             : 
    5324             :       return _GLIBCXX_STD_A::__set_intersection(__first1, __last1,
    5325             :                                 __first2, __last2, __result,
    5326             :                                 __gnu_cxx::__ops::__iter_comp_iter(__comp));
    5327             :     }
    5328             : 
    5329             :   template<typename _InputIterator1, typename _InputIterator2,
    5330             :            typename _OutputIterator,
    5331             :            typename _Compare>
    5332             :     _GLIBCXX20_CONSTEXPR
    5333             :     _OutputIterator
    5334             :     __set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
    5335             :                      _InputIterator2 __first2, _InputIterator2 __last2,
    5336             :                      _OutputIterator __result, _Compare __comp)
    5337             :     {
    5338             :       while (__first1 != __last1 && __first2 != __last2)
    5339             :         if (__comp(__first1, __first2))
    5340             :           {
    5341             :             *__result = *__first1;
    5342             :             ++__first1;
    5343             :             ++__result;
    5344             :           }
    5345             :         else if (__comp(__first2, __first1))
    5346             :           ++__first2;
    5347             :         else
    5348             :           {
    5349             :             ++__first1;
    5350             :             ++__first2;
    5351             :           }
    5352             :       return std::copy(__first1, __last1, __result);
    5353             :     }
    5354             : 
    5355             :   /**
    5356             :    *  @brief Return the difference of two sorted ranges.
    5357             :    *  @ingroup set_algorithms
    5358             :    *  @param  __first1  Start of first range.
    5359             :    *  @param  __last1   End of first range.
    5360             :    *  @param  __first2  Start of second range.
    5361             :    *  @param  __last2   End of second range.
    5362             :    *  @param  __result  Start of output range.
    5363             :    *  @return  End of the output range.
    5364             :    *  @ingroup set_algorithms
    5365             :    *
    5366             :    *  This operation iterates over both ranges, copying elements present in
    5367             :    *  the first range but not the second in order to the output range.
    5368             :    *  Iterators increment for each range.  When the current element of the
    5369             :    *  first range is less than the second, that element is copied and the
    5370             :    *  iterator advances.  If the current element of the second range is less,
    5371             :    *  the iterator advances, but no element is copied.  If an element is
    5372             :    *  contained in both ranges, no elements are copied and both ranges
    5373             :    *  advance.  The output range may not overlap either input range.
    5374             :   */
    5375             :   template<typename _InputIterator1, typename _InputIterator2,
    5376             :            typename _OutputIterator>
    5377             :     _GLIBCXX20_CONSTEXPR
    5378             :     inline _OutputIterator
    5379             :     set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
    5380             :                    _InputIterator2 __first2, _InputIterator2 __last2,
    5381             :                    _OutputIterator __result)
    5382             :     {
    5383             :       // concept requirements
    5384             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
    5385             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
    5386             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    5387             :             typename iterator_traits<_InputIterator1>::value_type>)
    5388             :       __glibcxx_function_requires(_LessThanOpConcept<
    5389             :             typename iterator_traits<_InputIterator1>::value_type,
    5390             :             typename iterator_traits<_InputIterator2>::value_type>)
    5391             :       __glibcxx_function_requires(_LessThanOpConcept<
    5392             :             typename iterator_traits<_InputIterator2>::value_type,
    5393             :             typename iterator_traits<_InputIterator1>::value_type>)    
    5394             :       __glibcxx_requires_sorted_set(__first1, __last1, __first2);
    5395             :       __glibcxx_requires_sorted_set(__first2, __last2, __first1);
    5396             :       __glibcxx_requires_irreflexive2(__first1, __last1);
    5397             :       __glibcxx_requires_irreflexive2(__first2, __last2);
    5398             : 
    5399             :       return _GLIBCXX_STD_A::__set_difference(__first1, __last1,
    5400             :                                    __first2, __last2, __result,
    5401             :                                    __gnu_cxx::__ops::__iter_less_iter());
    5402             :     }
    5403             : 
    5404             :   /**
    5405             :    *  @brief  Return the difference of two sorted ranges using comparison
    5406             :    *  functor.
    5407             :    *  @ingroup set_algorithms
    5408             :    *  @param  __first1  Start of first range.
    5409             :    *  @param  __last1   End of first range.
    5410             :    *  @param  __first2  Start of second range.
    5411             :    *  @param  __last2   End of second range.
    5412             :    *  @param  __result  Start of output range.
    5413             :    *  @param  __comp    The comparison functor.
    5414             :    *  @return  End of the output range.
    5415             :    *  @ingroup set_algorithms
    5416             :    *
    5417             :    *  This operation iterates over both ranges, copying elements present in
    5418             :    *  the first range but not the second in order to the output range.
    5419             :    *  Iterators increment for each range.  When the current element of the
    5420             :    *  first range is less than the second according to @p __comp, that element
    5421             :    *  is copied and the iterator advances.  If the current element of the
    5422             :    *  second range is less, no element is copied and the iterator advances.
    5423             :    *  If an element is contained in both ranges according to @p __comp, no
    5424             :    *  elements are copied and both ranges advance.  The output range may not
    5425             :    *  overlap either input range.
    5426             :   */
    5427             :   template<typename _InputIterator1, typename _InputIterator2,
    5428             :            typename _OutputIterator, typename _Compare>
    5429             :     _GLIBCXX20_CONSTEXPR
    5430             :     inline _OutputIterator
    5431             :     set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
    5432             :                    _InputIterator2 __first2, _InputIterator2 __last2,
    5433             :                    _OutputIterator __result, _Compare __comp)
    5434             :     {
    5435             :       // concept requirements
    5436             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
    5437             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
    5438             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    5439             :             typename iterator_traits<_InputIterator1>::value_type>)
    5440             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    5441             :             typename iterator_traits<_InputIterator1>::value_type,
    5442             :             typename iterator_traits<_InputIterator2>::value_type>)
    5443             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    5444             :             typename iterator_traits<_InputIterator2>::value_type,
    5445             :             typename iterator_traits<_InputIterator1>::value_type>)
    5446             :       __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
    5447             :       __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
    5448             :       __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
    5449             :       __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
    5450             : 
    5451             :       return _GLIBCXX_STD_A::__set_difference(__first1, __last1,
    5452             :                                    __first2, __last2, __result,
    5453             :                                    __gnu_cxx::__ops::__iter_comp_iter(__comp));
    5454             :     }
    5455             : 
    5456             :   template<typename _InputIterator1, typename _InputIterator2,
    5457             :            typename _OutputIterator,
    5458             :            typename _Compare>
    5459             :     _GLIBCXX20_CONSTEXPR
    5460             :     _OutputIterator
    5461             :     __set_symmetric_difference(_InputIterator1 __first1,
    5462             :                                _InputIterator1 __last1,
    5463             :                                _InputIterator2 __first2,
    5464             :                                _InputIterator2 __last2,
    5465             :                                _OutputIterator __result,
    5466             :                                _Compare __comp)
    5467             :     {
    5468             :       while (__first1 != __last1 && __first2 != __last2)
    5469             :         if (__comp(__first1, __first2))
    5470             :           {
    5471             :             *__result = *__first1;
    5472             :             ++__first1;
    5473             :             ++__result;
    5474             :           }
    5475             :         else if (__comp(__first2, __first1))
    5476             :           {
    5477             :             *__result = *__first2;
    5478             :             ++__first2;
    5479             :             ++__result;
    5480             :           }
    5481             :         else
    5482             :           {
    5483             :             ++__first1;
    5484             :             ++__first2;
    5485             :           }
    5486             :       return std::copy(__first2, __last2, 
    5487             :                        std::copy(__first1, __last1, __result));
    5488             :     }
    5489             : 
    5490             :   /**
    5491             :    *  @brief  Return the symmetric difference of two sorted ranges.
    5492             :    *  @ingroup set_algorithms
    5493             :    *  @param  __first1  Start of first range.
    5494             :    *  @param  __last1   End of first range.
    5495             :    *  @param  __first2  Start of second range.
    5496             :    *  @param  __last2   End of second range.
    5497             :    *  @param  __result  Start of output range.
    5498             :    *  @return  End of the output range.
    5499             :    *  @ingroup set_algorithms
    5500             :    *
    5501             :    *  This operation iterates over both ranges, copying elements present in
    5502             :    *  one range but not the other in order to the output range.  Iterators
    5503             :    *  increment for each range.  When the current element of one range is less
    5504             :    *  than the other, that element is copied and the iterator advances.  If an
    5505             :    *  element is contained in both ranges, no elements are copied and both
    5506             :    *  ranges advance.  The output range may not overlap either input range.
    5507             :   */
    5508             :   template<typename _InputIterator1, typename _InputIterator2,
    5509             :            typename _OutputIterator>
    5510             :     _GLIBCXX20_CONSTEXPR
    5511             :     inline _OutputIterator
    5512             :     set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
    5513             :                              _InputIterator2 __first2, _InputIterator2 __last2,
    5514             :                              _OutputIterator __result)
    5515             :     {
    5516             :       // concept requirements
    5517             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
    5518             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
    5519             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    5520             :             typename iterator_traits<_InputIterator1>::value_type>)
    5521             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    5522             :             typename iterator_traits<_InputIterator2>::value_type>)
    5523             :       __glibcxx_function_requires(_LessThanOpConcept<
    5524             :             typename iterator_traits<_InputIterator1>::value_type,
    5525             :             typename iterator_traits<_InputIterator2>::value_type>)
    5526             :       __glibcxx_function_requires(_LessThanOpConcept<
    5527             :             typename iterator_traits<_InputIterator2>::value_type,
    5528             :             typename iterator_traits<_InputIterator1>::value_type>)    
    5529             :       __glibcxx_requires_sorted_set(__first1, __last1, __first2);
    5530             :       __glibcxx_requires_sorted_set(__first2, __last2, __first1);
    5531             :       __glibcxx_requires_irreflexive2(__first1, __last1);
    5532             :       __glibcxx_requires_irreflexive2(__first2, __last2);
    5533             : 
    5534             :       return _GLIBCXX_STD_A::__set_symmetric_difference(__first1, __last1,
    5535             :                                         __first2, __last2, __result,
    5536             :                                         __gnu_cxx::__ops::__iter_less_iter());
    5537             :     }
    5538             : 
    5539             :   /**
    5540             :    *  @brief  Return the symmetric difference of two sorted ranges using
    5541             :    *  comparison functor.
    5542             :    *  @ingroup set_algorithms
    5543             :    *  @param  __first1  Start of first range.
    5544             :    *  @param  __last1   End of first range.
    5545             :    *  @param  __first2  Start of second range.
    5546             :    *  @param  __last2   End of second range.
    5547             :    *  @param  __result  Start of output range.
    5548             :    *  @param  __comp    The comparison functor.
    5549             :    *  @return  End of the output range.
    5550             :    *  @ingroup set_algorithms
    5551             :    *
    5552             :    *  This operation iterates over both ranges, copying elements present in
    5553             :    *  one range but not the other in order to the output range.  Iterators
    5554             :    *  increment for each range.  When the current element of one range is less
    5555             :    *  than the other according to @p comp, that element is copied and the
    5556             :    *  iterator advances.  If an element is contained in both ranges according
    5557             :    *  to @p __comp, no elements are copied and both ranges advance.  The output
    5558             :    *  range may not overlap either input range.
    5559             :   */
    5560             :   template<typename _InputIterator1, typename _InputIterator2,
    5561             :            typename _OutputIterator, typename _Compare>
    5562             :     _GLIBCXX20_CONSTEXPR
    5563             :     inline _OutputIterator
    5564             :     set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
    5565             :                              _InputIterator2 __first2, _InputIterator2 __last2,
    5566             :                              _OutputIterator __result,
    5567             :                              _Compare __comp)
    5568             :     {
    5569             :       // concept requirements
    5570             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
    5571             :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
    5572             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    5573             :             typename iterator_traits<_InputIterator1>::value_type>)
    5574             :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    5575             :             typename iterator_traits<_InputIterator2>::value_type>)
    5576             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    5577             :             typename iterator_traits<_InputIterator1>::value_type,
    5578             :             typename iterator_traits<_InputIterator2>::value_type>)
    5579             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    5580             :             typename iterator_traits<_InputIterator2>::value_type,
    5581             :             typename iterator_traits<_InputIterator1>::value_type>)
    5582             :       __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
    5583             :       __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
    5584             :       __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
    5585             :       __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
    5586             : 
    5587             :       return _GLIBCXX_STD_A::__set_symmetric_difference(__first1, __last1,
    5588             :                                 __first2, __last2, __result,
    5589             :                                 __gnu_cxx::__ops::__iter_comp_iter(__comp));
    5590             :     }
    5591             : 
    5592             :   template<typename _ForwardIterator, typename _Compare>
    5593             :     _GLIBCXX14_CONSTEXPR
    5594             :     _ForwardIterator
    5595             :     __min_element(_ForwardIterator __first, _ForwardIterator __last,
    5596             :                   _Compare __comp)
    5597             :     {
    5598             :       if (__first == __last)
    5599             :         return __first;
    5600             :       _ForwardIterator __result = __first;
    5601             :       while (++__first != __last)
    5602             :         if (__comp(__first, __result))
    5603             :           __result = __first;
    5604             :       return __result;
    5605             :     }
    5606             : 
    5607             :   /**
    5608             :    *  @brief  Return the minimum element in a range.
    5609             :    *  @ingroup sorting_algorithms
    5610             :    *  @param  __first  Start of range.
    5611             :    *  @param  __last   End of range.
    5612             :    *  @return  Iterator referencing the first instance of the smallest value.
    5613             :   */
    5614             :   template<typename _ForwardIterator>
    5615             :     _GLIBCXX14_CONSTEXPR
    5616             :     _ForwardIterator
    5617             :     inline min_element(_ForwardIterator __first, _ForwardIterator __last)
    5618             :     {
    5619             :       // concept requirements
    5620             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
    5621             :       __glibcxx_function_requires(_LessThanComparableConcept<
    5622             :             typename iterator_traits<_ForwardIterator>::value_type>)
    5623             :       __glibcxx_requires_valid_range(__first, __last);
    5624             :       __glibcxx_requires_irreflexive(__first, __last);
    5625             : 
    5626             :       return _GLIBCXX_STD_A::__min_element(__first, __last,
    5627             :                                 __gnu_cxx::__ops::__iter_less_iter());
    5628             :     }
    5629             : 
    5630             :   /**
    5631             :    *  @brief  Return the minimum element in a range using comparison functor.
    5632             :    *  @ingroup sorting_algorithms
    5633             :    *  @param  __first  Start of range.
    5634             :    *  @param  __last   End of range.
    5635             :    *  @param  __comp   Comparison functor.
    5636             :    *  @return  Iterator referencing the first instance of the smallest value
    5637             :    *  according to __comp.
    5638             :   */
    5639             :   template<typename _ForwardIterator, typename _Compare>
    5640             :     _GLIBCXX14_CONSTEXPR
    5641             :     inline _ForwardIterator
    5642             :     min_element(_ForwardIterator __first, _ForwardIterator __last,
    5643             :                 _Compare __comp)
    5644             :     {
    5645             :       // concept requirements
    5646             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
    5647             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    5648             :             typename iterator_traits<_ForwardIterator>::value_type,
    5649             :             typename iterator_traits<_ForwardIterator>::value_type>)
    5650             :       __glibcxx_requires_valid_range(__first, __last);
    5651             :       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
    5652             : 
    5653             :       return _GLIBCXX_STD_A::__min_element(__first, __last,
    5654             :                                 __gnu_cxx::__ops::__iter_comp_iter(__comp));
    5655             :     }
    5656             : 
    5657             :   template<typename _ForwardIterator, typename _Compare>
    5658             :     _GLIBCXX14_CONSTEXPR
    5659             :     _ForwardIterator
    5660             :     __max_element(_ForwardIterator __first, _ForwardIterator __last,
    5661             :                   _Compare __comp)
    5662             :     {
    5663             :       if (__first == __last) return __first;
    5664             :       _ForwardIterator __result = __first;
    5665             :       while (++__first != __last)
    5666             :         if (__comp(__result, __first))
    5667             :           __result = __first;
    5668             :       return __result;
    5669             :     }
    5670             : 
    5671             :   /**
    5672             :    *  @brief  Return the maximum element in a range.
    5673             :    *  @ingroup sorting_algorithms
    5674             :    *  @param  __first  Start of range.
    5675             :    *  @param  __last   End of range.
    5676             :    *  @return  Iterator referencing the first instance of the largest value.
    5677             :   */
    5678             :   template<typename _ForwardIterator>
    5679             :     _GLIBCXX14_CONSTEXPR
    5680             :     inline _ForwardIterator
    5681             :     max_element(_ForwardIterator __first, _ForwardIterator __last)
    5682             :     {
    5683             :       // concept requirements
    5684             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
    5685             :       __glibcxx_function_requires(_LessThanComparableConcept<
    5686             :             typename iterator_traits<_ForwardIterator>::value_type>)
    5687             :       __glibcxx_requires_valid_range(__first, __last);
    5688             :       __glibcxx_requires_irreflexive(__first, __last);
    5689             : 
    5690             :       return _GLIBCXX_STD_A::__max_element(__first, __last,
    5691             :                                 __gnu_cxx::__ops::__iter_less_iter());
    5692             :     }
    5693             : 
    5694             :   /**
    5695             :    *  @brief  Return the maximum element in a range using comparison functor.
    5696             :    *  @ingroup sorting_algorithms
    5697             :    *  @param  __first  Start of range.
    5698             :    *  @param  __last   End of range.
    5699             :    *  @param  __comp   Comparison functor.
    5700             :    *  @return  Iterator referencing the first instance of the largest value
    5701             :    *  according to __comp.
    5702             :   */
    5703             :   template<typename _ForwardIterator, typename _Compare>
    5704             :     _GLIBCXX14_CONSTEXPR
    5705             :     inline _ForwardIterator
    5706             :     max_element(_ForwardIterator __first, _ForwardIterator __last,
    5707             :                 _Compare __comp)
    5708             :     {
    5709             :       // concept requirements
    5710             :       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
    5711             :       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
    5712             :             typename iterator_traits<_ForwardIterator>::value_type,
    5713             :             typename iterator_traits<_ForwardIterator>::value_type>)
    5714             :       __glibcxx_requires_valid_range(__first, __last);
    5715             :       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
    5716             : 
    5717             :       return _GLIBCXX_STD_A::__max_element(__first, __last,
    5718             :                                 __gnu_cxx::__ops::__iter_comp_iter(__comp));
    5719             :     }
    5720             : 
    5721             : #if __cplusplus >= 201103L
    5722             :   // N2722 + DR 915.
    5723             :   template<typename _Tp>
    5724             :     _GLIBCXX14_CONSTEXPR
    5725             :     inline _Tp
    5726             :     min(initializer_list<_Tp> __l)
    5727             :     {
    5728             :       __glibcxx_requires_irreflexive(__l.begin(), __l.end());
    5729             :       return *_GLIBCXX_STD_A::__min_element(__l.begin(), __l.end(),
    5730             :           __gnu_cxx::__ops::__iter_less_iter());
    5731             :     }
    5732             : 
    5733             :   template<typename _Tp, typename _Compare>
    5734             :     _GLIBCXX14_CONSTEXPR
    5735             :     inline _Tp
    5736             :     min(initializer_list<_Tp> __l, _Compare __comp)
    5737             :     {
    5738             :       __glibcxx_requires_irreflexive_pred(__l.begin(), __l.end(), __comp);
    5739             :       return *_GLIBCXX_STD_A::__min_element(__l.begin(), __l.end(),
    5740             :           __gnu_cxx::__ops::__iter_comp_iter(__comp));
    5741             :     }
    5742             : 
    5743             :   template<typename _Tp>
    5744             :     _GLIBCXX14_CONSTEXPR
    5745             :     inline _Tp
    5746             :     max(initializer_list<_Tp> __l)
    5747             :     {
    5748             :       __glibcxx_requires_irreflexive(__l.begin(), __l.end());
    5749             :       return *_GLIBCXX_STD_A::__max_element(__l.begin(), __l.end(),
    5750             :           __gnu_cxx::__ops::__iter_less_iter());
    5751             :     }
    5752             : 
    5753             :   template<typename _Tp, typename _Compare>
    5754             :     _GLIBCXX14_CONSTEXPR
    5755             :     inline _Tp
    5756             :     max(initializer_list<_Tp> __l, _Compare __comp)
    5757             :     {
    5758             :       __glibcxx_requires_irreflexive_pred(__l.begin(), __l.end(), __comp);
    5759             :       return *_GLIBCXX_STD_A::__max_element(__l.begin(), __l.end(),
    5760             :           __gnu_cxx::__ops::__iter_comp_iter(__comp));
    5761             :     }
    5762             : #endif // C++11
    5763             : 
    5764             : #if __cplusplus >= 201402L
    5765             :   /// Reservoir sampling algorithm.
    5766             :   template<typename _InputIterator, typename _RandomAccessIterator,
    5767             :            typename _Size, typename _UniformRandomBitGenerator>
    5768             :     _RandomAccessIterator
    5769             :     __sample(_InputIterator __first, _InputIterator __last, input_iterator_tag,
    5770             :              _RandomAccessIterator __out, random_access_iterator_tag,
    5771             :              _Size __n, _UniformRandomBitGenerator&& __g)
    5772             :     {
    5773             :       using __distrib_type = uniform_int_distribution<_Size>;
    5774             :       using __param_type = typename __distrib_type::param_type;
    5775             :       __distrib_type __d{};
    5776             :       _Size __sample_sz = 0;
    5777             :       while (__first != __last && __sample_sz != __n)
    5778             :         {
    5779             :           __out[__sample_sz++] = *__first;
    5780             :           ++__first;
    5781             :         }
    5782             :       for (auto __pop_sz = __sample_sz; __first != __last;
    5783             :           ++__first, (void) ++__pop_sz)
    5784             :         {
    5785             :           const auto __k = __d(__g, __param_type{0, __pop_sz});
    5786             :           if (__k < __n)
    5787             :             __out[__k] = *__first;
    5788             :         }
    5789             :       return __out + __sample_sz;
    5790             :     }
    5791             : 
    5792             :   /// Selection sampling algorithm.
    5793             :   template<typename _ForwardIterator, typename _OutputIterator, typename _Cat,
    5794             :            typename _Size, typename _UniformRandomBitGenerator>
    5795             :     _OutputIterator
    5796             :     __sample(_ForwardIterator __first, _ForwardIterator __last,
    5797             :              forward_iterator_tag,
    5798             :              _OutputIterator __out, _Cat,
    5799             :              _Size __n, _UniformRandomBitGenerator&& __g)
    5800             :     {
    5801             :       using __distrib_type = uniform_int_distribution<_Size>;
    5802             :       using __param_type = typename __distrib_type::param_type;
    5803             :       using _USize = make_unsigned_t<_Size>;
    5804             :       using _Gen = remove_reference_t<_UniformRandomBitGenerator>;
    5805             :       using __uc_type = common_type_t<typename _Gen::result_type, _USize>;
    5806             : 
    5807             :       if (__first == __last)
    5808             :         return __out;
    5809             : 
    5810             :       __distrib_type __d{};
    5811             :       _Size __unsampled_sz = std::distance(__first, __last);
    5812             :       __n = std::min(__n, __unsampled_sz);
    5813             : 
    5814             :       // If possible, we use __gen_two_uniform_ints to efficiently produce
    5815             :       // two random numbers using a single distribution invocation:
    5816             : 
    5817             :       const __uc_type __urngrange = __g.max() - __g.min();
    5818             :       if (__urngrange / __uc_type(__unsampled_sz) >= __uc_type(__unsampled_sz))
    5819             :         // I.e. (__urngrange >= __unsampled_sz * __unsampled_sz) but without
    5820             :         // wrapping issues.
    5821             :         {
    5822             :           while (__n != 0 && __unsampled_sz >= 2)
    5823             :             {
    5824             :               const pair<_Size, _Size> __p =
    5825             :                 __gen_two_uniform_ints(__unsampled_sz, __unsampled_sz - 1, __g);
    5826             : 
    5827             :               --__unsampled_sz;
    5828             :               if (__p.first < __n)
    5829             :                 {
    5830             :                   *__out++ = *__first;
    5831             :                   --__n;
    5832             :                 }
    5833             : 
    5834             :               ++__first;
    5835             : 
    5836             :               if (__n == 0) break;
    5837             : 
    5838             :               --__unsampled_sz;
    5839             :               if (__p.second < __n)
    5840             :                 {
    5841             :                   *__out++ = *__first;
    5842             :                   --__n;
    5843             :                 }
    5844             : 
    5845             :               ++__first;
    5846             :             }
    5847             :         }
    5848             : 
    5849             :       // The loop above is otherwise equivalent to this one-at-a-time version:
    5850             : 
    5851             :       for (; __n != 0; ++__first)
    5852             :         if (__d(__g, __param_type{0, --__unsampled_sz}) < __n)
    5853             :           {
    5854             :             *__out++ = *__first;
    5855             :             --__n;
    5856             :           }
    5857             :       return __out;
    5858             :     }
    5859             : 
    5860             : #if __cplusplus > 201402L
    5861             : #define __cpp_lib_sample 201603L
    5862             :   /// Take a random sample from a population.
    5863             :   template<typename _PopulationIterator, typename _SampleIterator,
    5864             :            typename _Distance, typename _UniformRandomBitGenerator>
    5865             :     _SampleIterator
    5866             :     sample(_PopulationIterator __first, _PopulationIterator __last,
    5867             :            _SampleIterator __out, _Distance __n,
    5868             :            _UniformRandomBitGenerator&& __g)
    5869             :     {
    5870             :       using __pop_cat = typename
    5871             :         std::iterator_traits<_PopulationIterator>::iterator_category;
    5872             :       using __samp_cat = typename
    5873             :         std::iterator_traits<_SampleIterator>::iterator_category;
    5874             : 
    5875             :       static_assert(
    5876             :           __or_<is_convertible<__pop_cat, forward_iterator_tag>,
    5877             :                 is_convertible<__samp_cat, random_access_iterator_tag>>::value,
    5878             :           "output range must use a RandomAccessIterator when input range"
    5879             :           " does not meet the ForwardIterator requirements");
    5880             : 
    5881             :       static_assert(is_integral<_Distance>::value,
    5882             :                     "sample size must be an integer type");
    5883             : 
    5884             :       typename iterator_traits<_PopulationIterator>::difference_type __d = __n;
    5885             :       return _GLIBCXX_STD_A::
    5886             :         __sample(__first, __last, __pop_cat{}, __out, __samp_cat{}, __d,
    5887             :                  std::forward<_UniformRandomBitGenerator>(__g));
    5888             :     }
    5889             : #endif // C++17
    5890             : #endif // C++14
    5891             : 
    5892             : _GLIBCXX_END_NAMESPACE_ALGO
    5893             : _GLIBCXX_END_NAMESPACE_VERSION
    5894             : } // namespace std
    5895             : 
    5896             : #endif /* _STL_ALGO_H */

Generated by: LCOV version 1.16