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