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