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