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