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