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