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