]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/libstdc++/include/bits/stl_algo.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / libstdc++ / include / bits / stl_algo.h
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
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&
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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>
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>
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 */