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