1// Core algorithmic facilities -*- C++ -*-
2
3// Copyright (C) 2001-2022 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-1998
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_algobase.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_ALGOBASE_H
57#define _STL_ALGOBASE_H 1
58
59#include <bits/c++config.h>
60#include <bits/functexcept.h>
61#include <bits/cpp_type_traits.h>
62#include <ext/type_traits.h>
63#include <ext/numeric_traits.h>
64#include <bits/stl_pair.h>
65#include <bits/stl_iterator_base_types.h>
66#include <bits/stl_iterator_base_funcs.h>
67#include <bits/stl_iterator.h>
68#include <bits/concept_check.h>
69#include <debug/debug.h>
70#include <bits/move.h> // For std::swap
71#include <bits/predefined_ops.h>
72#if __cplusplus >= 201103L
73# include <type_traits>
74#endif
75#if __cplusplus > 201703L
76# include <compare>
77#endif
78
79namespace std _GLIBCXX_VISIBILITY(default)
80{
81_GLIBCXX_BEGIN_NAMESPACE_VERSION
82
83  /*
84   * A constexpr wrapper for __builtin_memcmp.
85   * @param __num The number of elements of type _Tp (not bytes).
86   */
87  template<typename _Tp, typename _Up>
88    _GLIBCXX14_CONSTEXPR
89    inline int
90    __memcmp(const _Tp* __first1, const _Up* __first2, size_t __num)
91    {
92#if __cplusplus >= 201103L
93      static_assert(sizeof(_Tp) == sizeof(_Up), "can be compared with memcmp");
94#endif
95#ifdef __cpp_lib_is_constant_evaluated
96      if (std::is_constant_evaluated())
97	{
98	  for(; __num > 0; ++__first1, ++__first2, --__num)
99	    if (*__first1 != *__first2)
100	      return *__first1 < *__first2 ? -1 : 1;
101	  return 0;
102	}
103      else
104#endif
105	return __builtin_memcmp(__first1, __first2, sizeof(_Tp) * __num);
106    }
107
108#if __cplusplus < 201103L
109  // See http://gcc.gnu.org/ml/libstdc++/2004-08/msg00167.html: in a
110  // nutshell, we are partially implementing the resolution of DR 187,
111  // when it's safe, i.e., the value_types are equal.
112  template<bool _BoolType>
113    struct __iter_swap
114    {
115      template<typename _ForwardIterator1, typename _ForwardIterator2>
116	static void
117	iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
118	{
119	  typedef typename iterator_traits<_ForwardIterator1>::value_type
120	    _ValueType1;
121	  _ValueType1 __tmp = *__a;
122	  *__a = *__b;
123	  *__b = __tmp;
124	}
125    };
126
127  template<>
128    struct __iter_swap<true>
129    {
130      template<typename _ForwardIterator1, typename _ForwardIterator2>
131	static void
132	iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
133	{
134	  swap(*__a, *__b);
135	}
136    };
137#endif // C++03
138
139  /**
140   *  @brief Swaps the contents of two iterators.
141   *  @ingroup mutating_algorithms
142   *  @param  __a  An iterator.
143   *  @param  __b  Another iterator.
144   *  @return   Nothing.
145   *
146   *  This function swaps the values pointed to by two iterators, not the
147   *  iterators themselves.
148  */
149  template<typename _ForwardIterator1, typename _ForwardIterator2>
150    _GLIBCXX20_CONSTEXPR
151    inline void
152    iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
153    {
154      // concept requirements
155      __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
156				  _ForwardIterator1>)
157      __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
158				  _ForwardIterator2>)
159
160#if __cplusplus < 201103L
161      typedef typename iterator_traits<_ForwardIterator1>::value_type
162	_ValueType1;
163      typedef typename iterator_traits<_ForwardIterator2>::value_type
164	_ValueType2;
165
166      __glibcxx_function_requires(_ConvertibleConcept<_ValueType1,
167				  _ValueType2>)
168      __glibcxx_function_requires(_ConvertibleConcept<_ValueType2,
169				  _ValueType1>)
170
171      typedef typename iterator_traits<_ForwardIterator1>::reference
172	_ReferenceType1;
173      typedef typename iterator_traits<_ForwardIterator2>::reference
174	_ReferenceType2;
175      std::__iter_swap<__are_same<_ValueType1, _ValueType2>::__value
176	&& __are_same<_ValueType1&, _ReferenceType1>::__value
177	&& __are_same<_ValueType2&, _ReferenceType2>::__value>::
178	iter_swap(__a, __b);
179#else
180      // _GLIBCXX_RESOLVE_LIB_DEFECTS
181      // 187. iter_swap underspecified
182      swap(*__a, *__b);
183#endif
184    }
185
186  /**
187   *  @brief Swap the elements of two sequences.
188   *  @ingroup mutating_algorithms
189   *  @param  __first1  A forward iterator.
190   *  @param  __last1   A forward iterator.
191   *  @param  __first2  A forward iterator.
192   *  @return   An iterator equal to @p first2+(last1-first1).
193   *
194   *  Swaps each element in the range @p [first1,last1) with the
195   *  corresponding element in the range @p [first2,(last1-first1)).
196   *  The ranges must not overlap.
197  */
198  template<typename _ForwardIterator1, typename _ForwardIterator2>
199    _GLIBCXX20_CONSTEXPR
200    _ForwardIterator2
201    swap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
202		_ForwardIterator2 __first2)
203    {
204      // concept requirements
205      __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
206				  _ForwardIterator1>)
207      __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
208				  _ForwardIterator2>)
209      __glibcxx_requires_valid_range(__first1, __last1);
210
211      for (; __first1 != __last1; ++__first1, (void)++__first2)
212	std::iter_swap(__first1, __first2);
213      return __first2;
214    }
215
216  /**
217   *  @brief This does what you think it does.
218   *  @ingroup sorting_algorithms
219   *  @param  __a  A thing of arbitrary type.
220   *  @param  __b  Another thing of arbitrary type.
221   *  @return   The lesser of the parameters.
222   *
223   *  This is the simple classic generic implementation.  It will work on
224   *  temporary expressions, since they are only evaluated once, unlike a
225   *  preprocessor macro.
226  */
227  template<typename _Tp>
228    _GLIBCXX14_CONSTEXPR
229    inline const _Tp&
230    min(const _Tp& __a, const _Tp& __b)
231    {
232      // concept requirements
233      __glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
234      //return __b < __a ? __b : __a;
235      if (__b < __a)
236	return __b;
237      return __a;
238    }
239
240  /**
241   *  @brief This does what you think it does.
242   *  @ingroup sorting_algorithms
243   *  @param  __a  A thing of arbitrary type.
244   *  @param  __b  Another thing of arbitrary type.
245   *  @return   The greater of the parameters.
246   *
247   *  This is the simple classic generic implementation.  It will work on
248   *  temporary expressions, since they are only evaluated once, unlike a
249   *  preprocessor macro.
250  */
251  template<typename _Tp>
252    _GLIBCXX14_CONSTEXPR
253    inline const _Tp&
254    max(const _Tp& __a, const _Tp& __b)
255    {
256      // concept requirements
257      __glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
258      //return  __a < __b ? __b : __a;
259      if (__a < __b)
260	return __b;
261      return __a;
262    }
263
264  /**
265   *  @brief This does what you think it does.
266   *  @ingroup sorting_algorithms
267   *  @param  __a  A thing of arbitrary type.
268   *  @param  __b  Another thing of arbitrary type.
269   *  @param  __comp  A @link comparison_functors comparison functor@endlink.
270   *  @return   The lesser of the parameters.
271   *
272   *  This will work on temporary expressions, since they are only evaluated
273   *  once, unlike a preprocessor macro.
274  */
275  template<typename _Tp, typename _Compare>
276    _GLIBCXX14_CONSTEXPR
277    inline const _Tp&
278    min(const _Tp& __a, const _Tp& __b, _Compare __comp)
279    {
280      //return __comp(__b, __a) ? __b : __a;
281      if (__comp(__b, __a))
282	return __b;
283      return __a;
284    }
285
286  /**
287   *  @brief This does what you think it does.
288   *  @ingroup sorting_algorithms
289   *  @param  __a  A thing of arbitrary type.
290   *  @param  __b  Another thing of arbitrary type.
291   *  @param  __comp  A @link comparison_functors comparison functor@endlink.
292   *  @return   The greater of the parameters.
293   *
294   *  This will work on temporary expressions, since they are only evaluated
295   *  once, unlike a preprocessor macro.
296  */
297  template<typename _Tp, typename _Compare>
298    _GLIBCXX14_CONSTEXPR
299    inline const _Tp&
300    max(const _Tp& __a, const _Tp& __b, _Compare __comp)
301    {
302      //return __comp(__a, __b) ? __b : __a;
303      if (__comp(__a, __b))
304	return __b;
305      return __a;
306    }
307
308  // Fallback implementation of the function in bits/stl_iterator.h used to
309  // remove the __normal_iterator wrapper. See copy, fill, ...
310  template<typename _Iterator>
311    _GLIBCXX20_CONSTEXPR
312    inline _Iterator
313    __niter_base(_Iterator __it)
314    _GLIBCXX_NOEXCEPT_IF(std::is_nothrow_copy_constructible<_Iterator>::value)
315    { return __it; }
316
317  template<typename _Ite, typename _Seq>
318    _Ite
319    __niter_base(const ::__gnu_debug::_Safe_iterator<_Ite, _Seq,
320		 std::random_access_iterator_tag>&);
321
322  // Reverse the __niter_base transformation to get a
323  // __normal_iterator back again (this assumes that __normal_iterator
324  // is only used to wrap random access iterators, like pointers).
325  template<typename _From, typename _To>
326    _GLIBCXX20_CONSTEXPR
327    inline _From
328    __niter_wrap(_From __from, _To __res)
329    { return __from + (__res - std::__niter_base(__from)); }
330
331  // No need to wrap, iterator already has the right type.
332  template<typename _Iterator>
333    _GLIBCXX20_CONSTEXPR
334    inline _Iterator
335    __niter_wrap(const _Iterator&, _Iterator __res)
336    { return __res; }
337
338  // All of these auxiliary structs serve two purposes.  (1) Replace
339  // calls to copy with memmove whenever possible.  (Memmove, not memcpy,
340  // because the input and output ranges are permitted to overlap.)
341  // (2) If we're using random access iterators, then write the loop as
342  // a for loop with an explicit count.
343
344  template<bool _IsMove, bool _IsSimple, typename _Category>
345    struct __copy_move
346    {
347      template<typename _II, typename _OI>
348	_GLIBCXX20_CONSTEXPR
349	static _OI
350	__copy_m(_II __first, _II __last, _OI __result)
351	{
352	  for (; __first != __last; ++__result, (void)++__first)
353	    *__result = *__first;
354	  return __result;
355	}
356    };
357
358#if __cplusplus >= 201103L
359  template<typename _Category>
360    struct __copy_move<true, false, _Category>
361    {
362      template<typename _II, typename _OI>
363	_GLIBCXX20_CONSTEXPR
364	static _OI
365	__copy_m(_II __first, _II __last, _OI __result)
366	{
367	  for (; __first != __last; ++__result, (void)++__first)
368	    *__result = std::move(*__first);
369	  return __result;
370	}
371    };
372#endif
373
374  template<>
375    struct __copy_move<false, false, random_access_iterator_tag>
376    {
377      template<typename _II, typename _OI>
378	_GLIBCXX20_CONSTEXPR
379	static _OI
380	__copy_m(_II __first, _II __last, _OI __result)
381	{
382	  typedef typename iterator_traits<_II>::difference_type _Distance;
383	  for(_Distance __n = __last - __first; __n > 0; --__n)
384	    {
385	      *__result = *__first;
386	      ++__first;
387	      ++__result;
388	    }
389	  return __result;
390	}
391    };
392
393#if __cplusplus >= 201103L
394  template<>
395    struct __copy_move<true, false, random_access_iterator_tag>
396    {
397      template<typename _II, typename _OI>
398	_GLIBCXX20_CONSTEXPR
399	static _OI
400	__copy_m(_II __first, _II __last, _OI __result)
401	{
402	  typedef typename iterator_traits<_II>::difference_type _Distance;
403	  for(_Distance __n = __last - __first; __n > 0; --__n)
404	    {
405	      *__result = std::move(*__first);
406	      ++__first;
407	      ++__result;
408	    }
409	  return __result;
410	}
411    };
412#endif
413
414  template<bool _IsMove>
415    struct __copy_move<_IsMove, true, random_access_iterator_tag>
416    {
417      template<typename _Tp>
418	_GLIBCXX20_CONSTEXPR
419	static _Tp*
420	__copy_m(const _Tp* __first, const _Tp* __last, _Tp* __result)
421	{
422#if __cplusplus >= 201103L
423	  using __assignable = __conditional_t<_IsMove,
424					       is_move_assignable<_Tp>,
425					       is_copy_assignable<_Tp>>;
426	  // trivial types can have deleted assignment
427	  static_assert( __assignable::value, "type must be assignable" );
428#endif
429	  const ptrdiff_t _Num = __last - __first;
430	  if (_Num)
431	    __builtin_memmove(__result, __first, sizeof(_Tp) * _Num);
432	  return __result + _Num;
433	}
434    };
435
436_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
437
438  template<typename _Tp, typename _Ref, typename _Ptr>
439    struct _Deque_iterator;
440
441  struct _Bit_iterator;
442
443_GLIBCXX_END_NAMESPACE_CONTAINER
444
445  // Helpers for streambuf iterators (either istream or ostream).
446  // NB: avoid including <iosfwd>, relatively large.
447  template<typename _CharT>
448    struct char_traits;
449
450  template<typename _CharT, typename _Traits>
451    class istreambuf_iterator;
452
453  template<typename _CharT, typename _Traits>
454    class ostreambuf_iterator;
455
456  template<bool _IsMove, typename _CharT>
457    typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
458	     ostreambuf_iterator<_CharT, char_traits<_CharT> > >::__type
459    __copy_move_a2(_CharT*, _CharT*,
460		   ostreambuf_iterator<_CharT, char_traits<_CharT> >);
461
462  template<bool _IsMove, typename _CharT>
463    typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
464	     ostreambuf_iterator<_CharT, char_traits<_CharT> > >::__type
465    __copy_move_a2(const _CharT*, const _CharT*,
466		   ostreambuf_iterator<_CharT, char_traits<_CharT> >);
467
468  template<bool _IsMove, typename _CharT>
469    typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
470				    _CharT*>::__type
471    __copy_move_a2(istreambuf_iterator<_CharT, char_traits<_CharT> >,
472		   istreambuf_iterator<_CharT, char_traits<_CharT> >, _CharT*);
473
474  template<bool _IsMove, typename _CharT>
475    typename __gnu_cxx::__enable_if<
476      __is_char<_CharT>::__value,
477      _GLIBCXX_STD_C::_Deque_iterator<_CharT, _CharT&, _CharT*> >::__type
478    __copy_move_a2(
479	istreambuf_iterator<_CharT, char_traits<_CharT> >,
480	istreambuf_iterator<_CharT, char_traits<_CharT> >,
481	_GLIBCXX_STD_C::_Deque_iterator<_CharT, _CharT&, _CharT*>);
482
483  template<bool _IsMove, typename _II, typename _OI>
484    _GLIBCXX20_CONSTEXPR
485    inline _OI
486    __copy_move_a2(_II __first, _II __last, _OI __result)
487    {
488      typedef typename iterator_traits<_II>::iterator_category _Category;
489#ifdef __cpp_lib_is_constant_evaluated
490      if (std::is_constant_evaluated())
491	return std::__copy_move<_IsMove, false, _Category>::
492	  __copy_m(__first, __last, __result);
493#endif
494      return std::__copy_move<_IsMove, __memcpyable<_OI, _II>::__value,
495			      _Category>::__copy_m(__first, __last, __result);
496    }
497
498  template<bool _IsMove,
499	   typename _Tp, typename _Ref, typename _Ptr, typename _OI>
500    _OI
501    __copy_move_a1(_GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr>,
502		   _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr>,
503		   _OI);
504
505  template<bool _IsMove,
506	   typename _ITp, typename _IRef, typename _IPtr, typename _OTp>
507    _GLIBCXX_STD_C::_Deque_iterator<_OTp, _OTp&, _OTp*>
508    __copy_move_a1(_GLIBCXX_STD_C::_Deque_iterator<_ITp, _IRef, _IPtr>,
509		   _GLIBCXX_STD_C::_Deque_iterator<_ITp, _IRef, _IPtr>,
510		   _GLIBCXX_STD_C::_Deque_iterator<_OTp, _OTp&, _OTp*>);
511
512  template<bool _IsMove, typename _II, typename _Tp>
513    typename __gnu_cxx::__enable_if<
514      __is_random_access_iter<_II>::__value,
515      _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*> >::__type
516    __copy_move_a1(_II, _II, _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*>);
517
518  template<bool _IsMove, typename _II, typename _OI>
519    _GLIBCXX20_CONSTEXPR
520    inline _OI
521    __copy_move_a1(_II __first, _II __last, _OI __result)
522    { return std::__copy_move_a2<_IsMove>(__first, __last, __result); }
523
524  template<bool _IsMove, typename _II, typename _OI>
525    _GLIBCXX20_CONSTEXPR
526    inline _OI
527    __copy_move_a(_II __first, _II __last, _OI __result)
528    {
529      return std::__niter_wrap(__result,
530		std::__copy_move_a1<_IsMove>(std::__niter_base(__first),
531					     std::__niter_base(__last),
532					     std::__niter_base(__result)));
533    }
534
535  template<bool _IsMove,
536	   typename _Ite, typename _Seq, typename _Cat, typename _OI>
537    _OI
538    __copy_move_a(const ::__gnu_debug::_Safe_iterator<_Ite, _Seq, _Cat>&,
539		  const ::__gnu_debug::_Safe_iterator<_Ite, _Seq, _Cat>&,
540		  _OI);
541
542  template<bool _IsMove,
543	   typename _II, typename _Ite, typename _Seq, typename _Cat>
544    __gnu_debug::_Safe_iterator<_Ite, _Seq, _Cat>
545    __copy_move_a(_II, _II,
546		  const ::__gnu_debug::_Safe_iterator<_Ite, _Seq, _Cat>&);
547
548  template<bool _IsMove,
549	   typename _IIte, typename _ISeq, typename _ICat,
550	   typename _OIte, typename _OSeq, typename _OCat>
551    ::__gnu_debug::_Safe_iterator<_OIte, _OSeq, _OCat>
552    __copy_move_a(const ::__gnu_debug::_Safe_iterator<_IIte, _ISeq, _ICat>&,
553		  const ::__gnu_debug::_Safe_iterator<_IIte, _ISeq, _ICat>&,
554		  const ::__gnu_debug::_Safe_iterator<_OIte, _OSeq, _OCat>&);
555
556  template<typename _InputIterator, typename _Size, typename _OutputIterator>
557    _GLIBCXX20_CONSTEXPR
558    _OutputIterator
559    __copy_n_a(_InputIterator __first, _Size __n, _OutputIterator __result,
560	       bool)
561    {
562      if (__n > 0)
563	{
564	  while (true)
565	    {
566	      *__result = *__first;
567	      ++__result;
568	      if (--__n > 0)
569		++__first;
570	      else
571		break;
572	    }
573	}
574      return __result;
575    }
576
577  template<typename _CharT, typename _Size>
578    typename __gnu_cxx::__enable_if<
579      __is_char<_CharT>::__value, _CharT*>::__type
580    __copy_n_a(istreambuf_iterator<_CharT, char_traits<_CharT> >,
581	       _Size, _CharT*, bool);
582
583  template<typename _CharT, typename _Size>
584    typename __gnu_cxx::__enable_if<
585      __is_char<_CharT>::__value,
586      _GLIBCXX_STD_C::_Deque_iterator<_CharT, _CharT&, _CharT*> >::__type
587    __copy_n_a(istreambuf_iterator<_CharT, char_traits<_CharT> >, _Size,
588	       _GLIBCXX_STD_C::_Deque_iterator<_CharT, _CharT&, _CharT*>,
589	       bool);
590
591  /**
592   *  @brief Copies the range [first,last) into result.
593   *  @ingroup mutating_algorithms
594   *  @param  __first  An input iterator.
595   *  @param  __last   An input iterator.
596   *  @param  __result An output iterator.
597   *  @return   result + (last - first)
598   *
599   *  This inline function will boil down to a call to @c memmove whenever
600   *  possible.  Failing that, if random access iterators are passed, then the
601   *  loop count will be known (and therefore a candidate for compiler
602   *  optimizations such as unrolling).  Result may not be contained within
603   *  [first,last); the copy_backward function should be used instead.
604   *
605   *  Note that the end of the output range is permitted to be contained
606   *  within [first,last).
607  */
608  template<typename _II, typename _OI>
609    _GLIBCXX20_CONSTEXPR
610    inline _OI
611    copy(_II __first, _II __last, _OI __result)
612    {
613      // concept requirements
614      __glibcxx_function_requires(_InputIteratorConcept<_II>)
615      __glibcxx_function_requires(_OutputIteratorConcept<_OI,
616	    typename iterator_traits<_II>::reference>)
617      __glibcxx_requires_can_increment_range(__first, __last, __result);
618
619      return std::__copy_move_a<__is_move_iterator<_II>::__value>
620	     (std::__miter_base(__first), std::__miter_base(__last), __result);
621    }
622
623#if __cplusplus >= 201103L
624  /**
625   *  @brief Moves the range [first,last) into result.
626   *  @ingroup mutating_algorithms
627   *  @param  __first  An input iterator.
628   *  @param  __last   An input iterator.
629   *  @param  __result An output iterator.
630   *  @return   result + (last - first)
631   *
632   *  This inline function will boil down to a call to @c memmove whenever
633   *  possible.  Failing that, if random access iterators are passed, then the
634   *  loop count will be known (and therefore a candidate for compiler
635   *  optimizations such as unrolling).  Result may not be contained within
636   *  [first,last); the move_backward function should be used instead.
637   *
638   *  Note that the end of the output range is permitted to be contained
639   *  within [first,last).
640  */
641  template<typename _II, typename _OI>
642    _GLIBCXX20_CONSTEXPR
643    inline _OI
644    move(_II __first, _II __last, _OI __result)
645    {
646      // concept requirements
647      __glibcxx_function_requires(_InputIteratorConcept<_II>)
648      __glibcxx_function_requires(_OutputIteratorConcept<_OI,
649	    typename iterator_traits<_II>::value_type&&>)
650      __glibcxx_requires_can_increment_range(__first, __last, __result);
651
652      return std::__copy_move_a<true>(std::__miter_base(__first),
653				      std::__miter_base(__last), __result);
654    }
655
656#define _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp)
657#else
658#define _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp)
659#endif
660
661  template<bool _IsMove, bool _IsSimple, typename _Category>
662    struct __copy_move_backward
663    {
664      template<typename _BI1, typename _BI2>
665	_GLIBCXX20_CONSTEXPR
666	static _BI2
667	__copy_move_b(_BI1 __first, _BI1 __last, _BI2 __result)
668	{
669	  while (__first != __last)
670	    *--__result = *--__last;
671	  return __result;
672	}
673    };
674
675#if __cplusplus >= 201103L
676  template<typename _Category>
677    struct __copy_move_backward<true, false, _Category>
678    {
679      template<typename _BI1, typename _BI2>
680	_GLIBCXX20_CONSTEXPR
681	static _BI2
682	__copy_move_b(_BI1 __first, _BI1 __last, _BI2 __result)
683	{
684	  while (__first != __last)
685	    *--__result = std::move(*--__last);
686	  return __result;
687	}
688    };
689#endif
690
691  template<>
692    struct __copy_move_backward<false, false, random_access_iterator_tag>
693    {
694      template<typename _BI1, typename _BI2>
695	_GLIBCXX20_CONSTEXPR
696	static _BI2
697	__copy_move_b(_BI1 __first, _BI1 __last, _BI2 __result)
698	{
699	  typename iterator_traits<_BI1>::difference_type
700	    __n = __last - __first;
701	  for (; __n > 0; --__n)
702	    *--__result = *--__last;
703	  return __result;
704	}
705    };
706
707#if __cplusplus >= 201103L
708  template<>
709    struct __copy_move_backward<true, false, random_access_iterator_tag>
710    {
711      template<typename _BI1, typename _BI2>
712	_GLIBCXX20_CONSTEXPR
713	static _BI2
714	__copy_move_b(_BI1 __first, _BI1 __last, _BI2 __result)
715	{
716	  typename iterator_traits<_BI1>::difference_type
717	    __n = __last - __first;
718	  for (; __n > 0; --__n)
719	    *--__result = std::move(*--__last);
720	  return __result;
721	}
722    };
723#endif
724
725  template<bool _IsMove>
726    struct __copy_move_backward<_IsMove, true, random_access_iterator_tag>
727    {
728      template<typename _Tp>
729	_GLIBCXX20_CONSTEXPR
730	static _Tp*
731	__copy_move_b(const _Tp* __first, const _Tp* __last, _Tp* __result)
732	{
733#if __cplusplus >= 201103L
734	  using __assignable = __conditional_t<_IsMove,
735					       is_move_assignable<_Tp>,
736					       is_copy_assignable<_Tp>>;
737	  // trivial types can have deleted assignment
738	  static_assert( __assignable::value, "type must be assignable" );
739#endif
740	  const ptrdiff_t _Num = __last - __first;
741	  if (_Num)
742	    __builtin_memmove(__result - _Num, __first, sizeof(_Tp) * _Num);
743	  return __result - _Num;
744	}
745    };
746
747  template<bool _IsMove, typename _BI1, typename _BI2>
748    _GLIBCXX20_CONSTEXPR
749    inline _BI2
750    __copy_move_backward_a2(_BI1 __first, _BI1 __last, _BI2 __result)
751    {
752      typedef typename iterator_traits<_BI1>::iterator_category _Category;
753#ifdef __cpp_lib_is_constant_evaluated
754      if (std::is_constant_evaluated())
755	return std::__copy_move_backward<_IsMove, false, _Category>::
756	  __copy_move_b(__first, __last, __result);
757#endif
758      return std::__copy_move_backward<_IsMove,
759				       __memcpyable<_BI2, _BI1>::__value,
760				       _Category>::__copy_move_b(__first,
761								 __last,
762								 __result);
763    }
764
765  template<bool _IsMove, typename _BI1, typename _BI2>
766    _GLIBCXX20_CONSTEXPR
767    inline _BI2
768    __copy_move_backward_a1(_BI1 __first, _BI1 __last, _BI2 __result)
769    { return std::__copy_move_backward_a2<_IsMove>(__first, __last, __result); }
770
771  template<bool _IsMove,
772	   typename _Tp, typename _Ref, typename _Ptr, typename _OI>
773    _OI
774    __copy_move_backward_a1(_GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr>,
775			    _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr>,
776			    _OI);
777
778  template<bool _IsMove,
779	   typename _ITp, typename _IRef, typename _IPtr, typename _OTp>
780    _GLIBCXX_STD_C::_Deque_iterator<_OTp, _OTp&, _OTp*>
781    __copy_move_backward_a1(
782			_GLIBCXX_STD_C::_Deque_iterator<_ITp, _IRef, _IPtr>,
783			_GLIBCXX_STD_C::_Deque_iterator<_ITp, _IRef, _IPtr>,
784			_GLIBCXX_STD_C::_Deque_iterator<_OTp, _OTp&, _OTp*>);
785
786  template<bool _IsMove, typename _II, typename _Tp>
787    typename __gnu_cxx::__enable_if<
788      __is_random_access_iter<_II>::__value,
789      _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*> >::__type
790    __copy_move_backward_a1(_II, _II,
791			    _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*>);
792
793  template<bool _IsMove, typename _II, typename _OI>
794    _GLIBCXX20_CONSTEXPR
795    inline _OI
796    __copy_move_backward_a(_II __first, _II __last, _OI __result)
797    {
798      return std::__niter_wrap(__result,
799		std::__copy_move_backward_a1<_IsMove>
800		  (std::__niter_base(__first), std::__niter_base(__last),
801		   std::__niter_base(__result)));
802    }
803
804  template<bool _IsMove,
805	   typename _Ite, typename _Seq, typename _Cat, typename _OI>
806    _OI
807    __copy_move_backward_a(
808		const ::__gnu_debug::_Safe_iterator<_Ite, _Seq, _Cat>&,
809		const ::__gnu_debug::_Safe_iterator<_Ite, _Seq, _Cat>&,
810		_OI);
811
812  template<bool _IsMove,
813	   typename _II, typename _Ite, typename _Seq, typename _Cat>
814    __gnu_debug::_Safe_iterator<_Ite, _Seq, _Cat>
815    __copy_move_backward_a(_II, _II,
816		const ::__gnu_debug::_Safe_iterator<_Ite, _Seq, _Cat>&);
817
818  template<bool _IsMove,
819	   typename _IIte, typename _ISeq, typename _ICat,
820	   typename _OIte, typename _OSeq, typename _OCat>
821    ::__gnu_debug::_Safe_iterator<_OIte, _OSeq, _OCat>
822    __copy_move_backward_a(
823		const ::__gnu_debug::_Safe_iterator<_IIte, _ISeq, _ICat>&,
824		const ::__gnu_debug::_Safe_iterator<_IIte, _ISeq, _ICat>&,
825		const ::__gnu_debug::_Safe_iterator<_OIte, _OSeq, _OCat>&);
826
827  /**
828   *  @brief Copies the range [first,last) into result.
829   *  @ingroup mutating_algorithms
830   *  @param  __first  A bidirectional iterator.
831   *  @param  __last   A bidirectional iterator.
832   *  @param  __result A bidirectional iterator.
833   *  @return   result - (last - first)
834   *
835   *  The function has the same effect as copy, but starts at the end of the
836   *  range and works its way to the start, returning the start of the result.
837   *  This inline function will boil down to a call to @c memmove whenever
838   *  possible.  Failing that, if random access iterators are passed, then the
839   *  loop count will be known (and therefore a candidate for compiler
840   *  optimizations such as unrolling).
841   *
842   *  Result may not be in the range (first,last].  Use copy instead.  Note
843   *  that the start of the output range may overlap [first,last).
844  */
845  template<typename _BI1, typename _BI2>
846    _GLIBCXX20_CONSTEXPR
847    inline _BI2
848    copy_backward(_BI1 __first, _BI1 __last, _BI2 __result)
849    {
850      // concept requirements
851      __glibcxx_function_requires(_BidirectionalIteratorConcept<_BI1>)
852      __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<_BI2>)
853      __glibcxx_function_requires(_OutputIteratorConcept<_BI2,
854	    typename iterator_traits<_BI1>::reference>)
855      __glibcxx_requires_can_decrement_range(__first, __last, __result);
856
857      return std::__copy_move_backward_a<__is_move_iterator<_BI1>::__value>
858	     (std::__miter_base(__first), std::__miter_base(__last), __result);
859    }
860
861#if __cplusplus >= 201103L
862  /**
863   *  @brief Moves the range [first,last) into result.
864   *  @ingroup mutating_algorithms
865   *  @param  __first  A bidirectional iterator.
866   *  @param  __last   A bidirectional iterator.
867   *  @param  __result A bidirectional iterator.
868   *  @return   result - (last - first)
869   *
870   *  The function has the same effect as move, but starts at the end of the
871   *  range and works its way to the start, returning the start of the result.
872   *  This inline function will boil down to a call to @c memmove whenever
873   *  possible.  Failing that, if random access iterators are passed, then the
874   *  loop count will be known (and therefore a candidate for compiler
875   *  optimizations such as unrolling).
876   *
877   *  Result may not be in the range (first,last].  Use move instead.  Note
878   *  that the start of the output range may overlap [first,last).
879  */
880  template<typename _BI1, typename _BI2>
881    _GLIBCXX20_CONSTEXPR
882    inline _BI2
883    move_backward(_BI1 __first, _BI1 __last, _BI2 __result)
884    {
885      // concept requirements
886      __glibcxx_function_requires(_BidirectionalIteratorConcept<_BI1>)
887      __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<_BI2>)
888      __glibcxx_function_requires(_OutputIteratorConcept<_BI2,
889	    typename iterator_traits<_BI1>::value_type&&>)
890      __glibcxx_requires_can_decrement_range(__first, __last, __result);
891
892      return std::__copy_move_backward_a<true>(std::__miter_base(__first),
893					       std::__miter_base(__last),
894					       __result);
895    }
896
897#define _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp)
898#else
899#define _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp)
900#endif
901
902  template<typename _ForwardIterator, typename _Tp>
903    _GLIBCXX20_CONSTEXPR
904    inline typename
905    __gnu_cxx::__enable_if<!__is_scalar<_Tp>::__value, void>::__type
906    __fill_a1(_ForwardIterator __first, _ForwardIterator __last,
907	      const _Tp& __value)
908    {
909      for (; __first != __last; ++__first)
910	*__first = __value;
911    }
912
913  template<typename _ForwardIterator, typename _Tp>
914    _GLIBCXX20_CONSTEXPR
915    inline typename
916    __gnu_cxx::__enable_if<__is_scalar<_Tp>::__value, void>::__type
917    __fill_a1(_ForwardIterator __first, _ForwardIterator __last,
918	      const _Tp& __value)
919    {
920      const _Tp __tmp = __value;
921      for (; __first != __last; ++__first)
922	*__first = __tmp;
923    }
924
925  // Specialization: for char types we can use memset.
926  template<typename _Tp>
927    _GLIBCXX20_CONSTEXPR
928    inline typename
929    __gnu_cxx::__enable_if<__is_byte<_Tp>::__value, void>::__type
930    __fill_a1(_Tp* __first, _Tp* __last, const _Tp& __c)
931    {
932      const _Tp __tmp = __c;
933#if __cpp_lib_is_constant_evaluated
934      if (std::is_constant_evaluated())
935	{
936	  for (; __first != __last; ++__first)
937	    *__first = __tmp;
938	  return;
939	}
940#endif
941      if (const size_t __len = __last - __first)
942	__builtin_memset(__first, static_cast<unsigned char>(__tmp), __len);
943    }
944
945  template<typename _Ite, typename _Cont, typename _Tp>
946    _GLIBCXX20_CONSTEXPR
947    inline void
948    __fill_a1(::__gnu_cxx::__normal_iterator<_Ite, _Cont> __first,
949	      ::__gnu_cxx::__normal_iterator<_Ite, _Cont> __last,
950	      const _Tp& __value)
951    { std::__fill_a1(__first.base(), __last.base(), __value); }
952
953  template<typename _Tp, typename _VTp>
954    void
955    __fill_a1(const _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*>&,
956	      const _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*>&,
957	      const _VTp&);
958
959  _GLIBCXX20_CONSTEXPR
960  void
961  __fill_a1(_GLIBCXX_STD_C::_Bit_iterator, _GLIBCXX_STD_C::_Bit_iterator,
962	    const bool&);
963
964  template<typename _FIte, typename _Tp>
965    _GLIBCXX20_CONSTEXPR
966    inline void
967    __fill_a(_FIte __first, _FIte __last, const _Tp& __value)
968    { std::__fill_a1(__first, __last, __value); }
969
970  template<typename _Ite, typename _Seq, typename _Cat, typename _Tp>
971    void
972    __fill_a(const ::__gnu_debug::_Safe_iterator<_Ite, _Seq, _Cat>&,
973	     const ::__gnu_debug::_Safe_iterator<_Ite, _Seq, _Cat>&,
974	     const _Tp&);
975
976  /**
977   *  @brief Fills the range [first,last) with copies of value.
978   *  @ingroup mutating_algorithms
979   *  @param  __first  A forward iterator.
980   *  @param  __last   A forward iterator.
981   *  @param  __value  A reference-to-const of arbitrary type.
982   *  @return   Nothing.
983   *
984   *  This function fills a range with copies of the same value.  For char
985   *  types filling contiguous areas of memory, this becomes an inline call
986   *  to @c memset or @c wmemset.
987  */
988  template<typename _ForwardIterator, typename _Tp>
989    _GLIBCXX20_CONSTEXPR
990    inline void
991    fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
992    {
993      // concept requirements
994      __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
995				  _ForwardIterator>)
996      __glibcxx_requires_valid_range(__first, __last);
997
998      std::__fill_a(__first, __last, __value);
999    }
1000
1001  // Used by fill_n, generate_n, etc. to convert _Size to an integral type:
1002  inline _GLIBCXX_CONSTEXPR int
1003  __size_to_integer(int __n) { return __n; }
1004  inline _GLIBCXX_CONSTEXPR unsigned
1005  __size_to_integer(unsigned __n) { return __n; }
1006  inline _GLIBCXX_CONSTEXPR long
1007  __size_to_integer(long __n) { return __n; }
1008  inline _GLIBCXX_CONSTEXPR unsigned long
1009  __size_to_integer(unsigned long __n) { return __n; }
1010  inline _GLIBCXX_CONSTEXPR long long
1011  __size_to_integer(long long __n) { return __n; }
1012  inline _GLIBCXX_CONSTEXPR unsigned long long
1013  __size_to_integer(unsigned long long __n) { return __n; }
1014
1015#if defined(__GLIBCXX_TYPE_INT_N_0)
1016  __extension__ inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_0
1017  __size_to_integer(__GLIBCXX_TYPE_INT_N_0 __n) { return __n; }
1018  __extension__ inline _GLIBCXX_CONSTEXPR unsigned __GLIBCXX_TYPE_INT_N_0
1019  __size_to_integer(unsigned __GLIBCXX_TYPE_INT_N_0 __n) { return __n; }
1020#endif
1021#if defined(__GLIBCXX_TYPE_INT_N_1)
1022  __extension__ inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_1
1023  __size_to_integer(__GLIBCXX_TYPE_INT_N_1 __n) { return __n; }
1024  __extension__ inline _GLIBCXX_CONSTEXPR unsigned __GLIBCXX_TYPE_INT_N_1
1025  __size_to_integer(unsigned __GLIBCXX_TYPE_INT_N_1 __n) { return __n; }
1026#endif
1027#if defined(__GLIBCXX_TYPE_INT_N_2)
1028  __extension__ inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_2
1029  __size_to_integer(__GLIBCXX_TYPE_INT_N_2 __n) { return __n; }
1030  __extension__ inline _GLIBCXX_CONSTEXPR unsigned __GLIBCXX_TYPE_INT_N_2
1031  __size_to_integer(unsigned __GLIBCXX_TYPE_INT_N_2 __n) { return __n; }
1032#endif
1033#if defined(__GLIBCXX_TYPE_INT_N_3)
1034  __extension__ inline _GLIBCXX_CONSTEXPR unsigned __GLIBCXX_TYPE_INT_N_3
1035  __size_to_integer(__GLIBCXX_TYPE_INT_N_3 __n) { return __n; }
1036  __extension__ inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_3
1037  __size_to_integer(unsigned __GLIBCXX_TYPE_INT_N_3 __n) { return __n; }
1038#endif
1039
1040  inline _GLIBCXX_CONSTEXPR long long
1041  __size_to_integer(float __n) { return (long long)__n; }
1042  inline _GLIBCXX_CONSTEXPR long long
1043  __size_to_integer(double __n) { return (long long)__n; }
1044  inline _GLIBCXX_CONSTEXPR long long
1045  __size_to_integer(long double __n) { return (long long)__n; }
1046#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
1047  __extension__ inline _GLIBCXX_CONSTEXPR long long
1048  __size_to_integer(__float128 __n) { return (long long)__n; }
1049#endif
1050
1051  template<typename _OutputIterator, typename _Size, typename _Tp>
1052    _GLIBCXX20_CONSTEXPR
1053    inline typename
1054    __gnu_cxx::__enable_if<!__is_scalar<_Tp>::__value, _OutputIterator>::__type
1055    __fill_n_a1(_OutputIterator __first, _Size __n, const _Tp& __value)
1056    {
1057      for (; __n > 0; --__n, (void) ++__first)
1058	*__first = __value;
1059      return __first;
1060    }
1061
1062  template<typename _OutputIterator, typename _Size, typename _Tp>
1063    _GLIBCXX20_CONSTEXPR
1064    inline typename
1065    __gnu_cxx::__enable_if<__is_scalar<_Tp>::__value, _OutputIterator>::__type
1066    __fill_n_a1(_OutputIterator __first, _Size __n, const _Tp& __value)
1067    {
1068      const _Tp __tmp = __value;
1069      for (; __n > 0; --__n, (void) ++__first)
1070	*__first = __tmp;
1071      return __first;
1072    }
1073
1074  template<typename _Ite, typename _Seq, typename _Cat, typename _Size,
1075	   typename _Tp>
1076    ::__gnu_debug::_Safe_iterator<_Ite, _Seq, _Cat>
1077    __fill_n_a(const ::__gnu_debug::_Safe_iterator<_Ite, _Seq, _Cat>& __first,
1078	       _Size __n, const _Tp& __value,
1079	       std::input_iterator_tag);
1080
1081  template<typename _OutputIterator, typename _Size, typename _Tp>
1082    _GLIBCXX20_CONSTEXPR
1083    inline _OutputIterator
1084    __fill_n_a(_OutputIterator __first, _Size __n, const _Tp& __value,
1085	       std::output_iterator_tag)
1086    {
1087#if __cplusplus >= 201103L
1088      static_assert(is_integral<_Size>{}, "fill_n must pass integral size");
1089#endif
1090      return __fill_n_a1(__first, __n, __value);
1091    }
1092
1093  template<typename _OutputIterator, typename _Size, typename _Tp>
1094    _GLIBCXX20_CONSTEXPR
1095    inline _OutputIterator
1096    __fill_n_a(_OutputIterator __first, _Size __n, const _Tp& __value,
1097	       std::input_iterator_tag)
1098    {
1099#if __cplusplus >= 201103L
1100      static_assert(is_integral<_Size>{}, "fill_n must pass integral size");
1101#endif
1102      return __fill_n_a1(__first, __n, __value);
1103    }
1104
1105  template<typename _OutputIterator, typename _Size, typename _Tp>
1106    _GLIBCXX20_CONSTEXPR
1107    inline _OutputIterator
1108    __fill_n_a(_OutputIterator __first, _Size __n, const _Tp& __value,
1109	       std::random_access_iterator_tag)
1110    {
1111#if __cplusplus >= 201103L
1112      static_assert(is_integral<_Size>{}, "fill_n must pass integral size");
1113#endif
1114      if (__n <= 0)
1115	return __first;
1116
1117      __glibcxx_requires_can_increment(__first, __n);
1118
1119      std::__fill_a(__first, __first + __n, __value);
1120      return __first + __n;
1121    }
1122
1123  /**
1124   *  @brief Fills the range [first,first+n) with copies of value.
1125   *  @ingroup mutating_algorithms
1126   *  @param  __first  An output iterator.
1127   *  @param  __n      The count of copies to perform.
1128   *  @param  __value  A reference-to-const of arbitrary type.
1129   *  @return   The iterator at first+n.
1130   *
1131   *  This function fills a range with copies of the same value.  For char
1132   *  types filling contiguous areas of memory, this becomes an inline call
1133   *  to @c memset or @c wmemset.
1134   *
1135   *  If @p __n is negative, the function does nothing.
1136  */
1137  // _GLIBCXX_RESOLVE_LIB_DEFECTS
1138  // DR 865. More algorithms that throw away information
1139  // DR 426. search_n(), fill_n(), and generate_n() with negative n
1140  template<typename _OI, typename _Size, typename _Tp>
1141    _GLIBCXX20_CONSTEXPR
1142    inline _OI
1143    fill_n(_OI __first, _Size __n, const _Tp& __value)
1144    {
1145      // concept requirements
1146      __glibcxx_function_requires(_OutputIteratorConcept<_OI, const _Tp&>)
1147
1148      return std::__fill_n_a(__first, std::__size_to_integer(__n), __value,
1149			       std::__iterator_category(__first));
1150    }
1151
1152  template<bool _BoolType>
1153    struct __equal
1154    {
1155      template<typename _II1, typename _II2>
1156	_GLIBCXX20_CONSTEXPR
1157	static bool
1158	equal(_II1 __first1, _II1 __last1, _II2 __first2)
1159	{
1160	  for (; __first1 != __last1; ++__first1, (void) ++__first2)
1161	    if (!(*__first1 == *__first2))
1162	      return false;
1163	  return true;
1164	}
1165    };
1166
1167  template<>
1168    struct __equal<true>
1169    {
1170      template<typename _Tp>
1171	_GLIBCXX20_CONSTEXPR
1172	static bool
1173	equal(const _Tp* __first1, const _Tp* __last1, const _Tp* __first2)
1174	{
1175	  if (const size_t __len = (__last1 - __first1))
1176	    return !std::__memcmp(__first1, __first2, __len);
1177	  return true;
1178	}
1179    };
1180
1181  template<typename _Tp, typename _Ref, typename _Ptr, typename _II>
1182    typename __gnu_cxx::__enable_if<
1183      __is_random_access_iter<_II>::__value, bool>::__type
1184    __equal_aux1(_GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr>,
1185		 _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr>,
1186		 _II);
1187
1188  template<typename _Tp1, typename _Ref1, typename _Ptr1,
1189	   typename _Tp2, typename _Ref2, typename _Ptr2>
1190    bool
1191    __equal_aux1(_GLIBCXX_STD_C::_Deque_iterator<_Tp1, _Ref1, _Ptr1>,
1192		 _GLIBCXX_STD_C::_Deque_iterator<_Tp1, _Ref1, _Ptr1>,
1193		 _GLIBCXX_STD_C::_Deque_iterator<_Tp2, _Ref2, _Ptr2>);
1194
1195  template<typename _II, typename _Tp, typename _Ref, typename _Ptr>
1196    typename __gnu_cxx::__enable_if<
1197      __is_random_access_iter<_II>::__value, bool>::__type
1198    __equal_aux1(_II, _II,
1199		_GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr>);
1200
1201  template<typename _II1, typename _II2>
1202    _GLIBCXX20_CONSTEXPR
1203    inline bool
1204    __equal_aux1(_II1 __first1, _II1 __last1, _II2 __first2)
1205    {
1206      typedef typename iterator_traits<_II1>::value_type _ValueType1;
1207      const bool __simple = ((__is_integer<_ValueType1>::__value
1208			      || __is_pointer<_ValueType1>::__value)
1209			     && __memcmpable<_II1, _II2>::__value);
1210      return std::__equal<__simple>::equal(__first1, __last1, __first2);
1211    }
1212
1213  template<typename _II1, typename _II2>
1214    _GLIBCXX20_CONSTEXPR
1215    inline bool
1216    __equal_aux(_II1 __first1, _II1 __last1, _II2 __first2)
1217    {
1218      return std::__equal_aux1(std::__niter_base(__first1),
1219			       std::__niter_base(__last1),
1220			       std::__niter_base(__first2));
1221    }
1222
1223  template<typename _II1, typename _Seq1, typename _Cat1, typename _II2>
1224    bool
1225    __equal_aux(const ::__gnu_debug::_Safe_iterator<_II1, _Seq1, _Cat1>&,
1226		const ::__gnu_debug::_Safe_iterator<_II1, _Seq1, _Cat1>&,
1227		_II2);
1228
1229  template<typename _II1, typename _II2, typename _Seq2, typename _Cat2>
1230    bool
1231    __equal_aux(_II1, _II1,
1232		const ::__gnu_debug::_Safe_iterator<_II2, _Seq2, _Cat2>&);
1233
1234  template<typename _II1, typename _Seq1, typename _Cat1,
1235	   typename _II2, typename _Seq2, typename _Cat2>
1236    bool
1237    __equal_aux(const ::__gnu_debug::_Safe_iterator<_II1, _Seq1, _Cat1>&,
1238		const ::__gnu_debug::_Safe_iterator<_II1, _Seq1, _Cat1>&,
1239		const ::__gnu_debug::_Safe_iterator<_II2, _Seq2, _Cat2>&);
1240
1241  template<typename, typename>
1242    struct __lc_rai
1243    {
1244      template<typename _II1, typename _II2>
1245	_GLIBCXX20_CONSTEXPR
1246	static _II1
1247	__newlast1(_II1, _II1 __last1, _II2, _II2)
1248	{ return __last1; }
1249
1250      template<typename _II>
1251	_GLIBCXX20_CONSTEXPR
1252	static bool
1253	__cnd2(_II __first, _II __last)
1254	{ return __first != __last; }
1255    };
1256
1257  template<>
1258    struct __lc_rai<random_access_iterator_tag, random_access_iterator_tag>
1259    {
1260      template<typename _RAI1, typename _RAI2>
1261	_GLIBCXX20_CONSTEXPR
1262	static _RAI1
1263	__newlast1(_RAI1 __first1, _RAI1 __last1,
1264		   _RAI2 __first2, _RAI2 __last2)
1265	{
1266	  const typename iterator_traits<_RAI1>::difference_type
1267	    __diff1 = __last1 - __first1;
1268	  const typename iterator_traits<_RAI2>::difference_type
1269	    __diff2 = __last2 - __first2;
1270	  return __diff2 < __diff1 ? __first1 + __diff2 : __last1;
1271	}
1272
1273      template<typename _RAI>
1274	static _GLIBCXX20_CONSTEXPR bool
1275	__cnd2(_RAI, _RAI)
1276	{ return true; }
1277    };
1278
1279  template<typename _II1, typename _II2, typename _Compare>
1280    _GLIBCXX20_CONSTEXPR
1281    bool
1282    __lexicographical_compare_impl(_II1 __first1, _II1 __last1,
1283				   _II2 __first2, _II2 __last2,
1284				   _Compare __comp)
1285    {
1286      typedef typename iterator_traits<_II1>::iterator_category _Category1;
1287      typedef typename iterator_traits<_II2>::iterator_category _Category2;
1288      typedef std::__lc_rai<_Category1, _Category2> __rai_type;
1289
1290      __last1 = __rai_type::__newlast1(__first1, __last1, __first2, __last2);
1291      for (; __first1 != __last1 && __rai_type::__cnd2(__first2, __last2);
1292	   ++__first1, (void)++__first2)
1293	{
1294	  if (__comp(__first1, __first2))
1295	    return true;
1296	  if (__comp(__first2, __first1))
1297	    return false;
1298	}
1299      return __first1 == __last1 && __first2 != __last2;
1300    }
1301
1302  template<bool _BoolType>
1303    struct __lexicographical_compare
1304    {
1305      template<typename _II1, typename _II2>
1306	_GLIBCXX20_CONSTEXPR
1307	static bool
1308	__lc(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2)
1309	{
1310	  using __gnu_cxx::__ops::__iter_less_iter;
1311	  return std::__lexicographical_compare_impl(__first1, __last1,
1312						     __first2, __last2,
1313						     __iter_less_iter());
1314	}
1315
1316      template<typename _II1, typename _II2>
1317	_GLIBCXX20_CONSTEXPR
1318	static int
1319	__3way(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2)
1320	{
1321	  while (__first1 != __last1)
1322	    {
1323	      if (__first2 == __last2)
1324		return +1;
1325	      if (*__first1 < *__first2)
1326		return -1;
1327	      if (*__first2 < *__first1)
1328		return +1;
1329	      ++__first1;
1330	      ++__first2;
1331	    }
1332	  return int(__first2 == __last2) - 1;
1333	}
1334    };
1335
1336  template<>
1337    struct __lexicographical_compare<true>
1338    {
1339      template<typename _Tp, typename _Up>
1340	_GLIBCXX20_CONSTEXPR
1341	static bool
1342	__lc(const _Tp* __first1, const _Tp* __last1,
1343	     const _Up* __first2, const _Up* __last2)
1344	{ return __3way(__first1, __last1, __first2, __last2) < 0; }
1345
1346      template<typename _Tp, typename _Up>
1347	_GLIBCXX20_CONSTEXPR
1348	static ptrdiff_t
1349	__3way(const _Tp* __first1, const _Tp* __last1,
1350	       const _Up* __first2, const _Up* __last2)
1351	{
1352	  const size_t __len1 = __last1 - __first1;
1353	  const size_t __len2 = __last2 - __first2;
1354	  if (const size_t __len = std::min(__len1, __len2))
1355	    if (int __result = std::__memcmp(__first1, __first2, __len))
1356	      return __result;
1357	  return ptrdiff_t(__len1 - __len2);
1358	}
1359    };
1360
1361  template<typename _II1, typename _II2>
1362    _GLIBCXX20_CONSTEXPR
1363    inline bool
1364    __lexicographical_compare_aux1(_II1 __first1, _II1 __last1,
1365				   _II2 __first2, _II2 __last2)
1366    {
1367      typedef typename iterator_traits<_II1>::value_type _ValueType1;
1368      typedef typename iterator_traits<_II2>::value_type _ValueType2;
1369      const bool __simple =
1370	(__is_memcmp_ordered_with<_ValueType1, _ValueType2>::__value
1371	 && __is_pointer<_II1>::__value
1372	 && __is_pointer<_II2>::__value
1373#if __cplusplus > 201703L && __cpp_lib_concepts
1374	 // For C++20 iterator_traits<volatile T*>::value_type is non-volatile
1375	 // so __is_byte<T> could be true, but we can't use memcmp with
1376	 // volatile data.
1377	 && !is_volatile_v<remove_reference_t<iter_reference_t<_II1>>>
1378	 && !is_volatile_v<remove_reference_t<iter_reference_t<_II2>>>
1379#endif
1380	 );
1381
1382      return std::__lexicographical_compare<__simple>::__lc(__first1, __last1,
1383							    __first2, __last2);
1384    }
1385
1386  template<typename _Tp1, typename _Ref1, typename _Ptr1,
1387	   typename _Tp2>
1388    bool
1389    __lexicographical_compare_aux1(
1390	_GLIBCXX_STD_C::_Deque_iterator<_Tp1, _Ref1, _Ptr1>,
1391	_GLIBCXX_STD_C::_Deque_iterator<_Tp1, _Ref1, _Ptr1>,
1392	_Tp2*, _Tp2*);
1393
1394  template<typename _Tp1,
1395	   typename _Tp2, typename _Ref2, typename _Ptr2>
1396    bool
1397    __lexicographical_compare_aux1(_Tp1*, _Tp1*,
1398	_GLIBCXX_STD_C::_Deque_iterator<_Tp2, _Ref2, _Ptr2>,
1399	_GLIBCXX_STD_C::_Deque_iterator<_Tp2, _Ref2, _Ptr2>);
1400
1401  template<typename _Tp1, typename _Ref1, typename _Ptr1,
1402	   typename _Tp2, typename _Ref2, typename _Ptr2>
1403    bool
1404    __lexicographical_compare_aux1(
1405	_GLIBCXX_STD_C::_Deque_iterator<_Tp1, _Ref1, _Ptr1>,
1406	_GLIBCXX_STD_C::_Deque_iterator<_Tp1, _Ref1, _Ptr1>,
1407	_GLIBCXX_STD_C::_Deque_iterator<_Tp2, _Ref2, _Ptr2>,
1408	_GLIBCXX_STD_C::_Deque_iterator<_Tp2, _Ref2, _Ptr2>);
1409
1410  template<typename _II1, typename _II2>
1411    _GLIBCXX20_CONSTEXPR
1412    inline bool
1413    __lexicographical_compare_aux(_II1 __first1, _II1 __last1,
1414				  _II2 __first2, _II2 __last2)
1415    {
1416      return std::__lexicographical_compare_aux1(std::__niter_base(__first1),
1417						 std::__niter_base(__last1),
1418						 std::__niter_base(__first2),
1419						 std::__niter_base(__last2));
1420    }
1421
1422  template<typename _Iter1, typename _Seq1, typename _Cat1,
1423	   typename _II2>
1424    bool
1425    __lexicographical_compare_aux(
1426		const ::__gnu_debug::_Safe_iterator<_Iter1, _Seq1, _Cat1>&,
1427		const ::__gnu_debug::_Safe_iterator<_Iter1, _Seq1, _Cat1>&,
1428		_II2, _II2);
1429
1430  template<typename _II1,
1431	   typename _Iter2, typename _Seq2, typename _Cat2>
1432    bool
1433    __lexicographical_compare_aux(
1434		_II1, _II1,
1435		const ::__gnu_debug::_Safe_iterator<_Iter2, _Seq2, _Cat2>&,
1436		const ::__gnu_debug::_Safe_iterator<_Iter2, _Seq2, _Cat2>&);
1437
1438  template<typename _Iter1, typename _Seq1, typename _Cat1,
1439	   typename _Iter2, typename _Seq2, typename _Cat2>
1440    bool
1441    __lexicographical_compare_aux(
1442		const ::__gnu_debug::_Safe_iterator<_Iter1, _Seq1, _Cat1>&,
1443		const ::__gnu_debug::_Safe_iterator<_Iter1, _Seq1, _Cat1>&,
1444		const ::__gnu_debug::_Safe_iterator<_Iter2, _Seq2, _Cat2>&,
1445		const ::__gnu_debug::_Safe_iterator<_Iter2, _Seq2, _Cat2>&);
1446
1447  template<typename _ForwardIterator, typename _Tp, typename _Compare>
1448    _GLIBCXX20_CONSTEXPR
1449    _ForwardIterator
1450    __lower_bound(_ForwardIterator __first, _ForwardIterator __last,
1451		  const _Tp& __val, _Compare __comp)
1452    {
1453      typedef typename iterator_traits<_ForwardIterator>::difference_type
1454	_DistanceType;
1455
1456      _DistanceType __len = std::distance(__first, __last);
1457
1458      while (__len > 0)
1459	{
1460	  _DistanceType __half = __len >> 1;
1461	  _ForwardIterator __middle = __first;
1462	  std::advance(__middle, __half);
1463	  if (__comp(__middle, __val))
1464	    {
1465	      __first = __middle;
1466	      ++__first;
1467	      __len = __len - __half - 1;
1468	    }
1469	  else
1470	    __len = __half;
1471	}
1472      return __first;
1473    }
1474
1475  /**
1476   *  @brief Finds the first position in which @a val could be inserted
1477   *         without changing the ordering.
1478   *  @param  __first   An iterator.
1479   *  @param  __last    Another iterator.
1480   *  @param  __val     The search term.
1481   *  @return         An iterator pointing to the first element <em>not less
1482   *                  than</em> @a val, or end() if every element is less than
1483   *                  @a val.
1484   *  @ingroup binary_search_algorithms
1485  */
1486  template<typename _ForwardIterator, typename _Tp>
1487    _GLIBCXX20_CONSTEXPR
1488    inline _ForwardIterator
1489    lower_bound(_ForwardIterator __first, _ForwardIterator __last,
1490		const _Tp& __val)
1491    {
1492      // concept requirements
1493      __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
1494      __glibcxx_function_requires(_LessThanOpConcept<
1495	    typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
1496      __glibcxx_requires_partitioned_lower(__first, __last, __val);
1497
1498      return std::__lower_bound(__first, __last, __val,
1499				__gnu_cxx::__ops::__iter_less_val());
1500    }
1501
1502  /// This is a helper function for the sort routines and for random.tcc.
1503  //  Precondition: __n > 0.
1504  inline _GLIBCXX_CONSTEXPR int
1505  __lg(int __n)
1506  { return (int)sizeof(int) * __CHAR_BIT__  - 1 - __builtin_clz(__n); }
1507
1508  inline _GLIBCXX_CONSTEXPR unsigned
1509  __lg(unsigned __n)
1510  { return (int)sizeof(int) * __CHAR_BIT__  - 1 - __builtin_clz(__n); }
1511
1512  inline _GLIBCXX_CONSTEXPR long
1513  __lg(long __n)
1514  { return (int)sizeof(long) * __CHAR_BIT__ - 1 - __builtin_clzl(__n); }
1515
1516  inline _GLIBCXX_CONSTEXPR unsigned long
1517  __lg(unsigned long __n)
1518  { return (int)sizeof(long) * __CHAR_BIT__ - 1 - __builtin_clzl(__n); }
1519
1520  inline _GLIBCXX_CONSTEXPR long long
1521  __lg(long long __n)
1522  { return (int)sizeof(long long) * __CHAR_BIT__ - 1 - __builtin_clzll(__n); }
1523
1524  inline _GLIBCXX_CONSTEXPR unsigned long long
1525  __lg(unsigned long long __n)
1526  { return (int)sizeof(long long) * __CHAR_BIT__ - 1 - __builtin_clzll(__n); }
1527
1528_GLIBCXX_BEGIN_NAMESPACE_ALGO
1529
1530  /**
1531   *  @brief Tests a range for element-wise equality.
1532   *  @ingroup non_mutating_algorithms
1533   *  @param  __first1  An input iterator.
1534   *  @param  __last1   An input iterator.
1535   *  @param  __first2  An input iterator.
1536   *  @return   A boolean true or false.
1537   *
1538   *  This compares the elements of two ranges using @c == and returns true or
1539   *  false depending on whether all of the corresponding elements of the
1540   *  ranges are equal.
1541  */
1542  template<typename _II1, typename _II2>
1543    _GLIBCXX20_CONSTEXPR
1544    inline bool
1545    equal(_II1 __first1, _II1 __last1, _II2 __first2)
1546    {
1547      // concept requirements
1548      __glibcxx_function_requires(_InputIteratorConcept<_II1>)
1549      __glibcxx_function_requires(_InputIteratorConcept<_II2>)
1550      __glibcxx_function_requires(_EqualOpConcept<
1551	    typename iterator_traits<_II1>::value_type,
1552	    typename iterator_traits<_II2>::value_type>)
1553      __glibcxx_requires_can_increment_range(__first1, __last1, __first2);
1554
1555      return std::__equal_aux(__first1, __last1, __first2);
1556    }
1557
1558  /**
1559   *  @brief Tests a range for element-wise equality.
1560   *  @ingroup non_mutating_algorithms
1561   *  @param  __first1  An input iterator.
1562   *  @param  __last1   An input iterator.
1563   *  @param  __first2  An input iterator.
1564   *  @param __binary_pred A binary predicate @link functors
1565   *                  functor@endlink.
1566   *  @return         A boolean true or false.
1567   *
1568   *  This compares the elements of two ranges using the binary_pred
1569   *  parameter, and returns true or
1570   *  false depending on whether all of the corresponding elements of the
1571   *  ranges are equal.
1572  */
1573  template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
1574    _GLIBCXX20_CONSTEXPR
1575    inline bool
1576    equal(_IIter1 __first1, _IIter1 __last1,
1577	  _IIter2 __first2, _BinaryPredicate __binary_pred)
1578    {
1579      // concept requirements
1580      __glibcxx_function_requires(_InputIteratorConcept<_IIter1>)
1581      __glibcxx_function_requires(_InputIteratorConcept<_IIter2>)
1582      __glibcxx_requires_valid_range(__first1, __last1);
1583
1584      for (; __first1 != __last1; ++__first1, (void)++__first2)
1585	if (!bool(__binary_pred(*__first1, *__first2)))
1586	  return false;
1587      return true;
1588    }
1589
1590#if __cplusplus >= 201103L
1591  // 4-iterator version of std::equal<It1, It2> for use in C++11.
1592  template<typename _II1, typename _II2>
1593    _GLIBCXX20_CONSTEXPR
1594    inline bool
1595    __equal4(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2)
1596    {
1597      using _RATag = random_access_iterator_tag;
1598      using _Cat1 = typename iterator_traits<_II1>::iterator_category;
1599      using _Cat2 = typename iterator_traits<_II2>::iterator_category;
1600      using _RAIters = __and_<is_same<_Cat1, _RATag>, is_same<_Cat2, _RATag>>;
1601      if (_RAIters())
1602	{
1603	  auto __d1 = std::distance(__first1, __last1);
1604	  auto __d2 = std::distance(__first2, __last2);
1605	  if (__d1 != __d2)
1606	    return false;
1607	  return _GLIBCXX_STD_A::equal(__first1, __last1, __first2);
1608	}
1609
1610      for (; __first1 != __last1 && __first2 != __last2;
1611	  ++__first1, (void)++__first2)
1612	if (!(*__first1 == *__first2))
1613	  return false;
1614      return __first1 == __last1 && __first2 == __last2;
1615    }
1616
1617  // 4-iterator version of std::equal<It1, It2, BinaryPred> for use in C++11.
1618  template<typename _II1, typename _II2, typename _BinaryPredicate>
1619    _GLIBCXX20_CONSTEXPR
1620    inline bool
1621    __equal4(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2,
1622	     _BinaryPredicate __binary_pred)
1623    {
1624      using _RATag = random_access_iterator_tag;
1625      using _Cat1 = typename iterator_traits<_II1>::iterator_category;
1626      using _Cat2 = typename iterator_traits<_II2>::iterator_category;
1627      using _RAIters = __and_<is_same<_Cat1, _RATag>, is_same<_Cat2, _RATag>>;
1628      if (_RAIters())
1629	{
1630	  auto __d1 = std::distance(__first1, __last1);
1631	  auto __d2 = std::distance(__first2, __last2);
1632	  if (__d1 != __d2)
1633	    return false;
1634	  return _GLIBCXX_STD_A::equal(__first1, __last1, __first2,
1635				       __binary_pred);
1636	}
1637
1638      for (; __first1 != __last1 && __first2 != __last2;
1639	  ++__first1, (void)++__first2)
1640	if (!bool(__binary_pred(*__first1, *__first2)))
1641	  return false;
1642      return __first1 == __last1 && __first2 == __last2;
1643    }
1644#endif // C++11
1645
1646#if __cplusplus > 201103L
1647
1648#define __cpp_lib_robust_nonmodifying_seq_ops 201304L
1649
1650  /**
1651   *  @brief Tests a range for element-wise equality.
1652   *  @ingroup non_mutating_algorithms
1653   *  @param  __first1  An input iterator.
1654   *  @param  __last1   An input iterator.
1655   *  @param  __first2  An input iterator.
1656   *  @param  __last2   An input iterator.
1657   *  @return   A boolean true or false.
1658   *
1659   *  This compares the elements of two ranges using @c == and returns true or
1660   *  false depending on whether all of the corresponding elements of the
1661   *  ranges are equal.
1662  */
1663  template<typename _II1, typename _II2>
1664    _GLIBCXX20_CONSTEXPR
1665    inline bool
1666    equal(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2)
1667    {
1668      // concept requirements
1669      __glibcxx_function_requires(_InputIteratorConcept<_II1>)
1670      __glibcxx_function_requires(_InputIteratorConcept<_II2>)
1671      __glibcxx_function_requires(_EqualOpConcept<
1672	    typename iterator_traits<_II1>::value_type,
1673	    typename iterator_traits<_II2>::value_type>)
1674      __glibcxx_requires_valid_range(__first1, __last1);
1675      __glibcxx_requires_valid_range(__first2, __last2);
1676
1677      return _GLIBCXX_STD_A::__equal4(__first1, __last1, __first2, __last2);
1678    }
1679
1680  /**
1681   *  @brief Tests a range for element-wise equality.
1682   *  @ingroup non_mutating_algorithms
1683   *  @param  __first1  An input iterator.
1684   *  @param  __last1   An input iterator.
1685   *  @param  __first2  An input iterator.
1686   *  @param  __last2   An input iterator.
1687   *  @param __binary_pred A binary predicate @link functors
1688   *                  functor@endlink.
1689   *  @return         A boolean true or false.
1690   *
1691   *  This compares the elements of two ranges using the binary_pred
1692   *  parameter, and returns true or
1693   *  false depending on whether all of the corresponding elements of the
1694   *  ranges are equal.
1695  */
1696  template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
1697    _GLIBCXX20_CONSTEXPR
1698    inline bool
1699    equal(_IIter1 __first1, _IIter1 __last1,
1700	  _IIter2 __first2, _IIter2 __last2, _BinaryPredicate __binary_pred)
1701    {
1702      // concept requirements
1703      __glibcxx_function_requires(_InputIteratorConcept<_IIter1>)
1704      __glibcxx_function_requires(_InputIteratorConcept<_IIter2>)
1705      __glibcxx_requires_valid_range(__first1, __last1);
1706      __glibcxx_requires_valid_range(__first2, __last2);
1707
1708      return _GLIBCXX_STD_A::__equal4(__first1, __last1, __first2, __last2,
1709				      __binary_pred);
1710    }
1711#endif // C++14
1712
1713  /**
1714   *  @brief Performs @b dictionary comparison on ranges.
1715   *  @ingroup sorting_algorithms
1716   *  @param  __first1  An input iterator.
1717   *  @param  __last1   An input iterator.
1718   *  @param  __first2  An input iterator.
1719   *  @param  __last2   An input iterator.
1720   *  @return   A boolean true or false.
1721   *
1722   *  <em>Returns true if the sequence of elements defined by the range
1723   *  [first1,last1) is lexicographically less than the sequence of elements
1724   *  defined by the range [first2,last2).  Returns false otherwise.</em>
1725   *  (Quoted from [25.3.8]/1.)  If the iterators are all character pointers,
1726   *  then this is an inline call to @c memcmp.
1727  */
1728  template<typename _II1, typename _II2>
1729    _GLIBCXX20_CONSTEXPR
1730    inline bool
1731    lexicographical_compare(_II1 __first1, _II1 __last1,
1732			    _II2 __first2, _II2 __last2)
1733    {
1734#ifdef _GLIBCXX_CONCEPT_CHECKS
1735      // concept requirements
1736      typedef typename iterator_traits<_II1>::value_type _ValueType1;
1737      typedef typename iterator_traits<_II2>::value_type _ValueType2;
1738#endif
1739      __glibcxx_function_requires(_InputIteratorConcept<_II1>)
1740      __glibcxx_function_requires(_InputIteratorConcept<_II2>)
1741      __glibcxx_function_requires(_LessThanOpConcept<_ValueType1, _ValueType2>)
1742      __glibcxx_function_requires(_LessThanOpConcept<_ValueType2, _ValueType1>)
1743      __glibcxx_requires_valid_range(__first1, __last1);
1744      __glibcxx_requires_valid_range(__first2, __last2);
1745
1746      return std::__lexicographical_compare_aux(__first1, __last1,
1747						__first2, __last2);
1748    }
1749
1750  /**
1751   *  @brief Performs @b dictionary comparison on ranges.
1752   *  @ingroup sorting_algorithms
1753   *  @param  __first1  An input iterator.
1754   *  @param  __last1   An input iterator.
1755   *  @param  __first2  An input iterator.
1756   *  @param  __last2   An input iterator.
1757   *  @param  __comp  A @link comparison_functors comparison functor@endlink.
1758   *  @return   A boolean true or false.
1759   *
1760   *  The same as the four-parameter @c lexicographical_compare, but uses the
1761   *  comp parameter instead of @c <.
1762  */
1763  template<typename _II1, typename _II2, typename _Compare>
1764    _GLIBCXX20_CONSTEXPR
1765    inline bool
1766    lexicographical_compare(_II1 __first1, _II1 __last1,
1767			    _II2 __first2, _II2 __last2, _Compare __comp)
1768    {
1769      // concept requirements
1770      __glibcxx_function_requires(_InputIteratorConcept<_II1>)
1771      __glibcxx_function_requires(_InputIteratorConcept<_II2>)
1772      __glibcxx_requires_valid_range(__first1, __last1);
1773      __glibcxx_requires_valid_range(__first2, __last2);
1774
1775      return std::__lexicographical_compare_impl
1776	(__first1, __last1, __first2, __last2,
1777	 __gnu_cxx::__ops::__iter_comp_iter(__comp));
1778    }
1779
1780#if __cpp_lib_three_way_comparison
1781  // Iter points to a contiguous range of unsigned narrow character type
1782  // or std::byte, suitable for comparison by memcmp.
1783  template<typename _Iter>
1784    concept __is_byte_iter = contiguous_iterator<_Iter>
1785      && __is_memcmp_ordered<iter_value_t<_Iter>>::__value;
1786
1787  // Return a struct with two members, initialized to the smaller of x and y
1788  // (or x if they compare equal) and the result of the comparison x <=> y.
1789  template<typename _Tp>
1790    constexpr auto
1791    __min_cmp(_Tp __x, _Tp __y)
1792    {
1793      struct _Res {
1794	_Tp _M_min;
1795	decltype(__x <=> __y) _M_cmp;
1796      };
1797      auto __c = __x <=> __y;
1798      if (__c > 0)
1799	return _Res{__y, __c};
1800      return _Res{__x, __c};
1801    }
1802
1803  /**
1804   *  @brief Performs dictionary comparison on ranges.
1805   *  @ingroup sorting_algorithms
1806   *  @param  __first1  An input iterator.
1807   *  @param  __last1   An input iterator.
1808   *  @param  __first2  An input iterator.
1809   *  @param  __last2   An input iterator.
1810   *  @param  __comp  A @link comparison_functors comparison functor@endlink.
1811   *  @return   The comparison category that `__comp(*__first1, *__first2)`
1812   *		returns.
1813  */
1814  template<typename _InputIter1, typename _InputIter2, typename _Comp>
1815    constexpr auto
1816    lexicographical_compare_three_way(_InputIter1 __first1,
1817				      _InputIter1 __last1,
1818				      _InputIter2 __first2,
1819				      _InputIter2 __last2,
1820				      _Comp __comp)
1821    -> decltype(__comp(*__first1, *__first2))
1822    {
1823      // concept requirements
1824      __glibcxx_function_requires(_InputIteratorConcept<_InputIter1>)
1825      __glibcxx_function_requires(_InputIteratorConcept<_InputIter2>)
1826      __glibcxx_requires_valid_range(__first1, __last1);
1827      __glibcxx_requires_valid_range(__first2, __last2);
1828
1829      using _Cat = decltype(__comp(*__first1, *__first2));
1830      static_assert(same_as<common_comparison_category_t<_Cat>, _Cat>);
1831
1832      if (!std::__is_constant_evaluated())
1833	if constexpr (same_as<_Comp, __detail::_Synth3way>
1834		      || same_as<_Comp, compare_three_way>)
1835	  if constexpr (__is_byte_iter<_InputIter1>)
1836	    if constexpr (__is_byte_iter<_InputIter2>)
1837	      {
1838		const auto [__len, __lencmp] = _GLIBCXX_STD_A::
1839		  __min_cmp(__last1 - __first1, __last2 - __first2);
1840		if (__len)
1841		  {
1842		    const auto __c
1843		      = __builtin_memcmp(&*__first1, &*__first2, __len) <=> 0;
1844		    if (__c != 0)
1845		      return __c;
1846		  }
1847		return __lencmp;
1848	      }
1849
1850      while (__first1 != __last1)
1851	{
1852	  if (__first2 == __last2)
1853	    return strong_ordering::greater;
1854	  if (auto __cmp = __comp(*__first1, *__first2); __cmp != 0)
1855	    return __cmp;
1856	  ++__first1;
1857	  ++__first2;
1858	}
1859      return (__first2 == __last2) <=> true; // See PR 94006
1860    }
1861
1862  template<typename _InputIter1, typename _InputIter2>
1863    constexpr auto
1864    lexicographical_compare_three_way(_InputIter1 __first1,
1865				      _InputIter1 __last1,
1866				      _InputIter2 __first2,
1867				      _InputIter2 __last2)
1868    {
1869      return _GLIBCXX_STD_A::
1870	lexicographical_compare_three_way(__first1, __last1, __first2, __last2,
1871					  compare_three_way{});
1872    }
1873#endif // three_way_comparison
1874
1875  template<typename _InputIterator1, typename _InputIterator2,
1876	   typename _BinaryPredicate>
1877    _GLIBCXX20_CONSTEXPR
1878    pair<_InputIterator1, _InputIterator2>
1879    __mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1880	       _InputIterator2 __first2, _BinaryPredicate __binary_pred)
1881    {
1882      while (__first1 != __last1 && __binary_pred(__first1, __first2))
1883	{
1884	  ++__first1;
1885	  ++__first2;
1886	}
1887      return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
1888    }
1889
1890  /**
1891   *  @brief Finds the places in ranges which don't match.
1892   *  @ingroup non_mutating_algorithms
1893   *  @param  __first1  An input iterator.
1894   *  @param  __last1   An input iterator.
1895   *  @param  __first2  An input iterator.
1896   *  @return   A pair of iterators pointing to the first mismatch.
1897   *
1898   *  This compares the elements of two ranges using @c == and returns a pair
1899   *  of iterators.  The first iterator points into the first range, the
1900   *  second iterator points into the second range, and the elements pointed
1901   *  to by the iterators are not equal.
1902  */
1903  template<typename _InputIterator1, typename _InputIterator2>
1904    _GLIBCXX20_CONSTEXPR
1905    inline pair<_InputIterator1, _InputIterator2>
1906    mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1907	     _InputIterator2 __first2)
1908    {
1909      // concept requirements
1910      __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
1911      __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
1912      __glibcxx_function_requires(_EqualOpConcept<
1913	    typename iterator_traits<_InputIterator1>::value_type,
1914	    typename iterator_traits<_InputIterator2>::value_type>)
1915      __glibcxx_requires_valid_range(__first1, __last1);
1916
1917      return _GLIBCXX_STD_A::__mismatch(__first1, __last1, __first2,
1918			     __gnu_cxx::__ops::__iter_equal_to_iter());
1919    }
1920
1921  /**
1922   *  @brief Finds the places in ranges which don't match.
1923   *  @ingroup non_mutating_algorithms
1924   *  @param  __first1  An input iterator.
1925   *  @param  __last1   An input iterator.
1926   *  @param  __first2  An input iterator.
1927   *  @param __binary_pred A binary predicate @link functors
1928   *         functor@endlink.
1929   *  @return   A pair of iterators pointing to the first mismatch.
1930   *
1931   *  This compares the elements of two ranges using the binary_pred
1932   *  parameter, and returns a pair
1933   *  of iterators.  The first iterator points into the first range, the
1934   *  second iterator points into the second range, and the elements pointed
1935   *  to by the iterators are not equal.
1936  */
1937  template<typename _InputIterator1, typename _InputIterator2,
1938	   typename _BinaryPredicate>
1939    _GLIBCXX20_CONSTEXPR
1940    inline pair<_InputIterator1, _InputIterator2>
1941    mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1942	     _InputIterator2 __first2, _BinaryPredicate __binary_pred)
1943    {
1944      // concept requirements
1945      __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
1946      __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
1947      __glibcxx_requires_valid_range(__first1, __last1);
1948
1949      return _GLIBCXX_STD_A::__mismatch(__first1, __last1, __first2,
1950	__gnu_cxx::__ops::__iter_comp_iter(__binary_pred));
1951    }
1952
1953#if __cplusplus > 201103L
1954
1955  template<typename _InputIterator1, typename _InputIterator2,
1956	   typename _BinaryPredicate>
1957    _GLIBCXX20_CONSTEXPR
1958    pair<_InputIterator1, _InputIterator2>
1959    __mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1960	       _InputIterator2 __first2, _InputIterator2 __last2,
1961	       _BinaryPredicate __binary_pred)
1962    {
1963      while (__first1 != __last1 && __first2 != __last2
1964	     && __binary_pred(__first1, __first2))
1965	{
1966	  ++__first1;
1967	  ++__first2;
1968	}
1969      return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
1970    }
1971
1972  /**
1973   *  @brief Finds the places in ranges which don't match.
1974   *  @ingroup non_mutating_algorithms
1975   *  @param  __first1  An input iterator.
1976   *  @param  __last1   An input iterator.
1977   *  @param  __first2  An input iterator.
1978   *  @param  __last2   An input iterator.
1979   *  @return   A pair of iterators pointing to the first mismatch.
1980   *
1981   *  This compares the elements of two ranges using @c == and returns a pair
1982   *  of iterators.  The first iterator points into the first range, the
1983   *  second iterator points into the second range, and the elements pointed
1984   *  to by the iterators are not equal.
1985  */
1986  template<typename _InputIterator1, typename _InputIterator2>
1987    _GLIBCXX20_CONSTEXPR
1988    inline pair<_InputIterator1, _InputIterator2>
1989    mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1990	     _InputIterator2 __first2, _InputIterator2 __last2)
1991    {
1992      // concept requirements
1993      __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
1994      __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
1995      __glibcxx_function_requires(_EqualOpConcept<
1996	    typename iterator_traits<_InputIterator1>::value_type,
1997	    typename iterator_traits<_InputIterator2>::value_type>)
1998      __glibcxx_requires_valid_range(__first1, __last1);
1999      __glibcxx_requires_valid_range(__first2, __last2);
2000
2001      return _GLIBCXX_STD_A::__mismatch(__first1, __last1, __first2, __last2,
2002			     __gnu_cxx::__ops::__iter_equal_to_iter());
2003    }
2004
2005  /**
2006   *  @brief Finds the places in ranges which don't match.
2007   *  @ingroup non_mutating_algorithms
2008   *  @param  __first1  An input iterator.
2009   *  @param  __last1   An input iterator.
2010   *  @param  __first2  An input iterator.
2011   *  @param  __last2   An input iterator.
2012   *  @param __binary_pred A binary predicate @link functors
2013   *         functor@endlink.
2014   *  @return   A pair of iterators pointing to the first mismatch.
2015   *
2016   *  This compares the elements of two ranges using the binary_pred
2017   *  parameter, and returns a pair
2018   *  of iterators.  The first iterator points into the first range, the
2019   *  second iterator points into the second range, and the elements pointed
2020   *  to by the iterators are not equal.
2021  */
2022  template<typename _InputIterator1, typename _InputIterator2,
2023	   typename _BinaryPredicate>
2024    _GLIBCXX20_CONSTEXPR
2025    inline pair<_InputIterator1, _InputIterator2>
2026    mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
2027	     _InputIterator2 __first2, _InputIterator2 __last2,
2028	     _BinaryPredicate __binary_pred)
2029    {
2030      // concept requirements
2031      __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
2032      __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
2033      __glibcxx_requires_valid_range(__first1, __last1);
2034      __glibcxx_requires_valid_range(__first2, __last2);
2035
2036      return _GLIBCXX_STD_A::__mismatch(__first1, __last1, __first2, __last2,
2037			     __gnu_cxx::__ops::__iter_comp_iter(__binary_pred));
2038    }
2039#endif
2040
2041_GLIBCXX_END_NAMESPACE_ALGO
2042
2043  /// This is an overload used by find algos for the Input Iterator case.
2044  template<typename _InputIterator, typename _Predicate>
2045    _GLIBCXX20_CONSTEXPR
2046    inline _InputIterator
2047    __find_if(_InputIterator __first, _InputIterator __last,
2048	      _Predicate __pred, input_iterator_tag)
2049    {
2050      while (__first != __last && !__pred(__first))
2051	++__first;
2052      return __first;
2053    }
2054
2055  /// This is an overload used by find algos for the RAI case.
2056  template<typename _RandomAccessIterator, typename _Predicate>
2057    _GLIBCXX20_CONSTEXPR
2058    _RandomAccessIterator
2059    __find_if(_RandomAccessIterator __first, _RandomAccessIterator __last,
2060	      _Predicate __pred, random_access_iterator_tag)
2061    {
2062      typename iterator_traits<_RandomAccessIterator>::difference_type
2063	__trip_count = (__last - __first) >> 2;
2064
2065      for (; __trip_count > 0; --__trip_count)
2066	{
2067	  if (__pred(__first))
2068	    return __first;
2069	  ++__first;
2070
2071	  if (__pred(__first))
2072	    return __first;
2073	  ++__first;
2074
2075	  if (__pred(__first))
2076	    return __first;
2077	  ++__first;
2078
2079	  if (__pred(__first))
2080	    return __first;
2081	  ++__first;
2082	}
2083
2084      switch (__last - __first)
2085	{
2086	case 3:
2087	  if (__pred(__first))
2088	    return __first;
2089	  ++__first;
2090	  // FALLTHRU
2091	case 2:
2092	  if (__pred(__first))
2093	    return __first;
2094	  ++__first;
2095	  // FALLTHRU
2096	case 1:
2097	  if (__pred(__first))
2098	    return __first;
2099	  ++__first;
2100	  // FALLTHRU
2101	case 0:
2102	default:
2103	  return __last;
2104	}
2105    }
2106
2107  template<typename _Iterator, typename _Predicate>
2108    _GLIBCXX20_CONSTEXPR
2109    inline _Iterator
2110    __find_if(_Iterator __first, _Iterator __last, _Predicate __pred)
2111    {
2112      return __find_if(__first, __last, __pred,
2113		       std::__iterator_category(__first));
2114    }
2115
2116  template<typename _InputIterator, typename _Predicate>
2117    _GLIBCXX20_CONSTEXPR
2118    typename iterator_traits<_InputIterator>::difference_type
2119    __count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
2120    {
2121      typename iterator_traits<_InputIterator>::difference_type __n = 0;
2122      for (; __first != __last; ++__first)
2123	if (__pred(__first))
2124	  ++__n;
2125      return __n;
2126    }
2127
2128  template<typename _ForwardIterator, typename _Predicate>
2129    _GLIBCXX20_CONSTEXPR
2130    _ForwardIterator
2131    __remove_if(_ForwardIterator __first, _ForwardIterator __last,
2132		_Predicate __pred)
2133    {
2134      __first = std::__find_if(__first, __last, __pred);
2135      if (__first == __last)
2136	return __first;
2137      _ForwardIterator __result = __first;
2138      ++__first;
2139      for (; __first != __last; ++__first)
2140	if (!__pred(__first))
2141	  {
2142	    *__result = _GLIBCXX_MOVE(*__first);
2143	    ++__result;
2144	  }
2145      return __result;
2146    }
2147
2148#if __cplusplus >= 201103L
2149  template<typename _ForwardIterator1, typename _ForwardIterator2,
2150	   typename _BinaryPredicate>
2151    _GLIBCXX20_CONSTEXPR
2152    bool
2153    __is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
2154		     _ForwardIterator2 __first2, _BinaryPredicate __pred)
2155    {
2156      // Efficiently compare identical prefixes:  O(N) if sequences
2157      // have the same elements in the same order.
2158      for (; __first1 != __last1; ++__first1, (void)++__first2)
2159	if (!__pred(__first1, __first2))
2160	  break;
2161
2162      if (__first1 == __last1)
2163	return true;
2164
2165      // Establish __last2 assuming equal ranges by iterating over the
2166      // rest of the list.
2167      _ForwardIterator2 __last2 = __first2;
2168      std::advance(__last2, std::distance(__first1, __last1));
2169      for (_ForwardIterator1 __scan = __first1; __scan != __last1; ++__scan)
2170	{
2171	  if (__scan != std::__find_if(__first1, __scan,
2172			  __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan)))
2173	    continue; // We've seen this one before.
2174
2175	  auto __matches
2176	    = std::__count_if(__first2, __last2,
2177			__gnu_cxx::__ops::__iter_comp_iter(__pred, __scan));
2178	  if (0 == __matches ||
2179	      std::__count_if(__scan, __last1,
2180			__gnu_cxx::__ops::__iter_comp_iter(__pred, __scan))
2181	      != __matches)
2182	    return false;
2183	}
2184      return true;
2185    }
2186
2187  /**
2188   *  @brief  Checks whether a permutation of the second sequence is equal
2189   *          to the first sequence.
2190   *  @ingroup non_mutating_algorithms
2191   *  @param  __first1  Start of first range.
2192   *  @param  __last1   End of first range.
2193   *  @param  __first2  Start of second range.
2194   *  @return true if there exists a permutation of the elements in the range
2195   *          [__first2, __first2 + (__last1 - __first1)), beginning with
2196   *          ForwardIterator2 begin, such that equal(__first1, __last1, begin)
2197   *          returns true; otherwise, returns false.
2198  */
2199  template<typename _ForwardIterator1, typename _ForwardIterator2>
2200    _GLIBCXX20_CONSTEXPR
2201    inline bool
2202    is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
2203		   _ForwardIterator2 __first2)
2204    {
2205      // concept requirements
2206      __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
2207      __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
2208      __glibcxx_function_requires(_EqualOpConcept<
2209		typename iterator_traits<_ForwardIterator1>::value_type,
2210		typename iterator_traits<_ForwardIterator2>::value_type>)
2211      __glibcxx_requires_valid_range(__first1, __last1);
2212
2213      return std::__is_permutation(__first1, __last1, __first2,
2214				   __gnu_cxx::__ops::__iter_equal_to_iter());
2215    }
2216#endif // C++11
2217
2218_GLIBCXX_END_NAMESPACE_VERSION
2219} // namespace std
2220
2221// NB: This file is included within many other C++ includes, as a way
2222// of getting the base algorithms. So, make sure that parallel bits
2223// come in too if requested.
2224#ifdef _GLIBCXX_PARALLEL
2225# include <parallel/algobase.h>
2226#endif
2227
2228#endif
2229