OSDN Git Service

2010-03-13 Paolo Carlini <paolo.carlini@oracle.com>
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / include / bits / stl_algo.h
1 // Algorithm implementation -*- C++ -*-
2
3 // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4 // Free Software Foundation, Inc.
5 //
6 // This file is part of the GNU ISO C++ Library.  This library is free
7 // software; you can redistribute it and/or modify it under the
8 // terms of the GNU General Public License as published by the
9 // Free Software Foundation; either version 3, or (at your option)
10 // any later version.
11
12 // This library is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 // GNU General Public License for more details.
16
17 // Under Section 7 of GPL version 3, you are granted additional
18 // permissions described in the GCC Runtime Library Exception, version
19 // 3.1, as published by the Free Software Foundation.
20
21 // You should have received a copy of the GNU General Public License and
22 // a copy of the GCC Runtime Library Exception along with this program;
23 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24 // <http://www.gnu.org/licenses/>.
25
26 /*
27  *
28  * Copyright (c) 1994
29  * Hewlett-Packard Company
30  *
31  * Permission to use, copy, modify, distribute and sell this software
32  * and its documentation for any purpose is hereby granted without fee,
33  * provided that the above copyright notice appear in all copies and
34  * that both that copyright notice and this permission notice appear
35  * in supporting documentation.  Hewlett-Packard Company makes no
36  * representations about the suitability of this software for any
37  * purpose.  It is provided "as is" without express or implied warranty.
38  *
39  *
40  * Copyright (c) 1996
41  * Silicon Graphics Computer Systems, Inc.
42  *
43  * Permission to use, copy, modify, distribute and sell this software
44  * and its documentation for any purpose is hereby granted without fee,
45  * provided that the above copyright notice appear in all copies and
46  * that both that copyright notice and this permission notice appear
47  * in supporting documentation.  Silicon Graphics makes no
48  * representations about the suitability of this software for any
49  * purpose.  It is provided "as is" without express or implied warranty.
50  */
51
52 /** @file stl_algo.h
53  *  This is an internal header file, included by other library headers.
54  *  You should not attempt to use it directly.
55  */
56
57 #ifndef _STL_ALGO_H
58 #define _STL_ALGO_H 1
59
60 #include <cstdlib>             // for rand
61 #include <bits/algorithmfwd.h>
62 #include <bits/stl_heap.h>
63 #include <bits/stl_tempbuf.h>  // for _Temporary_buffer
64
65 // See concept_check.h for the __glibcxx_*_requires macros.
66
67 _GLIBCXX_BEGIN_NAMESPACE(std)
68
69   /// Swaps the median value of *__a, *__b and *__c to *__a
70   template<typename _Iterator>
71     void
72     __move_median_first(_Iterator __a, _Iterator __b, _Iterator __c)
73     {
74       // concept requirements
75       __glibcxx_function_requires(_LessThanComparableConcept<
76             typename iterator_traits<_Iterator>::value_type>)
77
78       if (*__a < *__b)
79         {
80           if (*__b < *__c)
81             std::iter_swap(__a, __b);
82           else if (*__a < *__c)
83             std::iter_swap(__a, __c);
84         }
85       else if (*__a < *__c)
86         return;
87       else if (*__b < *__c)
88         std::iter_swap(__a, __c);
89       else
90         std::iter_swap(__a, __b);
91     }
92
93   /// Swaps the median value of *__a, *__b and *__c under __comp to *__a
94   template<typename _Iterator, typename _Compare>
95     void
96     __move_median_first(_Iterator __a, _Iterator __b, _Iterator __c,
97                         _Compare __comp)
98     {
99       // concept requirements
100       __glibcxx_function_requires(_BinaryFunctionConcept<_Compare, bool,
101             typename iterator_traits<_Iterator>::value_type,
102             typename iterator_traits<_Iterator>::value_type>)
103
104       if (__comp(*__a, *__b))
105         {
106           if (__comp(*__b, *__c))
107             std::iter_swap(__a, __b);
108           else if (__comp(*__a, *__c))
109             std::iter_swap(__a, __c);
110         }
111       else if (__comp(*__a, *__c))
112         return;
113       else if (__comp(*__b, *__c))
114         std::iter_swap(__a, __c);
115       else
116         std::iter_swap(__a, __b);
117     }
118
119   // for_each
120
121   /// This is an overload used by find() for the Input Iterator case.
122   template<typename _InputIterator, typename _Tp>
123     inline _InputIterator
124     __find(_InputIterator __first, _InputIterator __last,
125            const _Tp& __val, input_iterator_tag)
126     {
127       while (__first != __last && !(*__first == __val))
128         ++__first;
129       return __first;
130     }
131
132   /// This is an overload used by find_if() for the Input Iterator case.
133   template<typename _InputIterator, typename _Predicate>
134     inline _InputIterator
135     __find_if(_InputIterator __first, _InputIterator __last,
136               _Predicate __pred, input_iterator_tag)
137     {
138       while (__first != __last && !bool(__pred(*__first)))
139         ++__first;
140       return __first;
141     }
142
143   /// This is an overload used by find() for the RAI case.
144   template<typename _RandomAccessIterator, typename _Tp>
145     _RandomAccessIterator
146     __find(_RandomAccessIterator __first, _RandomAccessIterator __last,
147            const _Tp& __val, random_access_iterator_tag)
148     {
149       typename iterator_traits<_RandomAccessIterator>::difference_type
150         __trip_count = (__last - __first) >> 2;
151
152       for (; __trip_count > 0; --__trip_count)
153         {
154           if (*__first == __val)
155             return __first;
156           ++__first;
157
158           if (*__first == __val)
159             return __first;
160           ++__first;
161
162           if (*__first == __val)
163             return __first;
164           ++__first;
165
166           if (*__first == __val)
167             return __first;
168           ++__first;
169         }
170
171       switch (__last - __first)
172         {
173         case 3:
174           if (*__first == __val)
175             return __first;
176           ++__first;
177         case 2:
178           if (*__first == __val)
179             return __first;
180           ++__first;
181         case 1:
182           if (*__first == __val)
183             return __first;
184           ++__first;
185         case 0:
186         default:
187           return __last;
188         }
189     }
190
191   /// This is an overload used by find_if() for the RAI case.
192   template<typename _RandomAccessIterator, typename _Predicate>
193     _RandomAccessIterator
194     __find_if(_RandomAccessIterator __first, _RandomAccessIterator __last,
195               _Predicate __pred, random_access_iterator_tag)
196     {
197       typename iterator_traits<_RandomAccessIterator>::difference_type
198         __trip_count = (__last - __first) >> 2;
199
200       for (; __trip_count > 0; --__trip_count)
201         {
202           if (__pred(*__first))
203             return __first;
204           ++__first;
205
206           if (__pred(*__first))
207             return __first;
208           ++__first;
209
210           if (__pred(*__first))
211             return __first;
212           ++__first;
213
214           if (__pred(*__first))
215             return __first;
216           ++__first;
217         }
218
219       switch (__last - __first)
220         {
221         case 3:
222           if (__pred(*__first))
223             return __first;
224           ++__first;
225         case 2:
226           if (__pred(*__first))
227             return __first;
228           ++__first;
229         case 1:
230           if (__pred(*__first))
231             return __first;
232           ++__first;
233         case 0:
234         default:
235           return __last;
236         }
237     }
238
239 #ifdef __GXX_EXPERIMENTAL_CXX0X__
240   /// This is an overload used by find_if_not() for the Input Iterator case.
241   template<typename _InputIterator, typename _Predicate>
242     inline _InputIterator
243     __find_if_not(_InputIterator __first, _InputIterator __last,
244                   _Predicate __pred, input_iterator_tag)
245     {
246       while (__first != __last && bool(__pred(*__first)))
247         ++__first;
248       return __first;
249     }
250
251   /// This is an overload used by find_if_not() for the RAI case.
252   template<typename _RandomAccessIterator, typename _Predicate>
253     _RandomAccessIterator
254     __find_if_not(_RandomAccessIterator __first, _RandomAccessIterator __last,
255                   _Predicate __pred, random_access_iterator_tag)
256     {
257       typename iterator_traits<_RandomAccessIterator>::difference_type
258         __trip_count = (__last - __first) >> 2;
259
260       for (; __trip_count > 0; --__trip_count)
261         {
262           if (!bool(__pred(*__first)))
263             return __first;
264           ++__first;
265
266           if (!bool(__pred(*__first)))
267             return __first;
268           ++__first;
269
270           if (!bool(__pred(*__first)))
271             return __first;
272           ++__first;
273
274           if (!bool(__pred(*__first)))
275             return __first;
276           ++__first;
277         }
278
279       switch (__last - __first)
280         {
281         case 3:
282           if (!bool(__pred(*__first)))
283             return __first;
284           ++__first;
285         case 2:
286           if (!bool(__pred(*__first)))
287             return __first;
288           ++__first;
289         case 1:
290           if (!bool(__pred(*__first)))
291             return __first;
292           ++__first;
293         case 0:
294         default:
295           return __last;
296         }
297     }
298 #endif
299
300   // set_difference
301   // set_intersection
302   // set_symmetric_difference
303   // set_union
304   // for_each
305   // find
306   // find_if
307   // find_first_of
308   // adjacent_find
309   // count
310   // count_if
311   // search
312
313   /**
314    *  This is an uglified
315    *  search_n(_ForwardIterator, _ForwardIterator, _Integer, const _Tp&)
316    *  overloaded for forward iterators.
317   */
318   template<typename _ForwardIterator, typename _Integer, typename _Tp>
319     _ForwardIterator
320     __search_n(_ForwardIterator __first, _ForwardIterator __last,
321                _Integer __count, const _Tp& __val,
322                std::forward_iterator_tag)
323     {
324       __first = _GLIBCXX_STD_P::find(__first, __last, __val);
325       while (__first != __last)
326         {
327           typename iterator_traits<_ForwardIterator>::difference_type
328             __n = __count;
329           _ForwardIterator __i = __first;
330           ++__i;
331           while (__i != __last && __n != 1 && *__i == __val)
332             {
333               ++__i;
334               --__n;
335             }
336           if (__n == 1)
337             return __first;
338           if (__i == __last)
339             return __last;
340           __first = _GLIBCXX_STD_P::find(++__i, __last, __val);
341         }
342       return __last;
343     }
344
345   /**
346    *  This is an uglified
347    *  search_n(_ForwardIterator, _ForwardIterator, _Integer, const _Tp&)
348    *  overloaded for random access iterators.
349   */
350   template<typename _RandomAccessIter, typename _Integer, typename _Tp>
351     _RandomAccessIter
352     __search_n(_RandomAccessIter __first, _RandomAccessIter __last,
353                _Integer __count, const _Tp& __val, 
354                std::random_access_iterator_tag)
355     {
356       
357       typedef typename std::iterator_traits<_RandomAccessIter>::difference_type
358         _DistanceType;
359
360       _DistanceType __tailSize = __last - __first;
361       const _DistanceType __pattSize = __count;
362
363       if (__tailSize < __pattSize)
364         return __last;
365
366       const _DistanceType __skipOffset = __pattSize - 1;
367       _RandomAccessIter __lookAhead = __first + __skipOffset;
368       __tailSize -= __pattSize;
369
370       while (1) // the main loop...
371         {
372           // __lookAhead here is always pointing to the last element of next 
373           // possible match.
374           while (!(*__lookAhead == __val)) // the skip loop...
375             {
376               if (__tailSize < __pattSize)
377                 return __last;  // Failure
378               __lookAhead += __pattSize;
379               __tailSize -= __pattSize;
380             }
381           _DistanceType __remainder = __skipOffset;
382           for (_RandomAccessIter __backTrack = __lookAhead - 1; 
383                *__backTrack == __val; --__backTrack)
384             {
385               if (--__remainder == 0)
386                 return (__lookAhead - __skipOffset); // Success
387             }
388           if (__remainder > __tailSize)
389             return __last; // Failure
390           __lookAhead += __remainder;
391           __tailSize -= __remainder;
392         }
393     }
394
395   // search_n
396
397   /**
398    *  This is an uglified
399    *  search_n(_ForwardIterator, _ForwardIterator, _Integer, const _Tp&,
400    *           _BinaryPredicate)
401    *  overloaded for forward iterators.
402   */
403   template<typename _ForwardIterator, typename _Integer, typename _Tp,
404            typename _BinaryPredicate>
405     _ForwardIterator
406     __search_n(_ForwardIterator __first, _ForwardIterator __last,
407                _Integer __count, const _Tp& __val,
408                _BinaryPredicate __binary_pred, std::forward_iterator_tag)
409     {
410       while (__first != __last && !bool(__binary_pred(*__first, __val)))
411         ++__first;
412
413       while (__first != __last)
414         {
415           typename iterator_traits<_ForwardIterator>::difference_type
416             __n = __count;
417           _ForwardIterator __i = __first;
418           ++__i;
419           while (__i != __last && __n != 1 && bool(__binary_pred(*__i, __val)))
420             {
421               ++__i;
422               --__n;
423             }
424           if (__n == 1)
425             return __first;
426           if (__i == __last)
427             return __last;
428           __first = ++__i;
429           while (__first != __last
430                  && !bool(__binary_pred(*__first, __val)))
431             ++__first;
432         }
433       return __last;
434     }
435
436   /**
437    *  This is an uglified
438    *  search_n(_ForwardIterator, _ForwardIterator, _Integer, const _Tp&,
439    *           _BinaryPredicate)
440    *  overloaded for random access iterators.
441   */
442   template<typename _RandomAccessIter, typename _Integer, typename _Tp,
443            typename _BinaryPredicate>
444     _RandomAccessIter
445     __search_n(_RandomAccessIter __first, _RandomAccessIter __last,
446                _Integer __count, const _Tp& __val,
447                _BinaryPredicate __binary_pred, std::random_access_iterator_tag)
448     {
449       
450       typedef typename std::iterator_traits<_RandomAccessIter>::difference_type
451         _DistanceType;
452
453       _DistanceType __tailSize = __last - __first;
454       const _DistanceType __pattSize = __count;
455
456       if (__tailSize < __pattSize)
457         return __last;
458
459       const _DistanceType __skipOffset = __pattSize - 1;
460       _RandomAccessIter __lookAhead = __first + __skipOffset;
461       __tailSize -= __pattSize;
462
463       while (1) // the main loop...
464         {
465           // __lookAhead here is always pointing to the last element of next 
466           // possible match.
467           while (!bool(__binary_pred(*__lookAhead, __val))) // the skip loop...
468             {
469               if (__tailSize < __pattSize)
470                 return __last;  // Failure
471               __lookAhead += __pattSize;
472               __tailSize -= __pattSize;
473             }
474           _DistanceType __remainder = __skipOffset;
475           for (_RandomAccessIter __backTrack = __lookAhead - 1; 
476                __binary_pred(*__backTrack, __val); --__backTrack)
477             {
478               if (--__remainder == 0)
479                 return (__lookAhead - __skipOffset); // Success
480             }
481           if (__remainder > __tailSize)
482             return __last; // Failure
483           __lookAhead += __remainder;
484           __tailSize -= __remainder;
485         }
486     }
487
488   // find_end for forward iterators.
489   template<typename _ForwardIterator1, typename _ForwardIterator2>
490     _ForwardIterator1
491     __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
492                _ForwardIterator2 __first2, _ForwardIterator2 __last2,
493                forward_iterator_tag, forward_iterator_tag)
494     {
495       if (__first2 == __last2)
496         return __last1;
497       else
498         {
499           _ForwardIterator1 __result = __last1;
500           while (1)
501             {
502               _ForwardIterator1 __new_result
503                 = _GLIBCXX_STD_P::search(__first1, __last1, __first2, __last2);
504               if (__new_result == __last1)
505                 return __result;
506               else
507                 {
508                   __result = __new_result;
509                   __first1 = __new_result;
510                   ++__first1;
511                 }
512             }
513         }
514     }
515
516   template<typename _ForwardIterator1, typename _ForwardIterator2,
517            typename _BinaryPredicate>
518     _ForwardIterator1
519     __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
520                _ForwardIterator2 __first2, _ForwardIterator2 __last2,
521                forward_iterator_tag, forward_iterator_tag,
522                _BinaryPredicate __comp)
523     {
524       if (__first2 == __last2)
525         return __last1;
526       else
527         {
528           _ForwardIterator1 __result = __last1;
529           while (1)
530             {
531               _ForwardIterator1 __new_result
532                 = _GLIBCXX_STD_P::search(__first1, __last1, __first2,
533                                          __last2, __comp);
534               if (__new_result == __last1)
535                 return __result;
536               else
537                 {
538                   __result = __new_result;
539                   __first1 = __new_result;
540                   ++__first1;
541                 }
542             }
543         }
544     }
545
546   // find_end for bidirectional iterators (much faster).
547   template<typename _BidirectionalIterator1, typename _BidirectionalIterator2>
548     _BidirectionalIterator1
549     __find_end(_BidirectionalIterator1 __first1,
550                _BidirectionalIterator1 __last1,
551                _BidirectionalIterator2 __first2,
552                _BidirectionalIterator2 __last2,
553                bidirectional_iterator_tag, bidirectional_iterator_tag)
554     {
555       // concept requirements
556       __glibcxx_function_requires(_BidirectionalIteratorConcept<
557                                   _BidirectionalIterator1>)
558       __glibcxx_function_requires(_BidirectionalIteratorConcept<
559                                   _BidirectionalIterator2>)
560
561       typedef reverse_iterator<_BidirectionalIterator1> _RevIterator1;
562       typedef reverse_iterator<_BidirectionalIterator2> _RevIterator2;
563
564       _RevIterator1 __rlast1(__first1);
565       _RevIterator2 __rlast2(__first2);
566       _RevIterator1 __rresult = _GLIBCXX_STD_P::search(_RevIterator1(__last1),
567                                                        __rlast1,
568                                                        _RevIterator2(__last2),
569                                                        __rlast2);
570
571       if (__rresult == __rlast1)
572         return __last1;
573       else
574         {
575           _BidirectionalIterator1 __result = __rresult.base();
576           std::advance(__result, -std::distance(__first2, __last2));
577           return __result;
578         }
579     }
580
581   template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
582            typename _BinaryPredicate>
583     _BidirectionalIterator1
584     __find_end(_BidirectionalIterator1 __first1,
585                _BidirectionalIterator1 __last1,
586                _BidirectionalIterator2 __first2,
587                _BidirectionalIterator2 __last2,
588                bidirectional_iterator_tag, bidirectional_iterator_tag,
589                _BinaryPredicate __comp)
590     {
591       // concept requirements
592       __glibcxx_function_requires(_BidirectionalIteratorConcept<
593                                   _BidirectionalIterator1>)
594       __glibcxx_function_requires(_BidirectionalIteratorConcept<
595                                   _BidirectionalIterator2>)
596
597       typedef reverse_iterator<_BidirectionalIterator1> _RevIterator1;
598       typedef reverse_iterator<_BidirectionalIterator2> _RevIterator2;
599
600       _RevIterator1 __rlast1(__first1);
601       _RevIterator2 __rlast2(__first2);
602       _RevIterator1 __rresult = std::search(_RevIterator1(__last1), __rlast1,
603                                             _RevIterator2(__last2), __rlast2,
604                                             __comp);
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   /**
617    *  @brief  Find last matching subsequence in a sequence.
618    *  @ingroup non_mutating_algorithms
619    *  @param  first1  Start of range to search.
620    *  @param  last1   End of range to search.
621    *  @param  first2  Start of sequence to match.
622    *  @param  last2   End of sequence to match.
623    *  @return   The last iterator @c i in the range
624    *  @p [first1,last1-(last2-first2)) such that @c *(i+N) == @p *(first2+N)
625    *  for each @c N in the range @p [0,last2-first2), or @p last1 if no
626    *  such iterator exists.
627    *
628    *  Searches the range @p [first1,last1) for a sub-sequence that compares
629    *  equal value-by-value with the sequence given by @p [first2,last2) and
630    *  returns an iterator to the first element of the sub-sequence, or
631    *  @p last1 if the sub-sequence is not found.  The sub-sequence will be the
632    *  last such subsequence contained in [first,last1).
633    *
634    *  Because the sub-sequence must lie completely within the range
635    *  @p [first1,last1) it must start at a position less than
636    *  @p last1-(last2-first2) where @p last2-first2 is the length of the
637    *  sub-sequence.
638    *  This means that the returned iterator @c i will be in the range
639    *  @p [first1,last1-(last2-first2))
640   */
641   template<typename _ForwardIterator1, typename _ForwardIterator2>
642     inline _ForwardIterator1
643     find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
644              _ForwardIterator2 __first2, _ForwardIterator2 __last2)
645     {
646       // concept requirements
647       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
648       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
649       __glibcxx_function_requires(_EqualOpConcept<
650             typename iterator_traits<_ForwardIterator1>::value_type,
651             typename iterator_traits<_ForwardIterator2>::value_type>)
652       __glibcxx_requires_valid_range(__first1, __last1);
653       __glibcxx_requires_valid_range(__first2, __last2);
654
655       return std::__find_end(__first1, __last1, __first2, __last2,
656                              std::__iterator_category(__first1),
657                              std::__iterator_category(__first2));
658     }
659
660   /**
661    *  @brief  Find last matching subsequence in a sequence using a predicate.
662    *  @ingroup non_mutating_algorithms
663    *  @param  first1  Start of range to search.
664    *  @param  last1   End of range to search.
665    *  @param  first2  Start of sequence to match.
666    *  @param  last2   End of sequence to match.
667    *  @param  comp    The predicate to use.
668    *  @return   The last iterator @c i in the range
669    *  @p [first1,last1-(last2-first2)) such that @c predicate(*(i+N), @p
670    *  (first2+N)) is true for each @c N in the range @p [0,last2-first2), or
671    *  @p last1 if no such iterator exists.
672    *
673    *  Searches the range @p [first1,last1) for a sub-sequence that compares
674    *  equal value-by-value with the sequence given by @p [first2,last2) using
675    *  comp as a predicate and returns an iterator to the first element of the
676    *  sub-sequence, or @p last1 if the sub-sequence is not found.  The
677    *  sub-sequence will be the last such subsequence contained in
678    *  [first,last1).
679    *
680    *  Because the sub-sequence must lie completely within the range
681    *  @p [first1,last1) it must start at a position less than
682    *  @p last1-(last2-first2) where @p last2-first2 is the length of the
683    *  sub-sequence.
684    *  This means that the returned iterator @c i will be in the range
685    *  @p [first1,last1-(last2-first2))
686   */
687   template<typename _ForwardIterator1, typename _ForwardIterator2,
688            typename _BinaryPredicate>
689     inline _ForwardIterator1
690     find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
691              _ForwardIterator2 __first2, _ForwardIterator2 __last2,
692              _BinaryPredicate __comp)
693     {
694       // concept requirements
695       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
696       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
697       __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
698             typename iterator_traits<_ForwardIterator1>::value_type,
699             typename iterator_traits<_ForwardIterator2>::value_type>)
700       __glibcxx_requires_valid_range(__first1, __last1);
701       __glibcxx_requires_valid_range(__first2, __last2);
702
703       return std::__find_end(__first1, __last1, __first2, __last2,
704                              std::__iterator_category(__first1),
705                              std::__iterator_category(__first2),
706                              __comp);
707     }
708
709 #ifdef __GXX_EXPERIMENTAL_CXX0X__
710   /**
711    *  @brief  Checks that a predicate is true for all the elements
712    *          of a sequence.
713    *  @ingroup non_mutating_algorithms
714    *  @param  first   An input iterator.
715    *  @param  last    An input iterator.
716    *  @param  pred    A predicate.
717    *  @return  True if the check is true, false otherwise.
718    *
719    *  Returns true if @p pred is true for each element in the range
720    *  @p [first,last), and false otherwise.
721   */
722   template<typename _InputIterator, typename _Predicate>
723     inline bool
724     all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
725     { return __last == std::find_if_not(__first, __last, __pred); }
726
727   /**
728    *  @brief  Checks that a predicate is false for all the elements
729    *          of a sequence.
730    *  @ingroup non_mutating_algorithms
731    *  @param  first   An input iterator.
732    *  @param  last    An input iterator.
733    *  @param  pred    A predicate.
734    *  @return  True if the check is true, false otherwise.
735    *
736    *  Returns true if @p pred is false for each element in the range
737    *  @p [first,last), and false otherwise.
738   */
739   template<typename _InputIterator, typename _Predicate>
740     inline bool
741     none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
742     { return __last == _GLIBCXX_STD_P::find_if(__first, __last, __pred); }
743
744   /**
745    *  @brief  Checks that a predicate is false for at least an element
746    *          of a sequence.
747    *  @ingroup non_mutating_algorithms
748    *  @param  first   An input iterator.
749    *  @param  last    An input iterator.
750    *  @param  pred    A predicate.
751    *  @return  True if the check is true, false otherwise.
752    *
753    *  Returns true if an element exists in the range @p [first,last) such that
754    *  @p pred is true, and false otherwise.
755   */
756   template<typename _InputIterator, typename _Predicate>
757     inline bool
758     any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
759     { return !std::none_of(__first, __last, __pred); }
760
761   /**
762    *  @brief  Find the first element in a sequence for which a
763    *          predicate is false.
764    *  @ingroup non_mutating_algorithms
765    *  @param  first  An input iterator.
766    *  @param  last   An input iterator.
767    *  @param  pred   A predicate.
768    *  @return   The first iterator @c i in the range @p [first,last)
769    *  such that @p pred(*i) is false, or @p last if no such iterator exists.
770   */
771   template<typename _InputIterator, typename _Predicate>
772     inline _InputIterator
773     find_if_not(_InputIterator __first, _InputIterator __last,
774                 _Predicate __pred)
775     {
776       // concept requirements
777       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
778       __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
779               typename iterator_traits<_InputIterator>::value_type>)
780       __glibcxx_requires_valid_range(__first, __last);
781       return std::__find_if_not(__first, __last, __pred,
782                                 std::__iterator_category(__first));
783     }
784
785   /**
786    *  @brief  Checks whether the sequence is partitioned.
787    *  @ingroup mutating_algorithms
788    *  @param  first  An input iterator.
789    *  @param  last   An input iterator.
790    *  @param  pred   A predicate.
791    *  @return  True if the range @p [first,last) is partioned by @p pred,
792    *  i.e. if all elements that satisfy @p pred appear before those that
793    *  do not.
794   */
795   template<typename _InputIterator, typename _Predicate>
796     inline bool
797     is_partitioned(_InputIterator __first, _InputIterator __last,
798                    _Predicate __pred)
799     {
800       __first = std::find_if_not(__first, __last, __pred);
801       return std::none_of(__first, __last, __pred);
802     }
803
804   /**
805    *  @brief  Find the partition point of a partitioned range.
806    *  @ingroup mutating_algorithms
807    *  @param  first   An iterator.
808    *  @param  last    Another iterator.
809    *  @param  pred    A predicate.
810    *  @return  An iterator @p mid such that @p all_of(first, mid, pred)
811    *           and @p none_of(mid, last, pred) are both true.
812   */
813   template<typename _ForwardIterator, typename _Predicate>
814     _ForwardIterator
815     partition_point(_ForwardIterator __first, _ForwardIterator __last,
816                     _Predicate __pred)
817     {
818       // concept requirements
819       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
820       __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
821               typename iterator_traits<_ForwardIterator>::value_type>)
822
823       // A specific debug-mode test will be necessary...
824       __glibcxx_requires_valid_range(__first, __last);
825
826       typedef typename iterator_traits<_ForwardIterator>::difference_type
827         _DistanceType;
828
829       _DistanceType __len = std::distance(__first, __last);
830       _DistanceType __half;
831       _ForwardIterator __middle;
832
833       while (__len > 0)
834         {
835           __half = __len >> 1;
836           __middle = __first;
837           std::advance(__middle, __half);
838           if (__pred(*__middle))
839             {
840               __first = __middle;
841               ++__first;
842               __len = __len - __half - 1;
843             }
844           else
845             __len = __half;
846         }
847       return __first;
848     }
849 #endif
850
851
852   /**
853    *  @brief Copy a sequence, removing elements of a given value.
854    *  @ingroup mutating_algorithms
855    *  @param  first   An input iterator.
856    *  @param  last    An input iterator.
857    *  @param  result  An output iterator.
858    *  @param  value   The value to be removed.
859    *  @return   An iterator designating the end of the resulting sequence.
860    *
861    *  Copies each element in the range @p [first,last) not equal to @p value
862    *  to the range beginning at @p result.
863    *  remove_copy() is stable, so the relative order of elements that are
864    *  copied is unchanged.
865   */
866   template<typename _InputIterator, typename _OutputIterator, typename _Tp>
867     _OutputIterator
868     remove_copy(_InputIterator __first, _InputIterator __last,
869                 _OutputIterator __result, const _Tp& __value)
870     {
871       // concept requirements
872       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
873       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
874             typename iterator_traits<_InputIterator>::value_type>)
875       __glibcxx_function_requires(_EqualOpConcept<
876             typename iterator_traits<_InputIterator>::value_type, _Tp>)
877       __glibcxx_requires_valid_range(__first, __last);
878
879       for (; __first != __last; ++__first)
880         if (!(*__first == __value))
881           {
882             *__result = *__first;
883             ++__result;
884           }
885       return __result;
886     }
887
888   /**
889    *  @brief Copy a sequence, removing elements for which a predicate is true.
890    *  @ingroup mutating_algorithms
891    *  @param  first   An input iterator.
892    *  @param  last    An input iterator.
893    *  @param  result  An output iterator.
894    *  @param  pred    A predicate.
895    *  @return   An iterator designating the end of the resulting sequence.
896    *
897    *  Copies each element in the range @p [first,last) for which
898    *  @p pred returns false to the range beginning at @p result.
899    *
900    *  remove_copy_if() is stable, so the relative order of elements that are
901    *  copied is unchanged.
902   */
903   template<typename _InputIterator, typename _OutputIterator,
904            typename _Predicate>
905     _OutputIterator
906     remove_copy_if(_InputIterator __first, _InputIterator __last,
907                    _OutputIterator __result, _Predicate __pred)
908     {
909       // concept requirements
910       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
911       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
912             typename iterator_traits<_InputIterator>::value_type>)
913       __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
914             typename iterator_traits<_InputIterator>::value_type>)
915       __glibcxx_requires_valid_range(__first, __last);
916
917       for (; __first != __last; ++__first)
918         if (!bool(__pred(*__first)))
919           {
920             *__result = *__first;
921             ++__result;
922           }
923       return __result;
924     }
925
926 #ifdef __GXX_EXPERIMENTAL_CXX0X__
927   /**
928    *  @brief Copy the elements of a sequence for which a predicate is true.
929    *  @ingroup mutating_algorithms
930    *  @param  first   An input iterator.
931    *  @param  last    An input iterator.
932    *  @param  result  An output iterator.
933    *  @param  pred    A predicate.
934    *  @return   An iterator designating the end of the resulting sequence.
935    *
936    *  Copies each element in the range @p [first,last) for which
937    *  @p pred returns true to the range beginning at @p result.
938    *
939    *  copy_if() is stable, so the relative order of elements that are
940    *  copied is unchanged.
941   */
942   template<typename _InputIterator, typename _OutputIterator,
943            typename _Predicate>
944     _OutputIterator
945     copy_if(_InputIterator __first, _InputIterator __last,
946             _OutputIterator __result, _Predicate __pred)
947     {
948       // concept requirements
949       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
950       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
951             typename iterator_traits<_InputIterator>::value_type>)
952       __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
953             typename iterator_traits<_InputIterator>::value_type>)
954       __glibcxx_requires_valid_range(__first, __last);
955
956       for (; __first != __last; ++__first)
957         if (__pred(*__first))
958           {
959             *__result = *__first;
960             ++__result;
961           }
962       return __result;
963     }
964
965
966   template<typename _InputIterator, typename _Size, typename _OutputIterator>
967     _OutputIterator
968     __copy_n(_InputIterator __first, _Size __n,
969              _OutputIterator __result, input_iterator_tag)
970     {
971       for (; __n > 0; --__n)
972         {
973           *__result = *__first;
974           ++__first;
975           ++__result;
976         }
977       return __result;
978     }
979
980   template<typename _RandomAccessIterator, typename _Size,
981            typename _OutputIterator>
982     inline _OutputIterator
983     __copy_n(_RandomAccessIterator __first, _Size __n,
984              _OutputIterator __result, random_access_iterator_tag)
985     { return std::copy(__first, __first + __n, __result); }
986
987   /**
988    *  @brief Copies the range [first,first+n) into [result,result+n).
989    *  @ingroup mutating_algorithms
990    *  @param  first  An input iterator.
991    *  @param  n      The number of elements to copy.
992    *  @param  result An output iterator.
993    *  @return  result+n.
994    *
995    *  This inline function will boil down to a call to @c memmove whenever
996    *  possible.  Failing that, if random access iterators are passed, then the
997    *  loop count will be known (and therefore a candidate for compiler
998    *  optimizations such as unrolling).
999   */
1000   template<typename _InputIterator, typename _Size, typename _OutputIterator>
1001     inline _OutputIterator
1002     copy_n(_InputIterator __first, _Size __n, _OutputIterator __result)
1003     {
1004       // concept requirements
1005       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1006       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1007             typename iterator_traits<_InputIterator>::value_type>)
1008
1009       return std::__copy_n(__first, __n, __result,
1010                            std::__iterator_category(__first));
1011     }
1012
1013   /**
1014    *  @brief Copy the elements of a sequence to separate output sequences
1015    *         depending on the truth value of a predicate.
1016    *  @ingroup mutating_algorithms
1017    *  @param  first   An input iterator.
1018    *  @param  last    An input iterator.
1019    *  @param  out_true   An output iterator.
1020    *  @param  out_false  An output iterator.
1021    *  @param  pred    A predicate.
1022    *  @return   A pair designating the ends of the resulting sequences.
1023    *
1024    *  Copies each element in the range @p [first,last) for which
1025    *  @p pred returns true to the range beginning at @p out_true
1026    *  and each element for which @p pred returns false to @p out_false.
1027   */
1028   template<typename _InputIterator, typename _OutputIterator1,
1029            typename _OutputIterator2, typename _Predicate>
1030     pair<_OutputIterator1, _OutputIterator2>
1031     partition_copy(_InputIterator __first, _InputIterator __last,
1032                    _OutputIterator1 __out_true, _OutputIterator2 __out_false,
1033                    _Predicate __pred)
1034     {
1035       // concept requirements
1036       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1037       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator1,
1038             typename iterator_traits<_InputIterator>::value_type>)
1039       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator2,
1040             typename iterator_traits<_InputIterator>::value_type>)
1041       __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
1042             typename iterator_traits<_InputIterator>::value_type>)
1043       __glibcxx_requires_valid_range(__first, __last);
1044       
1045       for (; __first != __last; ++__first)
1046         if (__pred(*__first))
1047           {
1048             *__out_true = *__first;
1049             ++__out_true;
1050           }
1051         else
1052           {
1053             *__out_false = *__first;
1054             ++__out_false;
1055           }
1056
1057       return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false);
1058     }
1059 #endif
1060
1061   /**
1062    *  @brief Remove elements from a sequence.
1063    *  @ingroup mutating_algorithms
1064    *  @param  first  An input iterator.
1065    *  @param  last   An input iterator.
1066    *  @param  value  The value to be removed.
1067    *  @return   An iterator designating the end of the resulting sequence.
1068    *
1069    *  All elements equal to @p value are removed from the range
1070    *  @p [first,last).
1071    *
1072    *  remove() is stable, so the relative order of elements that are
1073    *  not removed is unchanged.
1074    *
1075    *  Elements between the end of the resulting sequence and @p last
1076    *  are still present, but their value is unspecified.
1077   */
1078   template<typename _ForwardIterator, typename _Tp>
1079     _ForwardIterator
1080     remove(_ForwardIterator __first, _ForwardIterator __last,
1081            const _Tp& __value)
1082     {
1083       // concept requirements
1084       __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1085                                   _ForwardIterator>)
1086       __glibcxx_function_requires(_EqualOpConcept<
1087             typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
1088       __glibcxx_requires_valid_range(__first, __last);
1089
1090       __first = _GLIBCXX_STD_P::find(__first, __last, __value);
1091       if(__first == __last)
1092         return __first;
1093       _ForwardIterator __result = __first;
1094       ++__first;
1095       for(; __first != __last; ++__first)
1096         if(!(*__first == __value))
1097           {
1098             *__result = _GLIBCXX_MOVE(*__first);
1099             ++__result;
1100           }
1101       return __result;
1102     }
1103
1104   /**
1105    *  @brief Remove elements from a sequence using a predicate.
1106    *  @ingroup mutating_algorithms
1107    *  @param  first  A forward iterator.
1108    *  @param  last   A forward iterator.
1109    *  @param  pred   A predicate.
1110    *  @return   An iterator designating the end of the resulting sequence.
1111    *
1112    *  All elements for which @p pred returns true are removed from the range
1113    *  @p [first,last).
1114    *
1115    *  remove_if() 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 _Predicate>
1122     _ForwardIterator
1123     remove_if(_ForwardIterator __first, _ForwardIterator __last,
1124               _Predicate __pred)
1125     {
1126       // concept requirements
1127       __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1128                                   _ForwardIterator>)
1129       __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
1130             typename iterator_traits<_ForwardIterator>::value_type>)
1131       __glibcxx_requires_valid_range(__first, __last);
1132
1133       __first = _GLIBCXX_STD_P::find_if(__first, __last, __pred);
1134       if(__first == __last)
1135         return __first;
1136       _ForwardIterator __result = __first;
1137       ++__first;
1138       for(; __first != __last; ++__first)
1139         if(!bool(__pred(*__first)))
1140           {
1141             *__result = _GLIBCXX_MOVE(*__first);
1142             ++__result;
1143           }
1144       return __result;
1145     }
1146
1147   /**
1148    *  @brief Remove consecutive duplicate values from a sequence.
1149    *  @ingroup mutating_algorithms
1150    *  @param  first  A forward iterator.
1151    *  @param  last   A forward iterator.
1152    *  @return  An iterator designating the end of the resulting sequence.
1153    *
1154    *  Removes all but the first element from each group of consecutive
1155    *  values that compare equal.
1156    *  unique() is stable, so the relative order of elements that are
1157    *  not removed is unchanged.
1158    *  Elements between the end of the resulting sequence and @p last
1159    *  are still present, but their value is unspecified.
1160   */
1161   template<typename _ForwardIterator>
1162     _ForwardIterator
1163     unique(_ForwardIterator __first, _ForwardIterator __last)
1164     {
1165       // concept requirements
1166       __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1167                                   _ForwardIterator>)
1168       __glibcxx_function_requires(_EqualityComparableConcept<
1169                      typename iterator_traits<_ForwardIterator>::value_type>)
1170       __glibcxx_requires_valid_range(__first, __last);
1171
1172       // Skip the beginning, if already unique.
1173       __first = _GLIBCXX_STD_P::adjacent_find(__first, __last);
1174       if (__first == __last)
1175         return __last;
1176
1177       // Do the real copy work.
1178       _ForwardIterator __dest = __first;
1179       ++__first;
1180       while (++__first != __last)
1181         if (!(*__dest == *__first))
1182           *++__dest = _GLIBCXX_MOVE(*__first);
1183       return ++__dest;
1184     }
1185
1186   /**
1187    *  @brief Remove consecutive values from a sequence using a predicate.
1188    *  @ingroup mutating_algorithms
1189    *  @param  first        A forward iterator.
1190    *  @param  last         A forward iterator.
1191    *  @param  binary_pred  A binary predicate.
1192    *  @return  An iterator designating the end of the resulting sequence.
1193    *
1194    *  Removes all but the first element from each group of consecutive
1195    *  values for which @p binary_pred returns true.
1196    *  unique() is stable, so the relative order of elements that are
1197    *  not removed is unchanged.
1198    *  Elements between the end of the resulting sequence and @p last
1199    *  are still present, but their value is unspecified.
1200   */
1201   template<typename _ForwardIterator, typename _BinaryPredicate>
1202     _ForwardIterator
1203     unique(_ForwardIterator __first, _ForwardIterator __last,
1204            _BinaryPredicate __binary_pred)
1205     {
1206       // concept requirements
1207       __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1208                                   _ForwardIterator>)
1209       __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
1210                 typename iterator_traits<_ForwardIterator>::value_type,
1211                 typename iterator_traits<_ForwardIterator>::value_type>)
1212       __glibcxx_requires_valid_range(__first, __last);
1213
1214       // Skip the beginning, if already unique.
1215       __first = _GLIBCXX_STD_P::adjacent_find(__first, __last, __binary_pred);
1216       if (__first == __last)
1217         return __last;
1218
1219       // Do the real copy work.
1220       _ForwardIterator __dest = __first;
1221       ++__first;
1222       while (++__first != __last)
1223         if (!bool(__binary_pred(*__dest, *__first)))
1224           *++__dest = _GLIBCXX_MOVE(*__first);
1225       return ++__dest;
1226     }
1227
1228   /**
1229    *  This is an uglified unique_copy(_InputIterator, _InputIterator,
1230    *                                  _OutputIterator)
1231    *  overloaded for forward iterators and output iterator as result.
1232   */
1233   template<typename _ForwardIterator, typename _OutputIterator>
1234     _OutputIterator
1235     __unique_copy(_ForwardIterator __first, _ForwardIterator __last,
1236                   _OutputIterator __result,
1237                   forward_iterator_tag, output_iterator_tag)
1238     {
1239       // concept requirements -- taken care of in dispatching function
1240       _ForwardIterator __next = __first;
1241       *__result = *__first;
1242       while (++__next != __last)
1243         if (!(*__first == *__next))
1244           {
1245             __first = __next;
1246             *++__result = *__first;
1247           }
1248       return ++__result;
1249     }
1250
1251   /**
1252    *  This is an uglified unique_copy(_InputIterator, _InputIterator,
1253    *                                  _OutputIterator)
1254    *  overloaded for input iterators and output iterator as result.
1255   */
1256   template<typename _InputIterator, typename _OutputIterator>
1257     _OutputIterator
1258     __unique_copy(_InputIterator __first, _InputIterator __last,
1259                   _OutputIterator __result,
1260                   input_iterator_tag, output_iterator_tag)
1261     {
1262       // concept requirements -- taken care of in dispatching function
1263       typename iterator_traits<_InputIterator>::value_type __value = *__first;
1264       *__result = __value;
1265       while (++__first != __last)
1266         if (!(__value == *__first))
1267           {
1268             __value = *__first;
1269             *++__result = __value;
1270           }
1271       return ++__result;
1272     }
1273
1274   /**
1275    *  This is an uglified unique_copy(_InputIterator, _InputIterator,
1276    *                                  _OutputIterator)
1277    *  overloaded for input iterators and forward iterator as result.
1278   */
1279   template<typename _InputIterator, typename _ForwardIterator>
1280     _ForwardIterator
1281     __unique_copy(_InputIterator __first, _InputIterator __last,
1282                   _ForwardIterator __result,
1283                   input_iterator_tag, forward_iterator_tag)
1284     {
1285       // concept requirements -- taken care of in dispatching function
1286       *__result = *__first;
1287       while (++__first != __last)
1288         if (!(*__result == *__first))
1289           *++__result = *__first;
1290       return ++__result;
1291     }
1292
1293   /**
1294    *  This is an uglified
1295    *  unique_copy(_InputIterator, _InputIterator, _OutputIterator,
1296    *              _BinaryPredicate)
1297    *  overloaded for forward iterators and output iterator as result.
1298   */
1299   template<typename _ForwardIterator, typename _OutputIterator,
1300            typename _BinaryPredicate>
1301     _OutputIterator
1302     __unique_copy(_ForwardIterator __first, _ForwardIterator __last,
1303                   _OutputIterator __result, _BinaryPredicate __binary_pred,
1304                   forward_iterator_tag, output_iterator_tag)
1305     {
1306       // concept requirements -- iterators already checked
1307       __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
1308           typename iterator_traits<_ForwardIterator>::value_type,
1309           typename iterator_traits<_ForwardIterator>::value_type>)
1310
1311       _ForwardIterator __next = __first;
1312       *__result = *__first;
1313       while (++__next != __last)
1314         if (!bool(__binary_pred(*__first, *__next)))
1315           {
1316             __first = __next;
1317             *++__result = *__first;
1318           }
1319       return ++__result;
1320     }
1321
1322   /**
1323    *  This is an uglified
1324    *  unique_copy(_InputIterator, _InputIterator, _OutputIterator,
1325    *              _BinaryPredicate)
1326    *  overloaded for input iterators and output iterator as result.
1327   */
1328   template<typename _InputIterator, typename _OutputIterator,
1329            typename _BinaryPredicate>
1330     _OutputIterator
1331     __unique_copy(_InputIterator __first, _InputIterator __last,
1332                   _OutputIterator __result, _BinaryPredicate __binary_pred,
1333                   input_iterator_tag, output_iterator_tag)
1334     {
1335       // concept requirements -- iterators already checked
1336       __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
1337           typename iterator_traits<_InputIterator>::value_type,
1338           typename iterator_traits<_InputIterator>::value_type>)
1339
1340       typename iterator_traits<_InputIterator>::value_type __value = *__first;
1341       *__result = __value;
1342       while (++__first != __last)
1343         if (!bool(__binary_pred(__value, *__first)))
1344           {
1345             __value = *__first;
1346             *++__result = __value;
1347           }
1348       return ++__result;
1349     }
1350
1351   /**
1352    *  This is an uglified
1353    *  unique_copy(_InputIterator, _InputIterator, _OutputIterator,
1354    *              _BinaryPredicate)
1355    *  overloaded for input iterators and forward iterator as result.
1356   */
1357   template<typename _InputIterator, typename _ForwardIterator,
1358            typename _BinaryPredicate>
1359     _ForwardIterator
1360     __unique_copy(_InputIterator __first, _InputIterator __last,
1361                   _ForwardIterator __result, _BinaryPredicate __binary_pred,
1362                   input_iterator_tag, forward_iterator_tag)
1363     {
1364       // concept requirements -- iterators already checked
1365       __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
1366           typename iterator_traits<_ForwardIterator>::value_type,
1367           typename iterator_traits<_InputIterator>::value_type>)
1368
1369       *__result = *__first;
1370       while (++__first != __last)
1371         if (!bool(__binary_pred(*__result, *__first)))
1372           *++__result = *__first;
1373       return ++__result;
1374     }
1375
1376   /**
1377    *  This is an uglified reverse(_BidirectionalIterator,
1378    *                              _BidirectionalIterator)
1379    *  overloaded for bidirectional iterators.
1380   */
1381   template<typename _BidirectionalIterator>
1382     void
1383     __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last,
1384               bidirectional_iterator_tag)
1385     {
1386       while (true)
1387         if (__first == __last || __first == --__last)
1388           return;
1389         else
1390           {
1391             std::iter_swap(__first, __last);
1392             ++__first;
1393           }
1394     }
1395
1396   /**
1397    *  This is an uglified reverse(_BidirectionalIterator,
1398    *                              _BidirectionalIterator)
1399    *  overloaded for random access iterators.
1400   */
1401   template<typename _RandomAccessIterator>
1402     void
1403     __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last,
1404               random_access_iterator_tag)
1405     {
1406       if (__first == __last)
1407         return;
1408       --__last;
1409       while (__first < __last)
1410         {
1411           std::iter_swap(__first, __last);
1412           ++__first;
1413           --__last;
1414         }
1415     }
1416
1417   /**
1418    *  @brief Reverse a sequence.
1419    *  @ingroup mutating_algorithms
1420    *  @param  first  A bidirectional iterator.
1421    *  @param  last   A bidirectional iterator.
1422    *  @return   reverse() returns no value.
1423    *
1424    *  Reverses the order of the elements in the range @p [first,last),
1425    *  so that the first element becomes the last etc.
1426    *  For every @c i such that @p 0<=i<=(last-first)/2), @p reverse()
1427    *  swaps @p *(first+i) and @p *(last-(i+1))
1428   */
1429   template<typename _BidirectionalIterator>
1430     inline void
1431     reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
1432     {
1433       // concept requirements
1434       __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
1435                                   _BidirectionalIterator>)
1436       __glibcxx_requires_valid_range(__first, __last);
1437       std::__reverse(__first, __last, std::__iterator_category(__first));
1438     }
1439
1440   /**
1441    *  @brief Copy a sequence, reversing its elements.
1442    *  @ingroup mutating_algorithms
1443    *  @param  first   A bidirectional iterator.
1444    *  @param  last    A bidirectional iterator.
1445    *  @param  result  An output iterator.
1446    *  @return  An iterator designating the end of the resulting sequence.
1447    *
1448    *  Copies the elements in the range @p [first,last) to the range
1449    *  @p [result,result+(last-first)) such that the order of the
1450    *  elements is reversed.
1451    *  For every @c i such that @p 0<=i<=(last-first), @p reverse_copy()
1452    *  performs the assignment @p *(result+(last-first)-i) = *(first+i).
1453    *  The ranges @p [first,last) and @p [result,result+(last-first))
1454    *  must not overlap.
1455   */
1456   template<typename _BidirectionalIterator, typename _OutputIterator>
1457     _OutputIterator
1458     reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last,
1459                  _OutputIterator __result)
1460     {
1461       // concept requirements
1462       __glibcxx_function_requires(_BidirectionalIteratorConcept<
1463                                   _BidirectionalIterator>)
1464       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1465                 typename iterator_traits<_BidirectionalIterator>::value_type>)
1466       __glibcxx_requires_valid_range(__first, __last);
1467
1468       while (__first != __last)
1469         {
1470           --__last;
1471           *__result = *__last;
1472           ++__result;
1473         }
1474       return __result;
1475     }
1476
1477   /**
1478    *  This is a helper function for the rotate algorithm specialized on RAIs.
1479    *  It returns the greatest common divisor of two integer values.
1480   */
1481   template<typename _EuclideanRingElement>
1482     _EuclideanRingElement
1483     __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)
1484     {
1485       while (__n != 0)
1486         {
1487           _EuclideanRingElement __t = __m % __n;
1488           __m = __n;
1489           __n = __t;
1490         }
1491       return __m;
1492     }
1493
1494   /// This is a helper function for the rotate algorithm.
1495   template<typename _ForwardIterator>
1496     void
1497     __rotate(_ForwardIterator __first,
1498              _ForwardIterator __middle,
1499              _ForwardIterator __last,
1500              forward_iterator_tag)
1501     {
1502       if (__first == __middle || __last  == __middle)
1503         return;
1504
1505       _ForwardIterator __first2 = __middle;
1506       do
1507         {
1508           std::iter_swap(__first, __first2);
1509           ++__first;
1510           ++__first2;
1511           if (__first == __middle)
1512             __middle = __first2;
1513         }
1514       while (__first2 != __last);
1515
1516       __first2 = __middle;
1517
1518       while (__first2 != __last)
1519         {
1520           std::iter_swap(__first, __first2);
1521           ++__first;
1522           ++__first2;
1523           if (__first == __middle)
1524             __middle = __first2;
1525           else if (__first2 == __last)
1526             __first2 = __middle;
1527         }
1528     }
1529
1530    /// This is a helper function for the rotate algorithm.
1531   template<typename _BidirectionalIterator>
1532     void
1533     __rotate(_BidirectionalIterator __first,
1534              _BidirectionalIterator __middle,
1535              _BidirectionalIterator __last,
1536               bidirectional_iterator_tag)
1537     {
1538       // concept requirements
1539       __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
1540                                   _BidirectionalIterator>)
1541
1542       if (__first == __middle || __last  == __middle)
1543         return;
1544
1545       std::__reverse(__first,  __middle, bidirectional_iterator_tag());
1546       std::__reverse(__middle, __last,   bidirectional_iterator_tag());
1547
1548       while (__first != __middle && __middle != __last)
1549         {
1550           std::iter_swap(__first, --__last);
1551           ++__first;
1552         }
1553
1554       if (__first == __middle)
1555         std::__reverse(__middle, __last,   bidirectional_iterator_tag());
1556       else
1557         std::__reverse(__first,  __middle, bidirectional_iterator_tag());
1558     }
1559
1560   /// This is a helper function for the rotate algorithm.
1561   template<typename _RandomAccessIterator>
1562     void
1563     __rotate(_RandomAccessIterator __first,
1564              _RandomAccessIterator __middle,
1565              _RandomAccessIterator __last,
1566              random_access_iterator_tag)
1567     {
1568       // concept requirements
1569       __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
1570                                   _RandomAccessIterator>)
1571
1572       if (__first == __middle || __last  == __middle)
1573         return;
1574
1575       typedef typename iterator_traits<_RandomAccessIterator>::difference_type
1576         _Distance;
1577       typedef typename iterator_traits<_RandomAccessIterator>::value_type
1578         _ValueType;
1579
1580       _Distance __n = __last   - __first;
1581       _Distance __k = __middle - __first;
1582
1583       if (__k == __n - __k)
1584         {
1585           std::swap_ranges(__first, __middle, __middle);
1586           return;
1587         }
1588
1589       _RandomAccessIterator __p = __first;
1590
1591       for (;;)
1592         {
1593           if (__k < __n - __k)
1594             {
1595               if (__is_pod(_ValueType) && __k == 1)
1596                 {
1597                   _ValueType __t = _GLIBCXX_MOVE(*__p);
1598                   _GLIBCXX_MOVE3(__p + 1, __p + __n, __p);
1599                   *(__p + __n - 1) = _GLIBCXX_MOVE(__t);
1600                   return;
1601                 }
1602               _RandomAccessIterator __q = __p + __k;
1603               for (_Distance __i = 0; __i < __n - __k; ++ __i)
1604                 {
1605                   std::iter_swap(__p, __q);
1606                   ++__p;
1607                   ++__q;
1608                 }
1609               __n %= __k;
1610               if (__n == 0)
1611                 return;
1612               std::swap(__n, __k);
1613               __k = __n - __k;
1614             }
1615           else
1616             {
1617               __k = __n - __k;
1618               if (__is_pod(_ValueType) && __k == 1)
1619                 {
1620                   _ValueType __t = _GLIBCXX_MOVE(*(__p + __n - 1));
1621                   _GLIBCXX_MOVE_BACKWARD3(__p, __p + __n - 1, __p + __n);
1622                   *__p = _GLIBCXX_MOVE(__t);
1623                   return;
1624                 }
1625               _RandomAccessIterator __q = __p + __n;
1626               __p = __q - __k;
1627               for (_Distance __i = 0; __i < __n - __k; ++ __i)
1628                 {
1629                   --__p;
1630                   --__q;
1631                   std::iter_swap(__p, __q);
1632                 }
1633               __n %= __k;
1634               if (__n == 0)
1635                 return;
1636               std::swap(__n, __k);
1637             }
1638         }
1639     }
1640
1641   /**
1642    *  @brief Rotate the elements of a sequence.
1643    *  @ingroup mutating_algorithms
1644    *  @param  first   A forward iterator.
1645    *  @param  middle  A forward iterator.
1646    *  @param  last    A forward iterator.
1647    *  @return  Nothing.
1648    *
1649    *  Rotates the elements of the range @p [first,last) by @p (middle-first)
1650    *  positions so that the element at @p middle is moved to @p first, the
1651    *  element at @p middle+1 is moved to @first+1 and so on for each element
1652    *  in the range @p [first,last).
1653    *
1654    *  This effectively swaps the ranges @p [first,middle) and
1655    *  @p [middle,last).
1656    *
1657    *  Performs @p *(first+(n+(last-middle))%(last-first))=*(first+n) for
1658    *  each @p n in the range @p [0,last-first).
1659   */
1660   template<typename _ForwardIterator>
1661     inline void
1662     rotate(_ForwardIterator __first, _ForwardIterator __middle,
1663            _ForwardIterator __last)
1664     {
1665       // concept requirements
1666       __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1667                                   _ForwardIterator>)
1668       __glibcxx_requires_valid_range(__first, __middle);
1669       __glibcxx_requires_valid_range(__middle, __last);
1670
1671       typedef typename iterator_traits<_ForwardIterator>::iterator_category
1672         _IterType;
1673       std::__rotate(__first, __middle, __last, _IterType());
1674     }
1675
1676   /**
1677    *  @brief Copy a sequence, rotating its elements.
1678    *  @ingroup mutating_algorithms
1679    *  @param  first   A forward iterator.
1680    *  @param  middle  A forward iterator.
1681    *  @param  last    A forward iterator.
1682    *  @param  result  An output iterator.
1683    *  @return   An iterator designating the end of the resulting sequence.
1684    *
1685    *  Copies the elements of the range @p [first,last) to the range
1686    *  beginning at @result, rotating the copied elements by @p (middle-first)
1687    *  positions so that the element at @p middle is moved to @p result, the
1688    *  element at @p middle+1 is moved to @result+1 and so on for each element
1689    *  in the range @p [first,last).
1690    *
1691    *  Performs @p *(result+(n+(last-middle))%(last-first))=*(first+n) for
1692    *  each @p n in the range @p [0,last-first).
1693   */
1694   template<typename _ForwardIterator, typename _OutputIterator>
1695     _OutputIterator
1696     rotate_copy(_ForwardIterator __first, _ForwardIterator __middle,
1697                 _ForwardIterator __last, _OutputIterator __result)
1698     {
1699       // concept requirements
1700       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
1701       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1702                 typename iterator_traits<_ForwardIterator>::value_type>)
1703       __glibcxx_requires_valid_range(__first, __middle);
1704       __glibcxx_requires_valid_range(__middle, __last);
1705
1706       return std::copy(__first, __middle,
1707                        std::copy(__middle, __last, __result));
1708     }
1709
1710   /// This is a helper function...
1711   template<typename _ForwardIterator, typename _Predicate>
1712     _ForwardIterator
1713     __partition(_ForwardIterator __first, _ForwardIterator __last,
1714                 _Predicate __pred, forward_iterator_tag)
1715     {
1716       if (__first == __last)
1717         return __first;
1718
1719       while (__pred(*__first))
1720         if (++__first == __last)
1721           return __first;
1722
1723       _ForwardIterator __next = __first;
1724
1725       while (++__next != __last)
1726         if (__pred(*__next))
1727           {
1728             std::iter_swap(__first, __next);
1729             ++__first;
1730           }
1731
1732       return __first;
1733     }
1734
1735   /// This is a helper function...
1736   template<typename _BidirectionalIterator, typename _Predicate>
1737     _BidirectionalIterator
1738     __partition(_BidirectionalIterator __first, _BidirectionalIterator __last,
1739                 _Predicate __pred, bidirectional_iterator_tag)
1740     {
1741       while (true)
1742         {
1743           while (true)
1744             if (__first == __last)
1745               return __first;
1746             else if (__pred(*__first))
1747               ++__first;
1748             else
1749               break;
1750           --__last;
1751           while (true)
1752             if (__first == __last)
1753               return __first;
1754             else if (!bool(__pred(*__last)))
1755               --__last;
1756             else
1757               break;
1758           std::iter_swap(__first, __last);
1759           ++__first;
1760         }
1761     }
1762
1763   // partition
1764
1765   /// This is a helper function...
1766   template<typename _ForwardIterator, typename _Predicate, typename _Distance>
1767     _ForwardIterator
1768     __inplace_stable_partition(_ForwardIterator __first,
1769                                _ForwardIterator __last,
1770                                _Predicate __pred, _Distance __len)
1771     {
1772       if (__len == 1)
1773         return __pred(*__first) ? __last : __first;
1774       _ForwardIterator __middle = __first;
1775       std::advance(__middle, __len / 2);
1776       _ForwardIterator __begin = std::__inplace_stable_partition(__first,
1777                                                                  __middle,
1778                                                                  __pred,
1779                                                                  __len / 2);
1780       _ForwardIterator __end = std::__inplace_stable_partition(__middle, __last,
1781                                                                __pred,
1782                                                                __len
1783                                                                - __len / 2);
1784       std::rotate(__begin, __middle, __end);
1785       std::advance(__begin, std::distance(__middle, __end));
1786       return __begin;
1787     }
1788
1789   /// This is a helper function...
1790   template<typename _ForwardIterator, typename _Pointer, typename _Predicate,
1791            typename _Distance>
1792     _ForwardIterator
1793     __stable_partition_adaptive(_ForwardIterator __first,
1794                                 _ForwardIterator __last,
1795                                 _Predicate __pred, _Distance __len,
1796                                 _Pointer __buffer,
1797                                 _Distance __buffer_size)
1798     {
1799       if (__len <= __buffer_size)
1800         {
1801           _ForwardIterator __result1 = __first;
1802           _Pointer __result2 = __buffer;
1803           for (; __first != __last; ++__first)
1804             if (__pred(*__first))
1805               {
1806                 *__result1 = _GLIBCXX_MOVE(*__first);
1807                 ++__result1;
1808               }
1809             else
1810               {
1811                 *__result2 = _GLIBCXX_MOVE(*__first);
1812                 ++__result2;
1813               }
1814           _GLIBCXX_MOVE3(__buffer, __result2, __result1);
1815           return __result1;
1816         }
1817       else
1818         {
1819           _ForwardIterator __middle = __first;
1820           std::advance(__middle, __len / 2);
1821           _ForwardIterator __begin =
1822             std::__stable_partition_adaptive(__first, __middle, __pred,
1823                                              __len / 2, __buffer,
1824                                              __buffer_size);
1825           _ForwardIterator __end =
1826             std::__stable_partition_adaptive(__middle, __last, __pred,
1827                                              __len - __len / 2,
1828                                              __buffer, __buffer_size);
1829           std::rotate(__begin, __middle, __end);
1830           std::advance(__begin, std::distance(__middle, __end));
1831           return __begin;
1832         }
1833     }
1834
1835   /**
1836    *  @brief Move elements for which a predicate is true to the beginning
1837    *         of a sequence, preserving relative ordering.
1838    *  @ingroup mutating_algorithms
1839    *  @param  first   A forward iterator.
1840    *  @param  last    A forward iterator.
1841    *  @param  pred    A predicate functor.
1842    *  @return  An iterator @p middle such that @p pred(i) is true for each
1843    *  iterator @p i in the range @p [first,middle) and false for each @p i
1844    *  in the range @p [middle,last).
1845    *
1846    *  Performs the same function as @p partition() with the additional
1847    *  guarantee that the relative ordering of elements in each group is
1848    *  preserved, so any two elements @p x and @p y in the range
1849    *  @p [first,last) such that @p pred(x)==pred(y) will have the same
1850    *  relative ordering after calling @p stable_partition().
1851   */
1852   template<typename _ForwardIterator, typename _Predicate>
1853     _ForwardIterator
1854     stable_partition(_ForwardIterator __first, _ForwardIterator __last,
1855                      _Predicate __pred)
1856     {
1857       // concept requirements
1858       __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1859                                   _ForwardIterator>)
1860       __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
1861             typename iterator_traits<_ForwardIterator>::value_type>)
1862       __glibcxx_requires_valid_range(__first, __last);
1863
1864       if (__first == __last)
1865         return __first;
1866       else
1867         {
1868           typedef typename iterator_traits<_ForwardIterator>::value_type
1869             _ValueType;
1870           typedef typename iterator_traits<_ForwardIterator>::difference_type
1871             _DistanceType;
1872
1873           _Temporary_buffer<_ForwardIterator, _ValueType> __buf(__first,
1874                                                                 __last);
1875         if (__buf.size() > 0)
1876           return
1877             std::__stable_partition_adaptive(__first, __last, __pred,
1878                                           _DistanceType(__buf.requested_size()),
1879                                           __buf.begin(),
1880                                           _DistanceType(__buf.size()));
1881         else
1882           return
1883             std::__inplace_stable_partition(__first, __last, __pred,
1884                                          _DistanceType(__buf.requested_size()));
1885         }
1886     }
1887
1888   /// This is a helper function for the sort routines.
1889   template<typename _RandomAccessIterator>
1890     void
1891     __heap_select(_RandomAccessIterator __first,
1892                   _RandomAccessIterator __middle,
1893                   _RandomAccessIterator __last)
1894     {
1895       std::make_heap(__first, __middle);
1896       for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
1897         if (*__i < *__first)
1898           std::__pop_heap(__first, __middle, __i);
1899     }
1900
1901   /// This is a helper function for the sort routines.
1902   template<typename _RandomAccessIterator, typename _Compare>
1903     void
1904     __heap_select(_RandomAccessIterator __first,
1905                   _RandomAccessIterator __middle,
1906                   _RandomAccessIterator __last, _Compare __comp)
1907     {
1908       std::make_heap(__first, __middle, __comp);
1909       for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
1910         if (__comp(*__i, *__first))
1911           std::__pop_heap(__first, __middle, __i, __comp);
1912     }
1913
1914   // partial_sort
1915
1916   /**
1917    *  @brief Copy the smallest elements of a sequence.
1918    *  @ingroup sorting_algorithms
1919    *  @param  first   An iterator.
1920    *  @param  last    Another iterator.
1921    *  @param  result_first   A random-access iterator.
1922    *  @param  result_last    Another random-access iterator.
1923    *  @return   An iterator indicating the end of the resulting sequence.
1924    *
1925    *  Copies and sorts the smallest N values from the range @p [first,last)
1926    *  to the range beginning at @p result_first, where the number of
1927    *  elements to be copied, @p N, is the smaller of @p (last-first) and
1928    *  @p (result_last-result_first).
1929    *  After the sort if @p i and @j are iterators in the range
1930    *  @p [result_first,result_first+N) such that @i precedes @j then
1931    *  @p *j<*i is false.
1932    *  The value returned is @p result_first+N.
1933   */
1934   template<typename _InputIterator, typename _RandomAccessIterator>
1935     _RandomAccessIterator
1936     partial_sort_copy(_InputIterator __first, _InputIterator __last,
1937                       _RandomAccessIterator __result_first,
1938                       _RandomAccessIterator __result_last)
1939     {
1940       typedef typename iterator_traits<_InputIterator>::value_type
1941         _InputValueType;
1942       typedef typename iterator_traits<_RandomAccessIterator>::value_type
1943         _OutputValueType;
1944       typedef typename iterator_traits<_RandomAccessIterator>::difference_type
1945         _DistanceType;
1946
1947       // concept requirements
1948       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1949       __glibcxx_function_requires(_ConvertibleConcept<_InputValueType,
1950                                   _OutputValueType>)
1951       __glibcxx_function_requires(_LessThanOpConcept<_InputValueType,
1952                                                      _OutputValueType>)
1953       __glibcxx_function_requires(_LessThanComparableConcept<_OutputValueType>)
1954       __glibcxx_requires_valid_range(__first, __last);
1955       __glibcxx_requires_valid_range(__result_first, __result_last);
1956
1957       if (__result_first == __result_last)
1958         return __result_last;
1959       _RandomAccessIterator __result_real_last = __result_first;
1960       while(__first != __last && __result_real_last != __result_last)
1961         {
1962           *__result_real_last = *__first;
1963           ++__result_real_last;
1964           ++__first;
1965         }
1966       std::make_heap(__result_first, __result_real_last);
1967       while (__first != __last)
1968         {
1969           if (*__first < *__result_first)
1970             std::__adjust_heap(__result_first, _DistanceType(0),
1971                                _DistanceType(__result_real_last
1972                                              - __result_first),
1973                                _InputValueType(*__first));
1974           ++__first;
1975         }
1976       std::sort_heap(__result_first, __result_real_last);
1977       return __result_real_last;
1978     }
1979
1980   /**
1981    *  @brief Copy the smallest elements of a sequence using a predicate for
1982    *         comparison.
1983    *  @ingroup sorting_algorithms
1984    *  @param  first   An input iterator.
1985    *  @param  last    Another input iterator.
1986    *  @param  result_first   A random-access iterator.
1987    *  @param  result_last    Another random-access iterator.
1988    *  @param  comp    A comparison functor.
1989    *  @return   An iterator indicating the end of the resulting sequence.
1990    *
1991    *  Copies and sorts the smallest N values from the range @p [first,last)
1992    *  to the range beginning at @p result_first, where the number of
1993    *  elements to be copied, @p N, is the smaller of @p (last-first) and
1994    *  @p (result_last-result_first).
1995    *  After the sort if @p i and @j are iterators in the range
1996    *  @p [result_first,result_first+N) such that @i precedes @j then
1997    *  @p comp(*j,*i) is false.
1998    *  The value returned is @p result_first+N.
1999   */
2000   template<typename _InputIterator, typename _RandomAccessIterator, typename _Compare>
2001     _RandomAccessIterator
2002     partial_sort_copy(_InputIterator __first, _InputIterator __last,
2003                       _RandomAccessIterator __result_first,
2004                       _RandomAccessIterator __result_last,
2005                       _Compare __comp)
2006     {
2007       typedef typename iterator_traits<_InputIterator>::value_type
2008         _InputValueType;
2009       typedef typename iterator_traits<_RandomAccessIterator>::value_type
2010         _OutputValueType;
2011       typedef typename iterator_traits<_RandomAccessIterator>::difference_type
2012         _DistanceType;
2013
2014       // concept requirements
2015       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
2016       __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
2017                                   _RandomAccessIterator>)
2018       __glibcxx_function_requires(_ConvertibleConcept<_InputValueType,
2019                                   _OutputValueType>)
2020       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2021                                   _InputValueType, _OutputValueType>)
2022       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2023                                   _OutputValueType, _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, __comp);
2037       while (__first != __last)
2038         {
2039           if (__comp(*__first, *__result_first))
2040             std::__adjust_heap(__result_first, _DistanceType(0),
2041                                _DistanceType(__result_real_last
2042                                              - __result_first),
2043                                _InputValueType(*__first),
2044                                __comp);
2045           ++__first;
2046         }
2047       std::sort_heap(__result_first, __result_real_last, __comp);
2048       return __result_real_last;
2049     }
2050
2051   /// This is a helper function for the sort routine.
2052   template<typename _RandomAccessIterator>
2053     void
2054     __unguarded_linear_insert(_RandomAccessIterator __last)
2055     {
2056       typename iterator_traits<_RandomAccessIterator>::value_type
2057         __val = _GLIBCXX_MOVE(*__last);
2058       _RandomAccessIterator __next = __last;
2059       --__next;
2060       while (__val < *__next)
2061         {
2062           *__last = _GLIBCXX_MOVE(*__next);
2063           __last = __next;
2064           --__next;
2065         }
2066       *__last = _GLIBCXX_MOVE(__val);
2067     }
2068
2069   /// This is a helper function for the sort routine.
2070   template<typename _RandomAccessIterator, typename _Compare>
2071     void
2072     __unguarded_linear_insert(_RandomAccessIterator __last,
2073                               _Compare __comp)
2074     {
2075       typename iterator_traits<_RandomAccessIterator>::value_type
2076         __val = _GLIBCXX_MOVE(*__last);
2077       _RandomAccessIterator __next = __last;
2078       --__next;
2079       while (__comp(__val, *__next))
2080         {
2081           *__last = _GLIBCXX_MOVE(*__next);
2082           __last = __next;
2083           --__next;
2084         }
2085       *__last = _GLIBCXX_MOVE(__val);
2086     }
2087
2088   /// This is a helper function for the sort routine.
2089   template<typename _RandomAccessIterator>
2090     void
2091     __insertion_sort(_RandomAccessIterator __first,
2092                      _RandomAccessIterator __last)
2093     {
2094       if (__first == __last)
2095         return;
2096
2097       for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
2098         {
2099           if (*__i < *__first)
2100             {
2101               typename iterator_traits<_RandomAccessIterator>::value_type
2102                 __val = _GLIBCXX_MOVE(*__i);
2103               _GLIBCXX_MOVE_BACKWARD3(__first, __i, __i + 1);
2104               *__first = _GLIBCXX_MOVE(__val);
2105             }
2106           else
2107             std::__unguarded_linear_insert(__i);
2108         }
2109     }
2110
2111   /// This is a helper function for the sort routine.
2112   template<typename _RandomAccessIterator, typename _Compare>
2113     void
2114     __insertion_sort(_RandomAccessIterator __first,
2115                      _RandomAccessIterator __last, _Compare __comp)
2116     {
2117       if (__first == __last) return;
2118
2119       for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
2120         {
2121           if (__comp(*__i, *__first))
2122             {
2123               typename iterator_traits<_RandomAccessIterator>::value_type
2124                 __val = _GLIBCXX_MOVE(*__i);
2125               _GLIBCXX_MOVE_BACKWARD3(__first, __i, __i + 1);
2126               *__first = _GLIBCXX_MOVE(__val);
2127             }
2128           else
2129             std::__unguarded_linear_insert(__i, __comp);
2130         }
2131     }
2132
2133   /// This is a helper function for the sort routine.
2134   template<typename _RandomAccessIterator>
2135     inline void
2136     __unguarded_insertion_sort(_RandomAccessIterator __first,
2137                                _RandomAccessIterator __last)
2138     {
2139       typedef typename iterator_traits<_RandomAccessIterator>::value_type
2140         _ValueType;
2141
2142       for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
2143         std::__unguarded_linear_insert(__i);
2144     }
2145
2146   /// This is a helper function for the sort routine.
2147   template<typename _RandomAccessIterator, typename _Compare>
2148     inline void
2149     __unguarded_insertion_sort(_RandomAccessIterator __first,
2150                                _RandomAccessIterator __last, _Compare __comp)
2151     {
2152       typedef typename iterator_traits<_RandomAccessIterator>::value_type
2153         _ValueType;
2154
2155       for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
2156         std::__unguarded_linear_insert(__i, __comp);
2157     }
2158
2159   /**
2160    *  @doctodo
2161    *  This controls some aspect of the sort routines.
2162   */
2163   enum { _S_threshold = 16 };
2164
2165   /// This is a helper function for the sort routine.
2166   template<typename _RandomAccessIterator>
2167     void
2168     __final_insertion_sort(_RandomAccessIterator __first,
2169                            _RandomAccessIterator __last)
2170     {
2171       if (__last - __first > int(_S_threshold))
2172         {
2173           std::__insertion_sort(__first, __first + int(_S_threshold));
2174           std::__unguarded_insertion_sort(__first + int(_S_threshold), __last);
2175         }
2176       else
2177         std::__insertion_sort(__first, __last);
2178     }
2179
2180   /// This is a helper function for the sort routine.
2181   template<typename _RandomAccessIterator, typename _Compare>
2182     void
2183     __final_insertion_sort(_RandomAccessIterator __first,
2184                            _RandomAccessIterator __last, _Compare __comp)
2185     {
2186       if (__last - __first > int(_S_threshold))
2187         {
2188           std::__insertion_sort(__first, __first + int(_S_threshold), __comp);
2189           std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,
2190                                           __comp);
2191         }
2192       else
2193         std::__insertion_sort(__first, __last, __comp);
2194     }
2195
2196   /// This is a helper function...
2197   template<typename _RandomAccessIterator, typename _Tp>
2198     _RandomAccessIterator
2199     __unguarded_partition(_RandomAccessIterator __first,
2200                           _RandomAccessIterator __last, const _Tp& __pivot)
2201     {
2202       while (true)
2203         {
2204           while (*__first < __pivot)
2205             ++__first;
2206           --__last;
2207           while (__pivot < *__last)
2208             --__last;
2209           if (!(__first < __last))
2210             return __first;
2211           std::iter_swap(__first, __last);
2212           ++__first;
2213         }
2214     }
2215
2216   /// This is a helper function...
2217   template<typename _RandomAccessIterator, typename _Tp, typename _Compare>
2218     _RandomAccessIterator
2219     __unguarded_partition(_RandomAccessIterator __first,
2220                           _RandomAccessIterator __last,
2221                           const _Tp& __pivot, _Compare __comp)
2222     {
2223       while (true)
2224         {
2225           while (__comp(*__first, __pivot))
2226             ++__first;
2227           --__last;
2228           while (__comp(__pivot, *__last))
2229             --__last;
2230           if (!(__first < __last))
2231             return __first;
2232           std::iter_swap(__first, __last);
2233           ++__first;
2234         }
2235     }
2236
2237   /// This is a helper function...
2238   template<typename _RandomAccessIterator>
2239     inline _RandomAccessIterator
2240     __unguarded_partition_pivot(_RandomAccessIterator __first,
2241                                 _RandomAccessIterator __last)
2242     {
2243       _RandomAccessIterator __mid = __first + (__last - __first) / 2;
2244       std::__move_median_first(__first, __mid, (__last - 1));
2245       return std::__unguarded_partition(__first + 1, __last, *__first);
2246     }
2247
2248
2249   /// This is a helper function...
2250   template<typename _RandomAccessIterator, typename _Compare>
2251     inline _RandomAccessIterator
2252     __unguarded_partition_pivot(_RandomAccessIterator __first,
2253                                 _RandomAccessIterator __last, _Compare __comp)
2254     {
2255       _RandomAccessIterator __mid = __first + (__last - __first) / 2;
2256       std::__move_median_first(__first, __mid, (__last - 1), __comp);
2257       return std::__unguarded_partition(__first + 1, __last, *__first, __comp);
2258     }
2259
2260   /// This is a helper function for the sort routine.
2261   template<typename _RandomAccessIterator, typename _Size>
2262     void
2263     __introsort_loop(_RandomAccessIterator __first,
2264                      _RandomAccessIterator __last,
2265                      _Size __depth_limit)
2266     {
2267       while (__last - __first > int(_S_threshold))
2268         {
2269           if (__depth_limit == 0)
2270             {
2271               _GLIBCXX_STD_P::partial_sort(__first, __last, __last);
2272               return;
2273             }
2274           --__depth_limit;
2275           _RandomAccessIterator __cut =
2276             std::__unguarded_partition_pivot(__first, __last);
2277           std::__introsort_loop(__cut, __last, __depth_limit);
2278           __last = __cut;
2279         }
2280     }
2281
2282   /// This is a helper function for the sort routine.
2283   template<typename _RandomAccessIterator, typename _Size, typename _Compare>
2284     void
2285     __introsort_loop(_RandomAccessIterator __first,
2286                      _RandomAccessIterator __last,
2287                      _Size __depth_limit, _Compare __comp)
2288     {
2289       while (__last - __first > int(_S_threshold))
2290         {
2291           if (__depth_limit == 0)
2292             {
2293               _GLIBCXX_STD_P::partial_sort(__first, __last, __last, __comp);
2294               return;
2295             }
2296           --__depth_limit;
2297           _RandomAccessIterator __cut =
2298             std::__unguarded_partition_pivot(__first, __last, __comp);
2299           std::__introsort_loop(__cut, __last, __depth_limit, __comp);
2300           __last = __cut;
2301         }
2302     }
2303
2304   /// This is a helper function for the sort routines.  Precondition: __n > 0.
2305   template<typename _Size>
2306     inline _Size
2307     __lg(_Size __n)
2308     {
2309       _Size __k;
2310       for (__k = 0; __n != 0; __n >>= 1)
2311         ++__k;
2312       return __k - 1;
2313     }
2314
2315   inline int
2316   __lg(int __n)
2317   { return sizeof(int) * __CHAR_BIT__  - 1 - __builtin_clz(__n); }
2318
2319   inline long
2320   __lg(long __n)
2321   { return sizeof(long) * __CHAR_BIT__ - 1 - __builtin_clzl(__n); }
2322
2323   inline long long
2324   __lg(long long __n)
2325   { return sizeof(long long) * __CHAR_BIT__ - 1 - __builtin_clzll(__n); }
2326
2327   // sort
2328
2329   template<typename _RandomAccessIterator, typename _Size>
2330     void
2331     __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth,
2332                   _RandomAccessIterator __last, _Size __depth_limit)
2333     {
2334       typedef typename iterator_traits<_RandomAccessIterator>::value_type
2335         _ValueType;
2336
2337       while (__last - __first > 3)
2338         {
2339           if (__depth_limit == 0)
2340             {
2341               std::__heap_select(__first, __nth + 1, __last);
2342
2343               // Place the nth largest element in its final position.
2344               std::iter_swap(__first, __nth);
2345               return;
2346             }
2347           --__depth_limit;
2348           _RandomAccessIterator __cut =
2349             std::__unguarded_partition_pivot(__first, __last);
2350           if (__cut <= __nth)
2351             __first = __cut;
2352           else
2353             __last = __cut;
2354         }
2355       std::__insertion_sort(__first, __last);
2356     }
2357
2358   template<typename _RandomAccessIterator, typename _Size, typename _Compare>
2359     void
2360     __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth,
2361                   _RandomAccessIterator __last, _Size __depth_limit,
2362                   _Compare __comp)
2363     {
2364       typedef typename iterator_traits<_RandomAccessIterator>::value_type
2365         _ValueType;
2366
2367       while (__last - __first > 3)
2368         {
2369           if (__depth_limit == 0)
2370             {
2371               std::__heap_select(__first, __nth + 1, __last, __comp);
2372               // Place the nth largest element in its final position.
2373               std::iter_swap(__first, __nth);
2374               return;
2375             }
2376           --__depth_limit;
2377           _RandomAccessIterator __cut =
2378             std::__unguarded_partition_pivot(__first, __last, __comp);
2379           if (__cut <= __nth)
2380             __first = __cut;
2381           else
2382             __last = __cut;
2383         }
2384       std::__insertion_sort(__first, __last, __comp);
2385     }
2386
2387   // nth_element
2388
2389   /**
2390    *  @brief Finds the first position in which @a val could be inserted
2391    *         without changing the ordering.
2392    *  @param  first   An iterator.
2393    *  @param  last    Another iterator.
2394    *  @param  val     The search term.
2395    *  @return         An iterator pointing to the first element <em>not less
2396    *                  than</em> @a val, or end() if every element is less than 
2397    *                  @a val.
2398    *  @ingroup binary_search_algorithms
2399   */
2400   template<typename _ForwardIterator, typename _Tp>
2401     _ForwardIterator
2402     lower_bound(_ForwardIterator __first, _ForwardIterator __last,
2403                 const _Tp& __val)
2404     {
2405       typedef typename iterator_traits<_ForwardIterator>::value_type
2406         _ValueType;
2407       typedef typename iterator_traits<_ForwardIterator>::difference_type
2408         _DistanceType;
2409
2410       // concept requirements
2411       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2412       __glibcxx_function_requires(_LessThanOpConcept<_ValueType, _Tp>)
2413       __glibcxx_requires_partitioned_lower(__first, __last, __val);
2414
2415       _DistanceType __len = std::distance(__first, __last);
2416       _DistanceType __half;
2417       _ForwardIterator __middle;
2418
2419       while (__len > 0)
2420         {
2421           __half = __len >> 1;
2422           __middle = __first;
2423           std::advance(__middle, __half);
2424           if (*__middle < __val)
2425             {
2426               __first = __middle;
2427               ++__first;
2428               __len = __len - __half - 1;
2429             }
2430           else
2431             __len = __half;
2432         }
2433       return __first;
2434     }
2435
2436   /**
2437    *  @brief Finds the first position in which @a val could be inserted
2438    *         without changing the ordering.
2439    *  @ingroup binary_search_algorithms
2440    *  @param  first   An iterator.
2441    *  @param  last    Another iterator.
2442    *  @param  val     The search term.
2443    *  @param  comp    A functor to use for comparisons.
2444    *  @return An iterator pointing to the first element <em>not less
2445    *           than</em> @a val, or end() if every element is less
2446    *           than @a val.
2447    *  @ingroup binary_search_algorithms
2448    *
2449    *  The comparison function should have the same effects on ordering as
2450    *  the function used for the initial sort.
2451   */
2452   template<typename _ForwardIterator, typename _Tp, typename _Compare>
2453     _ForwardIterator
2454     lower_bound(_ForwardIterator __first, _ForwardIterator __last,
2455                 const _Tp& __val, _Compare __comp)
2456     {
2457       typedef typename iterator_traits<_ForwardIterator>::value_type
2458         _ValueType;
2459       typedef typename iterator_traits<_ForwardIterator>::difference_type
2460         _DistanceType;
2461
2462       // concept requirements
2463       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2464       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2465                                   _ValueType, _Tp>)
2466       __glibcxx_requires_partitioned_lower_pred(__first, __last,
2467                                                 __val, __comp);
2468
2469       _DistanceType __len = std::distance(__first, __last);
2470       _DistanceType __half;
2471       _ForwardIterator __middle;
2472
2473       while (__len > 0)
2474         {
2475           __half = __len >> 1;
2476           __middle = __first;
2477           std::advance(__middle, __half);
2478           if (__comp(*__middle, __val))
2479             {
2480               __first = __middle;
2481               ++__first;
2482               __len = __len - __half - 1;
2483             }
2484           else
2485             __len = __half;
2486         }
2487       return __first;
2488     }
2489
2490   /**
2491    *  @brief Finds the last position in which @a val could be inserted
2492    *         without changing the ordering.
2493    *  @ingroup binary_search_algorithms
2494    *  @param  first   An iterator.
2495    *  @param  last    Another iterator.
2496    *  @param  val     The search term.
2497    *  @return  An iterator pointing to the first element greater than @a val,
2498    *           or end() if no elements are greater than @a val.
2499    *  @ingroup binary_search_algorithms
2500   */
2501   template<typename _ForwardIterator, typename _Tp>
2502     _ForwardIterator
2503     upper_bound(_ForwardIterator __first, _ForwardIterator __last,
2504                 const _Tp& __val)
2505     {
2506       typedef typename iterator_traits<_ForwardIterator>::value_type
2507         _ValueType;
2508       typedef typename iterator_traits<_ForwardIterator>::difference_type
2509         _DistanceType;
2510
2511       // concept requirements
2512       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2513       __glibcxx_function_requires(_LessThanOpConcept<_Tp, _ValueType>)
2514       __glibcxx_requires_partitioned_upper(__first, __last, __val);
2515
2516       _DistanceType __len = std::distance(__first, __last);
2517       _DistanceType __half;
2518       _ForwardIterator __middle;
2519
2520       while (__len > 0)
2521         {
2522           __half = __len >> 1;
2523           __middle = __first;
2524           std::advance(__middle, __half);
2525           if (__val < *__middle)
2526             __len = __half;
2527           else
2528             {
2529               __first = __middle;
2530               ++__first;
2531               __len = __len - __half - 1;
2532             }
2533         }
2534       return __first;
2535     }
2536
2537   /**
2538    *  @brief Finds the last position in which @a val could be inserted
2539    *         without changing the ordering.
2540    *  @ingroup binary_search_algorithms
2541    *  @param  first   An iterator.
2542    *  @param  last    Another iterator.
2543    *  @param  val     The search term.
2544    *  @param  comp    A functor to use for comparisons.
2545    *  @return  An iterator pointing to the first element greater than @a val,
2546    *           or end() if no elements are greater than @a val.
2547    *  @ingroup binary_search_algorithms
2548    *
2549    *  The comparison function should have the same effects on ordering as
2550    *  the function used for the initial sort.
2551   */
2552   template<typename _ForwardIterator, typename _Tp, typename _Compare>
2553     _ForwardIterator
2554     upper_bound(_ForwardIterator __first, _ForwardIterator __last,
2555                 const _Tp& __val, _Compare __comp)
2556     {
2557       typedef typename iterator_traits<_ForwardIterator>::value_type
2558         _ValueType;
2559       typedef typename iterator_traits<_ForwardIterator>::difference_type
2560         _DistanceType;
2561
2562       // concept requirements
2563       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2564       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2565                                   _Tp, _ValueType>)
2566       __glibcxx_requires_partitioned_upper_pred(__first, __last,
2567                                                 __val, __comp);
2568
2569       _DistanceType __len = std::distance(__first, __last);
2570       _DistanceType __half;
2571       _ForwardIterator __middle;
2572
2573       while (__len > 0)
2574         {
2575           __half = __len >> 1;
2576           __middle = __first;
2577           std::advance(__middle, __half);
2578           if (__comp(__val, *__middle))
2579             __len = __half;
2580           else
2581             {
2582               __first = __middle;
2583               ++__first;
2584               __len = __len - __half - 1;
2585             }
2586         }
2587       return __first;
2588     }
2589
2590   /**
2591    *  @brief Finds the largest subrange in which @a val could be inserted
2592    *         at any place in it without changing the ordering.
2593    *  @ingroup binary_search_algorithms
2594    *  @param  first   An iterator.
2595    *  @param  last    Another iterator.
2596    *  @param  val     The search term.
2597    *  @return  An pair of iterators defining the subrange.
2598    *  @ingroup binary_search_algorithms
2599    *
2600    *  This is equivalent to
2601    *  @code
2602    *    std::make_pair(lower_bound(first, last, val),
2603    *                   upper_bound(first, last, val))
2604    *  @endcode
2605    *  but does not actually call those functions.
2606   */
2607   template<typename _ForwardIterator, typename _Tp>
2608     pair<_ForwardIterator, _ForwardIterator>
2609     equal_range(_ForwardIterator __first, _ForwardIterator __last,
2610                 const _Tp& __val)
2611     {
2612       typedef typename iterator_traits<_ForwardIterator>::value_type
2613         _ValueType;
2614       typedef typename iterator_traits<_ForwardIterator>::difference_type
2615         _DistanceType;
2616
2617       // concept requirements
2618       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2619       __glibcxx_function_requires(_LessThanOpConcept<_ValueType, _Tp>)
2620       __glibcxx_function_requires(_LessThanOpConcept<_Tp, _ValueType>)  
2621       __glibcxx_requires_partitioned_lower(__first, __last, __val);
2622       __glibcxx_requires_partitioned_upper(__first, __last, __val);      
2623
2624       _DistanceType __len = std::distance(__first, __last);
2625       _DistanceType __half;
2626       _ForwardIterator __middle, __left, __right;
2627
2628       while (__len > 0)
2629         {
2630           __half = __len >> 1;
2631           __middle = __first;
2632           std::advance(__middle, __half);
2633           if (*__middle < __val)
2634             {
2635               __first = __middle;
2636               ++__first;
2637               __len = __len - __half - 1;
2638             }
2639           else if (__val < *__middle)
2640             __len = __half;
2641           else
2642             {
2643               __left = std::lower_bound(__first, __middle, __val);
2644               std::advance(__first, __len);
2645               __right = std::upper_bound(++__middle, __first, __val);
2646               return pair<_ForwardIterator, _ForwardIterator>(__left, __right);
2647             }
2648         }
2649       return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
2650     }
2651
2652   /**
2653    *  @brief Finds the largest subrange in which @a val could be inserted
2654    *         at any place in it without changing the ordering.
2655    *  @param  first   An iterator.
2656    *  @param  last    Another iterator.
2657    *  @param  val     The search term.
2658    *  @param  comp    A functor to use for comparisons.
2659    *  @return  An pair of iterators defining the subrange.
2660    *  @ingroup binary_search_algorithms
2661    *
2662    *  This is equivalent to
2663    *  @code
2664    *    std::make_pair(lower_bound(first, last, val, comp),
2665    *                   upper_bound(first, last, val, comp))
2666    *  @endcode
2667    *  but does not actually call those functions.
2668   */
2669   template<typename _ForwardIterator, typename _Tp, typename _Compare>
2670     pair<_ForwardIterator, _ForwardIterator>
2671     equal_range(_ForwardIterator __first, _ForwardIterator __last,
2672                 const _Tp& __val,
2673                 _Compare __comp)
2674     {
2675       typedef typename iterator_traits<_ForwardIterator>::value_type
2676         _ValueType;
2677       typedef typename iterator_traits<_ForwardIterator>::difference_type
2678         _DistanceType;
2679
2680       // concept requirements
2681       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2682       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2683                                   _ValueType, _Tp>)
2684       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2685                                   _Tp, _ValueType>)
2686       __glibcxx_requires_partitioned_lower_pred(__first, __last,
2687                                                 __val, __comp);
2688       __glibcxx_requires_partitioned_upper_pred(__first, __last,
2689                                                 __val, __comp);
2690
2691       _DistanceType __len = std::distance(__first, __last);
2692       _DistanceType __half;
2693       _ForwardIterator __middle, __left, __right;
2694
2695       while (__len > 0)
2696         {
2697           __half = __len >> 1;
2698           __middle = __first;
2699           std::advance(__middle, __half);
2700           if (__comp(*__middle, __val))
2701             {
2702               __first = __middle;
2703               ++__first;
2704               __len = __len - __half - 1;
2705             }
2706           else if (__comp(__val, *__middle))
2707             __len = __half;
2708           else
2709             {
2710               __left = std::lower_bound(__first, __middle, __val, __comp);
2711               std::advance(__first, __len);
2712               __right = std::upper_bound(++__middle, __first, __val, __comp);
2713               return pair<_ForwardIterator, _ForwardIterator>(__left, __right);
2714             }
2715         }
2716       return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
2717     }
2718
2719   /**
2720    *  @brief Determines whether an element exists in a range.
2721    *  @ingroup binary_search_algorithms
2722    *  @param  first   An iterator.
2723    *  @param  last    Another iterator.
2724    *  @param  val     The search term.
2725    *  @return  True if @a val (or its equivalent) is in [@a first,@a last ].
2726    *
2727    *  Note that this does not actually return an iterator to @a val.  For
2728    *  that, use std::find or a container's specialized find member functions.
2729   */
2730   template<typename _ForwardIterator, typename _Tp>
2731     bool
2732     binary_search(_ForwardIterator __first, _ForwardIterator __last,
2733                   const _Tp& __val)
2734     {
2735       typedef typename iterator_traits<_ForwardIterator>::value_type
2736         _ValueType;
2737
2738       // concept requirements
2739       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2740       __glibcxx_function_requires(_LessThanOpConcept<_Tp, _ValueType>)
2741       __glibcxx_requires_partitioned_lower(__first, __last, __val);
2742       __glibcxx_requires_partitioned_upper(__first, __last, __val);
2743
2744       _ForwardIterator __i = std::lower_bound(__first, __last, __val);
2745       return __i != __last && !(__val < *__i);
2746     }
2747
2748   /**
2749    *  @brief Determines whether an element exists in a range.
2750    *  @ingroup binary_search_algorithms
2751    *  @param  first   An iterator.
2752    *  @param  last    Another iterator.
2753    *  @param  val     The search term.
2754    *  @param  comp    A functor to use for comparisons.
2755    *  @return  True if @a val (or its equivalent) is in [@a first,@a last ].
2756    *
2757    *  Note that this does not actually return an iterator to @a val.  For
2758    *  that, use std::find or a container's specialized find member functions.
2759    *
2760    *  The comparison function should have the same effects on ordering as
2761    *  the function used for the initial sort.
2762   */
2763   template<typename _ForwardIterator, typename _Tp, typename _Compare>
2764     bool
2765     binary_search(_ForwardIterator __first, _ForwardIterator __last,
2766                   const _Tp& __val, _Compare __comp)
2767     {
2768       typedef typename iterator_traits<_ForwardIterator>::value_type
2769         _ValueType;
2770
2771       // concept requirements
2772       __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2773       __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2774                                   _Tp, _ValueType>)
2775       __glibcxx_requires_partitioned_lower_pred(__first, __last,
2776                                                 __val, __comp);
2777       __glibcxx_requires_partitioned_upper_pred(__first, __last,
2778                                                 __val, __comp);
2779
2780       _ForwardIterator __i = std::lower_bound(__first, __last, __val, __comp);
2781       return __i != __last && !bool(__comp(__val, *__i));
2782     }
2783
2784   // merge
2785
2786   /// This is a helper function for the merge routines.
2787   template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
2788            typename _BidirectionalIterator3>
2789     _BidirectionalIterator3
2790     __merge_backward(_BidirectionalIterator1 __first1,
2791                      _BidirectionalIterator1 __last1,
2792                      _BidirectionalIterator2 __first2,
2793                      _BidirectionalIterator2 __last2,
2794                      _BidirectionalIterator3 __result)
2795     {
2796       if (__first1 == __last1)
2797         return std::copy_backward(__first2, __last2, __result);
2798       if (__first2 == __last2)
2799         return std::copy_backward(__first1, __last1, __result);
2800       --__last1;
2801       --__last2;
2802       while (true)
2803         {
2804           if (*__last2 < *__last1)
2805             {
2806               *--__result = *__last1;
2807               if (__first1 == __last1)
2808                 return std::copy_backward(__first2, ++__last2, __result);
2809               --__last1;
2810             }
2811           else
2812             {
2813               *--__result = *__last2;
2814               if (__first2 == __last2)
2815                 return std::copy_backward(__first1, ++__last1, __result);
2816               --__last2;
2817             }
2818         }
2819     }
2820
2821   /// This is a helper function for the merge routines.
2822   template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
2823            typename _BidirectionalIterator3, typename _Compare>
2824     _BidirectionalIterator3
2825     __merge_backward(_BidirectionalIterator1 __first1,
2826                      _BidirectionalIterator1 __last1,
2827                      _BidirectionalIterator2 __first2,
2828                      _BidirectionalIterator2 __last2,
2829                      _BidirectionalIterator3 __result,
2830                      _Compare __comp)
2831     {
2832       if (__first1 == __last1)
2833         return std::copy_backward(__first2, __last2, __result);
2834       if (__first2 == __last2)
2835         return std::copy_backward(__first1, __last1, __result);
2836       --__last1;
2837       --__last2;
2838       while (true)
2839         {
2840           if (__comp(*__last2, *__last1))
2841             {
2842               *--__result = *__last1;
2843               if (__first1 == __last1)
2844                 return std::copy_backward(__first2, ++__last2, __result);
2845               --__last1;
2846             }
2847           else
2848             {
2849               *--__result = *__last2;
2850               if (__first2 == __last2)
2851                 return std::copy_backward(__first1, ++__last1, __result);
2852               --__last2;
2853             }
2854         }
2855     }
2856
2857   /// This is a helper function for the merge routines.
2858   template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
2859            typename _Distance>
2860     _BidirectionalIterator1
2861     __rotate_adaptive(_BidirectionalIterator1 __first,
2862                       _BidirectionalIterator1 __middle,
2863                       _BidirectionalIterator1 __last,
2864                       _Distance __len1, _Distance __len2,
2865                       _BidirectionalIterator2 __buffer,
2866                       _Distance __buffer_size)
2867     {
2868       _BidirectionalIterator2 __buffer_end;
2869       if (__len1 > __len2 && __len2 <= __buffer_size)
2870         {
2871           __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
2872           _GLIBCXX_MOVE_BACKWARD3(__first, __middle, __last);
2873           return _GLIBCXX_MOVE3(__buffer, __buffer_end, __first);
2874         }
2875       else if (__len1 <= __buffer_size)
2876         {
2877           __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
2878           _GLIBCXX_MOVE3(__middle, __last, __first);
2879           return _GLIBCXX_MOVE_BACKWARD3(__buffer, __buffer_end, __last);
2880         }
2881       else
2882         {
2883           std::rotate(__first, __middle, __last);
2884           std::advance(__first, std::distance(__middle, __last));
2885           return __first;
2886         }
2887     }
2888
2889   /// This is a helper function for the merge routines.
2890   template<typename _BidirectionalIterator, typename _Distance,
2891            typename _Pointer>
2892     void
2893     __merge_adaptive(_BidirectionalIterator __first,
2894                      _BidirectionalIterator __middle,
2895                      _BidirectionalIterator __last,
2896                      _Distance __len1, _Distance __len2,
2897                      _Pointer __buffer, _Distance __buffer_size)
2898     {
2899       if (__len1 <= __len2 && __len1 <= __buffer_size)
2900         {
2901           _Pointer __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
2902           _GLIBCXX_STD_P::merge(_GLIBCXX_MAKE_MOVE_ITERATOR(__buffer),
2903                                 _GLIBCXX_MAKE_MOVE_ITERATOR(__buffer_end),
2904                                 _GLIBCXX_MAKE_MOVE_ITERATOR(__middle),
2905                                 _GLIBCXX_MAKE_MOVE_ITERATOR(__last),
2906                                 __first);
2907         }
2908       else if (__len2 <= __buffer_size)
2909         {
2910           _Pointer __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
2911           std::__merge_backward(_GLIBCXX_MAKE_MOVE_ITERATOR(__first),
2912                                 _GLIBCXX_MAKE_MOVE_ITERATOR(__middle),
2913                                 _GLIBCXX_MAKE_MOVE_ITERATOR(__buffer),
2914                                 _GLIBCXX_MAKE_MOVE_ITERATOR(__buffer_end),
2915                                 __last);
2916         }
2917       else
2918         {
2919           _BidirectionalIterator __first_cut = __first;
2920           _BidirectionalIterator __second_cut = __middle;
2921           _Distance __len11 = 0;
2922           _Distance __len22 = 0;
2923           if (__len1 > __len2)
2924             {
2925               __len11 = __len1 / 2;
2926               std::advance(__first_cut, __len11);
2927               __second_cut = std::lower_bound(__middle, __last,
2928                                               *__first_cut);
2929               __len22 = std::distance(__middle, __second_cut);
2930             }
2931           else
2932             {
2933               __len22 = __len2 / 2;
2934               std::advance(__second_cut, __len22);
2935               __first_cut = std::upper_bound(__first, __middle,
2936                                              *__second_cut);
2937               __len11 = std::distance(__first, __first_cut);
2938             }
2939           _BidirectionalIterator __new_middle =
2940             std::__rotate_adaptive(__first_cut, __middle, __second_cut,
2941                                    __len1 - __len11, __len22, __buffer,
2942                                    __buffer_size);
2943           std::__merge_adaptive(__first, __first_cut, __new_middle, __len11,
2944                                 __len22, __buffer, __buffer_size);
2945           std::__merge_adaptive(__new_middle, __second_cut, __last,
2946                                 __len1 - __len11,
2947                                 __len2 - __len22, __buffer, __buffer_size);
2948         }
2949     }
2950
2951   /// This is a helper function for the merge routines.
2952   template<typename _BidirectionalIterator, typename _Distance, 
2953            typename _Pointer, typename _Compare>
2954     void
2955     __merge_adaptive(_BidirectionalIterator __first,
2956                      _BidirectionalIterator __middle,
2957                      _BidirectionalIterator __last,
2958                      _Distance __len1, _Distance __len2,
2959                      _Pointer __buffer, _Distance __buffer_size,
2960                      _Compare __comp)
2961     {
2962       if (__len1 <= __len2 && __len1 <= __buffer_size)
2963         {
2964           _Pointer __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
2965           _GLIBCXX_STD_P::merge(_GLIBCXX_MAKE_MOVE_ITERATOR(__buffer),
2966                                 _GLIBCXX_MAKE_MOVE_ITERATOR(__buffer_end),
2967                                 _GLIBCXX_MAKE_MOVE_ITERATOR(__middle),
2968                                 _GLIBCXX_MAKE_MOVE_ITERATOR(__last),
2969                                 __first, __comp);
2970         }
2971       else if (__len2 <= __buffer_size)
2972         {
2973           _Pointer __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
2974           std::__merge_backward(_GLIBCXX_MAKE_MOVE_ITERATOR(__first),
2975                                 _GLIBCXX_MAKE_MOVE_ITERATOR(__middle),
2976                                 _GLIBCXX_MAKE_MOVE_ITERATOR(__buffer),
2977                                 _GLIBCXX_MAKE_MOVE_ITERATOR(__buffer_end),
2978                                 __last,__comp);
2979         }
2980       else
2981         {
2982           _BidirectionalIterator __first_cut = __first;
2983           _BidirectionalIterator __second_cut = __middle;
2984           _Distance __len11 = 0;
2985           _Distance __len22 = 0;
2986           if (__len1 > __len2)
2987             {
2988               __len11 = __len1 / 2;
2989               std::advance(__first_cut, __len11);
2990               __second_cut = std::lower_bound(__middle, __last, *__first_cut,
2991                                               __comp);
2992               __len22 = std::distance(__middle, __second_cut);
2993             }
2994           else
2995             {
2996               __len22 = __len2 / 2;
2997               std::advance(__second_cut, __len22);
2998               __first_cut = std::upper_bound(__first, __middle, *__second_cut,
2999                                              __comp);
3000               __len11 = std::distance(__first, __first_cut);
3001             }
3002           _BidirectionalIterator __new_middle =
3003             std::__rotate_adaptive(__first_cut, __middle, __second_cut,
3004                                    __len1 - __len11, __len22, __buffer,
3005                                    __buffer_size);
3006           std::__merge_adaptive(__first, __first_cut, __new_middle, __len11,
3007                                 __len22, __buffer, __buffer_size, __comp);
3008           std::__merge_adaptive(__new_middle, __second_cut, __last,
3009                                 __len1 - __len11,
3010                                 __len2 - __len22, __buffer,
3011                                 __buffer_size, __comp);
3012         }
3013     }
3014
3015   /// This is a helper function for the merge routines.
3016   template<typename _BidirectionalIterator, typename _Distance>
3017     void
3018     __merge_without_buffer(_BidirectionalIterator __first,
3019                            _BidirectionalIterator __middle,
3020                            _BidirectionalIterator __last,
3021                            _Distance __len1, _Distance __len2)
3022     {
3023       if (__len1 == 0 || __len2 == 0)
3024         return;
3025       if (__len1 + __len2 == 2)
3026         {
3027           if (*__middle < *__first)
3028             std::iter_swap(__first, __middle);
3029           return;
3030         }
3031       _BidirectionalIterator __first_cut = __first;
3032       _BidirectionalIterator __second_cut = __middle;
3033       _Distance __len11 = 0;
3034       _Distance __len22 = 0;
3035       if (__len1 > __len2)
3036         {
3037           __len11 = __len1 / 2;
3038           std::advance(__first_cut, __len11);
3039           __second_cut = std::lower_bound(__middle, __last, *__first_cut);
3040           __len22 = std::distance(__middle, __second_cut);
3041         }
3042       else
3043         {
3044           __len22 = __len2 / 2;
3045           std::advance(__second_cut, __len22);
3046           __first_cut = std::upper_bound(__first, __middle, *__second_cut);
3047           __len11 = std::distance(__first, __first_cut);
3048         }
3049       std::rotate(__first_cut, __middle, __second_cut);
3050       _BidirectionalIterator __new_middle = __first_cut;
3051       std::advance(__new_middle, std::distance(__middle, __second_cut));
3052       std::__merge_without_buffer(__first, __first_cut, __new_middle,
3053                                   __len11, __len22);
3054       std::__merge_without_buffer(__new_middle, __second_cut, __last,
3055                                   __len1 - __len11, __len2 - __len22);
3056     }
3057
3058   /// This is a helper function for the merge routines.
3059   template<typename _BidirectionalIterator, typename _Distance,
3060            typename _Compare>
3061     void
3062     __merge_without_buffer(_BidirectionalIterator __first,
3063                            _BidirectionalIterator __middle,
3064                            _BidirectionalIterator __last,
3065                            _Distance __len1, _Distance __len2,
3066                            _Compare __comp)
3067     {
3068       if (__len1 == 0 || __len2 == 0)
3069         return;
3070       if (__len1 + __len2 == 2)
3071         {
3072           if (__comp(*__middle, *__first))
3073             std::iter_swap(__first, __middle);
3074           return;
3075         }
3076       _BidirectionalIterator __first_cut = __first;
3077       _BidirectionalIterator __second_cut = __middle;
3078       _Distance __len11 = 0;
3079       _Distance __len22 = 0;
3080       if (__len1 > __len2)
3081         {
3082           __len11 = __len1 / 2;
3083           std::advance(__first_cut, __len11);
3084           __second_cut = std::lower_bound(__middle, __last, *__first_cut,
3085                                           __comp);
3086           __len22 = std::distance(__middle, __second_cut);
3087         }
3088       else
3089         {
3090           __len22 = __len2 / 2;
3091           std::advance(__second_cut, __len22);
3092           __first_cut = std::upper_bound(__first, __middle, *__second_cut,
3093                                          __comp);
3094           __len11 = std::distance(__first, __first_cut);
3095         }
3096       std::rotate(__first_cut, __middle, __second_cut);
3097       _BidirectionalIterator __new_middle = __first_cut;
3098       std::advance(__new_middle, std::distance(__middle, __second_cut));
3099       std::__merge_without_buffer(__first, __first_cut, __new_middle,
3100                                   __len11, __len22, __comp);
3101       std::__merge_without_buffer(__new_middle, __second_cut, __last,
3102                                   __len1 - __len11, __len2 - __len22, __comp);
3103     }
3104
3105   /**
3106    *  @brief Merges two sorted ranges in place.
3107    *  @ingroup sorting_algorithms
3108    *  @param  first   An iterator.
3109    *  @param  middle  Another iterator.
3110    *  @param  last    Another iterator.
3111    *  @return  Nothing.
3112    *
3113    *  Merges two sorted and consecutive ranges, [first,middle) and
3114    *  [middle,last), and puts the result in [first,last).  The output will
3115    *  be sorted.  The sort is @e stable, that is, for equivalent
3116    *  elements in the two ranges, elements from the first range will always
3117    *  come before elements from the second.
3118    *
3119    *  If enough additional memory is available, this takes (last-first)-1
3120    *  comparisons.  Otherwise an NlogN algorithm is used, where N is
3121    *  distance(first,last).
3122   */
3123   template<typename _BidirectionalIterator>
3124     void
3125     inplace_merge(_BidirectionalIterator __first,
3126                   _BidirectionalIterator __middle,
3127                   _BidirectionalIterator __last)
3128     {
3129       typedef typename iterator_traits<_BidirectionalIterator>::value_type
3130           _ValueType;