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