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