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