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