LCOV - code coverage report
Current view: top level - usr/include/c++/4.8/bits - stl_algo.h (source / functions) Hit Total Coverage
Test: tmp.zDYK9MVh93 Lines: 200 509 39.3 %
Date: 2015-10-10 Functions: 32 148 21.6 %

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

Generated by: LCOV version 1.10