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