Home | History | Annotate | Download | only in bits
      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     __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       if (*__a < *__b)
     86 	{
     87 	  if (*__b < *__c)
     88 	    std::iter_swap(__result, __b);
     89 	  else if (*__a < *__c)
     90 	    std::iter_swap(__result, __c);
     91 	  else
     92 	    std::iter_swap(__result, __a);
     93 	}
     94       else if (*__a < *__c)
     95       	std::iter_swap(__result, __a);
     96       else if (*__b < *__c)
     97 	std::iter_swap(__result, __c);
     98       else
     99 	std::iter_swap(__result, __b);
    100     }
    101 
    102   /// Swaps the median value of *__a, *__b and *__c under __comp to *__result
    103   template<typename _Iterator, typename _Compare>
    104     void
    105     __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       if (__comp(*__a, *__b))
    115 	{
    116 	  if (__comp(*__b, *__c))
    117 	    std::iter_swap(__result, __b);
    118 	  else if (__comp(*__a, *__c))
    119 	    std::iter_swap(__result, __c);
    120 	  else
    121 	    std::iter_swap(__result, __a);
    122 	}
    123       else if (__comp(*__a, *__c))
    124 	std::iter_swap(__result, __a);
    125       else if (__comp(*__b, *__c))
    126 	std::iter_swap(__result, __c);
    127       else
    128 	std::iter_swap(__result, __b);
    129     }
    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     __find(_RandomAccessIterator __first, _RandomAccessIterator __last,
    159 	   const _Tp& __val, random_access_iterator_tag)
    160     {
    161       typename iterator_traits<_RandomAccessIterator>::difference_type
    162 	__trip_count = (__last - __first) >> 2;
    163 
    164       for (; __trip_count > 0; --__trip_count)
    165 	{
    166 	  if (*__first == __val)
    167 	    return __first;
    168 	  ++__first;
    169 
    170 	  if (*__first == __val)
    171 	    return __first;
    172 	  ++__first;
    173 
    174 	  if (*__first == __val)
    175 	    return __first;
    176 	  ++__first;
    177 
    178 	  if (*__first == __val)
    179 	    return __first;
    180 	  ++__first;
    181 	}
    182 
    183       switch (__last - __first)
    184 	{
    185 	case 3:
    186 	  if (*__first == __val)
    187 	    return __first;
    188 	  ++__first;
    189 	case 2:
    190 	  if (*__first == __val)
    191 	    return __first;
    192 	  ++__first;
    193 	case 1:
    194 	  if (*__first == __val)
    195 	    return __first;
    196 	  ++__first;
    197 	case 0:
    198 	default:
    199 	  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     __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 						       __rlast2);
    573 
    574       if (__rresult == __rlast1)
    575 	return __last1;
    576       else
    577 	{
    578 	  _BidirectionalIterator1 __result = __rresult.base();
    579 	  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 			     std::__iterator_category(__first1),
    661 			     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     __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       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       _Distance __n = __last   - __first;
   1592       _Distance __k = __middle - __first;
   1593 
   1594       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 	  if (__k < __n - __k)
   1605 	    {
   1606 	      if (__is_pod(_ValueType) && __k == 1)
   1607 		{
   1608 		  _ValueType __t = _GLIBCXX_MOVE(*__p);
   1609 		  _GLIBCXX_MOVE3(__p + 1, __p + __n, __p);
   1610 		  *(__p + __n - 1) = _GLIBCXX_MOVE(__t);
   1611 		  return;
   1612 		}
   1613 	      _RandomAccessIterator __q = __p + __k;
   1614 	      for (_Distance __i = 0; __i < __n - __k; ++ __i)
   1615 		{
   1616 		  std::iter_swap(__p, __q);
   1617 		  ++__p;
   1618 		  ++__q;
   1619 		}
   1620 	      __n %= __k;
   1621 	      if (__n == 0)
   1622 		return;
   1623 	      std::swap(__n, __k);
   1624 	      __k = __n - __k;
   1625 	    }
   1626 	  else
   1627 	    {
   1628 	      __k = __n - __k;
   1629 	      if (__is_pod(_ValueType) && __k == 1)
   1630 		{
   1631 		  _ValueType __t = _GLIBCXX_MOVE(*(__p + __n - 1));
   1632 		  _GLIBCXX_MOVE_BACKWARD3(__p, __p + __n - 1, __p + __n);
   1633 		  *__p = _GLIBCXX_MOVE(__t);
   1634 		  return;
   1635 		}
   1636 	      _RandomAccessIterator __q = __p + __n;
   1637 	      __p = __q - __k;
   1638 	      for (_Distance __i = 0; __i < __n - __k; ++ __i)
   1639 		{
   1640 		  --__p;
   1641 		  --__q;
   1642 		  std::iter_swap(__p, __q);
   1643 		}
   1644 	      __n %= __k;
   1645 	      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       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     __heap_select(_RandomAccessIterator __first,
   1930 		  _RandomAccessIterator __middle,
   1931 		  _RandomAccessIterator __last)
   1932     {
   1933       std::make_heap(__first, __middle);
   1934       for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
   1935 	if (*__i < *__first)
   1936 	  std::__pop_heap(__first, __middle, __i);
   1937     }
   1938 
   1939   /// This is a helper function for the sort routines.
   1940   template<typename _RandomAccessIterator, typename _Compare>
   1941     void
   1942     __heap_select(_RandomAccessIterator __first,
   1943 		  _RandomAccessIterator __middle,
   1944 		  _RandomAccessIterator __last, _Compare __comp)
   1945     {
   1946       std::make_heap(__first, __middle, __comp);
   1947       for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
   1948 	if (__comp(*__i, *__first))
   1949 	  std::__pop_heap(__first, __middle, __i, __comp);
   1950     }
   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     __unguarded_linear_insert(_RandomAccessIterator __last)
   2093     {
   2094       typename iterator_traits<_RandomAccessIterator>::value_type
   2095 	__val = _GLIBCXX_MOVE(*__last);
   2096       _RandomAccessIterator __next = __last;
   2097       --__next;
   2098       while (__val < *__next)
   2099 	{
   2100 	  *__last = _GLIBCXX_MOVE(*__next);
   2101 	  __last = __next;
   2102 	  --__next;
   2103 	}
   2104       *__last = _GLIBCXX_MOVE(__val);
   2105     }
   2106 
   2107   /// This is a helper function for the sort routine.
   2108   template<typename _RandomAccessIterator, typename _Compare>
   2109     void
   2110     __unguarded_linear_insert(_RandomAccessIterator __last,
   2111 			      _Compare __comp)
   2112     {
   2113       typename iterator_traits<_RandomAccessIterator>::value_type
   2114 	__val = _GLIBCXX_MOVE(*__last);
   2115       _RandomAccessIterator __next = __last;
   2116       --__next;
   2117       while (__comp(__val, *__next))
   2118 	{
   2119 	  *__last = _GLIBCXX_MOVE(*__next);
   2120 	  __last = __next;
   2121 	  --__next;
   2122 	}
   2123       *__last = _GLIBCXX_MOVE(__val);
   2124     }
   2125 
   2126   /// This is a helper function for the sort routine.
   2127   template<typename _RandomAccessIterator>
   2128     void
   2129     __insertion_sort(_RandomAccessIterator __first,
   2130 		     _RandomAccessIterator __last)
   2131     {
   2132       if (__first == __last)
   2133 	return;
   2134 
   2135       for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
   2136 	{
   2137 	  if (*__i < *__first)
   2138 	    {
   2139 	      typename iterator_traits<_RandomAccessIterator>::value_type
   2140 		__val = _GLIBCXX_MOVE(*__i);
   2141 	      _GLIBCXX_MOVE_BACKWARD3(__first, __i, __i + 1);
   2142 	      *__first = _GLIBCXX_MOVE(__val);
   2143 	    }
   2144 	  else
   2145 	    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     __insertion_sort(_RandomAccessIterator __first,
   2153 		     _RandomAccessIterator __last, _Compare __comp)
   2154     {
   2155       if (__first == __last) return;
   2156 
   2157       for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
   2158 	{
   2159 	  if (__comp(*__i, *__first))
   2160 	    {
   2161 	      typename iterator_traits<_RandomAccessIterator>::value_type
   2162 		__val = _GLIBCXX_MOVE(*__i);
   2163 	      _GLIBCXX_MOVE_BACKWARD3(__first, __i, __i + 1);
   2164 	      *__first = _GLIBCXX_MOVE(__val);
   2165 	    }
   2166 	  else
   2167 	    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       for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
   2181 	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       for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
   2194 	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     __final_insertion_sort(_RandomAccessIterator __first,
   2207 			   _RandomAccessIterator __last)
   2208     {
   2209       if (__last - __first > int(_S_threshold))
   2210 	{
   2211 	  std::__insertion_sort(__first, __first + int(_S_threshold));
   2212 	  std::__unguarded_insertion_sort(__first + int(_S_threshold), __last);
   2213 	}
   2214       else
   2215 	std::__insertion_sort(__first, __last);
   2216     }
   2217 
   2218   /// This is a helper function for the sort routine.
   2219   template<typename _RandomAccessIterator, typename _Compare>
   2220     void
   2221     __final_insertion_sort(_RandomAccessIterator __first,
   2222 			   _RandomAccessIterator __last, _Compare __comp)
   2223     {
   2224       if (__last - __first > int(_S_threshold))
   2225 	{
   2226 	  std::__insertion_sort(__first, __first + int(_S_threshold), __comp);
   2227 	  std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,
   2228 					  __comp);
   2229 	}
   2230       else
   2231 	std::__insertion_sort(__first, __last, __comp);
   2232     }
   2233 
   2234   /// This is a helper function...
   2235   template<typename _RandomAccessIterator, typename _Tp>
   2236     _RandomAccessIterator
   2237     __unguarded_partition(_RandomAccessIterator __first,
   2238 			  _RandomAccessIterator __last, const _Tp& __pivot)
   2239     {
   2240       while (true)
   2241 	{
   2242 	  while (*__first < __pivot)
   2243 	    ++__first;
   2244 	  --__last;
   2245 	  while (__pivot < *__last)
   2246 	    --__last;
   2247 	  if (!(__first < __last))
   2248 	    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     __unguarded_partition(_RandomAccessIterator __first,
   2258 			  _RandomAccessIterator __last,
   2259 			  const _Tp& __pivot, _Compare __comp)
   2260     {
   2261       while (true)
   2262 	{
   2263 	  while (__comp(*__first, __pivot))
   2264 	    ++__first;
   2265 	  --__last;
   2266 	  while (__comp(__pivot, *__last))
   2267 	    --__last;
   2268 	  if (!(__first < __last))
   2269 	    return __first;
   2270 	  std::iter_swap(__first, __last);
   2271 	  ++__first;
   2272 	}
   2273     }
   2274 
   2275   /// This is a helper function...
   2276   template<typename _RandomAccessIterator>
   2277     inline _RandomAccessIterator
   2278     __unguarded_partition_pivot(_RandomAccessIterator __first,
   2279 				_RandomAccessIterator __last)
   2280     {
   2281       _RandomAccessIterator __mid = __first + (__last - __first) / 2;
   2282       std::__move_median_to_first(__first, __first + 1, __mid, __last - 1);
   2283       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     __unguarded_partition_pivot(_RandomAccessIterator __first,
   2291 				_RandomAccessIterator __last, _Compare __comp)
   2292     {
   2293       _RandomAccessIterator __mid = __first + (__last - __first) / 2;
   2294       std::__move_median_to_first(__first, __first + 1, __mid, __last - 1,
   2295 				  __comp);
   2296       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     __introsort_loop(_RandomAccessIterator __first,
   2303 		     _RandomAccessIterator __last,
   2304 		     _Size __depth_limit)
   2305     {
   2306       while (__last - __first > int(_S_threshold))
   2307 	{
   2308 	  if (__depth_limit == 0)
   2309 	    {
   2310 	      _GLIBCXX_STD_A::partial_sort(__first, __last, __last);
   2311 	      return;
   2312 	    }
   2313 	  --__depth_limit;
   2314 	  _RandomAccessIterator __cut =
   2315 	    std::__unguarded_partition_pivot(__first, __last);
   2316 	  std::__introsort_loop(__cut, __last, __depth_limit);
   2317 	  __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     __introsort_loop(_RandomAccessIterator __first,
   2325 		     _RandomAccessIterator __last,
   2326 		     _Size __depth_limit, _Compare __comp)
   2327     {
   2328       while (__last - __first > int(_S_threshold))
   2329 	{
   2330 	  if (__depth_limit == 0)
   2331 	    {
   2332 	      _GLIBCXX_STD_A::partial_sort(__first, __last, __last, __comp);
   2333 	      return;
   2334 	    }
   2335 	  --__depth_limit;
   2336 	  _RandomAccessIterator __cut =
   2337 	    std::__unguarded_partition_pivot(__first, __last, __comp);
   2338 	  std::__introsort_loop(__cut, __last, __depth_limit, __comp);
   2339 	  __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     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       _DistanceType __len = std::distance(__first, __last);
   2441 
   2442       while (__len > 0)
   2443 	{
   2444 	  _DistanceType __half = __len >> 1;
   2445 	  _ForwardIterator __middle = __first;
   2446 	  std::advance(__middle, __half);
   2447 	  if (__comp(*__middle, __val))
   2448 	    {
   2449 	      __first = __middle;
   2450 	      ++__first;
   2451 	      __len = __len - __half - 1;
   2452 	    }
   2453 	  else
   2454 	    __len = __half;
   2455 	}
   2456       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 		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       _DistanceType __len = std::distance(__first, __last);
   2486 
   2487       while (__len > 0)
   2488 	{
   2489 	  _DistanceType __half = __len >> 1;
   2490 	  _ForwardIterator __middle = __first;
   2491 	  std::advance(__middle, __half);
   2492 	  if (__val < *__middle)
   2493 	    __len = __half;
   2494 	  else
   2495 	    {
   2496 	      __first = __middle;
   2497 	      ++__first;
   2498 	      __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     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       _DistanceType __len = std::distance(__first, __last);
   2537 
   2538       while (__len > 0)
   2539 	{
   2540 	  _DistanceType __half = __len >> 1;
   2541 	  _ForwardIterator __middle = __first;
   2542 	  std::advance(__middle, __half);
   2543 	  if (__comp(__val, *__middle))
   2544 	    __len = __half;
   2545 	  else
   2546 	    {
   2547 	      __first = __middle;
   2548 	      ++__first;
   2549 	      __len = __len - __half - 1;
   2550 	    }
   2551 	}
   2552       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     __move_merge_adaptive(_InputIterator1 __first1, _InputIterator1 __last1,
   2756 			  _InputIterator2 __first2, _InputIterator2 __last2,
   2757 			  _OutputIterator __result)
   2758     {
   2759       while (__first1 != __last1 && __first2 != __last2)
   2760 	{
   2761 	  if (*__first2 < *__first1)
   2762 	    {
   2763 	      *__result = _GLIBCXX_MOVE(*__first2);
   2764 	      ++__first2;
   2765 	    }
   2766 	  else
   2767 	    {
   2768 	      *__result = _GLIBCXX_MOVE(*__first1);
   2769 	      ++__first1;
   2770 	    }
   2771 	  ++__result;
   2772 	}
   2773       if (__first1 != __last1)
   2774 	_GLIBCXX_MOVE3(__first1, __last1, __result);
   2775     }
   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     __move_merge_adaptive(_InputIterator1 __first1, _InputIterator1 __last1,
   2782 			  _InputIterator2 __first2, _InputIterator2 __last2,
   2783 			  _OutputIterator __result, _Compare __comp)
   2784     {
   2785       while (__first1 != __last1 && __first2 != __last2)
   2786 	{
   2787 	  if (__comp(*__first2, *__first1))
   2788 	    {
   2789 	      *__result = _GLIBCXX_MOVE(*__first2);
   2790 	      ++__first2;
   2791 	    }
   2792 	  else
   2793 	    {
   2794 	      *__result = _GLIBCXX_MOVE(*__first1);
   2795 	      ++__first1;
   2796 	    }
   2797 	  ++__result;
   2798 	}
   2799       if (__first1 != __last1)
   2800 	_GLIBCXX_MOVE3(__first1, __last1, __result);
   2801     }
   2802 
   2803   /// This is a helper function for the __merge_adaptive routines.
   2804   template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
   2805 	   typename _BidirectionalIterator3>
   2806     void
   2807     __move_merge_adaptive_backward(_BidirectionalIterator1 __first1,
   2808 				   _BidirectionalIterator1 __last1,
   2809 				   _BidirectionalIterator2 __first2,
   2810 				   _BidirectionalIterator2 __last2,
   2811 				   _BidirectionalIterator3 __result)
   2812     {
   2813       if (__first1 == __last1)
   2814 	{
   2815 	  _GLIBCXX_MOVE_BACKWARD3(__first2, __last2, __result);
   2816 	  return;
   2817 	}
   2818       else if (__first2 == __last2)
   2819 	return;
   2820 
   2821       --__last1;
   2822       --__last2;
   2823       while (true)
   2824 	{
   2825 	  if (*__last2 < *__last1)
   2826 	    {
   2827 	      *--__result = _GLIBCXX_MOVE(*__last1);
   2828 	      if (__first1 == __last1)
   2829 		{
   2830 		  _GLIBCXX_MOVE_BACKWARD3(__first2, ++__last2, __result);
   2831 		  return;
   2832 		}
   2833 	      --__last1;
   2834 	    }
   2835 	  else
   2836 	    {
   2837 	      *--__result = _GLIBCXX_MOVE(*__last2);
   2838 	      if (__first2 == __last2)
   2839 		return;
   2840 	      --__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     __move_merge_adaptive_backward(_BidirectionalIterator1 __first1,
   2850 				   _BidirectionalIterator1 __last1,
   2851 				   _BidirectionalIterator2 __first2,
   2852 				   _BidirectionalIterator2 __last2,
   2853 				   _BidirectionalIterator3 __result,
   2854 				   _Compare __comp)
   2855     {
   2856       if (__first1 == __last1)
   2857 	{
   2858 	  _GLIBCXX_MOVE_BACKWARD3(__first2, __last2, __result);
   2859 	  return;
   2860 	}
   2861       else if (__first2 == __last2)
   2862 	return;
   2863 
   2864       --__last1;
   2865       --__last2;
   2866       while (true)
   2867 	{
   2868 	  if (__comp(*__last2, *__last1))
   2869 	    {
   2870 	      *--__result = _GLIBCXX_MOVE(*__last1);
   2871 	      if (__first1 == __last1)
   2872 		{
   2873 		  _GLIBCXX_MOVE_BACKWARD3(__first2, ++__last2, __result);
   2874 		  return;
   2875 		}
   2876 	      --__last1;
   2877 	    }
   2878 	  else
   2879 	    {
   2880 	      *--__result = _GLIBCXX_MOVE(*__last2);
   2881 	      if (__first2 == __last2)
   2882 		return;
   2883 	      --__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     __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       if (__len1 > __len2 && __len2 <= __buffer_size)
   2901 	{
   2902 	  if (__len2)
   2903 	    {
   2904 	      __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 	    return __first;
   2910 	}
   2911       else if (__len1 <= __buffer_size)
   2912 	{
   2913 	  if (__len1)
   2914 	    {
   2915 	      __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 	    return __last;
   2921 	}
   2922       else
   2923 	{
   2924 	  std::rotate(__first, __middle, __last);
   2925 	  std::advance(__first, std::distance(__middle, __last));
   2926 	  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     __merge_adaptive(_BidirectionalIterator __first,
   2935                      _BidirectionalIterator __middle,
   2936 		     _BidirectionalIterator __last,
   2937 		     _Distance __len1, _Distance __len2,
   2938 		     _Pointer __buffer, _Distance __buffer_size)
   2939     {
   2940       if (__len1 <= __len2 && __len1 <= __buffer_size)
   2941 	{
   2942 	  _Pointer __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
   2943 	  std::__move_merge_adaptive(__buffer, __buffer_end, __middle, __last,
   2944 				     __first);
   2945 	}
   2946       else if (__len2 <= __buffer_size)
   2947 	{
   2948 	  _Pointer __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
   2949 	  std::__move_merge_adaptive_backward(__first, __middle, __buffer,
   2950 					      __buffer_end, __last);
   2951 	}
   2952       else
   2953 	{
   2954 	  _BidirectionalIterator __first_cut = __first;
   2955 	  _BidirectionalIterator __second_cut = __middle;
   2956 	  _Distance __len11 = 0;
   2957 	  _Distance __len22 = 0;
   2958 	  if (__len1 > __len2)
   2959 	    {
   2960 	      __len11 = __len1 / 2;
   2961 	      std::advance(__first_cut, __len11);
   2962 	      __second_cut = std::lower_bound(__middle, __last,
   2963 					      *__first_cut);
   2964 	      __len22 = std::distance(__middle, __second_cut);
   2965 	    }
   2966 	  else
   2967 	    {
   2968 	      __len22 = __len2 / 2;
   2969 	      std::advance(__second_cut, __len22);
   2970 	      __first_cut = std::upper_bound(__first, __middle,
   2971 					     *__second_cut);
   2972 	      __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 				   __buffer_size);
   2978 	  std::__merge_adaptive(__first, __first_cut, __new_middle, __len11,
   2979 				__len22, __buffer, __buffer_size);
   2980 	  std::__merge_adaptive(__new_middle, __second_cut, __last,
   2981 				__len1 - __len11,
   2982 				__len2 - __len22, __buffer, __buffer_size);
   2983 	}
   2984     }
   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     __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       if (__len1 <= __len2 && __len1 <= __buffer_size)
   2998 	{
   2999 	  _Pointer __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
   3000 	  std::__move_merge_adaptive(__buffer, __buffer_end, __middle, __last,
   3001 				     __first, __comp);
   3002 	}
   3003       else if (__len2 <= __buffer_size)
   3004 	{
   3005 	  _Pointer __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
   3006 	  std::__move_merge_adaptive_backward(__first, __middle, __buffer,
   3007 					      __buffer_end, __last, __comp);
   3008 	}
   3009       else
   3010 	{
   3011 	  _BidirectionalIterator __first_cut = __first;
   3012 	  _BidirectionalIterator __second_cut = __middle;
   3013 	  _Distance __len11 = 0;
   3014 	  _Distance __len22 = 0;
   3015 	  if (__len1 > __len2)
   3016 	    {
   3017 	      __len11 = __len1 / 2;
   3018 	      std::advance(__first_cut, __len11);
   3019 	      __second_cut = std::lower_bound(__middle, __last, *__first_cut,
   3020 					      __comp);
   3021 	      __len22 = std::distance(__middle, __second_cut);
   3022 	    }
   3023 	  else
   3024 	    {
   3025 	      __len22 = __len2 / 2;
   3026 	      std::advance(__second_cut, __len22);
   3027 	      __first_cut = std::upper_bound(__first, __middle, *__second_cut,
   3028 					     __comp);
   3029 	      __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 				   __buffer_size);
   3035 	  std::__merge_adaptive(__first, __first_cut, __new_middle, __len11,
   3036 				__len22, __buffer, __buffer_size, __comp);
   3037 	  std::__merge_adaptive(__new_middle, __second_cut, __last,
   3038 				__len1 - __len11,
   3039 				__len2 - __len22, __buffer,
   3040 				__buffer_size, __comp);
   3041 	}
   3042     }
   3043 
   3044   /// This is a helper function for the merge routines.
   3045   template<typename _BidirectionalIterator, typename _Distance>
   3046     void
   3047     __merge_without_buffer(_BidirectionalIterator __first,
   3048 			   _BidirectionalIterator __middle,
   3049 			   _BidirectionalIterator __last,
   3050 			   _Distance __len1, _Distance __len2)
   3051     {
   3052       if (__len1 == 0 || __len2 == 0)
   3053 	return;
   3054       if (__len1 + __len2 == 2)
   3055 	{
   3056 	  if (*__middle < *__first)
   3057 	    std::iter_swap(__first, __middle);
   3058 	  return;
   3059 	}
   3060       _BidirectionalIterator __first_cut = __first;
   3061       _BidirectionalIterator __second_cut = __middle;
   3062       _Distance __len11 = 0;
   3063       _Distance __len22 = 0;
   3064       if (__len1 > __len2)
   3065 	{
   3066 	  __len11 = __len1 / 2;
   3067 	  std::advance(__first_cut, __len11);
   3068 	  __second_cut = std::lower_bound(__middle, __last, *__first_cut);
   3069 	  __len22 = std::distance(__middle, __second_cut);
   3070 	}
   3071       else
   3072 	{
   3073 	  __len22 = __len2 / 2;
   3074 	  std::advance(__second_cut, __len22);
   3075 	  __first_cut = std::upper_bound(__first, __middle, *__second_cut);
   3076 	  __len11 = std::distance(__first, __first_cut);
   3077 	}
   3078       std::rotate(__first_cut, __middle, __second_cut);
   3079       _BidirectionalIterator __new_middle = __first_cut;
   3080       std::advance(__new_middle, std::distance(__middle, __second_cut));
   3081       std::__merge_without_buffer(__first, __first_cut, __new_middle,
   3082 				  __len11, __len22);
   3083       std::__merge_without_buffer(__new_middle, __second_cut, __last,
   3084 				  __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     __merge_without_buffer(_BidirectionalIterator __first,
   3092                            _BidirectionalIterator __middle,
   3093 			   _BidirectionalIterator __last,
   3094 			   _Distance __len1, _Distance __len2,
   3095 			   _Compare __comp)
   3096     {
   3097       if (__len1 == 0 || __len2 == 0)
   3098 	return;
   3099       if (__len1 + __len2 == 2)
   3100 	{
   3101 	  if (__comp(*__middle, *__first))
   3102 	    std::iter_swap(__first, __middle);
   3103 	  return;
   3104 	}
   3105       _BidirectionalIterator __first_cut = __first;
   3106       _BidirectionalIterator __second_cut = __middle;
   3107       _Distance __len11 = 0;
   3108       _Distance __len22 = 0;
   3109       if (__len1 > __len2)
   3110 	{
   3111 	  __len11 = __len1 / 2;
   3112 	  std::advance(__first_cut, __len11);
   3113 	  __second_cut = std::lower_bound(__middle, __last, *__first_cut,
   3114 					  __comp);
   3115 	  __len22 = std::distance(__middle, __second_cut);
   3116 	}
   3117       else
   3118 	{
   3119 	  __len22 = __len2 / 2;
   3120 	  std::advance(__second_cut, __len22);
   3121 	  __first_cut = std::upper_bound(__first, __middle, *__second_cut,
   3122 					 __comp);
   3123 	  __len11 = std::distance(__first, __first_cut);
   3124 	}
   3125       std::rotate(__first_cut, __middle, __second_cut);
   3126       _BidirectionalIterator __new_middle = __first_cut;
   3127       std::advance(__new_middle, std::distance(__middle, __second_cut));
   3128       std::__merge_without_buffer(__first, __first_cut, __new_middle,
   3129 				  __len11, __len22, __comp);
   3130       std::__merge_without_buffer(__new_middle, __second_cut, __last,
   3131 				  __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     __move_merge(_InputIterator1 __first1, _InputIterator1 __last1,
   3250 		 _InputIterator2 __first2, _InputIterator2 __last2,
   3251 		 _OutputIterator __result)
   3252     {
   3253       while (__first1 != __last1 && __first2 != __last2)
   3254 	{
   3255 	  if (*__first2 < *__first1)
   3256 	    {
   3257 	      *__result = _GLIBCXX_MOVE(*__first2);
   3258 	      ++__first2;
   3259 	    }
   3260 	  else
   3261 	    {
   3262 	      *__result = _GLIBCXX_MOVE(*__first1);
   3263 	      ++__first1;
   3264 	    }
   3265 	  ++__result;
   3266 	}
   3267       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     __move_merge(_InputIterator1 __first1, _InputIterator1 __last1,
   3277 		 _InputIterator2 __first2, _InputIterator2 __last2,
   3278 		 _OutputIterator __result, _Compare __comp)
   3279     {
   3280       while (__first1 != __last1 && __first2 != __last2)
   3281 	{
   3282 	  if (__comp(*__first2, *__first1))
   3283 	    {
   3284 	      *__result = _GLIBCXX_MOVE(*__first2);
   3285 	      ++__first2;
   3286 	    }
   3287 	  else
   3288 	    {
   3289 	      *__result = _GLIBCXX_MOVE(*__first1);
   3290 	      ++__first1;
   3291 	    }
   3292 	  ++__result;
   3293 	}
   3294       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     __merge_sort_loop(_RandomAccessIterator1 __first,
   3303 		      _RandomAccessIterator1 __last,
   3304 		      _RandomAccessIterator2 __result,
   3305 		      _Distance __step_size)
   3306     {
   3307       const _Distance __two_step = 2 * __step_size;
   3308 
   3309       while (__last - __first >= __two_step)
   3310 	{
   3311 	  __result = std::__move_merge(__first, __first + __step_size,
   3312 				       __first + __step_size,
   3313 				       __first + __two_step, __result);
   3314 	  __first += __two_step;
   3315 	}
   3316 
   3317       __step_size = std::min(_Distance(__last - __first), __step_size);
   3318       std::__move_merge(__first, __first + __step_size,
   3319 			__first + __step_size, __last, __result);
   3320     }
   3321 
   3322   template<typename _RandomAccessIterator1, typename _RandomAccessIterator2,
   3323 	   typename _Distance, typename _Compare>
   3324     void
   3325     __merge_sort_loop(_RandomAccessIterator1 __first,
   3326 		      _RandomAccessIterator1 __last,
   3327 		      _RandomAccessIterator2 __result, _Distance __step_size,
   3328 		      _Compare __comp)
   3329     {
   3330       const _Distance __two_step = 2 * __step_size;
   3331 
   3332       while (__last - __first >= __two_step)
   3333 	{
   3334 	  __result = std::__move_merge(__first, __first + __step_size,
   3335 				       __first + __step_size,
   3336 				       __first + __two_step,
   3337 				       __result, __comp);
   3338 	  __first += __two_step;
   3339 	}
   3340       __step_size = std::min(_Distance(__last - __first), __step_size);
   3341 
   3342       std::__move_merge(__first,__first + __step_size,
   3343 			__first + __step_size, __last, __result, __comp);
   3344     }
   3345 
   3346   template<typename _RandomAccessIterator, typename _Distance>
   3347     void
   3348     __chunk_insertion_sort(_RandomAccessIterator __first,
   3349 			   _RandomAccessIterator __last,
   3350 			   _Distance __chunk_size)
   3351     {
   3352       while (__last - __first >= __chunk_size)
   3353 	{
   3354 	  std::__insertion_sort(__first, __first + __chunk_size);
   3355 	  __first += __chunk_size;
   3356 	}
   3357       std::__insertion_sort(__first, __last);
   3358     }
   3359 
   3360   template<typename _RandomAccessIterator, typename _Distance,
   3361 	   typename _Compare>
   3362     void
   3363     __chunk_insertion_sort(_RandomAccessIterator __first,
   3364 			   _RandomAccessIterator __last,
   3365 			   _Distance __chunk_size, _Compare __comp)
   3366     {
   3367       while (__last - __first >= __chunk_size)
   3368 	{
   3369 	  std::__insertion_sort(__first, __first + __chunk_size, __comp);
   3370 	  __first += __chunk_size;
   3371 	}
   3372       std::__insertion_sort(__first, __last, __comp);
   3373     }
   3374 
   3375   enum { _S_chunk_size = 7 };
   3376 
   3377   template<typename _RandomAccessIterator, typename _Pointer>
   3378     void
   3379     __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       const _Distance __len = __last - __first;
   3387       const _Pointer __buffer_last = __buffer + __len;
   3388 
   3389       _Distance __step_size = _S_chunk_size;
   3390       std::__chunk_insertion_sort(__first, __last, __step_size);
   3391 
   3392       while (__step_size < __len)
   3393 	{
   3394 	  std::__merge_sort_loop(__first, __last, __buffer, __step_size);
   3395 	  __step_size *= 2;
   3396 	  std::__merge_sort_loop(__buffer, __buffer_last, __first, __step_size);
   3397 	  __step_size *= 2;
   3398 	}
   3399     }
   3400 
   3401   template<typename _RandomAccessIterator, typename _Pointer, typename _Compare>
   3402     void
   3403     __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       const _Distance __len = __last - __first;
   3411       const _Pointer __buffer_last = __buffer + __len;
   3412 
   3413       _Distance __step_size = _S_chunk_size;
   3414       std::__chunk_insertion_sort(__first, __last, __step_size, __comp);
   3415 
   3416       while (__step_size < __len)
   3417 	{
   3418 	  std::__merge_sort_loop(__first, __last, __buffer,
   3419 				 __step_size, __comp);
   3420 	  __step_size *= 2;
   3421 	  std::__merge_sort_loop(__buffer, __buffer_last, __first,
   3422 				 __step_size, __comp);
   3423 	  __step_size *= 2;
   3424 	}
   3425     }
   3426 
   3427   template<typename _RandomAccessIterator, typename _Pointer,
   3428 	   typename _Distance>
   3429     void
   3430     __stable_sort_adaptive(_RandomAccessIterator __first,
   3431 			   _RandomAccessIterator __last,
   3432                            _Pointer __buffer, _Distance __buffer_size)
   3433     {
   3434       const _Distance __len = (__last - __first + 1) / 2;
   3435       const _RandomAccessIterator __middle = __first + __len;
   3436       if (__len > __buffer_size)
   3437 	{
   3438 	  std::__stable_sort_adaptive(__first, __middle,
   3439 				      __buffer, __buffer_size);
   3440 	  std::__stable_sort_adaptive(__middle, __last,
   3441 				      __buffer, __buffer_size);
   3442 	}
   3443       else
   3444 	{
   3445 	  std::__merge_sort_with_buffer(__first, __middle, __buffer);
   3446 	  std::__merge_sort_with_buffer(__middle, __last, __buffer);
   3447 	}
   3448       std::__merge_adaptive(__first, __middle, __last,
   3449 			    _Distance(__middle - __first),
   3450 			    _Distance(__last - __middle),
   3451 			    __buffer, __buffer_size);
   3452     }
   3453 
   3454   template<typename _RandomAccessIterator, typename _Pointer,
   3455 	   typename _Distance, typename _Compare>
   3456     void
   3457     __stable_sort_adaptive(_RandomAccessIterator __first,
   3458 			   _RandomAccessIterator __last,
   3459                            _Pointer __buffer, _Distance __buffer_size,
   3460                            _Compare __comp)
   3461     {
   3462       const _Distance __len = (__last - __first + 1) / 2;
   3463       const _RandomAccessIterator __middle = __first + __len;
   3464       if (__len > __buffer_size)
   3465 	{
   3466 	  std::__stable_sort_adaptive(__first, __middle, __buffer,
   3467 				      __buffer_size, __comp);
   3468 	  std::__stable_sort_adaptive(__middle, __last, __buffer,
   3469 				      __buffer_size, __comp);
   3470 	}
   3471       else
   3472 	{
   3473 	  std::__merge_sort_with_buffer(__first, __middle, __buffer, __comp);
   3474 	  std::__merge_sort_with_buffer(__middle, __last, __buffer, __comp);
   3475 	}
   3476       std::__merge_adaptive(__first, __middle, __last,
   3477 			    _Distance(__middle - __first),
   3478 			    _Distance(__last - __middle),
   3479 			    __buffer, __buffer_size,
   3480 			    __comp);
   3481     }
   3482 
   3483   /// This is a helper function for the stable sorting routines.
   3484   template<typename _RandomAccessIterator>
   3485     void
   3486     __inplace_stable_sort(_RandomAccessIterator __first,
   3487 			  _RandomAccessIterator __last)
   3488     {
   3489       if (__last - __first < 15)
   3490 	{
   3491 	  std::__insertion_sort(__first, __last);
   3492 	  return;
   3493 	}
   3494       _RandomAccessIterator __middle = __first + (__last - __first) / 2;
   3495       std::__inplace_stable_sort(__first, __middle);
   3496       std::__inplace_stable_sort(__middle, __last);
   3497       std::__merge_without_buffer(__first, __middle, __last,
   3498 				  __middle - __first,
   3499 				  __last - __middle);
   3500     }
   3501 
   3502   /// This is a helper function for the stable sorting routines.
   3503   template<typename _RandomAccessIterator, typename _Compare>
   3504     void
   3505     __inplace_stable_sort(_RandomAccessIterator __first,
   3506 			  _RandomAccessIterator __last, _Compare __comp)
   3507     {
   3508       if (__last - __first < 15)
   3509 	{
   3510 	  std::__insertion_sort(__first, __last, __comp);
   3511 	  return;
   3512 	}
   3513       _RandomAccessIterator __middle = __first + (__last - __first) / 2;
   3514       std::__inplace_stable_sort(__first, __middle, __comp);
   3515       std::__inplace_stable_sort(__middle, __last, __comp);
   3516       std::__merge_without_buffer(__first, __middle, __last,
   3517 				  __middle - __first,
   3518 				  __last - __middle,
   3519 				  __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     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 		         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     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       if (__first1 == __last1 || __first2 == __last2)
   4703 	return __first1;
   4704 
   4705       // Test for a pattern of length 1.
   4706       _ForwardIterator2 __p1(__first2);
   4707       if (++__p1 == __last2)
   4708 	return _GLIBCXX_STD_A::find(__first1, __last1, *__first2);
   4709 
   4710       // General case.
   4711       _ForwardIterator2 __p;
   4712       _ForwardIterator1 __current = __first1;
   4713 
   4714       for (;;)
   4715 	{
   4716 	  __first1 = _GLIBCXX_STD_A::find(__first1, __last1, *__first2);
   4717 	  if (__first1 == __last1)
   4718 	    return __last1;
   4719 
   4720 	  __p = __p1;
   4721 	  __current = __first1;
   4722 	  if (++__current == __last1)
   4723 	    return __last1;
   4724 
   4725 	  while (*__current == *__p)
   4726 	    {
   4727 	      if (++__p == __last2)
   4728 		return __first1;
   4729 	      if (++__current == __last1)
   4730 		return __last1;
   4731 	    }
   4732 	  ++__first1;
   4733 	}
   4734       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 	  std::iter_swap(__i, __first + (std::rand() % ((__i - __first) + 1)));
   5197     }
   5198 
   5199   /**
   5200    *  @brief Shuffle the elements of a sequence using a random number
   5201    *         generator.
   5202    *  @ingroup mutating_algorithms
   5203    *  @param  __first   A forward iterator.
   5204    *  @param  __last    A forward iterator.
   5205    *  @param  __rand    The RNG functor or function.
   5206    *  @return  Nothing.
   5207    *
   5208    *  Reorders the elements in the range @p [__first,__last) using @p __rand to
   5209    *  provide a random distribution. Calling @p __rand(N) for a positive
   5210    *  integer @p N should return a randomly chosen integer from the
   5211    *  range [0,N).
   5212   */
   5213   template<typename _RandomAccessIterator, typename _RandomNumberGenerator>
   5214     void
   5215     random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
   5216 #if __cplusplus >= 201103L
   5217 		   _RandomNumberGenerator&& __rand)
   5218 #else
   5219 		   _RandomNumberGenerator& __rand)
   5220 #endif
   5221     {
   5222       // concept requirements
   5223       __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
   5224 	    _RandomAccessIterator>)
   5225       __glibcxx_requires_valid_range(__first, __last);
   5226 
   5227       if (__first == __last)
   5228 	return;
   5229       for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
   5230 	std::iter_swap(__i, __first + __rand((__i - __first) + 1));
   5231     }
   5232 
   5233 
   5234   /**
   5235    *  @brief Move elements for which a predicate is true to the beginning
   5236    *         of a sequence.
   5237    *  @ingroup mutating_algorithms
   5238    *  @param  __first   A forward iterator.
   5239    *  @param  __last    A forward iterator.
   5240    *  @param  __pred    A predicate functor.
   5241    *  @return  An iterator @p middle such that @p __pred(i) is true for each
   5242    *  iterator @p i in the range @p [__first,middle) and false for each @p i
   5243    *  in the range @p [middle,__last).
   5244    *
   5245    *  @p __pred must not modify its operand. @p partition() does not preserve
   5246    *  the relative ordering of elements in each group, use
   5247    *  @p stable_partition() if this is needed.
   5248   */
   5249   template<typename _ForwardIterator, typename _Predicate>
   5250     inline _ForwardIterator
   5251     partition(_ForwardIterator __first, _ForwardIterator __last,
   5252 	      _Predicate   __pred)
   5253     {
   5254       // concept requirements
   5255       __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
   5256 				  _ForwardIterator>)
   5257       __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
   5258 	    typename iterator_traits<_ForwardIterator>::value_type>)
   5259       __glibcxx_requires_valid_range(__first, __last);
   5260 
   5261       return std::__partition(__first, __last, __pred,
   5262 			      std::__iterator_category(__first));
   5263     }
   5264 
   5265 
   5266 
   5267   /**
   5268    *  @brief Sort the smallest elements of a sequence.
   5269    *  @ingroup sorting_algorithms
   5270    *  @param  __first   An iterator.
   5271    *  @param  __middle  Another iterator.
   5272    *  @param  __last    Another iterator.
   5273    *  @return  Nothing.
   5274    *
   5275    *  Sorts the smallest @p (__middle-__first) elements in the range
   5276    *  @p [first,last) and moves them to the range @p [__first,__middle). The
   5277    *  order of the remaining elements in the range @p [__middle,__last) is
   5278    *  undefined.
   5279    *  After the sort if @e i and @e j are iterators in the range
   5280    *  @p [__first,__middle) such that i precedes j and @e k is an iterator in
   5281    *  the range @p [__middle,__last) then *j<*i and *k<*i are both false.
   5282   */
   5283   template<typename _RandomAccessIterator>
   5284     inline void
   5285     partial_sort(_RandomAccessIterator __first,
   5286 		 _RandomAccessIterator __middle,
   5287 		 _RandomAccessIterator __last)
   5288     {
   5289       typedef typename iterator_traits<_RandomAccessIterator>::value_type
   5290 	_ValueType;
   5291 
   5292       // concept requirements
   5293       __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
   5294 	    _RandomAccessIterator>)
   5295       __glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)
   5296       __glibcxx_requires_valid_range(__first, __middle);
   5297       __glibcxx_requires_valid_range(__middle, __last);
   5298 
   5299       std::__heap_select(__first, __middle, __last);
   5300       std::sort_heap(__first, __middle);
   5301     }
   5302 
   5303   /**
   5304    *  @brief Sort the smallest elements of a sequence using a predicate
   5305    *         for comparison.
   5306    *  @ingroup sorting_algorithms
   5307    *  @param  __first   An iterator.
   5308    *  @param  __middle  Another iterator.
   5309    *  @param  __last    Another iterator.
   5310    *  @param  __comp    A comparison functor.
   5311    *  @return  Nothing.
   5312    *
   5313    *  Sorts the smallest @p (__middle-__first) elements in the range
   5314    *  @p [__first,__last) and moves them to the range @p [__first,__middle). The
   5315    *  order of the remaining elements in the range @p [__middle,__last) is
   5316    *  undefined.
   5317    *  After the sort if @e i and @e j are iterators in the range
   5318    *  @p [__first,__middle) such that i precedes j and @e k is an iterator in
   5319    *  the range @p [__middle,__last) then @p *__comp(j,*i) and @p __comp(*k,*i)
   5320    *  are both false.
   5321   */
   5322   template<typename _RandomAccessIterator, typename _Compare>
   5323     inline void
   5324     partial_sort(_RandomAccessIterator __first,
   5325 		 _RandomAccessIterator __middle,
   5326 		 _RandomAccessIterator __last,
   5327 		 _Compare __comp)
   5328     {
   5329       typedef typename iterator_traits<_RandomAccessIterator>::value_type
   5330 	_ValueType;
   5331 
   5332       // concept requirements
   5333       __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
   5334 	    _RandomAccessIterator>)
   5335       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
   5336 				  _ValueType, _ValueType>)
   5337       __glibcxx_requires_valid_range(__first, __middle);
   5338       __glibcxx_requires_valid_range(__middle, __last);
   5339 
   5340       std::__heap_select(__first, __middle, __last, __comp);
   5341       std::sort_heap(__first, __middle, __comp);
   5342     }
   5343 
   5344   /**
   5345    *  @brief Sort a sequence just enough to find a particular position.
   5346    *  @ingroup sorting_algorithms
   5347    *  @param  __first   An iterator.
   5348    *  @param  __nth     Another iterator.
   5349    *  @param  __last    Another iterator.
   5350    *  @return  Nothing.
   5351    *
   5352    *  Rearranges the elements in the range @p [__first,__last) so that @p *__nth
   5353    *  is the same element that would have been in that position had the
   5354    *  whole sequence been sorted. The elements either side of @p *__nth are
   5355    *  not completely sorted, but for any iterator @e i in the range
   5356    *  @p [__first,__nth) and any iterator @e j in the range @p [__nth,__last) it
   5357    *  holds that *j < *i is false.
   5358   */
   5359   template<typename _RandomAccessIterator>
   5360     inline void
   5361     nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
   5362 		_RandomAccessIterator __last)
   5363     {
   5364       typedef typename iterator_traits<_RandomAccessIterator>::value_type
   5365 	_ValueType;
   5366 
   5367       // concept requirements
   5368       __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
   5369 				  _RandomAccessIterator>)
   5370       __glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)
   5371       __glibcxx_requires_valid_range(__first, __nth);
   5372       __glibcxx_requires_valid_range(__nth, __last);
   5373 
   5374       if (__first == __last || __nth == __last)
   5375 	return;
   5376 
   5377       std::__introselect(__first, __nth, __last,
   5378 			 std::__lg(__last - __first) * 2);
   5379     }
   5380 
   5381   /**
   5382    *  @brief Sort a sequence just enough to find a particular position
   5383    *         using a predicate for comparison.
   5384    *  @ingroup sorting_algorithms
   5385    *  @param  __first   An iterator.
   5386    *  @param  __nth     Another iterator.
   5387    *  @param  __last    Another iterator.
   5388    *  @param  __comp    A comparison functor.
   5389    *  @return  Nothing.
   5390    *
   5391    *  Rearranges the elements in the range @p [__first,__last) so that @p *__nth
   5392    *  is the same element that would have been in that position had the
   5393    *  whole sequence been sorted. The elements either side of @p *__nth are
   5394    *  not completely sorted, but for any iterator @e i in the range
   5395    *  @p [__first,__nth) and any iterator @e j in the range @p [__nth,__last) it
   5396    *  holds that @p __comp(*j,*i) is false.
   5397   */
   5398   template<typename _RandomAccessIterator, typename _Compare>
   5399     inline void
   5400     nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
   5401 		_RandomAccessIterator __last, _Compare __comp)
   5402     {
   5403       typedef typename iterator_traits<_RandomAccessIterator>::value_type
   5404 	_ValueType;
   5405 
   5406       // concept requirements
   5407       __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
   5408 				  _RandomAccessIterator>)
   5409       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
   5410 				  _ValueType, _ValueType>)
   5411       __glibcxx_requires_valid_range(__first, __nth);
   5412       __glibcxx_requires_valid_range(__nth, __last);
   5413 
   5414       if (__first == __last || __nth == __last)
   5415 	return;
   5416 
   5417       std::__introselect(__first, __nth, __last,
   5418 			 std::__lg(__last - __first) * 2, __comp);
   5419     }
   5420 
   5421 
   5422   /**
   5423    *  @brief Sort the elements of a sequence.
   5424    *  @ingroup sorting_algorithms
   5425    *  @param  __first   An iterator.
   5426    *  @param  __last    Another iterator.
   5427    *  @return  Nothing.
   5428    *
   5429    *  Sorts the elements in the range @p [__first,__last) in ascending order,
   5430    *  such that for each iterator @e i in the range @p [__first,__last-1),
   5431    *  *(i+1)<*i is false.
   5432    *
   5433    *  The relative ordering of equivalent elements is not preserved, use
   5434    *  @p stable_sort() if this is needed.
   5435   */
   5436   template<typename _RandomAccessIterator>
   5437     inline void
   5438     sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
   5439     {
   5440       typedef typename iterator_traits<_RandomAccessIterator>::value_type
   5441 	_ValueType;
   5442 
   5443       // concept requirements
   5444       __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
   5445 	    _RandomAccessIterator>)
   5446       __glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)
   5447       __glibcxx_requires_valid_range(__first, __last);
   5448 
   5449       if (__first != __last)
   5450 	{
   5451 	  std::__introsort_loop(__first, __last,
   5452 				std::__lg(__last - __first) * 2);
   5453 	  std::__final_insertion_sort(__first, __last);
   5454 	}
   5455     }
   5456 
   5457   /**
   5458    *  @brief Sort the elements of a sequence using a predicate for comparison.
   5459    *  @ingroup sorting_algorithms
   5460    *  @param  __first   An iterator.
   5461    *  @param  __last    Another iterator.
   5462    *  @param  __comp    A comparison functor.
   5463    *  @return  Nothing.
   5464    *
   5465    *  Sorts the elements in the range @p [__first,__last) in ascending order,
   5466    *  such that @p __comp(*(i+1),*i) is false for every iterator @e i in the
   5467    *  range @p [__first,__last-1).
   5468    *
   5469    *  The relative ordering of equivalent elements is not preserved, use
   5470    *  @p stable_sort() if this is needed.
   5471   */
   5472   template<typename _RandomAccessIterator, typename _Compare>
   5473     inline void
   5474     sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
   5475 	 _Compare __comp)
   5476     {
   5477       typedef typename iterator_traits<_RandomAccessIterator>::value_type
   5478 	_ValueType;
   5479 
   5480       // concept requirements
   5481       __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
   5482 	    _RandomAccessIterator>)
   5483       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, _ValueType,
   5484 				  _ValueType>)
   5485       __glibcxx_requires_valid_range(__first, __last);
   5486 
   5487       if (__first != __last)
   5488 	{
   5489 	  std::__introsort_loop(__first, __last,
   5490 				std::__lg(__last - __first) * 2, __comp);
   5491 	  std::__final_insertion_sort(__first, __last, __comp);
   5492 	}
   5493     }
   5494 
   5495   /**
   5496    *  @brief Merges two sorted ranges.
   5497    *  @ingroup sorting_algorithms
   5498    *  @param  __first1  An iterator.
   5499    *  @param  __first2  Another iterator.
   5500    *  @param  __last1   Another iterator.
   5501    *  @param  __last2   Another iterator.
   5502    *  @param  __result  An iterator pointing to the end of the merged range.
   5503    *  @return         An iterator pointing to the first element <em>not less
   5504    *                  than</em> @e val.
   5505    *
   5506    *  Merges the ranges @p [__first1,__last1) and @p [__first2,__last2) into
   5507    *  the sorted range @p [__result, __result + (__last1-__first1) +
   5508    *  (__last2-__first2)).  Both input ranges must be sorted, and the
   5509    *  output range must not overlap with either of the input ranges.
   5510    *  The sort is @e stable, that is, for equivalent elements in the
   5511    *  two ranges, elements from the first range will always come
   5512    *  before elements from the second.
   5513   */
   5514   template<typename _InputIterator1, typename _InputIterator2,
   5515 	   typename _OutputIterator>
   5516     _OutputIterator
   5517     merge(_InputIterator1 __first1, _InputIterator1 __last1,
   5518 	  _InputIterator2 __first2, _InputIterator2 __last2,
   5519 	  _OutputIterator __result)
   5520     {
   5521       typedef typename iterator_traits<_InputIterator1>::value_type
   5522 	_ValueType1;
   5523       typedef typename iterator_traits<_InputIterator2>::value_type
   5524 	_ValueType2;
   5525 
   5526       // concept requirements
   5527       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
   5528       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
   5529       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   5530 				  _ValueType1>)
   5531       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   5532 				  _ValueType2>)
   5533       __glibcxx_function_requires(_LessThanOpConcept<_ValueType2, _ValueType1>)
   5534       __glibcxx_requires_sorted_set(__first1, __last1, __first2);
   5535       __glibcxx_requires_sorted_set(__first2, __last2, __first1);
   5536 
   5537       while (__first1 != __last1 && __first2 != __last2)
   5538 	{
   5539 	  if (*__first2 < *__first1)
   5540 	    {
   5541 	      *__result = *__first2;
   5542 	      ++__first2;
   5543 	    }
   5544 	  else
   5545 	    {
   5546 	      *__result = *__first1;
   5547 	      ++__first1;
   5548 	    }
   5549 	  ++__result;
   5550 	}
   5551       return std::copy(__first2, __last2, std::copy(__first1, __last1,
   5552 						    __result));
   5553     }
   5554 
   5555   /**
   5556    *  @brief Merges two sorted ranges.
   5557    *  @ingroup sorting_algorithms
   5558    *  @param  __first1  An iterator.
   5559    *  @param  __first2  Another iterator.
   5560    *  @param  __last1   Another iterator.
   5561    *  @param  __last2   Another iterator.
   5562    *  @param  __result  An iterator pointing to the end of the merged range.
   5563    *  @param  __comp    A functor to use for comparisons.
   5564    *  @return         An iterator pointing to the first element "not less
   5565    *                  than" @e val.
   5566    *
   5567    *  Merges the ranges @p [__first1,__last1) and @p [__first2,__last2) into
   5568    *  the sorted range @p [__result, __result + (__last1-__first1) +
   5569    *  (__last2-__first2)).  Both input ranges must be sorted, and the
   5570    *  output range must not overlap with either of the input ranges.
   5571    *  The sort is @e stable, that is, for equivalent elements in the
   5572    *  two ranges, elements from the first range will always come
   5573    *  before elements from the second.
   5574    *
   5575    *  The comparison function should have the same effects on ordering as
   5576    *  the function used for the initial sort.
   5577   */
   5578   template<typename _InputIterator1, typename _InputIterator2,
   5579 	   typename _OutputIterator, typename _Compare>
   5580     _OutputIterator
   5581     merge(_InputIterator1 __first1, _InputIterator1 __last1,
   5582 	  _InputIterator2 __first2, _InputIterator2 __last2,
   5583 	  _OutputIterator __result, _Compare __comp)
   5584     {
   5585       typedef typename iterator_traits<_InputIterator1>::value_type
   5586 	_ValueType1;
   5587       typedef typename iterator_traits<_InputIterator2>::value_type
   5588 	_ValueType2;
   5589 
   5590       // concept requirements
   5591       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
   5592       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
   5593       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   5594 				  _ValueType1>)
   5595       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   5596 				  _ValueType2>)
   5597       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
   5598 				  _ValueType2, _ValueType1>)
   5599       __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
   5600       __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
   5601 
   5602       while (__first1 != __last1 && __first2 != __last2)
   5603 	{
   5604 	  if (__comp(*__first2, *__first1))
   5605 	    {
   5606 	      *__result = *__first2;
   5607 	      ++__first2;
   5608 	    }
   5609 	  else
   5610 	    {
   5611 	      *__result = *__first1;
   5612 	      ++__first1;
   5613 	    }
   5614 	  ++__result;
   5615 	}
   5616       return std::copy(__first2, __last2, std::copy(__first1, __last1,
   5617 						    __result));
   5618     }
   5619 
   5620 
   5621   /**
   5622    *  @brief Sort the elements of a sequence, preserving the relative order
   5623    *         of equivalent elements.
   5624    *  @ingroup sorting_algorithms
   5625    *  @param  __first   An iterator.
   5626    *  @param  __last    Another iterator.
   5627    *  @return  Nothing.
   5628    *
   5629    *  Sorts the elements in the range @p [__first,__last) in ascending order,
   5630    *  such that for each iterator @p i in the range @p [__first,__last-1),
   5631    *  @p *(i+1)<*i is false.
   5632    *
   5633    *  The relative ordering of equivalent elements is preserved, so any two
   5634    *  elements @p x and @p y in the range @p [__first,__last) such that
   5635    *  @p x<y is false and @p y<x is false will have the same relative
   5636    *  ordering after calling @p stable_sort().
   5637   */
   5638   template<typename _RandomAccessIterator>
   5639     inline void
   5640     stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
   5641     {
   5642       typedef typename iterator_traits<_RandomAccessIterator>::value_type
   5643 	_ValueType;
   5644       typedef typename iterator_traits<_RandomAccessIterator>::difference_type
   5645 	_DistanceType;
   5646 
   5647       // concept requirements
   5648       __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
   5649 	    _RandomAccessIterator>)
   5650       __glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)
   5651       __glibcxx_requires_valid_range(__first, __last);
   5652 
   5653       _Temporary_buffer<_RandomAccessIterator, _ValueType> __buf(__first,
   5654 								 __last);
   5655       if (__buf.begin() == 0)
   5656 	std::__inplace_stable_sort(__first, __last);
   5657       else
   5658 	std::__stable_sort_adaptive(__first, __last, __buf.begin(),
   5659 				    _DistanceType(__buf.size()));
   5660     }
   5661 
   5662   /**
   5663    *  @brief Sort the elements of a sequence using a predicate for comparison,
   5664    *         preserving the relative order of equivalent elements.
   5665    *  @ingroup sorting_algorithms
   5666    *  @param  __first   An iterator.
   5667    *  @param  __last    Another iterator.
   5668    *  @param  __comp    A comparison functor.
   5669    *  @return  Nothing.
   5670    *
   5671    *  Sorts the elements in the range @p [__first,__last) in ascending order,
   5672    *  such that for each iterator @p i in the range @p [__first,__last-1),
   5673    *  @p __comp(*(i+1),*i) is false.
   5674    *
   5675    *  The relative ordering of equivalent elements is preserved, so any two
   5676    *  elements @p x and @p y in the range @p [__first,__last) such that
   5677    *  @p __comp(x,y) is false and @p __comp(y,x) is false will have the same
   5678    *  relative ordering after calling @p stable_sort().
   5679   */
   5680   template<typename _RandomAccessIterator, typename _Compare>
   5681     inline void
   5682     stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
   5683 		_Compare __comp)
   5684     {
   5685       typedef typename iterator_traits<_RandomAccessIterator>::value_type
   5686 	_ValueType;
   5687       typedef typename iterator_traits<_RandomAccessIterator>::difference_type
   5688 	_DistanceType;
   5689 
   5690       // concept requirements
   5691       __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
   5692 	    _RandomAccessIterator>)
   5693       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
   5694 				  _ValueType,
   5695 				  _ValueType>)
   5696       __glibcxx_requires_valid_range(__first, __last);
   5697 
   5698       _Temporary_buffer<_RandomAccessIterator, _ValueType> __buf(__first,
   5699 								 __last);
   5700       if (__buf.begin() == 0)
   5701 	std::__inplace_stable_sort(__first, __last, __comp);
   5702       else
   5703 	std::__stable_sort_adaptive(__first, __last, __buf.begin(),
   5704 				    _DistanceType(__buf.size()), __comp);
   5705     }
   5706 
   5707 
   5708   /**
   5709    *  @brief Return the union of two sorted ranges.
   5710    *  @ingroup set_algorithms
   5711    *  @param  __first1  Start of first range.
   5712    *  @param  __last1   End of first range.
   5713    *  @param  __first2  Start of second range.
   5714    *  @param  __last2   End of second range.
   5715    *  @return  End of the output range.
   5716    *  @ingroup set_algorithms
   5717    *
   5718    *  This operation iterates over both ranges, copying elements present in
   5719    *  each range in order to the output range.  Iterators increment for each
   5720    *  range.  When the current element of one range is less than the other,
   5721    *  that element is copied and the iterator advanced.  If an element is
   5722    *  contained in both ranges, the element from the first range is copied and
   5723    *  both ranges advance.  The output range may not overlap either input
   5724    *  range.
   5725   */
   5726   template<typename _InputIterator1, typename _InputIterator2,
   5727 	   typename _OutputIterator>
   5728     _OutputIterator
   5729     set_union(_InputIterator1 __first1, _InputIterator1 __last1,
   5730 	      _InputIterator2 __first2, _InputIterator2 __last2,
   5731 	      _OutputIterator __result)
   5732     {
   5733       typedef typename iterator_traits<_InputIterator1>::value_type
   5734 	_ValueType1;
   5735       typedef typename iterator_traits<_InputIterator2>::value_type
   5736 	_ValueType2;
   5737 
   5738       // concept requirements
   5739       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
   5740       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
   5741       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   5742 				  _ValueType1>)
   5743       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   5744 				  _ValueType2>)
   5745       __glibcxx_function_requires(_LessThanOpConcept<_ValueType1, _ValueType2>)
   5746       __glibcxx_function_requires(_LessThanOpConcept<_ValueType2, _ValueType1>)
   5747       __glibcxx_requires_sorted_set(__first1, __last1, __first2);
   5748       __glibcxx_requires_sorted_set(__first2, __last2, __first1);
   5749 
   5750       while (__first1 != __last1 && __first2 != __last2)
   5751 	{
   5752 	  if (*__first1 < *__first2)
   5753 	    {
   5754 	      *__result = *__first1;
   5755 	      ++__first1;
   5756 	    }
   5757 	  else if (*__first2 < *__first1)
   5758 	    {
   5759 	      *__result = *__first2;
   5760 	      ++__first2;
   5761 	    }
   5762 	  else
   5763 	    {
   5764 	      *__result = *__first1;
   5765 	      ++__first1;
   5766 	      ++__first2;
   5767 	    }
   5768 	  ++__result;
   5769 	}
   5770       return std::copy(__first2, __last2, std::copy(__first1, __last1,
   5771 						    __result));
   5772     }
   5773 
   5774   /**
   5775    *  @brief Return the union of two sorted ranges using a comparison functor.
   5776    *  @ingroup set_algorithms
   5777    *  @param  __first1  Start of first range.
   5778    *  @param  __last1   End of first range.
   5779    *  @param  __first2  Start of second range.
   5780    *  @param  __last2   End of second range.
   5781    *  @param  __comp    The comparison functor.
   5782    *  @return  End of the output range.
   5783    *  @ingroup set_algorithms
   5784    *
   5785    *  This operation iterates over both ranges, copying elements present in
   5786    *  each range in order to the output range.  Iterators increment for each
   5787    *  range.  When the current element of one range is less than the other
   5788    *  according to @p __comp, that element is copied and the iterator advanced.
   5789    *  If an equivalent element according to @p __comp is contained in both
   5790    *  ranges, the element from the first range is copied and both ranges
   5791    *  advance.  The output range may not overlap either input range.
   5792   */
   5793   template<typename _InputIterator1, typename _InputIterator2,
   5794 	   typename _OutputIterator, typename _Compare>
   5795     _OutputIterator
   5796     set_union(_InputIterator1 __first1, _InputIterator1 __last1,
   5797 	      _InputIterator2 __first2, _InputIterator2 __last2,
   5798 	      _OutputIterator __result, _Compare __comp)
   5799     {
   5800       typedef typename iterator_traits<_InputIterator1>::value_type
   5801 	_ValueType1;
   5802       typedef typename iterator_traits<_InputIterator2>::value_type
   5803 	_ValueType2;
   5804 
   5805       // concept requirements
   5806       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
   5807       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
   5808       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   5809 				  _ValueType1>)
   5810       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   5811 				  _ValueType2>)
   5812       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
   5813 				  _ValueType1, _ValueType2>)
   5814       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
   5815 				  _ValueType2, _ValueType1>)
   5816       __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
   5817       __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
   5818 
   5819       while (__first1 != __last1 && __first2 != __last2)
   5820 	{
   5821 	  if (__comp(*__first1, *__first2))
   5822 	    {
   5823 	      *__result = *__first1;
   5824 	      ++__first1;
   5825 	    }
   5826 	  else if (__comp(*__first2, *__first1))
   5827 	    {
   5828 	      *__result = *__first2;
   5829 	      ++__first2;
   5830 	    }
   5831 	  else
   5832 	    {
   5833 	      *__result = *__first1;
   5834 	      ++__first1;
   5835 	      ++__first2;
   5836 	    }
   5837 	  ++__result;
   5838 	}
   5839       return std::copy(__first2, __last2, std::copy(__first1, __last1,
   5840 						    __result));
   5841     }
   5842 
   5843   /**
   5844    *  @brief Return the intersection of two sorted ranges.
   5845    *  @ingroup set_algorithms
   5846    *  @param  __first1  Start of first range.
   5847    *  @param  __last1   End of first range.
   5848    *  @param  __first2  Start of second range.
   5849    *  @param  __last2   End of second range.
   5850    *  @return  End of the output range.
   5851    *  @ingroup set_algorithms
   5852    *
   5853    *  This operation iterates over both ranges, copying elements present in
   5854    *  both ranges in order to the output range.  Iterators increment for each
   5855    *  range.  When the current element of one range is less than the other,
   5856    *  that iterator advances.  If an element is contained in both ranges, the
   5857    *  element from the first range is copied and both ranges advance.  The
   5858    *  output range may not overlap either input range.
   5859   */
   5860   template<typename _InputIterator1, typename _InputIterator2,
   5861 	   typename _OutputIterator>
   5862     _OutputIterator
   5863     set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
   5864 		     _InputIterator2 __first2, _InputIterator2 __last2,
   5865 		     _OutputIterator __result)
   5866     {
   5867       typedef typename iterator_traits<_InputIterator1>::value_type
   5868 	_ValueType1;
   5869       typedef typename iterator_traits<_InputIterator2>::value_type
   5870 	_ValueType2;
   5871 
   5872       // concept requirements
   5873       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
   5874       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
   5875       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   5876 				  _ValueType1>)
   5877       __glibcxx_function_requires(_LessThanOpConcept<_ValueType1, _ValueType2>)
   5878       __glibcxx_function_requires(_LessThanOpConcept<_ValueType2, _ValueType1>)
   5879       __glibcxx_requires_sorted_set(__first1, __last1, __first2);
   5880       __glibcxx_requires_sorted_set(__first2, __last2, __first1);
   5881 
   5882       while (__first1 != __last1 && __first2 != __last2)
   5883 	if (*__first1 < *__first2)
   5884 	  ++__first1;
   5885 	else if (*__first2 < *__first1)
   5886 	  ++__first2;
   5887 	else
   5888 	  {
   5889 	    *__result = *__first1;
   5890 	    ++__first1;
   5891 	    ++__first2;
   5892 	    ++__result;
   5893 	  }
   5894       return __result;
   5895     }
   5896 
   5897   /**
   5898    *  @brief Return the intersection of two sorted ranges using comparison
   5899    *  functor.
   5900    *  @ingroup set_algorithms
   5901    *  @param  __first1  Start of first range.
   5902    *  @param  __last1   End of first range.
   5903    *  @param  __first2  Start of second range.
   5904    *  @param  __last2   End of second range.
   5905    *  @param  __comp    The comparison functor.
   5906    *  @return  End of the output range.
   5907    *  @ingroup set_algorithms
   5908    *
   5909    *  This operation iterates over both ranges, copying elements present in
   5910    *  both ranges in order to the output range.  Iterators increment for each
   5911    *  range.  When the current element of one range is less than the other
   5912    *  according to @p __comp, that iterator advances.  If an element is
   5913    *  contained in both ranges according to @p __comp, the element from the
   5914    *  first range is copied and both ranges advance.  The output range may not
   5915    *  overlap either input range.
   5916   */
   5917   template<typename _InputIterator1, typename _InputIterator2,
   5918 	   typename _OutputIterator, typename _Compare>
   5919     _OutputIterator
   5920     set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
   5921 		     _InputIterator2 __first2, _InputIterator2 __last2,
   5922 		     _OutputIterator __result, _Compare __comp)
   5923     {
   5924       typedef typename iterator_traits<_InputIterator1>::value_type
   5925 	_ValueType1;
   5926       typedef typename iterator_traits<_InputIterator2>::value_type
   5927 	_ValueType2;
   5928 
   5929       // concept requirements
   5930       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
   5931       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
   5932       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   5933 				  _ValueType1>)
   5934       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
   5935 				  _ValueType1, _ValueType2>)
   5936       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
   5937 				  _ValueType2, _ValueType1>)
   5938       __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
   5939       __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
   5940 
   5941       while (__first1 != __last1 && __first2 != __last2)
   5942 	if (__comp(*__first1, *__first2))
   5943 	  ++__first1;
   5944 	else if (__comp(*__first2, *__first1))
   5945 	  ++__first2;
   5946 	else
   5947 	  {
   5948 	    *__result = *__first1;
   5949 	    ++__first1;
   5950 	    ++__first2;
   5951 	    ++__result;
   5952 	  }
   5953       return __result;
   5954     }
   5955 
   5956   /**
   5957    *  @brief Return the difference of two sorted ranges.
   5958    *  @ingroup set_algorithms
   5959    *  @param  __first1  Start of first range.
   5960    *  @param  __last1   End of first range.
   5961    *  @param  __first2  Start of second range.
   5962    *  @param  __last2   End of second range.
   5963    *  @return  End of the output range.
   5964    *  @ingroup set_algorithms
   5965    *
   5966    *  This operation iterates over both ranges, copying elements present in
   5967    *  the first range but not the second in order to the output range.
   5968    *  Iterators increment for each range.  When the current element of the
   5969    *  first range is less than the second, that element is copied and the
   5970    *  iterator advances.  If the current element of the second range is less,
   5971    *  the iterator advances, but no element is copied.  If an element is
   5972    *  contained in both ranges, no elements are copied and both ranges
   5973    *  advance.  The output range may not overlap either input range.
   5974   */
   5975   template<typename _InputIterator1, typename _InputIterator2,
   5976 	   typename _OutputIterator>
   5977     _OutputIterator
   5978     set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
   5979 		   _InputIterator2 __first2, _InputIterator2 __last2,
   5980 		   _OutputIterator __result)
   5981     {
   5982       typedef typename iterator_traits<_InputIterator1>::value_type
   5983 	_ValueType1;
   5984       typedef typename iterator_traits<_InputIterator2>::value_type
   5985 	_ValueType2;
   5986 
   5987       // concept requirements
   5988       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
   5989       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
   5990       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   5991 				  _ValueType1>)
   5992       __glibcxx_function_requires(_LessThanOpConcept<_ValueType1, _ValueType2>)
   5993       __glibcxx_function_requires(_LessThanOpConcept<_ValueType2, _ValueType1>)
   5994       __glibcxx_requires_sorted_set(__first1, __last1, __first2);
   5995       __glibcxx_requires_sorted_set(__first2, __last2, __first1);
   5996 
   5997       while (__first1 != __last1 && __first2 != __last2)
   5998 	if (*__first1 < *__first2)
   5999 	  {
   6000 	    *__result = *__first1;
   6001 	    ++__first1;
   6002 	    ++__result;
   6003 	  }
   6004 	else if (*__first2 < *__first1)
   6005 	  ++__first2;
   6006 	else
   6007 	  {
   6008 	    ++__first1;
   6009 	    ++__first2;
   6010 	  }
   6011       return std::copy(__first1, __last1, __result);
   6012     }
   6013 
   6014   /**
   6015    *  @brief  Return the difference of two sorted ranges using comparison
   6016    *  functor.
   6017    *  @ingroup set_algorithms
   6018    *  @param  __first1  Start of first range.
   6019    *  @param  __last1   End of first range.
   6020    *  @param  __first2  Start of second range.
   6021    *  @param  __last2   End of second range.
   6022    *  @param  __comp    The comparison functor.
   6023    *  @return  End of the output range.
   6024    *  @ingroup set_algorithms
   6025    *
   6026    *  This operation iterates over both ranges, copying elements present in
   6027    *  the first range but not the second in order to the output range.
   6028    *  Iterators increment for each range.  When the current element of the
   6029    *  first range is less than the second according to @p __comp, that element
   6030    *  is copied and the iterator advances.  If the current element of the
   6031    *  second range is less, no element is copied and the iterator advances.
   6032    *  If an element is contained in both ranges according to @p __comp, no
   6033    *  elements are copied and both ranges advance.  The output range may not
   6034    *  overlap either input range.
   6035   */
   6036   template<typename _InputIterator1, typename _InputIterator2,
   6037 	   typename _OutputIterator, typename _Compare>
   6038     _OutputIterator
   6039     set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
   6040 		   _InputIterator2 __first2, _InputIterator2 __last2,
   6041 		   _OutputIterator __result, _Compare __comp)
   6042     {
   6043       typedef typename iterator_traits<_InputIterator1>::value_type
   6044 	_ValueType1;
   6045       typedef typename iterator_traits<_InputIterator2>::value_type
   6046 	_ValueType2;
   6047 
   6048       // concept requirements
   6049       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
   6050       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
   6051       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   6052 				  _ValueType1>)
   6053       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
   6054 				  _ValueType1, _ValueType2>)
   6055       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
   6056 				  _ValueType2, _ValueType1>)
   6057       __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
   6058       __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
   6059 
   6060       while (__first1 != __last1 && __first2 != __last2)
   6061 	if (__comp(*__first1, *__first2))
   6062 	  {
   6063 	    *__result = *__first1;
   6064 	    ++__first1;
   6065 	    ++__result;
   6066 	  }
   6067 	else if (__comp(*__first2, *__first1))
   6068 	  ++__first2;
   6069 	else
   6070 	  {
   6071 	    ++__first1;
   6072 	    ++__first2;
   6073 	  }
   6074       return std::copy(__first1, __last1, __result);
   6075     }
   6076 
   6077   /**
   6078    *  @brief  Return the symmetric difference of two sorted ranges.
   6079    *  @ingroup set_algorithms
   6080    *  @param  __first1  Start of first range.
   6081    *  @param  __last1   End of first range.
   6082    *  @param  __first2  Start of second range.
   6083    *  @param  __last2   End of second range.
   6084    *  @return  End of the output range.
   6085    *  @ingroup set_algorithms
   6086    *
   6087    *  This operation iterates over both ranges, copying elements present in
   6088    *  one range but not the other in order to the output range.  Iterators
   6089    *  increment for each range.  When the current element of one range is less
   6090    *  than the other, that element is copied and the iterator advances.  If an
   6091    *  element is contained in both ranges, no elements are copied and both
   6092    *  ranges advance.  The output range may not overlap either input range.
   6093   */
   6094   template<typename _InputIterator1, typename _InputIterator2,
   6095 	   typename _OutputIterator>
   6096     _OutputIterator
   6097     set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
   6098 			     _InputIterator2 __first2, _InputIterator2 __last2,
   6099 			     _OutputIterator __result)
   6100     {
   6101       typedef typename iterator_traits<_InputIterator1>::value_type
   6102 	_ValueType1;
   6103       typedef typename iterator_traits<_InputIterator2>::value_type
   6104 	_ValueType2;
   6105 
   6106       // concept requirements
   6107       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
   6108       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
   6109       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   6110 				  _ValueType1>)
   6111       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   6112 				  _ValueType2>)
   6113       __glibcxx_function_requires(_LessThanOpConcept<_ValueType1, _ValueType2>)
   6114       __glibcxx_function_requires(_LessThanOpConcept<_ValueType2, _ValueType1>)
   6115       __glibcxx_requires_sorted_set(__first1, __last1, __first2);
   6116       __glibcxx_requires_sorted_set(__first2, __last2, __first1);
   6117 
   6118       while (__first1 != __last1 && __first2 != __last2)
   6119 	if (*__first1 < *__first2)
   6120 	  {
   6121 	    *__result = *__first1;
   6122 	    ++__first1;
   6123 	    ++__result;
   6124 	  }
   6125 	else if (*__first2 < *__first1)
   6126 	  {
   6127 	    *__result = *__first2;
   6128 	    ++__first2;
   6129 	    ++__result;
   6130 	  }
   6131 	else
   6132 	  {
   6133 	    ++__first1;
   6134 	    ++__first2;
   6135 	  }
   6136       return std::copy(__first2, __last2, std::copy(__first1,
   6137 						    __last1, __result));
   6138     }
   6139 
   6140   /**
   6141    *  @brief  Return the symmetric difference of two sorted ranges using
   6142    *  comparison functor.
   6143    *  @ingroup set_algorithms
   6144    *  @param  __first1  Start of first range.
   6145    *  @param  __last1   End of first range.
   6146    *  @param  __first2  Start of second range.
   6147    *  @param  __last2   End of second range.
   6148    *  @param  __comp    The comparison functor.
   6149    *  @return  End of the output range.
   6150    *  @ingroup set_algorithms
   6151    *
   6152    *  This operation iterates over both ranges, copying elements present in
   6153    *  one range but not the other in order to the output range.  Iterators
   6154    *  increment for each range.  When the current element of one range is less
   6155    *  than the other according to @p comp, that element is copied and the
   6156    *  iterator advances.  If an element is contained in both ranges according
   6157    *  to @p __comp, no elements are copied and both ranges advance.  The output
   6158    *  range may not overlap either input range.
   6159   */
   6160   template<typename _InputIterator1, typename _InputIterator2,
   6161 	   typename _OutputIterator, typename _Compare>
   6162     _OutputIterator
   6163     set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
   6164 			     _InputIterator2 __first2, _InputIterator2 __last2,
   6165 			     _OutputIterator __result,
   6166 			     _Compare __comp)
   6167     {
   6168       typedef typename iterator_traits<_InputIterator1>::value_type
   6169 	_ValueType1;
   6170       typedef typename iterator_traits<_InputIterator2>::value_type
   6171 	_ValueType2;
   6172 
   6173       // concept requirements
   6174       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
   6175       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
   6176       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   6177 				  _ValueType1>)
   6178       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   6179 				  _ValueType2>)
   6180       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
   6181 				  _ValueType1, _ValueType2>)
   6182       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
   6183 				  _ValueType2, _ValueType1>)
   6184       __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
   6185       __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
   6186 
   6187       while (__first1 != __last1 && __first2 != __last2)
   6188 	if (__comp(*__first1, *__first2))
   6189 	  {
   6190 	    *__result = *__first1;
   6191 	    ++__first1;
   6192 	    ++__result;
   6193 	  }
   6194 	else if (__comp(*__first2, *__first1))
   6195 	  {
   6196 	    *__result = *__first2;
   6197 	    ++__first2;
   6198 	    ++__result;
   6199 	  }
   6200 	else
   6201 	  {
   6202 	    ++__first1;
   6203 	    ++__first2;
   6204 	  }
   6205       return std::copy(__first2, __last2,
   6206 		       std::copy(__first1, __last1, __result));
   6207     }
   6208 
   6209 
   6210   /**
   6211    *  @brief  Return the minimum element in a range.
   6212    *  @ingroup sorting_algorithms
   6213    *  @param  __first  Start of range.
   6214    *  @param  __last   End of range.
   6215    *  @return  Iterator referencing the first instance of the smallest value.
   6216   */
   6217   template<typename _ForwardIterator>
   6218     _ForwardIterator
   6219     min_element(_ForwardIterator __first, _ForwardIterator __last)
   6220     {
   6221       // concept requirements
   6222       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
   6223       __glibcxx_function_requires(_LessThanComparableConcept<
   6224 	    typename iterator_traits<_ForwardIterator>::value_type>)
   6225       __glibcxx_requires_valid_range(__first, __last);
   6226 
   6227       if (__first == __last)
   6228 	return __first;
   6229       _ForwardIterator __result = __first;
   6230       while (++__first != __last)
   6231 	if (*__first < *__result)
   6232 	  __result = __first;
   6233       return __result;
   6234     }
   6235 
   6236   /**
   6237    *  @brief  Return the minimum element in a range using comparison functor.
   6238    *  @ingroup sorting_algorithms
   6239    *  @param  __first  Start of range.
   6240    *  @param  __last   End of range.
   6241    *  @param  __comp   Comparison functor.
   6242    *  @return  Iterator referencing the first instance of the smallest value
   6243    *  according to __comp.
   6244   */
   6245   template<typename _ForwardIterator, typename _Compare>
   6246     _ForwardIterator
   6247     min_element(_ForwardIterator __first, _ForwardIterator __last,
   6248 		_Compare __comp)
   6249     {
   6250       // concept requirements
   6251       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
   6252       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
   6253 	    typename iterator_traits<_ForwardIterator>::value_type,
   6254 	    typename iterator_traits<_ForwardIterator>::value_type>)
   6255       __glibcxx_requires_valid_range(__first, __last);
   6256 
   6257       if (__first == __last)
   6258 	return __first;
   6259       _ForwardIterator __result = __first;
   6260       while (++__first != __last)
   6261 	if (__comp(*__first, *__result))
   6262 	  __result = __first;
   6263       return __result;
   6264     }
   6265 
   6266   /**
   6267    *  @brief  Return the maximum element in a range.
   6268    *  @ingroup sorting_algorithms
   6269    *  @param  __first  Start of range.
   6270    *  @param  __last   End of range.
   6271    *  @return  Iterator referencing the first instance of the largest value.
   6272   */
   6273   template<typename _ForwardIterator>
   6274     _ForwardIterator
   6275     max_element(_ForwardIterator __first, _ForwardIterator __last)
   6276     {
   6277       // concept requirements
   6278       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
   6279       __glibcxx_function_requires(_LessThanComparableConcept<
   6280 	    typename iterator_traits<_ForwardIterator>::value_type>)
   6281       __glibcxx_requires_valid_range(__first, __last);
   6282 
   6283       if (__first == __last)
   6284 	return __first;
   6285       _ForwardIterator __result = __first;
   6286       while (++__first != __last)
   6287 	if (*__result < *__first)
   6288 	  __result = __first;
   6289       return __result;
   6290     }
   6291 
   6292   /**
   6293    *  @brief  Return the maximum element in a range using comparison functor.
   6294    *  @ingroup sorting_algorithms
   6295    *  @param  __first  Start of range.
   6296    *  @param  __last   End of range.
   6297    *  @param  __comp   Comparison functor.
   6298    *  @return  Iterator referencing the first instance of the largest value
   6299    *  according to __comp.
   6300   */
   6301   template<typename _ForwardIterator, typename _Compare>
   6302     _ForwardIterator
   6303     max_element(_ForwardIterator __first, _ForwardIterator __last,
   6304 		_Compare __comp)
   6305     {
   6306       // concept requirements
   6307       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
   6308       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
   6309 	    typename iterator_traits<_ForwardIterator>::value_type,
   6310 	    typename iterator_traits<_ForwardIterator>::value_type>)
   6311       __glibcxx_requires_valid_range(__first, __last);
   6312 
   6313       if (__first == __last) return __first;
   6314       _ForwardIterator __result = __first;
   6315       while (++__first != __last)
   6316 	if (__comp(*__result, *__first))
   6317 	  __result = __first;
   6318       return __result;
   6319     }
   6320 
   6321 _GLIBCXX_END_NAMESPACE_ALGO
   6322 } // namespace std
   6323 
   6324 #endif /* _STL_ALGO_H */
   6325