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