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