home *** CD-ROM | disk | FTP | other *** search
/ Beginning C++ Through Gam…rogramming (2nd Edition) / BCGP2E.ISO / bloodshed / devcpp-4.9.9.2_setup.exe / stl_algo.h < prev    next >
C/C++ Source or Header  |  2005-01-29  |  177KB  |  5,154 lines

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