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