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