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