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