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