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