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