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 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