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