blob: 3e0938fe2ea81efcdac29e732d339a440c58abde [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001// -*- C++ -*-
2//===-------------------------- algorithm ---------------------------------===//
3//
Howard Hinnantf5256e12010-05-11 21:36:01 +00004// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005//
Howard Hinnantb64f8b02010-11-16 22:09:02 +00006// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00008//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_ALGORITHM
12#define _LIBCPP_ALGORITHM
13
14/*
15 algorithm synopsis
16
17#include <initializer_list>
18
19namespace std
20{
21
22template <class InputIterator, class Predicate>
23 bool
24 all_of(InputIterator first, InputIterator last, Predicate pred);
25
26template <class InputIterator, class Predicate>
27 bool
28 any_of(InputIterator first, InputIterator last, Predicate pred);
29
30template <class InputIterator, class Predicate>
31 bool
32 none_of(InputIterator first, InputIterator last, Predicate pred);
33
34template <class InputIterator, class Function>
35 Function
36 for_each(InputIterator first, InputIterator last, Function f);
37
38template <class InputIterator, class T>
39 InputIterator
40 find(InputIterator first, InputIterator last, const T& value);
41
42template <class InputIterator, class Predicate>
43 InputIterator
44 find_if(InputIterator first, InputIterator last, Predicate pred);
45
46template<class InputIterator, class Predicate>
47 InputIterator
48 find_if_not(InputIterator first, InputIterator last, Predicate pred);
49
50template <class ForwardIterator1, class ForwardIterator2>
51 ForwardIterator1
52 find_end(ForwardIterator1 first1, ForwardIterator1 last1,
53 ForwardIterator2 first2, ForwardIterator2 last2);
54
55template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
56 ForwardIterator1
57 find_end(ForwardIterator1 first1, ForwardIterator1 last1,
58 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
59
60template <class ForwardIterator1, class ForwardIterator2>
61 ForwardIterator1
62 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
63 ForwardIterator2 first2, ForwardIterator2 last2);
64
65template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
66 ForwardIterator1
67 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
68 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
69
70template <class ForwardIterator>
71 ForwardIterator
72 adjacent_find(ForwardIterator first, ForwardIterator last);
73
74template <class ForwardIterator, class BinaryPredicate>
75 ForwardIterator
76 adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
77
78template <class InputIterator, class T>
79 typename iterator_traits<InputIterator>::difference_type
80 count(InputIterator first, InputIterator last, const T& value);
81
82template <class InputIterator, class Predicate>
83 typename iterator_traits<InputIterator>::difference_type
84 count_if(InputIterator first, InputIterator last, Predicate pred);
85
86template <class InputIterator1, class InputIterator2>
87 pair<InputIterator1, InputIterator2>
88 mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
89
90template <class InputIterator1, class InputIterator2, class BinaryPredicate>
91 pair<InputIterator1, InputIterator2>
92 mismatch(InputIterator1 first1, InputIterator1 last1,
93 InputIterator2 first2, BinaryPredicate pred);
94
95template <class InputIterator1, class InputIterator2>
96 bool
97 equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
98
99template <class InputIterator1, class InputIterator2, class BinaryPredicate>
100 bool
101 equal(InputIterator1 first1, InputIterator1 last1,
102 InputIterator2 first2, BinaryPredicate pred);
103
104template<class ForwardIterator1, class ForwardIterator2>
105 bool
106 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
107 ForwardIterator2 first2);
108
109template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
110 bool
111 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
112 ForwardIterator2 first2, BinaryPredicate pred);
113
114template <class ForwardIterator1, class ForwardIterator2>
115 ForwardIterator1
116 search(ForwardIterator1 first1, ForwardIterator1 last1,
117 ForwardIterator2 first2, ForwardIterator2 last2);
118
119template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
120 ForwardIterator1
121 search(ForwardIterator1 first1, ForwardIterator1 last1,
122 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
123
124template <class ForwardIterator, class Size, class T>
125 ForwardIterator
126 search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value);
127
128template <class ForwardIterator, class Size, class T, class BinaryPredicate>
129 ForwardIterator
130 search_n(ForwardIterator first, ForwardIterator last,
131 Size count, const T& value, BinaryPredicate pred);
132
133template <class InputIterator, class OutputIterator>
134 OutputIterator
135 copy(InputIterator first, InputIterator last, OutputIterator result);
136
137template<class InputIterator, class OutputIterator, class Predicate>
138 OutputIterator
139 copy_if(InputIterator first, InputIterator last,
140 OutputIterator result, Predicate pred);
141
142template<class InputIterator, class Size, class OutputIterator>
143 OutputIterator
144 copy_n(InputIterator first, Size n, OutputIterator result);
145
146template <class BidirectionalIterator1, class BidirectionalIterator2>
147 BidirectionalIterator2
148 copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last,
149 BidirectionalIterator2 result);
150
151template <class ForwardIterator1, class ForwardIterator2>
152 ForwardIterator2
153 swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2);
154
155template <class ForwardIterator1, class ForwardIterator2>
156 void
157 iter_swap(ForwardIterator1 a, ForwardIterator2 b);
158
159template <class InputIterator, class OutputIterator, class UnaryOperation>
160 OutputIterator
161 transform(InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op);
162
163template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation>
164 OutputIterator
165 transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2,
166 OutputIterator result, BinaryOperation binary_op);
167
168template <class ForwardIterator, class T>
169 void
170 replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value);
171
172template <class ForwardIterator, class Predicate, class T>
173 void
174 replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value);
175
176template <class InputIterator, class OutputIterator, class T>
177 OutputIterator
178 replace_copy(InputIterator first, InputIterator last, OutputIterator result,
179 const T& old_value, const T& new_value);
180
181template <class InputIterator, class OutputIterator, class Predicate, class T>
182 OutputIterator
183 replace_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value);
184
185template <class ForwardIterator, class T>
186 void
187 fill(ForwardIterator first, ForwardIterator last, const T& value);
188
189template <class OutputIterator, class Size, class T>
190 OutputIterator
191 fill_n(OutputIterator first, Size n, const T& value);
192
193template <class ForwardIterator, class Generator>
194 void
195 generate(ForwardIterator first, ForwardIterator last, Generator gen);
196
197template <class OutputIterator, class Size, class Generator>
198 OutputIterator
199 generate_n(OutputIterator first, Size n, Generator gen);
200
201template <class ForwardIterator, class T>
202 ForwardIterator
203 remove(ForwardIterator first, ForwardIterator last, const T& value);
204
205template <class ForwardIterator, class Predicate>
206 ForwardIterator
207 remove_if(ForwardIterator first, ForwardIterator last, Predicate pred);
208
209template <class InputIterator, class OutputIterator, class T>
210 OutputIterator
211 remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value);
212
213template <class InputIterator, class OutputIterator, class Predicate>
214 OutputIterator
215 remove_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred);
216
217template <class ForwardIterator>
218 ForwardIterator
219 unique(ForwardIterator first, ForwardIterator last);
220
221template <class ForwardIterator, class BinaryPredicate>
222 ForwardIterator
223 unique(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
224
225template <class InputIterator, class OutputIterator>
226 OutputIterator
227 unique_copy(InputIterator first, InputIterator last, OutputIterator result);
228
229template <class InputIterator, class OutputIterator, class BinaryPredicate>
230 OutputIterator
231 unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate pred);
232
233template <class BidirectionalIterator>
234 void
235 reverse(BidirectionalIterator first, BidirectionalIterator last);
236
237template <class BidirectionalIterator, class OutputIterator>
238 OutputIterator
239 reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result);
240
241template <class ForwardIterator>
242 ForwardIterator
243 rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last);
244
245template <class ForwardIterator, class OutputIterator>
246 OutputIterator
247 rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result);
248
249template <class RandomAccessIterator>
250 void
251 random_shuffle(RandomAccessIterator first, RandomAccessIterator last);
252
253template <class RandomAccessIterator, class RandomNumberGenerator>
254 void
255 random_shuffle(RandomAccessIterator first, RandomAccessIterator last, RandomNumberGenerator& rand);
256
Howard Hinnantc3267212010-05-26 17:49:34 +0000257template<class RandomAccessIterator, class UniformRandomNumberGenerator>
258 void shuffle(RandomAccessIterator first, RandomAccessIterator last,
Howard Hinnant278bf2d2010-11-18 01:47:02 +0000259 UniformRandomNumberGenerator&& g);
Howard Hinnantc3267212010-05-26 17:49:34 +0000260
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000261template <class InputIterator, class Predicate>
262 bool
263 is_partitioned(InputIterator first, InputIterator last, Predicate pred);
264
265template <class ForwardIterator, class Predicate>
266 ForwardIterator
267 partition(ForwardIterator first, ForwardIterator last, Predicate pred);
268
269template <class InputIterator, class OutputIterator1,
270 class OutputIterator2, class Predicate>
271 pair<OutputIterator1, OutputIterator2>
272 partition_copy(InputIterator first, InputIterator last,
273 OutputIterator1 out_true, OutputIterator2 out_false,
274 Predicate pred);
275
276template <class ForwardIterator, class Predicate>
277 ForwardIterator
278 stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred);
279
280template<class ForwardIterator, class Predicate>
281 ForwardIterator
282 partition_point(ForwardIterator first, ForwardIterator last, Predicate pred);
283
284template <class ForwardIterator>
285 bool
286 is_sorted(ForwardIterator first, ForwardIterator last);
287
288template <class ForwardIterator, class Compare>
289 bool
290 is_sorted(ForwardIterator first, ForwardIterator last, Compare comp);
291
292template<class ForwardIterator>
293 ForwardIterator
294 is_sorted_until(ForwardIterator first, ForwardIterator last);
295
296template <class ForwardIterator, class Compare>
297 ForwardIterator
298 is_sorted_until(ForwardIterator first, ForwardIterator last, Compare comp);
299
300template <class RandomAccessIterator>
301 void
302 sort(RandomAccessIterator first, RandomAccessIterator last);
303
304template <class RandomAccessIterator, class Compare>
305 void
306 sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
307
308template <class RandomAccessIterator>
309 void
310 stable_sort(RandomAccessIterator first, RandomAccessIterator last);
311
312template <class RandomAccessIterator, class Compare>
313 void
314 stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
315
316template <class RandomAccessIterator>
317 void
318 partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last);
319
320template <class RandomAccessIterator, class Compare>
321 void
322 partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp);
323
324template <class InputIterator, class RandomAccessIterator>
325 RandomAccessIterator
326 partial_sort_copy(InputIterator first, InputIterator last,
327 RandomAccessIterator result_first, RandomAccessIterator result_last);
328
329template <class InputIterator, class RandomAccessIterator, class Compare>
330 RandomAccessIterator
331 partial_sort_copy(InputIterator first, InputIterator last,
332 RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp);
333
334template <class RandomAccessIterator>
335 void
336 nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last);
337
338template <class RandomAccessIterator, class Compare>
339 void
340 nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp);
341
342template <class ForwardIterator, class T>
343 ForwardIterator
344 lower_bound(ForwardIterator first, ForwardIterator last, const T& value);
345
346template <class ForwardIterator, class T, class Compare>
347 ForwardIterator
348 lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
349
350template <class ForwardIterator, class T>
351 ForwardIterator
352 upper_bound(ForwardIterator first, ForwardIterator last, const T& value);
353
354template <class ForwardIterator, class T, class Compare>
355 ForwardIterator
356 upper_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
357
358template <class ForwardIterator, class T>
359 pair<ForwardIterator, ForwardIterator>
360 equal_range(ForwardIterator first, ForwardIterator last, const T& value);
361
362template <class ForwardIterator, class T, class Compare>
363 pair<ForwardIterator, ForwardIterator>
364 equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
365
366template <class ForwardIterator, class T>
367 bool
368 binary_search(ForwardIterator first, ForwardIterator last, const T& value);
369
370template <class ForwardIterator, class T, class Compare>
371 bool
372 binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
373
374template <class InputIterator1, class InputIterator2, class OutputIterator>
375 OutputIterator
376 merge(InputIterator1 first1, InputIterator1 last1,
377 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
378
379template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
380 OutputIterator
381 merge(InputIterator1 first1, InputIterator1 last1,
382 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
383
384template <class BidirectionalIterator>
385 void
386 inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last);
387
388template <class BidirectionalIterator, class Compare>
389 void
390 inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp);
391
392template <class InputIterator1, class InputIterator2>
393 bool
394 includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
395
396template <class InputIterator1, class InputIterator2, class Compare>
397 bool
398 includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp);
399
400template <class InputIterator1, class InputIterator2, class OutputIterator>
401 OutputIterator
402 set_union(InputIterator1 first1, InputIterator1 last1,
403 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
404
405template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
406 OutputIterator
407 set_union(InputIterator1 first1, InputIterator1 last1,
408 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
409
410template <class InputIterator1, class InputIterator2, class OutputIterator>
411 OutputIterator
412 set_intersection(InputIterator1 first1, InputIterator1 last1,
413 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
414
415template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
416 OutputIterator
417 set_intersection(InputIterator1 first1, InputIterator1 last1,
418 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
419
420template <class InputIterator1, class InputIterator2, class OutputIterator>
421 OutputIterator
422 set_difference(InputIterator1 first1, InputIterator1 last1,
423 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
424
425template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
426 OutputIterator
427 set_difference(InputIterator1 first1, InputIterator1 last1,
428 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
429
430template <class InputIterator1, class InputIterator2, class OutputIterator>
431 OutputIterator
432 set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
433 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
434
435template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
436 OutputIterator
437 set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
438 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
439
440template <class RandomAccessIterator>
441 void
442 push_heap(RandomAccessIterator first, RandomAccessIterator last);
443
444template <class RandomAccessIterator, class Compare>
445 void
446 push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
447
448template <class RandomAccessIterator>
449 void
450 pop_heap(RandomAccessIterator first, RandomAccessIterator last);
451
452template <class RandomAccessIterator, class Compare>
453 void
454 pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
455
456template <class RandomAccessIterator>
457 void
458 make_heap(RandomAccessIterator first, RandomAccessIterator last);
459
460template <class RandomAccessIterator, class Compare>
461 void
462 make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
463
464template <class RandomAccessIterator>
465 void
466 sort_heap(RandomAccessIterator first, RandomAccessIterator last);
467
468template <class RandomAccessIterator, class Compare>
469 void
470 sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
471
Howard Hinnant324bb032010-08-22 00:02:43 +0000472template <class RandomAccessIterator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000473 bool
Howard Hinnant324bb032010-08-22 00:02:43 +0000474 is_heap(RandomAccessIterator first, RandomAccessiterator last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000475
Howard Hinnant324bb032010-08-22 00:02:43 +0000476template <class RandomAccessIterator, class Compare>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000477 bool
Howard Hinnant324bb032010-08-22 00:02:43 +0000478 is_heap(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000479
Howard Hinnant324bb032010-08-22 00:02:43 +0000480template <class RandomAccessIterator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000481 RandomAccessIterator
Howard Hinnant324bb032010-08-22 00:02:43 +0000482 is_heap_until(RandomAccessIterator first, RandomAccessiterator last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000483
Howard Hinnant324bb032010-08-22 00:02:43 +0000484template <class RandomAccessIterator, class Compare>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000485 RandomAccessIterator
Howard Hinnant324bb032010-08-22 00:02:43 +0000486 is_heap_until(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000487
Howard Hinnant98e5d972010-08-21 20:10:01 +0000488template <class ForwardIterator>
489 ForwardIterator
490 min_element(ForwardIterator first, ForwardIterator last);
491
492template <class ForwardIterator, class Compare>
493 ForwardIterator
494 min_element(ForwardIterator first, ForwardIterator last, Compare comp);
495
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000496template <class T>
497 const T&
498 min(const T& a, const T& b);
499
500template <class T, class Compare>
501 const T&
502 min(const T& a, const T& b, Compare comp);
503
Howard Hinnant98e5d972010-08-21 20:10:01 +0000504template<class T>
505 T
506 min(initializer_list<T> t);
507
508template<class T, class Compare>
509 T
510 min(initializer_list<T> t, Compare comp);
511
512template <class ForwardIterator>
513 ForwardIterator
514 max_element(ForwardIterator first, ForwardIterator last);
515
516template <class ForwardIterator, class Compare>
517 ForwardIterator
518 max_element(ForwardIterator first, ForwardIterator last, Compare comp);
519
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000520template <class T>
521 const T&
522 max(const T& a, const T& b);
523
524template <class T, class Compare>
525 const T&
526 max(const T& a, const T& b, Compare comp);
527
Howard Hinnant98e5d972010-08-21 20:10:01 +0000528template<class T>
529 T
530 max(initializer_list<T> t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000531
Howard Hinnant98e5d972010-08-21 20:10:01 +0000532template<class T, class Compare>
533 T
534 max(initializer_list<T> t, Compare comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000535
Howard Hinnant98e5d972010-08-21 20:10:01 +0000536template<class ForwardIterator>
537 pair<ForwardIterator, ForwardIterator>
538 minmax_element(ForwardIterator first, ForwardIterator last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000539
Howard Hinnant98e5d972010-08-21 20:10:01 +0000540template<class ForwardIterator, class Compare>
541 pair<ForwardIterator, ForwardIterator>
542 minmax_element(ForwardIterator first, ForwardIterator last, Compare comp);
543
544template<class T>
545 pair<const T&, const T&>
546 minmax(const T& a, const T& b);
547
548template<class T, class Compare>
549 pair<const T&, const T&>
550 minmax(const T& a, const T& b, Compare comp);
551
552template<class T>
553 pair<T, T>
554 minmax(initializer_list<T> t);
555
556template<class T, class Compare>
557 pair<T, T>
558 minmax(initializer_list<T> t, Compare comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000559
560template <class InputIterator1, class InputIterator2>
561 bool
562 lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
563
564template <class InputIterator1, class InputIterator2, class Compare>
565 bool
566 lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
567 InputIterator2 first2, InputIterator2 last2, Compare comp);
568
569template <class BidirectionalIterator>
Howard Hinnant324bb032010-08-22 00:02:43 +0000570 bool
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000571 next_permutation(BidirectionalIterator first, BidirectionalIterator last);
572
573template <class BidirectionalIterator, class Compare>
574 bool
575 next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
576
577template <class BidirectionalIterator>
578 bool
579 prev_permutation(BidirectionalIterator first, BidirectionalIterator last);
580
581template <class BidirectionalIterator, class Compare>
582 bool
583 prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
584
585} // std
586
587*/
588
589#include <__config>
590#include <initializer_list>
591#include <type_traits>
592#include <cstring>
593#include <utility>
594#include <memory>
595#include <iterator>
596#ifdef _LIBCPP_DEBUG
597#include <cassert>
598#endif
Howard Hinnantadff4892010-05-24 17:49:41 +0000599#include <cstdlib>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000600
601#pragma GCC system_header
602
603_LIBCPP_BEGIN_NAMESPACE_STD
604
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000605template <class _T1, class _T2 = _T1>
606struct __equal_to
607{
608 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
609 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T2& __y) const {return __x == __y;}
610 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T1& __y) const {return __x == __y;}
611 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T2& __y) const {return __x == __y;}
612};
613
614template <class _T1>
615struct __equal_to<_T1, _T1>
616{
617 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
618};
619
620template <class _T1>
621struct __equal_to<const _T1, _T1>
622{
623 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
624};
625
626template <class _T1>
627struct __equal_to<_T1, const _T1>
628{
629 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
630};
631
632template <class _T1, class _T2 = _T1>
633struct __less
634{
635 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
636 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T2& __y) const {return __x < __y;}
637 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T1& __y) const {return __x < __y;}
638 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T2& __y) const {return __x < __y;}
639};
640
641template <class _T1>
642struct __less<_T1, _T1>
643{
644 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
645};
646
647template <class _T1>
648struct __less<const _T1, _T1>
649{
650 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
651};
652
653template <class _T1>
654struct __less<_T1, const _T1>
655{
656 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
657};
658
659template <class _Predicate>
660class __negate
661{
662private:
663 _Predicate __p_;
664public:
665 _LIBCPP_INLINE_VISIBILITY __negate() {}
666
667 _LIBCPP_INLINE_VISIBILITY
668 explicit __negate(_Predicate __p) : __p_(__p) {}
669
670 template <class _T1>
671 _LIBCPP_INLINE_VISIBILITY
672 bool operator()(const _T1& __x) {return !__p_(__x);}
673
674 template <class _T1, class _T2>
675 _LIBCPP_INLINE_VISIBILITY
676 bool operator()(const _T1& __x, const _T2& __y) {return !__p_(__x, __y);}
677};
678
679#ifdef _LIBCPP_DEBUG
680
681template <class _Compare>
682struct __debug_less
683{
684 _Compare __comp_;
685 __debug_less(_Compare& __c) : __comp_(__c) {}
686 template <class _Tp, class _Up>
687 bool operator()(const _Tp& __x, const _Up& __y)
688 {
689 bool __r = __comp_(__x, __y);
690 if (__r)
691 assert(!__comp_(__y, __x));
692 return __r;
693 }
694};
695
696#endif // _LIBCPP_DEBUG
697
Howard Hinnant13c98cc2010-05-27 20:06:01 +0000698// Precondition: __x != 0
699inline _LIBCPP_INLINE_VISIBILITY unsigned __ctz(unsigned __x) {return __builtin_ctz (__x);}
700inline _LIBCPP_INLINE_VISIBILITY unsigned long __ctz(unsigned long __x) {return __builtin_ctzl (__x);}
701inline _LIBCPP_INLINE_VISIBILITY unsigned long long __ctz(unsigned long long __x) {return __builtin_ctzll(__x);}
702
703// Precondition: __x != 0
704inline _LIBCPP_INLINE_VISIBILITY unsigned __clz(unsigned __x) {return __builtin_clz (__x);}
705inline _LIBCPP_INLINE_VISIBILITY unsigned long __clz(unsigned long __x) {return __builtin_clzl (__x);}
706inline _LIBCPP_INLINE_VISIBILITY unsigned long long __clz(unsigned long long __x) {return __builtin_clzll(__x);}
707
708inline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned __x) {return __builtin_popcount (__x);}
709inline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned long __x) {return __builtin_popcountl (__x);}
710inline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned long long __x) {return __builtin_popcountll(__x);}
711
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000712// all_of
713
714template <class _InputIterator, class _Predicate>
715inline _LIBCPP_INLINE_VISIBILITY
716bool
717all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
718{
719 for (; __first != __last; ++__first)
720 if (!__pred(*__first))
721 return false;
722 return true;
723}
724
725// any_of
726
727template <class _InputIterator, class _Predicate>
728inline _LIBCPP_INLINE_VISIBILITY
729bool
730any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
731{
732 for (; __first != __last; ++__first)
733 if (__pred(*__first))
734 return true;
735 return false;
736}
737
738// none_of
739
740template <class _InputIterator, class _Predicate>
741inline _LIBCPP_INLINE_VISIBILITY
742bool
743none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
744{
745 for (; __first != __last; ++__first)
746 if (__pred(*__first))
747 return false;
748 return true;
749}
750
751// for_each
752
753template <class _InputIterator, class _Function>
754inline _LIBCPP_INLINE_VISIBILITY
755_Function
756for_each(_InputIterator __first, _InputIterator __last, _Function __f)
757{
758 for (; __first != __last; ++__first)
759 __f(*__first);
Howard Hinnant0949eed2011-06-30 21:18:19 +0000760 return _VSTD::move(__f);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000761}
762
763// find
764
765template <class _InputIterator, class _Tp>
766inline _LIBCPP_INLINE_VISIBILITY
767_InputIterator
768find(_InputIterator __first, _InputIterator __last, const _Tp& __value)
769{
770 for (; __first != __last; ++__first)
771 if (*__first == __value)
772 break;
773 return __first;
774}
775
776// find_if
777
778template <class _InputIterator, class _Predicate>
779inline _LIBCPP_INLINE_VISIBILITY
780_InputIterator
781find_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
782{
783 for (; __first != __last; ++__first)
784 if (__pred(*__first))
785 break;
786 return __first;
787}
788
789// find_if_not
790
791template<class _InputIterator, class _Predicate>
792inline _LIBCPP_INLINE_VISIBILITY
793_InputIterator
794find_if_not(_InputIterator __first, _InputIterator __last, _Predicate __pred)
795{
796 for (; __first != __last; ++__first)
797 if (!__pred(*__first))
798 break;
799 return __first;
800}
801
802// find_end
803
804template <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
805_ForwardIterator1
806__find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
807 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred,
808 forward_iterator_tag, forward_iterator_tag)
809{
810 // modeled after search algorithm
811 _ForwardIterator1 __r = __last1; // __last1 is the "default" answer
812 if (__first2 == __last2)
813 return __r;
814 while (true)
815 {
816 while (true)
817 {
818 if (__first1 == __last1) // if source exhausted return last correct answer
819 return __r; // (or __last1 if never found)
820 if (__pred(*__first1, *__first2))
821 break;
822 ++__first1;
823 }
824 // *__first1 matches *__first2, now match elements after here
825 _ForwardIterator1 __m1 = __first1;
826 _ForwardIterator2 __m2 = __first2;
827 while (true)
828 {
829 if (++__m2 == __last2)
830 { // Pattern exhaused, record answer and search for another one
831 __r = __first1;
832 ++__first1;
833 break;
834 }
835 if (++__m1 == __last1) // Source exhausted, return last answer
836 return __r;
837 if (!__pred(*__m1, *__m2)) // mismatch, restart with a new __first
838 {
839 ++__first1;
840 break;
841 } // else there is a match, check next elements
842 }
843 }
844}
845
846template <class _BinaryPredicate, class _BidirectionalIterator1, class _BidirectionalIterator2>
847_BidirectionalIterator1
848__find_end(_BidirectionalIterator1 __first1, _BidirectionalIterator1 __last1,
849 _BidirectionalIterator2 __first2, _BidirectionalIterator2 __last2, _BinaryPredicate __pred,
850 bidirectional_iterator_tag, bidirectional_iterator_tag)
851{
852 // modeled after search algorithm (in reverse)
853 if (__first2 == __last2)
854 return __last1; // Everything matches an empty sequence
855 _BidirectionalIterator1 __l1 = __last1;
856 _BidirectionalIterator2 __l2 = __last2;
857 --__l2;
858 while (true)
859 {
860 // Find last element in sequence 1 that matchs *(__last2-1), with a mininum of loop checks
861 while (true)
862 {
863 if (__first1 == __l1) // return __last1 if no element matches *__first2
864 return __last1;
865 if (__pred(*--__l1, *__l2))
866 break;
867 }
868 // *__l1 matches *__l2, now match elements before here
869 _BidirectionalIterator1 __m1 = __l1;
870 _BidirectionalIterator2 __m2 = __l2;
871 while (true)
872 {
873 if (__m2 == __first2) // If pattern exhausted, __m1 is the answer (works for 1 element pattern)
874 return __m1;
875 if (__m1 == __first1) // Otherwise if source exhaused, pattern not found
876 return __last1;
877 if (!__pred(*--__m1, *--__m2)) // if there is a mismatch, restart with a new __l1
878 {
879 break;
880 } // else there is a match, check next elements
881 }
882 }
883}
884
885template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
886_RandomAccessIterator1
887__find_end(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
888 _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
889 random_access_iterator_tag, random_access_iterator_tag)
890{
891 // Take advantage of knowing source and pattern lengths. Stop short when source is smaller than pattern
892 typename iterator_traits<_RandomAccessIterator2>::difference_type __len2 = __last2 - __first2;
893 if (__len2 == 0)
894 return __last1;
895 typename iterator_traits<_RandomAccessIterator1>::difference_type __len1 = __last1 - __first1;
896 if (__len1 < __len2)
897 return __last1;
898 const _RandomAccessIterator1 __s = __first1 + (__len2 - 1); // End of pattern match can't go before here
899 _RandomAccessIterator1 __l1 = __last1;
900 _RandomAccessIterator2 __l2 = __last2;
901 --__l2;
902 while (true)
903 {
904 while (true)
905 {
906 if (__s == __l1)
907 return __last1;
908 if (__pred(*--__l1, *__l2))
909 break;
910 }
911 _RandomAccessIterator1 __m1 = __l1;
912 _RandomAccessIterator2 __m2 = __l2;
913 while (true)
914 {
915 if (__m2 == __first2)
916 return __m1;
917 // no need to check range on __m1 because __s guarantees we have enough source
918 if (!__pred(*--__m1, *--__m2))
919 {
920 break;
921 }
922 }
923 }
924}
925
926template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
927inline _LIBCPP_INLINE_VISIBILITY
928_ForwardIterator1
929find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
930 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
931{
Howard Hinnant0949eed2011-06-30 21:18:19 +0000932 return _VSTD::__find_end<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000933 (__first1, __last1, __first2, __last2, __pred,
934 typename iterator_traits<_ForwardIterator1>::iterator_category(),
935 typename iterator_traits<_ForwardIterator2>::iterator_category());
936}
937
938template <class _ForwardIterator1, class _ForwardIterator2>
939inline _LIBCPP_INLINE_VISIBILITY
940_ForwardIterator1
941find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
942 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
943{
944 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
945 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnant0949eed2011-06-30 21:18:19 +0000946 return _VSTD::find_end(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000947}
948
949// find_first_of
950
951template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
952_ForwardIterator1
953find_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
954 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
955{
956 for (; __first1 != __last1; ++__first1)
957 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
958 if (__pred(*__first1, *__j))
959 return __first1;
960 return __last1;
961}
962
963template <class _ForwardIterator1, class _ForwardIterator2>
964inline _LIBCPP_INLINE_VISIBILITY
965_ForwardIterator1
966find_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
967 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
968{
969 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
970 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnant0949eed2011-06-30 21:18:19 +0000971 return _VSTD::find_first_of(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000972}
973
974// adjacent_find
975
976template <class _ForwardIterator, class _BinaryPredicate>
977inline _LIBCPP_INLINE_VISIBILITY
978_ForwardIterator
979adjacent_find(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred)
980{
981 if (__first != __last)
982 {
983 _ForwardIterator __i = __first;
984 while (++__i != __last)
985 {
986 if (__pred(*__first, *__i))
987 return __first;
988 __first = __i;
989 }
990 }
991 return __last;
992}
993
994template <class _ForwardIterator>
995inline _LIBCPP_INLINE_VISIBILITY
996_ForwardIterator
997adjacent_find(_ForwardIterator __first, _ForwardIterator __last)
998{
999 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001000 return _VSTD::adjacent_find(__first, __last, __equal_to<__v>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001001}
1002
1003// count
1004
1005template <class _InputIterator, class _Tp>
1006inline _LIBCPP_INLINE_VISIBILITY
1007typename iterator_traits<_InputIterator>::difference_type
1008count(_InputIterator __first, _InputIterator __last, const _Tp& __value)
1009{
1010 typename iterator_traits<_InputIterator>::difference_type __r(0);
1011 for (; __first != __last; ++__first)
1012 if (*__first == __value)
1013 ++__r;
1014 return __r;
1015}
1016
1017// count_if
1018
1019template <class _InputIterator, class _Predicate>
1020inline _LIBCPP_INLINE_VISIBILITY
1021typename iterator_traits<_InputIterator>::difference_type
1022count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
1023{
1024 typename iterator_traits<_InputIterator>::difference_type __r(0);
1025 for (; __first != __last; ++__first)
1026 if (__pred(*__first))
1027 ++__r;
1028 return __r;
1029}
1030
1031// mismatch
1032
1033template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
1034inline _LIBCPP_INLINE_VISIBILITY
1035pair<_InputIterator1, _InputIterator2>
1036mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1037 _InputIterator2 __first2, _BinaryPredicate __pred)
1038{
1039 for (; __first1 != __last1; ++__first1, ++__first2)
1040 if (!__pred(*__first1, *__first2))
1041 break;
1042 return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
1043}
1044
1045template <class _InputIterator1, class _InputIterator2>
1046inline _LIBCPP_INLINE_VISIBILITY
1047pair<_InputIterator1, _InputIterator2>
1048mismatch(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2)
1049{
1050 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1051 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001052 return _VSTD::mismatch(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001053}
1054
1055// equal
1056
1057template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
1058inline _LIBCPP_INLINE_VISIBILITY
1059bool
1060equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _BinaryPredicate __pred)
1061{
1062 for (; __first1 != __last1; ++__first1, ++__first2)
1063 if (!__pred(*__first1, *__first2))
1064 return false;
1065 return true;
1066}
1067
1068template <class _InputIterator1, class _InputIterator2>
1069inline _LIBCPP_INLINE_VISIBILITY
1070bool
1071equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2)
1072{
1073 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1074 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001075 return _VSTD::equal(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001076}
1077
1078// is_permutation
1079
1080template<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
1081bool
1082is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1083 _ForwardIterator2 __first2, _BinaryPredicate __pred)
1084{
1085 // shorten sequences as much as possible by lopping of any equal parts
1086 for (; __first1 != __last1; ++__first1, ++__first2)
1087 if (!__pred(*__first1, *__first2))
1088 goto __not_done;
1089 return true;
1090__not_done:
1091 // __first1 != __last1 && *__first1 != *__first2
1092 typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001093 _D1 __l1 = _VSTD::distance(__first1, __last1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001094 if (__l1 == _D1(1))
1095 return false;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001096 _ForwardIterator2 __last2 = _VSTD::next(__first2, __l1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001097 // For each element in [f1, l1) see if there are the same number of
1098 // equal elements in [f2, l2)
1099 for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i)
1100 {
1101 // Have we already counted the number of *__i in [f1, l1)?
1102 for (_ForwardIterator1 __j = __first1; __j != __i; ++__j)
1103 if (__pred(*__j, *__i))
1104 goto __next_iter;
1105 {
1106 // Count number of *__i in [f2, l2)
1107 _D1 __c2 = 0;
1108 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
1109 if (__pred(*__i, *__j))
1110 ++__c2;
1111 if (__c2 == 0)
1112 return false;
1113 // Count number of *__i in [__i, l1) (we can start with 1)
1114 _D1 __c1 = 1;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001115 for (_ForwardIterator1 __j = _VSTD::next(__i); __j != __last1; ++__j)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001116 if (__pred(*__i, *__j))
1117 ++__c1;
1118 if (__c1 != __c2)
1119 return false;
1120 }
1121__next_iter:;
1122 }
1123 return true;
1124}
1125
1126template<class _ForwardIterator1, class _ForwardIterator2>
1127inline _LIBCPP_INLINE_VISIBILITY
1128bool
1129is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1130 _ForwardIterator2 __first2)
1131{
1132 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1133 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001134 return _VSTD::is_permutation(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001135}
1136
1137// search
1138
1139template <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
1140_ForwardIterator1
1141__search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1142 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred,
1143 forward_iterator_tag, forward_iterator_tag)
1144{
1145 if (__first2 == __last2)
1146 return __first1; // Everything matches an empty sequence
1147 while (true)
1148 {
1149 // Find first element in sequence 1 that matchs *__first2, with a mininum of loop checks
1150 while (true)
1151 {
1152 if (__first1 == __last1) // return __last1 if no element matches *__first2
1153 return __last1;
1154 if (__pred(*__first1, *__first2))
1155 break;
1156 ++__first1;
1157 }
1158 // *__first1 matches *__first2, now match elements after here
1159 _ForwardIterator1 __m1 = __first1;
1160 _ForwardIterator2 __m2 = __first2;
1161 while (true)
1162 {
1163 if (++__m2 == __last2) // If pattern exhausted, __first1 is the answer (works for 1 element pattern)
1164 return __first1;
1165 if (++__m1 == __last1) // Otherwise if source exhaused, pattern not found
1166 return __last1;
1167 if (!__pred(*__m1, *__m2)) // if there is a mismatch, restart with a new __first1
1168 {
1169 ++__first1;
1170 break;
1171 } // else there is a match, check next elements
1172 }
1173 }
1174}
1175
1176template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
1177_RandomAccessIterator1
1178__search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
1179 _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
1180 random_access_iterator_tag, random_access_iterator_tag)
1181{
1182 typedef typename std::iterator_traits<_RandomAccessIterator1>::difference_type _D1;
1183 typedef typename std::iterator_traits<_RandomAccessIterator2>::difference_type _D2;
1184 // Take advantage of knowing source and pattern lengths. Stop short when source is smaller than pattern
1185 _D2 __len2 = __last2 - __first2;
1186 if (__len2 == 0)
1187 return __first1;
1188 _D1 __len1 = __last1 - __first1;
1189 if (__len1 < __len2)
1190 return __last1;
1191 const _RandomAccessIterator1 __s = __last1 - (__len2 - 1); // Start of pattern match can't go beyond here
1192 while (true)
1193 {
1194#if !_LIBCPP_UNROLL_LOOPS
1195 while (true)
1196 {
1197 if (__first1 == __s)
1198 return __last1;
1199 if (__pred(*__first1, *__first2))
1200 break;
1201 ++__first1;
1202 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001203#else // !_LIBCPP_UNROLL_LOOPS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001204 for (_D1 __loop_unroll = (__s - __first1) / 4; __loop_unroll > 0; --__loop_unroll)
1205 {
1206 if (__pred(*__first1, *__first2))
1207 goto __phase2;
1208 if (__pred(*++__first1, *__first2))
1209 goto __phase2;
1210 if (__pred(*++__first1, *__first2))
1211 goto __phase2;
1212 if (__pred(*++__first1, *__first2))
1213 goto __phase2;
1214 ++__first1;
1215 }
1216 switch (__s - __first1)
1217 {
1218 case 3:
1219 if (__pred(*__first1, *__first2))
1220 break;
1221 ++__first1;
1222 case 2:
1223 if (__pred(*__first1, *__first2))
1224 break;
1225 ++__first1;
1226 case 1:
1227 if (__pred(*__first1, *__first2))
1228 break;
1229 case 0:
1230 return __last1;
1231 }
1232 __phase2:
Howard Hinnant324bb032010-08-22 00:02:43 +00001233#endif // !_LIBCPP_UNROLL_LOOPS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001234 _RandomAccessIterator1 __m1 = __first1;
1235 _RandomAccessIterator2 __m2 = __first2;
1236#if !_LIBCPP_UNROLL_LOOPS
1237 while (true)
1238 {
1239 if (++__m2 == __last2)
1240 return __first1;
1241 ++__m1; // no need to check range on __m1 because __s guarantees we have enough source
1242 if (!__pred(*__m1, *__m2))
1243 {
1244 ++__first1;
1245 break;
1246 }
1247 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001248#else // !_LIBCPP_UNROLL_LOOPS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001249 ++__m2;
1250 ++__m1;
1251 for (_D2 __loop_unroll = (__last2 - __m2) / 4; __loop_unroll > 0; --__loop_unroll)
1252 {
1253 if (!__pred(*__m1, *__m2))
1254 goto __continue;
1255 if (!__pred(*++__m1, *++__m2))
1256 goto __continue;
1257 if (!__pred(*++__m1, *++__m2))
1258 goto __continue;
1259 if (!__pred(*++__m1, *++__m2))
1260 goto __continue;
1261 ++__m1;
1262 ++__m2;
1263 }
1264 switch (__last2 - __m2)
1265 {
1266 case 3:
1267 if (!__pred(*__m1, *__m2))
1268 break;
1269 ++__m1;
1270 ++__m2;
1271 case 2:
1272 if (!__pred(*__m1, *__m2))
1273 break;
1274 ++__m1;
1275 ++__m2;
1276 case 1:
1277 if (!__pred(*__m1, *__m2))
1278 break;
1279 case 0:
1280 return __first1;
1281 }
1282 __continue:
1283 ++__first1;
Howard Hinnant324bb032010-08-22 00:02:43 +00001284#endif // !_LIBCPP_UNROLL_LOOPS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001285 }
1286}
1287
1288template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
1289inline _LIBCPP_INLINE_VISIBILITY
1290_ForwardIterator1
1291search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1292 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1293{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001294 return _VSTD::__search<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001295 (__first1, __last1, __first2, __last2, __pred,
1296 typename std::iterator_traits<_ForwardIterator1>::iterator_category(),
1297 typename std::iterator_traits<_ForwardIterator2>::iterator_category());
1298}
1299
1300template <class _ForwardIterator1, class _ForwardIterator2>
1301inline _LIBCPP_INLINE_VISIBILITY
1302_ForwardIterator1
1303search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1304 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1305{
1306 typedef typename std::iterator_traits<_ForwardIterator1>::value_type __v1;
1307 typedef typename std::iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001308 return _VSTD::search(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001309}
1310
1311// search_n
1312
1313template <class _BinaryPredicate, class _ForwardIterator, class _Size, class _Tp>
1314_ForwardIterator
1315__search_n(_ForwardIterator __first, _ForwardIterator __last,
1316 _Size __count, const _Tp& __value, _BinaryPredicate __pred, forward_iterator_tag)
1317{
1318 if (__count <= 0)
1319 return __first;
1320 while (true)
1321 {
1322 // Find first element in sequence that matchs __value, with a mininum of loop checks
1323 while (true)
1324 {
1325 if (__first == __last) // return __last if no element matches __value
1326 return __last;
1327 if (__pred(*__first, __value))
1328 break;
1329 ++__first;
1330 }
1331 // *__first matches __value, now match elements after here
1332 _ForwardIterator __m = __first;
1333 _Size __c(0);
1334 while (true)
1335 {
1336 if (++__c == __count) // If pattern exhausted, __first is the answer (works for 1 element pattern)
1337 return __first;
1338 if (++__m == __last) // Otherwise if source exhaused, pattern not found
1339 return __last;
1340 if (!__pred(*__m, __value)) // if there is a mismatch, restart with a new __first
1341 {
1342 __first = __m;
1343 ++__first;
1344 break;
1345 } // else there is a match, check next elements
1346 }
1347 }
1348}
1349
1350template <class _BinaryPredicate, class _RandomAccessIterator, class _Size, class _Tp>
1351_RandomAccessIterator
1352__search_n(_RandomAccessIterator __first, _RandomAccessIterator __last,
1353 _Size __count, const _Tp& __value, _BinaryPredicate __pred, random_access_iterator_tag)
1354{
1355 if (__count <= 0)
1356 return __first;
1357 _Size __len = static_cast<_Size>(__last - __first);
1358 if (__len < __count)
1359 return __last;
1360 const _RandomAccessIterator __s = __last - (__count - 1); // Start of pattern match can't go beyond here
1361 while (true)
1362 {
1363 // Find first element in sequence that matchs __value, with a mininum of loop checks
1364 while (true)
1365 {
1366 if (__first == __s) // return __last if no element matches __value
1367 return __last;
1368 if (__pred(*__first, __value))
1369 break;
1370 ++__first;
1371 }
1372 // *__first matches __value, now match elements after here
1373 _RandomAccessIterator __m = __first;
1374 _Size __c(0);
1375 while (true)
1376 {
1377 if (++__c == __count) // If pattern exhausted, __first is the answer (works for 1 element pattern)
1378 return __first;
1379 ++__m; // no need to check range on __m because __s guarantees we have enough source
1380 if (!__pred(*__m, __value)) // if there is a mismatch, restart with a new __first
1381 {
1382 __first = __m;
1383 ++__first;
1384 break;
1385 } // else there is a match, check next elements
1386 }
1387 }
1388}
1389
1390template <class _ForwardIterator, class _Size, class _Tp, class _BinaryPredicate>
1391inline _LIBCPP_INLINE_VISIBILITY
1392_ForwardIterator
1393search_n(_ForwardIterator __first, _ForwardIterator __last,
1394 _Size __count, const _Tp& __value, _BinaryPredicate __pred)
1395{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001396 return _VSTD::__search_n<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001397 (__first, __last, __count, __value, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
1398}
1399
1400template <class _ForwardIterator, class _Size, class _Tp>
1401inline _LIBCPP_INLINE_VISIBILITY
1402_ForwardIterator
1403search_n(_ForwardIterator __first, _ForwardIterator __last, _Size __count, const _Tp& __value)
1404{
1405 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001406 return _VSTD::search_n(__first, __last, __count, __value, __equal_to<__v, _Tp>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001407}
1408
1409// copy
1410
1411template <class _Iter>
1412struct __libcpp_is_trivial_iterator
1413{
1414 static const bool value = is_pointer<_Iter>::value;
1415};
1416
1417template <class _Iter>
1418struct __libcpp_is_trivial_iterator<move_iterator<_Iter> >
1419{
1420 static const bool value = is_pointer<_Iter>::value;
1421};
1422
1423template <class _Iter>
1424struct __libcpp_is_trivial_iterator<__wrap_iter<_Iter> >
1425{
1426 static const bool value = is_pointer<_Iter>::value;
1427};
1428
1429template <class _Iter>
1430inline _LIBCPP_INLINE_VISIBILITY
1431_Iter
1432__unwrap_iter(_Iter __i)
1433{
1434 return __i;
1435}
1436
1437template <class _Tp>
1438inline _LIBCPP_INLINE_VISIBILITY
1439typename enable_if
1440<
Howard Hinnant1468b662010-11-19 22:17:28 +00001441 is_trivially_copy_assignable<_Tp>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001442 _Tp*
1443>::type
1444__unwrap_iter(move_iterator<_Tp*> __i)
1445{
1446 return __i.base();
1447}
1448
1449template <class _Tp>
1450inline _LIBCPP_INLINE_VISIBILITY
1451typename enable_if
1452<
Howard Hinnant1468b662010-11-19 22:17:28 +00001453 is_trivially_copy_assignable<_Tp>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001454 _Tp*
1455>::type
1456__unwrap_iter(__wrap_iter<_Tp*> __i)
1457{
1458 return __i.base();
1459}
1460
1461template <class _InputIterator, class _OutputIterator>
1462inline _LIBCPP_INLINE_VISIBILITY
1463_OutputIterator
1464__copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1465{
1466 for (; __first != __last; ++__first, ++__result)
1467 *__result = *__first;
1468 return __result;
1469}
1470
1471template <class _Tp, class _Up>
1472inline _LIBCPP_INLINE_VISIBILITY
1473typename enable_if
1474<
1475 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnant1468b662010-11-19 22:17:28 +00001476 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001477 _Up*
1478>::type
1479__copy(_Tp* __first, _Tp* __last, _Up* __result)
1480{
1481 const size_t __n = static_cast<size_t>(__last - __first);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001482 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001483 return __result + __n;
1484}
1485
1486template <class _InputIterator, class _OutputIterator>
1487inline _LIBCPP_INLINE_VISIBILITY
1488_OutputIterator
1489copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1490{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001491 return _VSTD::__copy(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001492}
1493
1494// copy_backward
1495
1496template <class _InputIterator, class _OutputIterator>
1497inline _LIBCPP_INLINE_VISIBILITY
1498_OutputIterator
1499__copy_backward(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1500{
1501 while (__first != __last)
1502 *--__result = *--__last;
1503 return __result;
1504}
1505
1506template <class _Tp, class _Up>
1507inline _LIBCPP_INLINE_VISIBILITY
1508typename enable_if
1509<
1510 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnant1468b662010-11-19 22:17:28 +00001511 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001512 _Up*
1513>::type
1514__copy_backward(_Tp* __first, _Tp* __last, _Up* __result)
1515{
1516 const size_t __n = static_cast<size_t>(__last - __first);
1517 __result -= __n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001518 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001519 return __result;
1520}
1521
1522template <class _BidirectionalIterator1, class _BidirectionalIterator2>
1523inline _LIBCPP_INLINE_VISIBILITY
1524_BidirectionalIterator2
1525copy_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
1526 _BidirectionalIterator2 __result)
1527{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001528 return _VSTD::__copy_backward(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001529}
1530
1531// copy_if
1532
1533template<class _InputIterator, class _OutputIterator, class _Predicate>
1534inline _LIBCPP_INLINE_VISIBILITY
1535_OutputIterator
1536copy_if(_InputIterator __first, _InputIterator __last,
1537 _OutputIterator __result, _Predicate __pred)
1538{
1539 for (; __first != __last; ++__first)
1540 {
1541 if (__pred(*__first))
1542 {
1543 *__result = *__first;
1544 ++__result;
1545 }
1546 }
1547 return __result;
1548}
1549
1550// copy_n
1551
1552template<class _InputIterator, class _Size, class _OutputIterator>
1553inline _LIBCPP_INLINE_VISIBILITY
1554typename enable_if
1555<
1556 __is_input_iterator<_InputIterator>::value &&
1557 !__is_random_access_iterator<_InputIterator>::value,
1558 _OutputIterator
1559>::type
1560copy_n(_InputIterator __first, _Size __n, _OutputIterator __result)
1561{
Howard Hinnant171869e2011-02-27 20:55:39 +00001562 if (__n > 0)
1563 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001564 *__result = *__first;
Howard Hinnant171869e2011-02-27 20:55:39 +00001565 ++__result;
1566 for (--__n; __n > 0; --__n)
1567 {
1568 ++__first;
1569 *__result = *__first;
1570 ++__result;
1571 }
1572 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001573 return __result;
1574}
1575
1576template<class _InputIterator, class _Size, class _OutputIterator>
1577inline _LIBCPP_INLINE_VISIBILITY
1578typename enable_if
1579<
1580 __is_random_access_iterator<_InputIterator>::value,
1581 _OutputIterator
1582>::type
1583copy_n(_InputIterator __first, _Size __n, _OutputIterator __result)
1584{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001585 return _VSTD::copy(__first, __first + __n, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001586}
1587
1588// move
1589
1590template <class _InputIterator, class _OutputIterator>
1591inline _LIBCPP_INLINE_VISIBILITY
1592_OutputIterator
1593__move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1594{
1595 for (; __first != __last; ++__first, ++__result)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001596 *__result = _VSTD::move(*__first);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001597 return __result;
1598}
1599
1600template <class _Tp, class _Up>
1601inline _LIBCPP_INLINE_VISIBILITY
1602typename enable_if
1603<
1604 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnant1468b662010-11-19 22:17:28 +00001605 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001606 _Up*
1607>::type
1608__move(_Tp* __first, _Tp* __last, _Up* __result)
1609{
1610 const size_t __n = static_cast<size_t>(__last - __first);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001611 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001612 return __result + __n;
1613}
1614
1615template <class _InputIterator, class _OutputIterator>
1616inline _LIBCPP_INLINE_VISIBILITY
1617_OutputIterator
1618move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1619{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001620 return _VSTD::__move(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001621}
1622
1623// move_backward
1624
1625template <class _InputIterator, class _OutputIterator>
1626inline _LIBCPP_INLINE_VISIBILITY
1627_OutputIterator
1628__move_backward(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1629{
1630 while (__first != __last)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001631 *--__result = _VSTD::move(*--__last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001632 return __result;
1633}
1634
1635template <class _Tp, class _Up>
1636inline _LIBCPP_INLINE_VISIBILITY
1637typename enable_if
1638<
1639 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnant1468b662010-11-19 22:17:28 +00001640 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001641 _Up*
1642>::type
1643__move_backward(_Tp* __first, _Tp* __last, _Up* __result)
1644{
1645 const size_t __n = static_cast<size_t>(__last - __first);
1646 __result -= __n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001647 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001648 return __result;
1649}
1650
1651template <class _BidirectionalIterator1, class _BidirectionalIterator2>
1652inline _LIBCPP_INLINE_VISIBILITY
1653_BidirectionalIterator2
1654move_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
1655 _BidirectionalIterator2 __result)
1656{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001657 return _VSTD::__move_backward(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001658}
1659
1660// iter_swap
1661
Howard Hinnante9b2c2d2011-05-27 15:04:19 +00001662// moved to <type_traits> for better swap / noexcept support
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001663
1664// transform
1665
1666template <class _InputIterator, class _OutputIterator, class _UnaryOperation>
1667inline _LIBCPP_INLINE_VISIBILITY
1668_OutputIterator
1669transform(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _UnaryOperation __op)
1670{
1671 for (; __first != __last; ++__first, ++__result)
1672 *__result = __op(*__first);
1673 return __result;
1674}
1675
1676template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _BinaryOperation>
1677inline _LIBCPP_INLINE_VISIBILITY
1678_OutputIterator
1679transform(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2,
1680 _OutputIterator __result, _BinaryOperation __binary_op)
1681{
1682 for (; __first1 != __last1; ++__first1, ++__first2, ++__result)
1683 *__result = __binary_op(*__first1, *__first2);
1684 return __result;
1685}
1686
1687// replace
1688
1689template <class _ForwardIterator, class _Tp>
1690inline _LIBCPP_INLINE_VISIBILITY
1691void
1692replace(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __old_value, const _Tp& __new_value)
1693{
1694 for (; __first != __last; ++__first)
1695 if (*__first == __old_value)
1696 *__first = __new_value;
1697}
1698
1699// replace_if
1700
1701template <class _ForwardIterator, class _Predicate, class _Tp>
1702inline _LIBCPP_INLINE_VISIBILITY
1703void
1704replace_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, const _Tp& __new_value)
1705{
1706 for (; __first != __last; ++__first)
1707 if (__pred(*__first))
1708 *__first = __new_value;
1709}
1710
1711// replace_copy
1712
1713template <class _InputIterator, class _OutputIterator, class _Tp>
1714inline _LIBCPP_INLINE_VISIBILITY
1715_OutputIterator
1716replace_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
1717 const _Tp& __old_value, const _Tp& __new_value)
1718{
1719 for (; __first != __last; ++__first, ++__result)
1720 if (*__first == __old_value)
1721 *__result = __new_value;
1722 else
1723 *__result = *__first;
1724 return __result;
1725}
1726
1727// replace_copy_if
1728
1729template <class _InputIterator, class _OutputIterator, class _Predicate, class _Tp>
1730inline _LIBCPP_INLINE_VISIBILITY
1731_OutputIterator
1732replace_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
1733 _Predicate __pred, const _Tp& __new_value)
1734{
1735 for (; __first != __last; ++__first, ++__result)
1736 if (__pred(*__first))
1737 *__result = __new_value;
1738 else
1739 *__result = *__first;
1740 return __result;
1741}
1742
1743// fill_n
1744
1745template <class _OutputIterator, class _Size, class _Tp>
1746inline _LIBCPP_INLINE_VISIBILITY
1747_OutputIterator
1748__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value, false_type)
1749{
1750 for (; __n > 0; ++__first, --__n)
1751 *__first = __value;
1752 return __first;
1753}
1754
1755template <class _OutputIterator, class _Size, class _Tp>
1756inline _LIBCPP_INLINE_VISIBILITY
1757_OutputIterator
1758__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value, true_type)
1759{
1760 if (__n > 0)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001761 _VSTD::memset(__first, (unsigned char)__value, (size_t)(__n));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001762 return __first + __n;
1763}
1764
1765template <class _OutputIterator, class _Size, class _Tp>
1766inline _LIBCPP_INLINE_VISIBILITY
1767_OutputIterator
1768fill_n(_OutputIterator __first, _Size __n, const _Tp& __value)
1769{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001770 return _VSTD::__fill_n(__first, __n, __value, integral_constant<bool,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001771 is_pointer<_OutputIterator>::value &&
Howard Hinnant1468b662010-11-19 22:17:28 +00001772 is_trivially_copy_assignable<_Tp>::value &&
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001773 sizeof(_Tp) == 1>());
1774}
1775
1776// fill
1777
1778template <class _ForwardIterator, class _Tp>
1779inline _LIBCPP_INLINE_VISIBILITY
1780void
1781__fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, forward_iterator_tag)
1782{
1783 for (; __first != __last; ++__first)
1784 *__first = __value;
1785}
1786
1787template <class _RandomAccessIterator, class _Tp>
1788inline _LIBCPP_INLINE_VISIBILITY
1789void
1790__fill(_RandomAccessIterator __first, _RandomAccessIterator __last, const _Tp& __value, random_access_iterator_tag)
1791{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001792 _VSTD::fill_n(__first, __last - __first, __value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001793}
1794
1795template <class _ForwardIterator, class _Tp>
1796inline _LIBCPP_INLINE_VISIBILITY
1797void
1798fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
1799{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001800 _VSTD::__fill(__first, __last, __value, typename iterator_traits<_ForwardIterator>::iterator_category());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001801}
1802
1803// generate
1804
1805template <class _ForwardIterator, class _Generator>
1806inline _LIBCPP_INLINE_VISIBILITY
1807void
1808generate(_ForwardIterator __first, _ForwardIterator __last, _Generator __gen)
1809{
1810 for (; __first != __last; ++__first)
1811 *__first = __gen();
1812}
1813
1814// generate_n
1815
1816template <class _OutputIterator, class _Size, class _Generator>
1817inline _LIBCPP_INLINE_VISIBILITY
1818_OutputIterator
1819generate_n(_OutputIterator __first, _Size __n, _Generator __gen)
1820{
1821 for (; __n > 0; ++__first, --__n)
1822 *__first = __gen();
1823 return __first;
1824}
1825
1826// remove
1827
1828template <class _ForwardIterator, class _Tp>
1829_ForwardIterator
1830remove(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
1831{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001832 __first = _VSTD::find(__first, __last, __value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001833 if (__first != __last)
1834 {
1835 _ForwardIterator __i = __first;
1836 while (++__i != __last)
1837 {
1838 if (!(*__i == __value))
1839 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00001840 *__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001841 ++__first;
1842 }
1843 }
1844 }
1845 return __first;
1846}
1847
1848// remove_if
1849
1850template <class _ForwardIterator, class _Predicate>
1851_ForwardIterator
1852remove_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
1853{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001854 __first = _VSTD::find_if<_ForwardIterator, typename add_lvalue_reference<_Predicate>::type>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001855 (__first, __last, __pred);
1856 if (__first != __last)
1857 {
1858 _ForwardIterator __i = __first;
1859 while (++__i != __last)
1860 {
1861 if (!__pred(*__i))
1862 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00001863 *__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001864 ++__first;
1865 }
1866 }
1867 }
1868 return __first;
1869}
1870
1871// remove_copy
1872
1873template <class _InputIterator, class _OutputIterator, class _Tp>
1874inline _LIBCPP_INLINE_VISIBILITY
1875_OutputIterator
1876remove_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, const _Tp& __value)
1877{
1878 for (; __first != __last; ++__first)
1879 {
1880 if (!(*__first == __value))
1881 {
1882 *__result = *__first;
1883 ++__result;
1884 }
1885 }
1886 return __result;
1887}
1888
1889// remove_copy_if
1890
1891template <class _InputIterator, class _OutputIterator, class _Predicate>
1892inline _LIBCPP_INLINE_VISIBILITY
1893_OutputIterator
1894remove_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Predicate __pred)
1895{
1896 for (; __first != __last; ++__first)
1897 {
1898 if (!__pred(*__first))
1899 {
1900 *__result = *__first;
1901 ++__result;
1902 }
1903 }
1904 return __result;
1905}
1906
1907// unique
1908
1909template <class _ForwardIterator, class _BinaryPredicate>
1910_ForwardIterator
1911unique(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred)
1912{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001913 __first = _VSTD::adjacent_find<_ForwardIterator, typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001914 (__first, __last, __pred);
1915 if (__first != __last)
1916 {
1917 // ... a a ? ...
1918 // f i
1919 _ForwardIterator __i = __first;
1920 for (++__i; ++__i != __last;)
1921 if (!__pred(*__first, *__i))
Howard Hinnant0949eed2011-06-30 21:18:19 +00001922 *++__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001923 ++__first;
1924 }
1925 return __first;
1926}
1927
1928template <class _ForwardIterator>
1929inline _LIBCPP_INLINE_VISIBILITY
1930_ForwardIterator
1931unique(_ForwardIterator __first, _ForwardIterator __last)
1932{
1933 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001934 return _VSTD::unique(__first, __last, __equal_to<__v>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001935}
1936
1937// unique_copy
1938
1939template <class _BinaryPredicate, class _InputIterator, class _OutputIterator>
1940_OutputIterator
1941__unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred,
1942 input_iterator_tag, output_iterator_tag)
1943{
1944 if (__first != __last)
1945 {
1946 typename iterator_traits<_InputIterator>::value_type __t(*__first);
1947 *__result = __t;
1948 ++__result;
1949 while (++__first != __last)
1950 {
1951 if (!__pred(__t, *__first))
1952 {
1953 __t = *__first;
1954 *__result = __t;
1955 ++__result;
1956 }
1957 }
1958 }
1959 return __result;
1960}
1961
1962template <class _BinaryPredicate, class _ForwardIterator, class _OutputIterator>
1963_OutputIterator
1964__unique_copy(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result, _BinaryPredicate __pred,
1965 forward_iterator_tag, output_iterator_tag)
1966{
1967 if (__first != __last)
1968 {
1969 _ForwardIterator __i = __first;
1970 *__result = *__i;
1971 ++__result;
1972 while (++__first != __last)
1973 {
1974 if (!__pred(*__i, *__first))
1975 {
1976 *__result = *__first;
1977 ++__result;
1978 __i = __first;
1979 }
1980 }
1981 }
1982 return __result;
1983}
1984
1985template <class _BinaryPredicate, class _InputIterator, class _ForwardIterator>
1986_ForwardIterator
1987__unique_copy(_InputIterator __first, _InputIterator __last, _ForwardIterator __result, _BinaryPredicate __pred,
1988 input_iterator_tag, forward_iterator_tag)
1989{
1990 if (__first != __last)
1991 {
1992 *__result = *__first;
1993 while (++__first != __last)
1994 if (!__pred(*__result, *__first))
1995 *++__result = *__first;
1996 ++__result;
1997 }
1998 return __result;
1999}
2000
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002001template <class _InputIterator, class _OutputIterator, class _BinaryPredicate>
2002inline _LIBCPP_INLINE_VISIBILITY
2003_OutputIterator
2004unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred)
2005{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002006 return _VSTD::__unique_copy<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002007 (__first, __last, __result, __pred,
2008 typename iterator_traits<_InputIterator>::iterator_category(),
2009 typename iterator_traits<_OutputIterator>::iterator_category());
2010}
2011
2012template <class _InputIterator, class _OutputIterator>
2013inline _LIBCPP_INLINE_VISIBILITY
2014_OutputIterator
2015unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
2016{
2017 typedef typename iterator_traits<_InputIterator>::value_type __v;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002018 return _VSTD::unique_copy(__first, __last, __result, __equal_to<__v>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002019}
2020
2021// reverse
2022
2023template <class _BidirectionalIterator>
2024inline _LIBCPP_INLINE_VISIBILITY
2025void
2026__reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirectional_iterator_tag)
2027{
2028 while (__first != __last)
2029 {
2030 if (__first == --__last)
2031 break;
2032 swap(*__first, *__last);
2033 ++__first;
2034 }
2035}
2036
2037template <class _RandomAccessIterator>
2038inline _LIBCPP_INLINE_VISIBILITY
2039void
2040__reverse(_RandomAccessIterator __first, _RandomAccessIterator __last, random_access_iterator_tag)
2041{
2042 if (__first != __last)
2043 for (; __first < --__last; ++__first)
2044 swap(*__first, *__last);
2045}
2046
2047template <class _BidirectionalIterator>
2048inline _LIBCPP_INLINE_VISIBILITY
2049void
2050reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
2051{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002052 _VSTD::__reverse(__first, __last, typename iterator_traits<_BidirectionalIterator>::iterator_category());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002053}
2054
2055// reverse_copy
2056
2057template <class _BidirectionalIterator, class _OutputIterator>
2058inline _LIBCPP_INLINE_VISIBILITY
2059_OutputIterator
2060reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last, _OutputIterator __result)
2061{
2062 for (; __first != __last; ++__result)
2063 *__result = *--__last;
2064 return __result;
2065}
2066
2067// rotate
2068
2069template <class _ForwardIterator>
2070_ForwardIterator
2071__rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last, false_type)
2072{
2073 if (__first == __middle)
2074 return __last;
2075 if (__middle == __last)
2076 return __first;
2077 _ForwardIterator __i = __middle;
2078 while (true)
2079 {
2080 swap(*__first, *__i);
2081 ++__first;
2082 if (++__i == __last)
2083 break;
2084 if (__first == __middle)
2085 __middle = __i;
2086 }
2087 _ForwardIterator __r = __first;
2088 if (__first != __middle)
2089 {
2090 __i = __middle;
2091 while (true)
2092 {
2093 swap(*__first, *__i);
2094 ++__first;
2095 if (++__i == __last)
2096 {
2097 if (__first == __middle)
2098 break;
2099 __i = __middle;
2100 }
2101 else if (__first == __middle)
2102 __middle = __i;
2103 }
2104 }
2105 return __r;
2106}
2107
2108template<typename _Integral>
2109inline _LIBCPP_INLINE_VISIBILITY
2110_Integral
2111__gcd(_Integral __x, _Integral __y)
2112{
2113 do
2114 {
2115 _Integral __t = __x % __y;
2116 __x = __y;
2117 __y = __t;
2118 } while (__y);
2119 return __x;
2120}
2121
2122template<typename _RandomAccessIterator>
2123_RandomAccessIterator
2124__rotate(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last, true_type)
2125{
2126 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
2127 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
Howard Hinnant324bb032010-08-22 00:02:43 +00002128
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002129 if (__first == __middle)
2130 return __last;
2131 if (__middle == __last)
2132 return __first;
2133 const difference_type __m1 = __middle - __first;
2134 const difference_type __m2 = __last - __middle;
2135 if (__m1 == __m2)
2136 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002137 _VSTD::swap_ranges(__first, __middle, __middle);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002138 return __middle;
2139 }
2140 const difference_type __g = __gcd(__m1, __m2);
2141 for (_RandomAccessIterator __p = __first + __g; __p != __first;)
2142 {
2143 value_type __t(*--__p);
2144 _RandomAccessIterator __p1 = __p;
2145 _RandomAccessIterator __p2 = __p1 + __m1;
2146 do
2147 {
2148 *__p1 = *__p2;
2149 __p1 = __p2;
2150 const difference_type __d = __last - __p2;
2151 if (__m1 < __d)
2152 __p2 += __m1;
2153 else
2154 __p2 = __first + (__m1 - __d);
2155 } while (__p2 != __p);
2156 *__p1 = __t;
2157 }
2158 return __first + __m2;
2159}
2160
2161template <class _ForwardIterator>
2162inline _LIBCPP_INLINE_VISIBILITY
2163_ForwardIterator
2164rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last)
2165{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002166 return _VSTD::__rotate(__first, __middle, __last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002167 integral_constant
2168 <
2169 bool,
2170 is_convertible
2171 <
2172 typename iterator_traits<_ForwardIterator>::iterator_category,
2173 random_access_iterator_tag
2174 >::value &&
Howard Hinnant1468b662010-11-19 22:17:28 +00002175 is_trivially_copy_assignable
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002176 <
2177 typename iterator_traits<_ForwardIterator>::value_type
2178 >::value
2179 >());
2180}
2181
2182// rotate_copy
2183
2184template <class _ForwardIterator, class _OutputIterator>
2185inline _LIBCPP_INLINE_VISIBILITY
2186_OutputIterator
2187rotate_copy(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last, _OutputIterator __result)
2188{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002189 return _VSTD::copy(__first, __middle, _VSTD::copy(__middle, __last, __result));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002190}
2191
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002192// min_element
2193
2194template <class _ForwardIterator, class _Compare>
2195inline _LIBCPP_INLINE_VISIBILITY
2196_ForwardIterator
2197min_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
2198{
2199 if (__first != __last)
2200 {
2201 _ForwardIterator __i = __first;
2202 while (++__i != __last)
2203 if (__comp(*__i, *__first))
2204 __first = __i;
2205 }
2206 return __first;
2207}
2208
2209template <class _ForwardIterator>
2210inline _LIBCPP_INLINE_VISIBILITY
2211_ForwardIterator
2212min_element(_ForwardIterator __first, _ForwardIterator __last)
2213{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002214 return _VSTD::min_element(__first, __last,
Howard Hinnant98e5d972010-08-21 20:10:01 +00002215 __less<typename iterator_traits<_ForwardIterator>::value_type>());
2216}
2217
2218// min
2219
2220template <class _Tp, class _Compare>
2221inline _LIBCPP_INLINE_VISIBILITY
2222const _Tp&
2223min(const _Tp& __a, const _Tp& __b, _Compare __comp)
2224{
2225 return __comp(__b, __a) ? __b : __a;
2226}
2227
2228template <class _Tp>
2229inline _LIBCPP_INLINE_VISIBILITY
2230const _Tp&
2231min(const _Tp& __a, const _Tp& __b)
2232{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002233 return _VSTD::min(__a, __b, __less<_Tp>());
Howard Hinnant98e5d972010-08-21 20:10:01 +00002234}
2235
2236template<class _Tp, class _Compare>
2237inline _LIBCPP_INLINE_VISIBILITY
2238_Tp
2239min(initializer_list<_Tp> __t, _Compare __comp)
2240{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002241 return *_VSTD::min_element(__t.begin(), __t.end(), __comp);
Howard Hinnant98e5d972010-08-21 20:10:01 +00002242}
2243
2244template<class _Tp>
2245inline _LIBCPP_INLINE_VISIBILITY
2246_Tp
2247min(initializer_list<_Tp> __t)
2248{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002249 return *_VSTD::min_element(__t.begin(), __t.end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002250}
2251
2252// max_element
2253
2254template <class _ForwardIterator, class _Compare>
2255inline _LIBCPP_INLINE_VISIBILITY
2256_ForwardIterator
2257max_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
2258{
2259 if (__first != __last)
2260 {
2261 _ForwardIterator __i = __first;
2262 while (++__i != __last)
2263 if (__comp(*__first, *__i))
2264 __first = __i;
2265 }
2266 return __first;
2267}
2268
2269template <class _ForwardIterator>
2270inline _LIBCPP_INLINE_VISIBILITY
2271_ForwardIterator
2272max_element(_ForwardIterator __first, _ForwardIterator __last)
2273{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002274 return _VSTD::max_element(__first, __last,
Howard Hinnant98e5d972010-08-21 20:10:01 +00002275 __less<typename iterator_traits<_ForwardIterator>::value_type>());
2276}
2277
2278// max
2279
2280template <class _Tp, class _Compare>
2281inline _LIBCPP_INLINE_VISIBILITY
2282const _Tp&
2283max(const _Tp& __a, const _Tp& __b, _Compare __comp)
2284{
2285 return __comp(__a, __b) ? __b : __a;
2286}
2287
2288template <class _Tp>
2289inline _LIBCPP_INLINE_VISIBILITY
2290const _Tp&
2291max(const _Tp& __a, const _Tp& __b)
2292{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002293 return _VSTD::max(__a, __b, __less<_Tp>());
Howard Hinnant98e5d972010-08-21 20:10:01 +00002294}
2295
2296template<class _Tp, class _Compare>
2297inline _LIBCPP_INLINE_VISIBILITY
2298_Tp
2299max(initializer_list<_Tp> __t, _Compare __comp)
2300{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002301 return *_VSTD::max_element(__t.begin(), __t.end(), __comp);
Howard Hinnant98e5d972010-08-21 20:10:01 +00002302}
2303
2304template<class _Tp>
2305inline _LIBCPP_INLINE_VISIBILITY
2306_Tp
2307max(initializer_list<_Tp> __t)
2308{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002309 return *_VSTD::max_element(__t.begin(), __t.end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002310}
2311
2312// minmax_element
2313
2314template <class _ForwardIterator, class _Compare>
2315std::pair<_ForwardIterator, _ForwardIterator>
2316minmax_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
2317{
2318 std::pair<_ForwardIterator, _ForwardIterator> __result(__first, __first);
2319 if (__first != __last)
2320 {
2321 if (++__first != __last)
2322 {
2323 if (__comp(*__first, *__result.first))
2324 {
2325 __result.second = __result.first;
2326 __result.first = __first;
2327 }
2328 else
2329 __result.second = __first;
2330 while (++__first != __last)
2331 {
2332 _ForwardIterator __i = __first;
2333 if (++__first == __last)
2334 {
2335 if (__comp(*__i, *__result.first))
2336 __result.first = __i;
2337 else if (!__comp(*__i, *__result.second))
2338 __result.second = __i;
2339 break;
2340 }
2341 else
2342 {
2343 if (__comp(*__first, *__i))
2344 {
2345 if (__comp(*__first, *__result.first))
2346 __result.first = __first;
2347 if (!__comp(*__i, *__result.second))
2348 __result.second = __i;
2349 }
2350 else
2351 {
2352 if (__comp(*__i, *__result.first))
2353 __result.first = __i;
2354 if (!__comp(*__first, *__result.second))
2355 __result.second = __first;
2356 }
2357 }
2358 }
2359 }
2360 }
2361 return __result;
2362}
2363
2364template <class _ForwardIterator>
2365inline _LIBCPP_INLINE_VISIBILITY
2366std::pair<_ForwardIterator, _ForwardIterator>
2367minmax_element(_ForwardIterator __first, _ForwardIterator __last)
2368{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002369 return _VSTD::minmax_element(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002370}
2371
Howard Hinnant98e5d972010-08-21 20:10:01 +00002372// minmax
2373
2374template<class _Tp, class _Compare>
2375inline _LIBCPP_INLINE_VISIBILITY
2376pair<const _Tp&, const _Tp&>
2377minmax(const _Tp& __a, const _Tp& __b, _Compare __comp)
2378{
2379 return __comp(__b, __a) ? pair<const _Tp&, const _Tp&>(__b, __a) :
2380 pair<const _Tp&, const _Tp&>(__a, __b);
2381}
2382
2383template<class _Tp>
2384inline _LIBCPP_INLINE_VISIBILITY
2385pair<const _Tp&, const _Tp&>
2386minmax(const _Tp& __a, const _Tp& __b)
2387{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002388 return _VSTD::minmax(__a, __b, __less<_Tp>());
Howard Hinnant98e5d972010-08-21 20:10:01 +00002389}
2390
2391template<class _Tp>
2392inline _LIBCPP_INLINE_VISIBILITY
2393pair<_Tp, _Tp>
2394minmax(initializer_list<_Tp> __t)
2395{
2396 pair<const _Tp*, const _Tp*> __p =
Howard Hinnant0949eed2011-06-30 21:18:19 +00002397 _VSTD::minmax_element(__t.begin(), __t.end());
Howard Hinnant98e5d972010-08-21 20:10:01 +00002398 return pair<_Tp, _Tp>(*__p.first, *__p.second);
2399}
2400
2401template<class _Tp, class _Compare>
2402inline _LIBCPP_INLINE_VISIBILITY
2403pair<_Tp, _Tp>
2404minmax(initializer_list<_Tp> __t, _Compare __comp)
2405{
2406 pair<const _Tp*, const _Tp*> __p =
Howard Hinnant0949eed2011-06-30 21:18:19 +00002407 _VSTD::minmax_element(__t.begin(), __t.end(), __comp);
Howard Hinnant98e5d972010-08-21 20:10:01 +00002408 return pair<_Tp, _Tp>(*__p.first, *__p.second);
2409}
2410
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002411// random_shuffle
2412
Howard Hinnantc3267212010-05-26 17:49:34 +00002413// __independent_bits_engine
2414
2415template <unsigned long long _X, size_t _R>
2416struct __log2_imp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002417{
Howard Hinnantc3267212010-05-26 17:49:34 +00002418 static const size_t value = _X & ((unsigned long long)(1) << _R) ? _R
2419 : __log2_imp<_X, _R - 1>::value;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002420};
2421
Howard Hinnantc3267212010-05-26 17:49:34 +00002422template <unsigned long long _X>
2423struct __log2_imp<_X, 0>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002424{
Howard Hinnantc3267212010-05-26 17:49:34 +00002425 static const size_t value = 0;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002426};
2427
Howard Hinnantc3267212010-05-26 17:49:34 +00002428template <size_t _R>
2429struct __log2_imp<0, _R>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002430{
Howard Hinnantc3267212010-05-26 17:49:34 +00002431 static const size_t value = _R + 1;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002432};
2433
Howard Hinnantc3267212010-05-26 17:49:34 +00002434template <class _UI, _UI _X>
2435struct __log2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002436{
Howard Hinnantc3267212010-05-26 17:49:34 +00002437 static const size_t value = __log2_imp<_X,
2438 sizeof(_UI) * __CHAR_BIT__ - 1>::value;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002439};
2440
Howard Hinnantc3267212010-05-26 17:49:34 +00002441template<class _Engine, class _UIntType>
2442class __independent_bits_engine
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002443{
Howard Hinnantc3267212010-05-26 17:49:34 +00002444public:
2445 // types
2446 typedef _UIntType result_type;
2447
2448private:
2449 typedef typename _Engine::result_type _Engine_result_type;
2450 typedef typename conditional
2451 <
2452 sizeof(_Engine_result_type) <= sizeof(result_type),
2453 result_type,
2454 _Engine_result_type
2455 >::type _Working_result_type;
2456
2457 _Engine& __e_;
2458 size_t __w_;
2459 size_t __w0_;
2460 size_t __n_;
2461 size_t __n0_;
2462 _Working_result_type __y0_;
2463 _Working_result_type __y1_;
2464 _Engine_result_type __mask0_;
2465 _Engine_result_type __mask1_;
2466
2467 static const _Working_result_type _R = _Engine::_Max - _Engine::_Min
2468 + _Working_result_type(1);
2469 static const size_t __m = __log2<_Working_result_type, _R>::value;
2470 static const size_t _WDt = numeric_limits<_Working_result_type>::digits;
2471 static const size_t _EDt = numeric_limits<_Engine_result_type>::digits;
2472
2473public:
2474 // constructors and seeding functions
2475 __independent_bits_engine(_Engine& __e, size_t __w);
2476
2477 // generating functions
2478 result_type operator()() {return __eval(integral_constant<bool, _R != 0>());}
2479
2480private:
2481 result_type __eval(false_type);
2482 result_type __eval(true_type);
2483};
2484
2485template<class _Engine, class _UIntType>
2486__independent_bits_engine<_Engine, _UIntType>
2487 ::__independent_bits_engine(_Engine& __e, size_t __w)
2488 : __e_(__e),
2489 __w_(__w)
2490{
2491 __n_ = __w_ / __m + (__w_ % __m != 0);
2492 __w0_ = __w_ / __n_;
2493 if (_R == 0)
2494 __y0_ = _R;
2495 else if (__w0_ < _WDt)
2496 __y0_ = (_R >> __w0_) << __w0_;
2497 else
2498 __y0_ = 0;
2499 if (_R - __y0_ > __y0_ / __n_)
2500 {
2501 ++__n_;
2502 __w0_ = __w_ / __n_;
2503 if (__w0_ < _WDt)
2504 __y0_ = (_R >> __w0_) << __w0_;
2505 else
2506 __y0_ = 0;
2507 }
2508 __n0_ = __n_ - __w_ % __n_;
2509 if (__w0_ < _WDt - 1)
2510 __y1_ = (_R >> (__w0_ + 1)) << (__w0_ + 1);
2511 else
2512 __y1_ = 0;
2513 __mask0_ = __w0_ > 0 ? _Engine_result_type(~0) >> (_EDt - __w0_) :
2514 _Engine_result_type(0);
2515 __mask1_ = __w0_ < _EDt - 1 ?
2516 _Engine_result_type(~0) >> (_EDt - (__w0_ + 1)) :
2517 _Engine_result_type(~0);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002518}
2519
Howard Hinnantc3267212010-05-26 17:49:34 +00002520template<class _Engine, class _UIntType>
2521inline
2522_UIntType
2523__independent_bits_engine<_Engine, _UIntType>::__eval(false_type)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002524{
Howard Hinnantc3267212010-05-26 17:49:34 +00002525 return static_cast<result_type>(__e_() & __mask0_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002526}
2527
Howard Hinnantc3267212010-05-26 17:49:34 +00002528template<class _Engine, class _UIntType>
2529_UIntType
2530__independent_bits_engine<_Engine, _UIntType>::__eval(true_type)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002531{
Howard Hinnantc3267212010-05-26 17:49:34 +00002532 result_type _S = 0;
2533 for (size_t __k = 0; __k < __n0_; ++__k)
2534 {
2535 _Engine_result_type __u;
2536 do
2537 {
2538 __u = __e_() - _Engine::min();
2539 } while (__u >= __y0_);
2540 if (__w0_ < _EDt)
2541 _S <<= __w0_;
2542 else
2543 _S = 0;
2544 _S += __u & __mask0_;
2545 }
2546 for (size_t __k = __n0_; __k < __n_; ++__k)
2547 {
2548 _Engine_result_type __u;
2549 do
2550 {
2551 __u = __e_() - _Engine::min();
2552 } while (__u >= __y1_);
2553 if (__w0_ < _EDt - 1)
2554 _S <<= __w0_ + 1;
2555 else
2556 _S = 0;
2557 _S += __u & __mask1_;
2558 }
2559 return _S;
2560}
2561
2562// uniform_int_distribution
2563
2564template<class _IntType = int>
2565class uniform_int_distribution
2566{
2567public:
2568 // types
2569 typedef _IntType result_type;
2570
2571 class param_type
2572 {
2573 result_type __a_;
2574 result_type __b_;
2575 public:
2576 typedef uniform_int_distribution distribution_type;
2577
2578 explicit param_type(result_type __a = 0,
2579 result_type __b = numeric_limits<result_type>::max())
2580 : __a_(__a), __b_(__b) {}
2581
2582 result_type a() const {return __a_;}
2583 result_type b() const {return __b_;}
2584
2585 friend bool operator==(const param_type& __x, const param_type& __y)
2586 {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;}
2587 friend bool operator!=(const param_type& __x, const param_type& __y)
2588 {return !(__x == __y);}
2589 };
2590
2591private:
2592 param_type __p_;
2593
2594public:
2595 // constructors and reset functions
2596 explicit uniform_int_distribution(result_type __a = 0,
2597 result_type __b = numeric_limits<result_type>::max())
2598 : __p_(param_type(__a, __b)) {}
2599 explicit uniform_int_distribution(const param_type& __p) : __p_(__p) {}
2600 void reset() {}
2601
2602 // generating functions
2603 template<class _URNG> result_type operator()(_URNG& __g)
2604 {return (*this)(__g, __p_);}
2605 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
2606
2607 // property functions
2608 result_type a() const {return __p_.a();}
2609 result_type b() const {return __p_.b();}
2610
2611 param_type param() const {return __p_;}
2612 void param(const param_type& __p) {__p_ = __p;}
2613
2614 result_type min() const {return a();}
2615 result_type max() const {return b();}
2616
2617 friend bool operator==(const uniform_int_distribution& __x,
2618 const uniform_int_distribution& __y)
2619 {return __x.__p_ == __y.__p_;}
2620 friend bool operator!=(const uniform_int_distribution& __x,
2621 const uniform_int_distribution& __y)
2622 {return !(__x == __y);}
2623};
2624
2625template<class _IntType>
2626template<class _URNG>
2627typename uniform_int_distribution<_IntType>::result_type
2628uniform_int_distribution<_IntType>::operator()(_URNG& __g, const param_type& __p)
2629{
2630 typedef typename conditional<sizeof(result_type) <= sizeof(uint32_t),
2631 uint32_t, uint64_t>::type _UIntType;
2632 const _UIntType _R = __p.b() - __p.a() + _UIntType(1);
2633 if (_R == 1)
2634 return __p.a();
2635 const size_t _Dt = numeric_limits<_UIntType>::digits;
2636 typedef __independent_bits_engine<_URNG, _UIntType> _Eng;
2637 if (_R == 0)
2638 return static_cast<result_type>(_Eng(__g, _Dt)());
2639 size_t __w = _Dt - __clz(_R) - 1;
2640 if ((_R & (_UIntType(~0) >> (_Dt - __w))) != 0)
2641 ++__w;
2642 _Eng __e(__g, __w);
2643 _UIntType __u;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002644 do
Howard Hinnantc3267212010-05-26 17:49:34 +00002645 {
2646 __u = __e();
2647 } while (__u >= _R);
2648 return static_cast<result_type>(__u + __p.a());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002649}
2650
Howard Hinnantc3267212010-05-26 17:49:34 +00002651class __rs_default;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002652
Howard Hinnantc3267212010-05-26 17:49:34 +00002653__rs_default __rs_get();
2654
2655class __rs_default
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002656{
Howard Hinnantc3267212010-05-26 17:49:34 +00002657 static unsigned __c_;
2658
2659 __rs_default();
2660public:
2661 typedef unsigned result_type;
2662
2663 static const result_type _Min = 0;
2664 static const result_type _Max = 0xFFFFFFFF;
2665
2666 __rs_default(const __rs_default&);
2667 ~__rs_default();
2668
2669 result_type operator()();
2670
2671 static const/*expr*/ result_type min() {return _Min;}
2672 static const/*expr*/ result_type max() {return _Max;}
2673
2674 friend __rs_default __rs_get();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002675};
2676
Howard Hinnantc3267212010-05-26 17:49:34 +00002677__rs_default __rs_get();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002678
2679template <class _RandomAccessIterator>
2680void
2681random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
2682{
2683 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnantc3267212010-05-26 17:49:34 +00002684 typedef uniform_int_distribution<ptrdiff_t> _D;
2685 typedef typename _D::param_type _P;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002686 difference_type __d = __last - __first;
2687 if (__d > 1)
2688 {
Howard Hinnantc3267212010-05-26 17:49:34 +00002689 _D __uid;
2690 __rs_default __g = __rs_get();
2691 for (--__last, --__d; __first < __last; ++__first, --__d)
Howard Hinnant4e599482010-10-22 15:26:39 +00002692 {
2693 difference_type __i = __uid(__g, _P(0, __d));
2694 if (__i != difference_type(0))
2695 swap(*__first, *(__first + __i));
2696 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002697 }
2698}
2699
2700template <class _RandomAccessIterator, class _RandomNumberGenerator>
2701void
2702random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
Howard Hinnant73d21a42010-09-04 23:28:19 +00002703#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002704 _RandomNumberGenerator&& __rand)
2705#else
2706 _RandomNumberGenerator& __rand)
2707#endif
2708{
2709 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
2710 difference_type __d = __last - __first;
2711 if (__d > 1)
2712 {
2713 for (--__last; __first < __last; ++__first, --__d)
Howard Hinnant4e599482010-10-22 15:26:39 +00002714 {
2715 difference_type __i = __rand(__d);
2716 swap(*__first, *(__first + __i));
2717 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002718 }
2719}
2720
Howard Hinnantc3267212010-05-26 17:49:34 +00002721template<class _RandomAccessIterator, class _UniformRandomNumberGenerator>
2722 void shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
Howard Hinnant278bf2d2010-11-18 01:47:02 +00002723#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2724 _UniformRandomNumberGenerator&& __g)
2725#else
Howard Hinnantc3267212010-05-26 17:49:34 +00002726 _UniformRandomNumberGenerator& __g)
Howard Hinnant278bf2d2010-11-18 01:47:02 +00002727#endif
Howard Hinnantc3267212010-05-26 17:49:34 +00002728{
2729 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
2730 typedef uniform_int_distribution<ptrdiff_t> _D;
2731 typedef typename _D::param_type _P;
2732 difference_type __d = __last - __first;
2733 if (__d > 1)
2734 {
2735 _D __uid;
2736 for (--__last, --__d; __first < __last; ++__first, --__d)
Howard Hinnant4e599482010-10-22 15:26:39 +00002737 {
2738 difference_type __i = __uid(__g, _P(0, __d));
2739 if (__i != difference_type(0))
2740 swap(*__first, *(__first + __i));
2741 }
Howard Hinnantc3267212010-05-26 17:49:34 +00002742 }
2743}
2744
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002745template <class _InputIterator, class _Predicate>
2746bool
2747is_partitioned(_InputIterator __first, _InputIterator __last, _Predicate __pred)
2748{
2749 for (; __first != __last; ++__first)
2750 if (!__pred(*__first))
2751 break;
2752 for (; __first != __last; ++__first)
2753 if (__pred(*__first))
2754 return false;
2755 return true;
2756}
2757
2758// partition
2759
2760template <class _Predicate, class _ForwardIterator>
2761_ForwardIterator
2762__partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, forward_iterator_tag)
2763{
2764 while (true)
2765 {
2766 if (__first == __last)
2767 return __first;
2768 if (!__pred(*__first))
2769 break;
2770 ++__first;
2771 }
2772 for (_ForwardIterator __p = __first; ++__p != __last;)
2773 {
2774 if (__pred(*__p))
2775 {
2776 swap(*__first, *__p);
2777 ++__first;
2778 }
2779 }
2780 return __first;
2781}
2782
2783template <class _Predicate, class _BidirectionalIterator>
2784_BidirectionalIterator
2785__partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
2786 bidirectional_iterator_tag)
2787{
2788 while (true)
2789 {
2790 while (true)
2791 {
2792 if (__first == __last)
2793 return __first;
2794 if (!__pred(*__first))
2795 break;
2796 ++__first;
2797 }
2798 do
2799 {
2800 if (__first == --__last)
2801 return __first;
2802 } while (!__pred(*__last));
2803 swap(*__first, *__last);
2804 ++__first;
2805 }
2806}
2807
2808template <class _ForwardIterator, class _Predicate>
2809inline _LIBCPP_INLINE_VISIBILITY
2810_ForwardIterator
2811partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
2812{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002813 return _VSTD::__partition<typename add_lvalue_reference<_Predicate>::type>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002814 (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
2815}
2816
2817// partition_copy
2818
2819template <class _InputIterator, class _OutputIterator1,
2820 class _OutputIterator2, class _Predicate>
2821pair<_OutputIterator1, _OutputIterator2>
2822partition_copy(_InputIterator __first, _InputIterator __last,
2823 _OutputIterator1 __out_true, _OutputIterator2 __out_false,
2824 _Predicate __pred)
2825{
2826 for (; __first != __last; ++__first)
2827 {
2828 if (__pred(*__first))
2829 {
2830 *__out_true = *__first;
2831 ++__out_true;
2832 }
2833 else
2834 {
2835 *__out_false = *__first;
2836 ++__out_false;
2837 }
2838 }
2839 return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false);
2840}
2841
2842// partition_point
2843
2844template<class _ForwardIterator, class _Predicate>
2845_ForwardIterator
2846partition_point(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
2847{
2848 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002849 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002850 while (__len != 0)
2851 {
2852 difference_type __l2 = __len / 2;
2853 _ForwardIterator __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002854 _VSTD::advance(__m, __l2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002855 if (__pred(*__m))
2856 {
2857 __first = ++__m;
2858 __len -= __l2 + 1;
2859 }
2860 else
2861 __len = __l2;
2862 }
2863 return __first;
2864}
2865
2866// stable_partition
2867
2868template <class _Predicate, class _ForwardIterator, class _Distance, class _Pair>
2869_ForwardIterator
2870__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
2871 _Distance __len, _Pair __p, forward_iterator_tag __fit)
2872{
2873 // *__first is known to be false
2874 // __len >= 1
2875 if (__len == 1)
2876 return __first;
2877 if (__len == 2)
2878 {
2879 _ForwardIterator __m = __first;
2880 if (__pred(*++__m))
2881 {
2882 swap(*__first, *__m);
2883 return __m;
2884 }
2885 return __first;
2886 }
2887 if (__len <= __p.second)
2888 { // The buffer is big enough to use
2889 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
2890 __destruct_n __d(0);
2891 unique_ptr<value_type, __destruct_n&> __h(__p.first, __d);
2892 // Move the falses into the temporary buffer, and the trues to the front of the line
2893 // Update __first to always point to the end of the trues
2894 value_type* __t = __p.first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002895 ::new(__t) value_type(_VSTD::move(*__first));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002896 __d.__incr((value_type*)0);
2897 ++__t;
2898 _ForwardIterator __i = __first;
2899 while (++__i != __last)
2900 {
2901 if (__pred(*__i))
2902 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002903 *__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002904 ++__first;
2905 }
2906 else
2907 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002908 ::new(__t) value_type(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002909 __d.__incr((value_type*)0);
2910 ++__t;
2911 }
2912 }
2913 // All trues now at start of range, all falses in buffer
2914 // Move falses back into range, but don't mess up __first which points to first false
2915 __i = __first;
2916 for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i)
Howard Hinnant0949eed2011-06-30 21:18:19 +00002917 *__i = _VSTD::move(*__t2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002918 // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer
2919 return __first;
2920 }
2921 // Else not enough buffer, do in place
2922 // __len >= 3
2923 _ForwardIterator __m = __first;
2924 _Distance __len2 = __len / 2; // __len2 >= 2
Howard Hinnant0949eed2011-06-30 21:18:19 +00002925 _VSTD::advance(__m, __len2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002926 // recurse on [__first, __m), *__first know to be false
2927 // F?????????????????
2928 // f m l
2929 typedef typename add_lvalue_reference<_Predicate>::type _PredRef;
2930 _ForwardIterator __first_false = __stable_partition<_PredRef>(__first, __m, __pred, __len2, __p, __fit);
2931 // TTTFFFFF??????????
2932 // f ff m l
2933 // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true
2934 _ForwardIterator __m1 = __m;
2935 _ForwardIterator __second_false = __last;
2936 _Distance __len_half = __len - __len2;
2937 while (__pred(*__m1))
2938 {
2939 if (++__m1 == __last)
2940 goto __second_half_done;
2941 --__len_half;
2942 }
2943 // TTTFFFFFTTTF??????
2944 // f ff m m1 l
2945 __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __fit);
2946__second_half_done:
2947 // TTTFFFFFTTTTTFFFFF
2948 // f ff m sf l
Howard Hinnant0949eed2011-06-30 21:18:19 +00002949 return _VSTD::rotate(__first_false, __m, __second_false);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002950 // TTTTTTTTFFFFFFFFFF
2951 // |
2952}
2953
2954struct __return_temporary_buffer
2955{
2956 template <class _Tp>
Howard Hinnant0949eed2011-06-30 21:18:19 +00002957 _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) const {_VSTD::return_temporary_buffer(__p);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002958};
2959
2960template <class _Predicate, class _ForwardIterator>
2961_ForwardIterator
2962__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
2963 forward_iterator_tag)
2964{
2965 const unsigned __alloc_limit = 3; // might want to make this a function of trivial assignment
2966 // Either prove all true and return __first or point to first false
2967 while (true)
2968 {
2969 if (__first == __last)
2970 return __first;
2971 if (!__pred(*__first))
2972 break;
2973 ++__first;
2974 }
2975 // We now have a reduced range [__first, __last)
2976 // *__first is known to be false
2977 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
2978 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002979 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002980 pair<value_type*, ptrdiff_t> __p(0, 0);
2981 unique_ptr<value_type, __return_temporary_buffer> __h;
2982 if (__len >= __alloc_limit)
2983 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002984 __p = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002985 __h.reset(__p.first);
2986 }
2987 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
2988 (__first, __last, __pred, __len, __p, forward_iterator_tag());
2989}
2990
2991template <class _Predicate, class _BidirectionalIterator, class _Distance, class _Pair>
2992_BidirectionalIterator
2993__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
2994 _Distance __len, _Pair __p, bidirectional_iterator_tag __bit)
2995{
2996 // *__first is known to be false
2997 // *__last is known to be true
2998 // __len >= 2
2999 if (__len == 2)
3000 {
3001 swap(*__first, *__last);
3002 return __last;
3003 }
3004 if (__len == 3)
3005 {
3006 _BidirectionalIterator __m = __first;
3007 if (__pred(*++__m))
3008 {
3009 swap(*__first, *__m);
3010 swap(*__m, *__last);
3011 return __last;
3012 }
3013 swap(*__m, *__last);
3014 swap(*__first, *__m);
3015 return __m;
3016 }
3017 if (__len <= __p.second)
3018 { // The buffer is big enough to use
3019 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3020 __destruct_n __d(0);
3021 unique_ptr<value_type, __destruct_n&> __h(__p.first, __d);
3022 // Move the falses into the temporary buffer, and the trues to the front of the line
3023 // Update __first to always point to the end of the trues
3024 value_type* __t = __p.first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003025 ::new(__t) value_type(_VSTD::move(*__first));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003026 __d.__incr((value_type*)0);
3027 ++__t;
3028 _BidirectionalIterator __i = __first;
3029 while (++__i != __last)
3030 {
3031 if (__pred(*__i))
3032 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003033 *__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003034 ++__first;
3035 }
3036 else
3037 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003038 ::new(__t) value_type(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003039 __d.__incr((value_type*)0);
3040 ++__t;
3041 }
3042 }
3043 // move *__last, known to be true
Howard Hinnant0949eed2011-06-30 21:18:19 +00003044 *__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003045 __i = ++__first;
3046 // All trues now at start of range, all falses in buffer
3047 // Move falses back into range, but don't mess up __first which points to first false
3048 for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i)
Howard Hinnant0949eed2011-06-30 21:18:19 +00003049 *__i = _VSTD::move(*__t2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003050 // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer
3051 return __first;
3052 }
3053 // Else not enough buffer, do in place
3054 // __len >= 4
3055 _BidirectionalIterator __m = __first;
3056 _Distance __len2 = __len / 2; // __len2 >= 2
Howard Hinnant0949eed2011-06-30 21:18:19 +00003057 _VSTD::advance(__m, __len2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003058 // recurse on [__first, __m-1], except reduce __m-1 until *(__m-1) is true, *__first know to be false
3059 // F????????????????T
3060 // f m l
3061 _BidirectionalIterator __m1 = __m;
3062 _BidirectionalIterator __first_false = __first;
3063 _Distance __len_half = __len2;
3064 while (!__pred(*--__m1))
3065 {
3066 if (__m1 == __first)
3067 goto __first_half_done;
3068 --__len_half;
3069 }
3070 // F???TFFF?????????T
3071 // f m1 m l
3072 typedef typename add_lvalue_reference<_Predicate>::type _PredRef;
3073 __first_false = __stable_partition<_PredRef>(__first, __m1, __pred, __len_half, __p, __bit);
3074__first_half_done:
3075 // TTTFFFFF?????????T
3076 // f ff m l
3077 // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true
3078 __m1 = __m;
3079 _BidirectionalIterator __second_false = __last;
3080 ++__second_false;
3081 __len_half = __len - __len2;
3082 while (__pred(*__m1))
3083 {
3084 if (++__m1 == __last)
3085 goto __second_half_done;
3086 --__len_half;
3087 }
3088 // TTTFFFFFTTTF?????T
3089 // f ff m m1 l
3090 __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __bit);
3091__second_half_done:
3092 // TTTFFFFFTTTTTFFFFF
3093 // f ff m sf l
Howard Hinnant0949eed2011-06-30 21:18:19 +00003094 return _VSTD::rotate(__first_false, __m, __second_false);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003095 // TTTTTTTTFFFFFFFFFF
3096 // |
3097}
3098
3099template <class _Predicate, class _BidirectionalIterator>
3100_BidirectionalIterator
3101__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3102 bidirectional_iterator_tag)
3103{
3104 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
3105 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3106 const difference_type __alloc_limit = 4; // might want to make this a function of trivial assignment
3107 // Either prove all true and return __first or point to first false
3108 while (true)
3109 {
3110 if (__first == __last)
3111 return __first;
3112 if (!__pred(*__first))
3113 break;
3114 ++__first;
3115 }
3116 // __first points to first false, everything prior to __first is already set.
3117 // Either prove [__first, __last) is all false and return __first, or point __last to last true
3118 do
3119 {
3120 if (__first == --__last)
3121 return __first;
3122 } while (!__pred(*__last));
3123 // We now have a reduced range [__first, __last]
3124 // *__first is known to be false
3125 // *__last is known to be true
3126 // __len >= 2
Howard Hinnant0949eed2011-06-30 21:18:19 +00003127 difference_type __len = _VSTD::distance(__first, __last) + 1;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003128 pair<value_type*, ptrdiff_t> __p(0, 0);
3129 unique_ptr<value_type, __return_temporary_buffer> __h;
3130 if (__len >= __alloc_limit)
3131 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003132 __p = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003133 __h.reset(__p.first);
3134 }
3135 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
3136 (__first, __last, __pred, __len, __p, bidirectional_iterator_tag());
3137}
3138
3139template <class _ForwardIterator, class _Predicate>
3140inline _LIBCPP_INLINE_VISIBILITY
3141_ForwardIterator
3142stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
3143{
3144 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
3145 (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
3146}
3147
3148// is_sorted_until
3149
3150template <class _ForwardIterator, class _Compare>
3151_ForwardIterator
3152is_sorted_until(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
3153{
3154 if (__first != __last)
3155 {
3156 _ForwardIterator __i = __first;
3157 while (++__i != __last)
3158 {
3159 if (__comp(*__i, *__first))
3160 return __i;
3161 __first = __i;
3162 }
3163 }
3164 return __last;
3165}
3166
Howard Hinnant324bb032010-08-22 00:02:43 +00003167template<class _ForwardIterator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003168inline _LIBCPP_INLINE_VISIBILITY
3169_ForwardIterator
3170is_sorted_until(_ForwardIterator __first, _ForwardIterator __last)
3171{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003172 return _VSTD::is_sorted_until(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003173}
3174
3175// is_sorted
3176
3177template <class _ForwardIterator, class _Compare>
3178inline _LIBCPP_INLINE_VISIBILITY
3179bool
3180is_sorted(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
3181{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003182 return _VSTD::is_sorted_until(__first, __last, __comp) == __last;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003183}
3184
Howard Hinnant324bb032010-08-22 00:02:43 +00003185template<class _ForwardIterator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003186inline _LIBCPP_INLINE_VISIBILITY
3187bool
3188is_sorted(_ForwardIterator __first, _ForwardIterator __last)
3189{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003190 return _VSTD::is_sorted(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003191}
3192
3193// sort
3194
3195// stable, 2-3 compares, 0-2 swaps
3196
3197template <class _Compare, class _ForwardIterator>
3198unsigned
3199__sort3(_ForwardIterator __x, _ForwardIterator __y, _ForwardIterator __z, _Compare __c)
3200{
3201 unsigned __r = 0;
3202 if (!__c(*__y, *__x)) // if x <= y
3203 {
3204 if (!__c(*__z, *__y)) // if y <= z
3205 return __r; // x <= y && y <= z
3206 // x <= y && y > z
3207 swap(*__y, *__z); // x <= z && y < z
3208 __r = 1;
3209 if (__c(*__y, *__x)) // if x > y
3210 {
3211 swap(*__x, *__y); // x < y && y <= z
3212 __r = 2;
3213 }
3214 return __r; // x <= y && y < z
3215 }
3216 if (__c(*__z, *__y)) // x > y, if y > z
3217 {
3218 swap(*__x, *__z); // x < y && y < z
3219 __r = 1;
3220 return __r;
3221 }
3222 swap(*__x, *__y); // x > y && y <= z
3223 __r = 1; // x < y && x <= z
3224 if (__c(*__z, *__y)) // if y > z
3225 {
3226 swap(*__y, *__z); // x <= y && y < z
3227 __r = 2;
3228 }
3229 return __r;
3230} // x <= y && y <= z
3231
3232// stable, 3-6 compares, 0-5 swaps
3233
3234template <class _Compare, class _ForwardIterator>
3235unsigned
3236__sort4(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3,
3237 _ForwardIterator __x4, _Compare __c)
3238{
3239 unsigned __r = __sort3<_Compare>(__x1, __x2, __x3, __c);
3240 if (__c(*__x4, *__x3))
3241 {
3242 swap(*__x3, *__x4);
3243 ++__r;
3244 if (__c(*__x3, *__x2))
3245 {
3246 swap(*__x2, *__x3);
3247 ++__r;
3248 if (__c(*__x2, *__x1))
3249 {
3250 swap(*__x1, *__x2);
3251 ++__r;
3252 }
3253 }
3254 }
3255 return __r;
3256}
3257
3258// stable, 4-10 compares, 0-9 swaps
3259
3260template <class _Compare, class _ForwardIterator>
3261unsigned
3262__sort5(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3,
3263 _ForwardIterator __x4, _ForwardIterator __x5, _Compare __c)
3264{
3265 unsigned __r = __sort4<_Compare>(__x1, __x2, __x3, __x4, __c);
3266 if (__c(*__x5, *__x4))
3267 {
3268 swap(*__x4, *__x5);
3269 ++__r;
3270 if (__c(*__x4, *__x3))
3271 {
3272 swap(*__x3, *__x4);
3273 ++__r;
3274 if (__c(*__x3, *__x2))
3275 {
3276 swap(*__x2, *__x3);
3277 ++__r;
3278 if (__c(*__x2, *__x1))
3279 {
3280 swap(*__x1, *__x2);
3281 ++__r;
3282 }
3283 }
3284 }
3285 }
3286 return __r;
3287}
3288
3289// Assumes size > 0
3290template <class _Compare, class _BirdirectionalIterator>
3291void
3292__selection_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp)
3293{
3294 _BirdirectionalIterator __lm1 = __last;
3295 for (--__lm1; __first != __lm1; ++__first)
3296 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003297 _BirdirectionalIterator __i = _VSTD::min_element<_BirdirectionalIterator,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003298 typename add_lvalue_reference<_Compare>::type>
3299 (__first, __last, __comp);
3300 if (__i != __first)
3301 swap(*__first, *__i);
3302 }
3303}
3304
3305template <class _Compare, class _BirdirectionalIterator>
3306void
3307__insertion_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp)
3308{
3309 typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type;
3310 if (__first != __last)
3311 {
3312 _BirdirectionalIterator __i = __first;
3313 for (++__i; __i != __last; ++__i)
3314 {
3315 _BirdirectionalIterator __j = __i;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003316 value_type __t(_VSTD::move(*__j));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003317 for (_BirdirectionalIterator __k = __i; __k != __first && __comp(__t, *--__k); --__j)
Howard Hinnant0949eed2011-06-30 21:18:19 +00003318 *__j = _VSTD::move(*__k);
3319 *__j = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003320 }
3321 }
3322}
3323
3324template <class _Compare, class _RandomAccessIterator>
3325void
3326__insertion_sort_3(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3327{
3328 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3329 _RandomAccessIterator __j = __first+2;
3330 __sort3<_Compare>(__first, __first+1, __j, __comp);
3331 for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
3332 {
3333 if (__comp(*__i, *__j))
3334 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003335 value_type __t(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003336 _RandomAccessIterator __k = __j;
3337 __j = __i;
3338 do
3339 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003340 *__j = _VSTD::move(*__k);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003341 __j = __k;
3342 } while (__j != __first && __comp(__t, *--__k));
Howard Hinnant0949eed2011-06-30 21:18:19 +00003343 *__j = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003344 }
3345 __j = __i;
3346 }
3347}
3348
3349template <class _Compare, class _RandomAccessIterator>
3350bool
3351__insertion_sort_incomplete(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3352{
3353 switch (__last - __first)
3354 {
3355 case 0:
3356 case 1:
3357 return true;
3358 case 2:
3359 if (__comp(*--__last, *__first))
3360 swap(*__first, *__last);
3361 return true;
3362 case 3:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003363 _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003364 return true;
3365 case 4:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003366 _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003367 return true;
3368 case 5:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003369 _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003370 return true;
3371 }
3372 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3373 _RandomAccessIterator __j = __first+2;
3374 __sort3<_Compare>(__first, __first+1, __j, __comp);
3375 const unsigned __limit = 8;
3376 unsigned __count = 0;
3377 for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
3378 {
3379 if (__comp(*__i, *__j))
3380 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003381 value_type __t(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003382 _RandomAccessIterator __k = __j;
3383 __j = __i;
3384 do
3385 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003386 *__j = _VSTD::move(*__k);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003387 __j = __k;
3388 } while (__j != __first && __comp(__t, *--__k));
Howard Hinnant0949eed2011-06-30 21:18:19 +00003389 *__j = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003390 if (++__count == __limit)
3391 return ++__i == __last;
3392 }
3393 __j = __i;
3394 }
3395 return true;
3396}
3397
3398template <class _Compare, class _BirdirectionalIterator>
3399void
3400__insertion_sort_move(_BirdirectionalIterator __first1, _BirdirectionalIterator __last1,
3401 typename iterator_traits<_BirdirectionalIterator>::value_type* __first2, _Compare __comp)
3402{
3403 typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type;
3404 if (__first1 != __last1)
3405 {
3406 __destruct_n __d(0);
3407 unique_ptr<value_type, __destruct_n&> __h(__first2, __d);
3408 value_type* __last2 = __first2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003409 ::new(__last2) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003410 __d.__incr((value_type*)0);
3411 for (++__last2; ++__first1 != __last1; ++__last2)
3412 {
3413 value_type* __j2 = __last2;
3414 value_type* __i2 = __j2;
3415 if (__comp(*__first1, *--__i2))
3416 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003417 ::new(__j2) value_type(_VSTD::move(*__i2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003418 __d.__incr((value_type*)0);
3419 for (--__j2; __i2 != __first2 && __comp(*__first1, *--__i2); --__j2)
Howard Hinnant0949eed2011-06-30 21:18:19 +00003420 *__j2 = _VSTD::move(*__i2);
3421 *__j2 = _VSTD::move(*__first1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003422 }
3423 else
3424 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003425 ::new(__j2) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003426 __d.__incr((value_type*)0);
3427 }
3428 }
3429 __h.release();
3430 }
3431}
3432
3433template <class _Compare, class _RandomAccessIterator>
3434void
3435__sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3436{
3437 // _Compare is known to be a reference type
3438 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
3439 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
Howard Hinnant1468b662010-11-19 22:17:28 +00003440 const difference_type __limit = is_trivially_copy_constructible<value_type>::value &&
3441 is_trivially_copy_assignable<value_type>::value ? 30 : 6;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003442 while (true)
3443 {
3444 __restart:
3445 difference_type __len = __last - __first;
3446 switch (__len)
3447 {
3448 case 0:
3449 case 1:
3450 return;
3451 case 2:
3452 if (__comp(*--__last, *__first))
3453 swap(*__first, *__last);
3454 return;
3455 case 3:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003456 _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003457 return;
3458 case 4:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003459 _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003460 return;
3461 case 5:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003462 _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003463 return;
3464 }
3465 if (__len <= __limit)
3466 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003467 _VSTD::__insertion_sort_3<_Compare>(__first, __last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003468 return;
3469 }
3470 // __len > 5
3471 _RandomAccessIterator __m = __first;
3472 _RandomAccessIterator __lm1 = __last;
3473 --__lm1;
3474 unsigned __n_swaps;
3475 {
3476 difference_type __delta;
3477 if (__len >= 1000)
3478 {
3479 __delta = __len/2;
3480 __m += __delta;
3481 __delta /= 2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003482 __n_swaps = _VSTD::__sort5<_Compare>(__first, __first + __delta, __m, __m+__delta, __lm1, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003483 }
3484 else
3485 {
3486 __delta = __len/2;
3487 __m += __delta;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003488 __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, __lm1, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003489 }
3490 }
3491 // *__m is median
3492 // partition [__first, __m) < *__m and *__m <= [__m, __last)
3493 // (this inhibits tossing elements equivalent to __m around unnecessarily)
3494 _RandomAccessIterator __i = __first;
3495 _RandomAccessIterator __j = __lm1;
3496 // j points beyond range to be tested, *__m is known to be <= *__lm1
3497 // The search going up is known to be guarded but the search coming down isn't.
3498 // Prime the downward search with a guard.
3499 if (!__comp(*__i, *__m)) // if *__first == *__m
3500 {
3501 // *__first == *__m, *__first doesn't go in first part
3502 // manually guard downward moving __j against __i
3503 while (true)
3504 {
3505 if (__i == --__j)
3506 {
3507 // *__first == *__m, *__m <= all other elements
3508 // Parition instead into [__first, __i) == *__first and *__first < [__i, __last)
3509 ++__i; // __first + 1
3510 __j = __last;
3511 if (!__comp(*__first, *--__j)) // we need a guard if *__first == *(__last-1)
3512 {
3513 while (true)
3514 {
3515 if (__i == __j)
3516 return; // [__first, __last) all equivalent elements
3517 if (__comp(*__first, *__i))
3518 {
3519 swap(*__i, *__j);
3520 ++__n_swaps;
3521 ++__i;
3522 break;
3523 }
3524 ++__i;
3525 }
3526 }
3527 // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1
3528 if (__i == __j)
3529 return;
3530 while (true)
3531 {
3532 while (!__comp(*__first, *__i))
3533 ++__i;
3534 while (__comp(*__first, *--__j))
3535 ;
3536 if (__i >= __j)
3537 break;
3538 swap(*__i, *__j);
3539 ++__n_swaps;
3540 ++__i;
3541 }
3542 // [__first, __i) == *__first and *__first < [__i, __last)
3543 // The first part is sorted, sort the secod part
Howard Hinnant0949eed2011-06-30 21:18:19 +00003544 // _VSTD::__sort<_Compare>(__i, __last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003545 __first = __i;
3546 goto __restart;
3547 }
3548 if (__comp(*__j, *__m))
3549 {
3550 swap(*__i, *__j);
3551 ++__n_swaps;
3552 break; // found guard for downward moving __j, now use unguarded partition
3553 }
3554 }
3555 }
3556 // It is known that *__i < *__m
3557 ++__i;
3558 // j points beyond range to be tested, *__m is known to be <= *__lm1
3559 // if not yet partitioned...
3560 if (__i < __j)
3561 {
3562 // known that *(__i - 1) < *__m
3563 // known that __i <= __m
3564 while (true)
3565 {
3566 // __m still guards upward moving __i
3567 while (__comp(*__i, *__m))
3568 ++__i;
3569 // It is now known that a guard exists for downward moving __j
3570 while (!__comp(*--__j, *__m))
3571 ;
3572 if (__i > __j)
3573 break;
3574 swap(*__i, *__j);
3575 ++__n_swaps;
3576 // It is known that __m != __j
3577 // If __m just moved, follow it
3578 if (__m == __i)
3579 __m = __j;
3580 ++__i;
3581 }
3582 }
3583 // [__first, __i) < *__m and *__m <= [__i, __last)
3584 if (__i != __m && __comp(*__m, *__i))
3585 {
3586 swap(*__i, *__m);
3587 ++__n_swaps;
3588 }
3589 // [__first, __i) < *__i and *__i <= [__i+1, __last)
3590 // If we were given a perfect partition, see if insertion sort is quick...
3591 if (__n_swaps == 0)
3592 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003593 bool __fs = _VSTD::__insertion_sort_incomplete<_Compare>(__first, __i, __comp);
3594 if (_VSTD::__insertion_sort_incomplete<_Compare>(__i+1, __last, __comp))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003595 {
3596 if (__fs)
3597 return;
3598 __last = __i;
3599 continue;
3600 }
3601 else
3602 {
3603 if (__fs)
3604 {
3605 __first = ++__i;
3606 continue;
3607 }
3608 }
3609 }
3610 // sort smaller range with recursive call and larger with tail recursion elimination
3611 if (__i - __first < __last - __i)
3612 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003613 _VSTD::__sort<_Compare>(__first, __i, __comp);
3614 // _VSTD::__sort<_Compare>(__i+1, __last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003615 __first = ++__i;
3616 }
3617 else
3618 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003619 _VSTD::__sort<_Compare>(__i+1, __last, __comp);
3620 // _VSTD::__sort<_Compare>(__first, __i, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003621 __last = __i;
3622 }
3623 }
3624}
3625
3626// This forwarder keeps the top call and the recursive calls using the same instantiation, forcing a reference _Compare
3627template <class _RandomAccessIterator, class _Compare>
3628inline _LIBCPP_INLINE_VISIBILITY
3629void
3630sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3631{
3632#ifdef _LIBCPP_DEBUG
3633 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3634 __debug_less<_Compare> __c(__comp);
3635 __sort<_Comp_ref>(__first, __last, __c);
Howard Hinnant324bb032010-08-22 00:02:43 +00003636#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003637 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3638 __sort<_Comp_ref>(__first, __last, __comp);
Howard Hinnant324bb032010-08-22 00:02:43 +00003639#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003640}
3641
3642template <class _RandomAccessIterator>
3643inline _LIBCPP_INLINE_VISIBILITY
3644void
3645sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
3646{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003647 _VSTD::sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003648}
3649
3650template <class _Tp>
3651inline _LIBCPP_INLINE_VISIBILITY
3652void
3653sort(_Tp** __first, _Tp** __last)
3654{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003655 _VSTD::sort((size_t*)__first, (size_t*)__last, __less<size_t>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003656}
3657
3658template <class _Tp>
3659inline _LIBCPP_INLINE_VISIBILITY
3660void
3661sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last)
3662{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003663 _VSTD::sort(__first.base(), __last.base());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003664}
3665
3666extern template void __sort<__less<char>&, char*>(char*, char*, __less<char>&);
3667extern template void __sort<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&);
3668extern template void __sort<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&);
3669extern template void __sort<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&);
3670extern template void __sort<__less<short>&, short*>(short*, short*, __less<short>&);
3671extern template void __sort<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&);
3672extern template void __sort<__less<int>&, int*>(int*, int*, __less<int>&);
3673extern template void __sort<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&);
3674extern template void __sort<__less<long>&, long*>(long*, long*, __less<long>&);
3675extern template void __sort<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&);
3676extern template void __sort<__less<long long>&, long long*>(long long*, long long*, __less<long long>&);
3677extern template void __sort<__less<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned long long>&);
3678extern template void __sort<__less<float>&, float*>(float*, float*, __less<float>&);
3679extern template void __sort<__less<double>&, double*>(double*, double*, __less<double>&);
3680extern template void __sort<__less<long double>&, long double*>(long double*, long double*, __less<long double>&);
3681
3682extern template bool __insertion_sort_incomplete<__less<char>&, char*>(char*, char*, __less<char>&);
3683extern template bool __insertion_sort_incomplete<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&);
3684extern template bool __insertion_sort_incomplete<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&);
3685extern template bool __insertion_sort_incomplete<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&);
3686extern template bool __insertion_sort_incomplete<__less<short>&, short*>(short*, short*, __less<short>&);
3687extern template bool __insertion_sort_incomplete<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&);
3688extern template bool __insertion_sort_incomplete<__less<int>&, int*>(int*, int*, __less<int>&);
3689extern template bool __insertion_sort_incomplete<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&);
3690extern template bool __insertion_sort_incomplete<__less<long>&, long*>(long*, long*, __less<long>&);
3691extern template bool __insertion_sort_incomplete<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&);
3692extern template bool __insertion_sort_incomplete<__less<long long>&, long long*>(long long*, long long*, __less<long long>&);
3693extern template bool __insertion_sort_incomplete<__less<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned long long>&);
3694extern template bool __insertion_sort_incomplete<__less<float>&, float*>(float*, float*, __less<float>&);
3695extern template bool __insertion_sort_incomplete<__less<double>&, double*>(double*, double*, __less<double>&);
3696extern template bool __insertion_sort_incomplete<__less<long double>&, long double*>(long double*, long double*, __less<long double>&);
3697
3698extern template unsigned __sort5<__less<long double>&, long double*>(long double*, long double*, long double*, long double*, long double*, __less<long double>&);
3699
3700// lower_bound
3701
3702template <class _Compare, class _ForwardIterator, class _Tp>
3703_ForwardIterator
3704__lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp)
3705{
3706 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003707 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003708 while (__len != 0)
3709 {
3710 difference_type __l2 = __len / 2;
3711 _ForwardIterator __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003712 _VSTD::advance(__m, __l2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003713 if (__comp(*__m, __value))
3714 {
3715 __first = ++__m;
3716 __len -= __l2 + 1;
3717 }
3718 else
3719 __len = __l2;
3720 }
3721 return __first;
3722}
3723
3724template <class _ForwardIterator, class _Tp, class _Compare>
3725inline _LIBCPP_INLINE_VISIBILITY
3726_ForwardIterator
3727lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp)
3728{
3729#ifdef _LIBCPP_DEBUG
3730 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3731 __debug_less<_Compare> __c(__comp);
3732 return __lower_bound<_Comp_ref>(__first, __last, __value, __c);
Howard Hinnant324bb032010-08-22 00:02:43 +00003733#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003734 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3735 return __lower_bound<_Comp_ref>(__first, __last, __value, __comp);
Howard Hinnant324bb032010-08-22 00:02:43 +00003736#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003737}
3738
3739template <class _ForwardIterator, class _Tp>
3740inline _LIBCPP_INLINE_VISIBILITY
3741_ForwardIterator
3742lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
3743{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003744 return _VSTD::lower_bound(__first, __last, __value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003745 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
3746}
3747
3748// upper_bound
3749
3750template <class _Compare, class _ForwardIterator, class _Tp>
3751_ForwardIterator
3752__upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp)
3753{
3754 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003755 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003756 while (__len != 0)
3757 {
3758 difference_type __l2 = __len / 2;
3759 _ForwardIterator __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003760 _VSTD::advance(__m, __l2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003761 if (__comp(__value, *__m))
3762 __len = __l2;
3763 else
3764 {
3765 __first = ++__m;
3766 __len -= __l2 + 1;
3767 }
3768 }
3769 return __first;
3770}
3771
3772template <class _ForwardIterator, class _Tp, class _Compare>
3773inline _LIBCPP_INLINE_VISIBILITY
3774_ForwardIterator
3775upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp)
3776{
3777#ifdef _LIBCPP_DEBUG
3778 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3779 __debug_less<_Compare> __c(__comp);
3780 return __upper_bound<_Comp_ref>(__first, __last, __value, __c);
Howard Hinnant324bb032010-08-22 00:02:43 +00003781#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003782 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3783 return __upper_bound<_Comp_ref>(__first, __last, __value, __comp);
Howard Hinnant324bb032010-08-22 00:02:43 +00003784#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003785}
3786
3787template <class _ForwardIterator, class _Tp>
3788inline _LIBCPP_INLINE_VISIBILITY
3789_ForwardIterator
3790upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
3791{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003792 return _VSTD::upper_bound(__first, __last, __value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003793 __less<_Tp, typename iterator_traits<_ForwardIterator>::value_type>());
3794}
3795
3796// equal_range
3797
3798template <class _Compare, class _ForwardIterator, class _Tp>
3799pair<_ForwardIterator, _ForwardIterator>
3800__equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp)
3801{
3802 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003803 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003804 while (__len != 0)
3805 {
3806 difference_type __l2 = __len / 2;
3807 _ForwardIterator __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003808 _VSTD::advance(__m, __l2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003809 if (__comp(*__m, __value))
3810 {
3811 __first = ++__m;
3812 __len -= __l2 + 1;
3813 }
3814 else if (__comp(__value, *__m))
3815 {
3816 __last = __m;
3817 __len = __l2;
3818 }
3819 else
3820 {
3821 _ForwardIterator __mp1 = __m;
3822 return pair<_ForwardIterator, _ForwardIterator>
3823 (
3824 __lower_bound<_Compare>(__first, __m, __value, __comp),
3825 __upper_bound<_Compare>(++__mp1, __last, __value, __comp)
3826 );
3827 }
3828 }
3829 return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
3830}
3831
3832template <class _ForwardIterator, class _Tp, class _Compare>
3833inline _LIBCPP_INLINE_VISIBILITY
3834pair<_ForwardIterator, _ForwardIterator>
3835equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp)
3836{
3837#ifdef _LIBCPP_DEBUG
3838 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3839 __debug_less<_Compare> __c(__comp);
3840 return __equal_range<_Comp_ref>(__first, __last, __value, __c);
Howard Hinnant324bb032010-08-22 00:02:43 +00003841#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003842 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3843 return __equal_range<_Comp_ref>(__first, __last, __value, __comp);
Howard Hinnant324bb032010-08-22 00:02:43 +00003844#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003845}
3846
3847template <class _ForwardIterator, class _Tp>
3848inline _LIBCPP_INLINE_VISIBILITY
3849pair<_ForwardIterator, _ForwardIterator>
3850equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
3851{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003852 return _VSTD::equal_range(__first, __last, __value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003853 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
3854}
3855
3856// binary_search
3857
3858template <class _Compare, class _ForwardIterator, class _Tp>
3859inline _LIBCPP_INLINE_VISIBILITY
3860bool
3861__binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp)
3862{
3863 __first = __lower_bound<_Compare>(__first, __last, __value, __comp);
3864 return __first != __last && !__comp(__value, *__first);
3865}
3866
3867template <class _ForwardIterator, class _Tp, class _Compare>
3868inline _LIBCPP_INLINE_VISIBILITY
3869bool
3870binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp)
3871{
3872#ifdef _LIBCPP_DEBUG
3873 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3874 __debug_less<_Compare> __c(__comp);
3875 return __binary_search<_Comp_ref>(__first, __last, __value, __c);
Howard Hinnant324bb032010-08-22 00:02:43 +00003876#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003877 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3878 return __binary_search<_Comp_ref>(__first, __last, __value, __comp);
Howard Hinnant324bb032010-08-22 00:02:43 +00003879#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003880}
3881
3882template <class _ForwardIterator, class _Tp>
3883inline _LIBCPP_INLINE_VISIBILITY
3884bool
3885binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
3886{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003887 return _VSTD::binary_search(__first, __last, __value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003888 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
3889}
3890
3891// merge
3892
3893template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
3894_OutputIterator
3895__merge(_InputIterator1 __first1, _InputIterator1 __last1,
3896 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
3897{
3898 for (; __first1 != __last1; ++__result)
3899 {
3900 if (__first2 == __last2)
Howard Hinnant0949eed2011-06-30 21:18:19 +00003901 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003902 if (__comp(*__first2, *__first1))
3903 {
3904 *__result = *__first2;
3905 ++__first2;
3906 }
3907 else
3908 {
3909 *__result = *__first1;
3910 ++__first1;
3911 }
3912 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00003913 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003914}
3915
3916template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
3917inline _LIBCPP_INLINE_VISIBILITY
3918_OutputIterator
3919merge(_InputIterator1 __first1, _InputIterator1 __last1,
3920 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
3921{
3922#ifdef _LIBCPP_DEBUG
3923 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3924 __debug_less<_Compare> __c(__comp);
Howard Hinnant0949eed2011-06-30 21:18:19 +00003925 return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant324bb032010-08-22 00:02:43 +00003926#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003927 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003928 return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant324bb032010-08-22 00:02:43 +00003929#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003930}
3931
3932template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
3933inline _LIBCPP_INLINE_VISIBILITY
3934_OutputIterator
3935merge(_InputIterator1 __first1, _InputIterator1 __last1,
3936 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
3937{
3938 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
3939 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
3940 return merge(__first1, __last1, __first2, __last2, __result, __less<__v1, __v2>());
3941}
3942
3943// inplace_merge
3944
3945template <class _Compare, class _BidirectionalIterator>
3946void
3947__buffered_inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
3948 _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1,
3949 typename iterator_traits<_BidirectionalIterator>::difference_type __len2,
3950 typename iterator_traits<_BidirectionalIterator>::value_type* __buff)
3951{
3952 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3953 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
3954 typedef typename iterator_traits<_BidirectionalIterator>::pointer pointer;
3955 __destruct_n __d(0);
3956 unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
3957 if (__len1 <= __len2)
3958 {
3959 value_type* __p = __buff;
3960 for (_BidirectionalIterator __i = __first; __i != __middle; __d.__incr((value_type*)0), ++__i, ++__p)
Howard Hinnant0949eed2011-06-30 21:18:19 +00003961 ::new(__p) value_type(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003962 __merge<_Compare>(move_iterator<value_type*>(__buff),
3963 move_iterator<value_type*>(__p),
3964 move_iterator<_BidirectionalIterator>(__middle),
3965 move_iterator<_BidirectionalIterator>(__last),
3966 __first, __comp);
3967 }
3968 else
3969 {
3970 value_type* __p = __buff;
3971 for (_BidirectionalIterator __i = __middle; __i != __last; __d.__incr((value_type*)0), ++__i, ++__p)
Howard Hinnant0949eed2011-06-30 21:18:19 +00003972 ::new(__p) value_type(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003973 typedef reverse_iterator<_BidirectionalIterator> _RBi;
3974 typedef reverse_iterator<value_type*> _Rv;
3975 __merge(move_iterator<_RBi>(_RBi(__middle)), move_iterator<_RBi>(_RBi(__first)),
3976 move_iterator<_Rv>(_Rv(__p)), move_iterator<_Rv>(_Rv(__buff)),
3977 _RBi(__last), __negate<_Compare>(__comp));
3978 }
3979}
3980
3981template <class _Compare, class _BidirectionalIterator>
3982void
3983__inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
3984 _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1,
3985 typename iterator_traits<_BidirectionalIterator>::difference_type __len2,
3986 typename iterator_traits<_BidirectionalIterator>::value_type* __buff, ptrdiff_t __buff_size)
3987{
3988 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3989 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
3990 while (true)
3991 {
3992 // if __middle == __last, we're done
3993 if (__len2 == 0)
3994 return;
3995 // shrink [__first, __middle) as much as possible (with no moves), returning if it shrinks to 0
3996 for (; true; ++__first, --__len1)
3997 {
3998 if (__len1 == 0)
3999 return;
4000 if (__comp(*__middle, *__first))
4001 break;
4002 }
4003 if (__len1 <= __buff_size || __len2 <= __buff_size)
4004 {
4005 __buffered_inplace_merge<_Compare>(__first, __middle, __last, __comp, __len1, __len2, __buff);
4006 return;
4007 }
4008 // __first < __middle < __last
4009 // *__first > *__middle
4010 // partition [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last) such that
4011 // all elements in:
4012 // [__first, __m1) <= [__middle, __m2)
4013 // [__middle, __m2) < [__m1, __middle)
4014 // [__m1, __middle) <= [__m2, __last)
4015 // and __m1 or __m2 is in the middle of its range
4016 _BidirectionalIterator __m1; // "median" of [__first, __middle)
4017 _BidirectionalIterator __m2; // "median" of [__middle, __last)
4018 difference_type __len11; // distance(__first, __m1)
4019 difference_type __len21; // distance(__middle, __m2)
4020 // binary search smaller range
4021 if (__len1 < __len2)
4022 { // __len >= 1, __len2 >= 2
4023 __len21 = __len2 / 2;
4024 __m2 = __middle;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004025 _VSTD::advance(__m2, __len21);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004026 __m1 = __upper_bound<_Compare>(__first, __middle, *__m2, __comp);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004027 __len11 = _VSTD::distance(__first, __m1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004028 }
4029 else
4030 {
4031 if (__len1 == 1)
4032 { // __len1 >= __len2 && __len2 > 0, therefore __len2 == 1
4033 // It is known *__first > *__middle
4034 swap(*__first, *__middle);
4035 return;
4036 }
4037 // __len1 >= 2, __len2 >= 1
4038 __len11 = __len1 / 2;
4039 __m1 = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004040 _VSTD::advance(__m1, __len11);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004041 __m2 = __lower_bound<_Compare>(__middle, __last, *__m1, __comp);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004042 __len21 = _VSTD::distance(__middle, __m2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004043 }
4044 difference_type __len12 = __len1 - __len11; // distance(__m1, __middle)
4045 difference_type __len22 = __len2 - __len21; // distance(__m2, __last)
4046 // [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last)
4047 // swap middle two partitions
Howard Hinnant0949eed2011-06-30 21:18:19 +00004048 __middle = _VSTD::rotate(__m1, __middle, __m2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004049 // __len12 and __len21 now have swapped meanings
4050 // merge smaller range with recurisve call and larger with tail recursion elimination
4051 if (__len11 + __len21 < __len12 + __len22)
4052 {
4053 __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size);
4054// __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size);
4055 __first = __middle;
4056 __middle = __m2;
4057 __len1 = __len12;
4058 __len2 = __len22;
4059 }
4060 else
4061 {
4062 __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size);
4063// __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size);
4064 __last = __middle;
4065 __middle = __m1;
4066 __len1 = __len11;
4067 __len2 = __len21;
4068 }
4069 }
4070}
4071
4072template <class _Tp>
4073struct __inplace_merge_switch
4074{
Howard Hinnant1468b662010-11-19 22:17:28 +00004075 static const unsigned value = is_trivially_copy_assignable<_Tp>::value;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004076};
4077
4078template <class _BidirectionalIterator, class _Compare>
4079inline _LIBCPP_INLINE_VISIBILITY
4080void
4081inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4082 _Compare __comp)
4083{
4084 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
4085 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004086 difference_type __len1 = _VSTD::distance(__first, __middle);
4087 difference_type __len2 = _VSTD::distance(__middle, __last);
4088 difference_type __buf_size = _VSTD::min(__len1, __len2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004089 pair<value_type*, ptrdiff_t> __buf(0, 0);
4090 unique_ptr<value_type, __return_temporary_buffer> __h;
4091 if (__inplace_merge_switch<value_type>::value && __buf_size > 8)
4092 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004093 __buf = _VSTD::get_temporary_buffer<value_type>(__buf_size);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004094 __h.reset(__buf.first);
4095 }
4096#ifdef _LIBCPP_DEBUG
4097 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4098 __debug_less<_Compare> __c(__comp);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004099 return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __c, __len1, __len2,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004100 __buf.first, __buf.second);
Howard Hinnant324bb032010-08-22 00:02:43 +00004101#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004102 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004103 return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __comp, __len1, __len2,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004104 __buf.first, __buf.second);
Howard Hinnant324bb032010-08-22 00:02:43 +00004105#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004106}
4107
4108template <class _BidirectionalIterator>
4109inline _LIBCPP_INLINE_VISIBILITY
4110void
4111inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last)
4112{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004113 _VSTD::inplace_merge(__first, __middle, __last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004114 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
4115}
4116
4117// stable_sort
4118
4119template <class _Compare, class _InputIterator1, class _InputIterator2>
4120void
4121__merge_move_construct(_InputIterator1 __first1, _InputIterator1 __last1,
4122 _InputIterator2 __first2, _InputIterator2 __last2,
4123 typename iterator_traits<_InputIterator1>::value_type* __result, _Compare __comp)
4124{
4125 typedef typename iterator_traits<_InputIterator1>::value_type value_type;
4126 __destruct_n __d(0);
4127 unique_ptr<value_type, __destruct_n&> __h(__result, __d);
4128 for (; true; ++__result)
4129 {
4130 if (__first1 == __last1)
4131 {
4132 for (; __first2 != __last2; ++__first2, ++__result, __d.__incr((value_type*)0))
Howard Hinnant0949eed2011-06-30 21:18:19 +00004133 ::new (__result) value_type(_VSTD::move(*__first2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004134 __h.release();
4135 return;
4136 }
4137 if (__first2 == __last2)
4138 {
4139 for (; __first1 != __last1; ++__first1, ++__result, __d.__incr((value_type*)0))
Howard Hinnant0949eed2011-06-30 21:18:19 +00004140 ::new (__result) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004141 __h.release();
4142 return;
4143 }
4144 if (__comp(*__first2, *__first1))
4145 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004146 ::new (__result) value_type(_VSTD::move(*__first2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004147 __d.__incr((value_type*)0);
4148 ++__first2;
4149 }
4150 else
4151 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004152 ::new (__result) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004153 __d.__incr((value_type*)0);
4154 ++__first1;
4155 }
4156 }
4157}
4158
4159template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4160void
4161__merge_move_assign(_InputIterator1 __first1, _InputIterator1 __last1,
4162 _InputIterator2 __first2, _InputIterator2 __last2,
4163 _OutputIterator __result, _Compare __comp)
4164{
4165 for (; __first1 != __last1; ++__result)
4166 {
4167 if (__first2 == __last2)
4168 {
4169 for (; __first1 != __last1; ++__first1, ++__result)
Howard Hinnant0949eed2011-06-30 21:18:19 +00004170 *__result = _VSTD::move(*__first1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004171 return;
4172 }
4173 if (__comp(*__first2, *__first1))
4174 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004175 *__result = _VSTD::move(*__first2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004176 ++__first2;
4177 }
4178 else
4179 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004180 *__result = _VSTD::move(*__first1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004181 ++__first1;
4182 }
4183 }
4184 for (; __first2 != __last2; ++__first2, ++__result)
Howard Hinnant0949eed2011-06-30 21:18:19 +00004185 *__result = _VSTD::move(*__first2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004186}
4187
4188template <class _Compare, class _RandomAccessIterator>
4189void
4190__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4191 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4192 typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size);
4193
4194template <class _Compare, class _RandomAccessIterator>
4195void
4196__stable_sort_move(_RandomAccessIterator __first1, _RandomAccessIterator __last1, _Compare __comp,
4197 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4198 typename iterator_traits<_RandomAccessIterator>::value_type* __first2)
4199{
4200 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4201 switch (__len)
4202 {
4203 case 0:
4204 return;
4205 case 1:
Howard Hinnant0949eed2011-06-30 21:18:19 +00004206 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004207 return;
4208 case 2:
4209 __destruct_n __d(0);
4210 unique_ptr<value_type, __destruct_n&> __h2(__first2, __d);
4211 if (__comp(*--__last1, *__first1))
4212 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004213 ::new(__first2) value_type(_VSTD::move(*__last1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004214 __d.__incr((value_type*)0);
4215 ++__first2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004216 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004217 }
4218 else
4219 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004220 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004221 __d.__incr((value_type*)0);
4222 ++__first2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004223 ::new(__first2) value_type(_VSTD::move(*__last1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004224 }
4225 __h2.release();
4226 return;
4227 }
4228 if (__len <= 8)
4229 {
4230 __insertion_sort_move<_Compare>(__first1, __last1, __first2, __comp);
4231 return;
4232 }
4233 typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2;
4234 _RandomAccessIterator __m = __first1 + __l2;
4235 __stable_sort<_Compare>(__first1, __m, __comp, __l2, __first2, __l2);
4236 __stable_sort<_Compare>(__m, __last1, __comp, __len - __l2, __first2 + __l2, __len - __l2);
4237 __merge_move_construct<_Compare>(__first1, __m, __m, __last1, __first2, __comp);
4238}
4239
4240template <class _Tp>
4241struct __stable_sort_switch
4242{
Howard Hinnant1468b662010-11-19 22:17:28 +00004243 static const unsigned value = 128*is_trivially_copy_assignable<_Tp>::value;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004244};
4245
4246template <class _Compare, class _RandomAccessIterator>
4247void
4248__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4249 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4250 typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size)
4251{
4252 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4253 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4254 switch (__len)
4255 {
4256 case 0:
4257 case 1:
4258 return;
4259 case 2:
4260 if (__comp(*--__last, *__first))
4261 swap(*__first, *__last);
4262 return;
4263 }
4264 if (__len <= static_cast<difference_type>(__stable_sort_switch<value_type>::value))
4265 {
4266 __insertion_sort<_Compare>(__first, __last, __comp);
4267 return;
4268 }
4269 typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2;
4270 _RandomAccessIterator __m = __first + __l2;
4271 if (__len <= __buff_size)
4272 {
4273 __destruct_n __d(0);
4274 unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
4275 __stable_sort_move<_Compare>(__first, __m, __comp, __l2, __buff);
4276 __d.__set(__l2, (value_type*)0);
4277 __stable_sort_move<_Compare>(__m, __last, __comp, __len - __l2, __buff + __l2);
4278 __d.__set(__len, (value_type*)0);
4279 __merge_move_assign<_Compare>(__buff, __buff + __l2, __buff + __l2, __buff + __len, __first, __comp);
4280// __merge<_Compare>(move_iterator<value_type*>(__buff),
4281// move_iterator<value_type*>(__buff + __l2),
4282// move_iterator<_RandomAccessIterator>(__buff + __l2),
4283// move_iterator<_RandomAccessIterator>(__buff + __len),
4284// __first, __comp);
4285 return;
4286 }
4287 __stable_sort<_Compare>(__first, __m, __comp, __l2, __buff, __buff_size);
4288 __stable_sort<_Compare>(__m, __last, __comp, __len - __l2, __buff, __buff_size);
4289 __inplace_merge<_Compare>(__first, __m, __last, __comp, __l2, __len - __l2, __buff, __buff_size);
4290}
4291
4292template <class _RandomAccessIterator, class _Compare>
4293inline _LIBCPP_INLINE_VISIBILITY
4294void
4295stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4296{
4297 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4298 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4299 difference_type __len = __last - __first;
4300 pair<value_type*, ptrdiff_t> __buf(0, 0);
4301 unique_ptr<value_type, __return_temporary_buffer> __h;
4302 if (__len > static_cast<difference_type>(__stable_sort_switch<value_type>::value))
4303 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004304 __buf = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004305 __h.reset(__buf.first);
4306 }
4307#ifdef _LIBCPP_DEBUG
4308 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4309 __debug_less<_Compare> __c(__comp);
4310 __stable_sort<_Comp_ref>(__first, __last, __c, __len, __buf.first, __buf.second);
Howard Hinnant324bb032010-08-22 00:02:43 +00004311#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004312 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4313 __stable_sort<_Comp_ref>(__first, __last, __comp, __len, __buf.first, __buf.second);
Howard Hinnant324bb032010-08-22 00:02:43 +00004314#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004315}
4316
4317template <class _RandomAccessIterator>
4318inline _LIBCPP_INLINE_VISIBILITY
4319void
4320stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
4321{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004322 _VSTD::stable_sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004323}
4324
4325// is_heap_until
4326
4327template <class _RandomAccessIterator, class _Compare>
4328_RandomAccessIterator
4329is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4330{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004331 typedef typename _VSTD::iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004332 difference_type __len = __last - __first;
4333 difference_type __p = 0;
4334 difference_type __c = 1;
4335 _RandomAccessIterator __pp = __first;
4336 while (__c < __len)
4337 {
4338 _RandomAccessIterator __cp = __first + __c;
4339 if (__comp(*__pp, *__cp))
4340 return __cp;
4341 ++__c;
4342 ++__cp;
4343 if (__c == __len)
4344 return __last;
4345 if (__comp(*__pp, *__cp))
4346 return __cp;
4347 ++__p;
4348 ++__pp;
4349 __c = 2 * __p + 1;
4350 }
4351 return __last;
4352}
4353
Howard Hinnant324bb032010-08-22 00:02:43 +00004354template<class _RandomAccessIterator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004355inline _LIBCPP_INLINE_VISIBILITY
4356_RandomAccessIterator
4357is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last)
4358{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004359 return _VSTD::is_heap_until(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004360}
4361
4362// is_heap
4363
4364template <class _RandomAccessIterator, class _Compare>
4365inline _LIBCPP_INLINE_VISIBILITY
4366bool
4367is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4368{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004369 return _VSTD::is_heap_until(__first, __last, __comp) == __last;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004370}
4371
Howard Hinnant324bb032010-08-22 00:02:43 +00004372template<class _RandomAccessIterator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004373inline _LIBCPP_INLINE_VISIBILITY
4374bool
4375is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4376{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004377 return _VSTD::is_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004378}
4379
4380// push_heap
4381
4382template <class _Compare, class _RandomAccessIterator>
4383void
4384__push_heap_front(_RandomAccessIterator __first, _RandomAccessIterator, _Compare __comp,
4385 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
4386{
4387 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4388 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4389 if (__len > 1)
4390 {
4391 difference_type __p = 0;
4392 _RandomAccessIterator __pp = __first;
4393 difference_type __c = 2;
4394 _RandomAccessIterator __cp = __first + __c;
4395 if (__c == __len || __comp(*__cp, *(__cp - 1)))
4396 {
4397 --__c;
4398 --__cp;
4399 }
4400 if (__comp(*__pp, *__cp))
4401 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004402 value_type __t(_VSTD::move(*__pp));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004403 do
4404 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004405 *__pp = _VSTD::move(*__cp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004406 __pp = __cp;
4407 __p = __c;
4408 __c = (__p + 1) * 2;
4409 if (__c > __len)
4410 break;
4411 __cp = __first + __c;
4412 if (__c == __len || __comp(*__cp, *(__cp - 1)))
4413 {
4414 --__c;
4415 --__cp;
4416 }
4417 } while (__comp(__t, *__cp));
Howard Hinnant0949eed2011-06-30 21:18:19 +00004418 *__pp = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004419 }
4420 }
4421}
4422
4423template <class _Compare, class _RandomAccessIterator>
4424void
4425__push_heap_back(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4426 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
4427{
4428 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4429 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4430 if (__len > 1)
4431 {
4432 __len = (__len - 2) / 2;
4433 _RandomAccessIterator __ptr = __first + __len;
4434 if (__comp(*__ptr, *--__last))
4435 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004436 value_type __t(_VSTD::move(*__last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004437 do
4438 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004439 *__last = _VSTD::move(*__ptr);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004440 __last = __ptr;
4441 if (__len == 0)
4442 break;
4443 __len = (__len - 1) / 2;
4444 __ptr = __first + __len;
4445 } while (__comp(*__ptr, __t));
Howard Hinnant0949eed2011-06-30 21:18:19 +00004446 *__last = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004447 }
4448 }
4449}
4450
4451template <class _RandomAccessIterator, class _Compare>
4452inline _LIBCPP_INLINE_VISIBILITY
4453void
4454push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4455{
4456#ifdef _LIBCPP_DEBUG
4457 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4458 __debug_less<_Compare> __c(__comp);
4459 __push_heap_back<_Comp_ref>(__first, __last, __c, __last - __first);
Howard Hinnant324bb032010-08-22 00:02:43 +00004460#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004461 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4462 __push_heap_back<_Comp_ref>(__first, __last, __comp, __last - __first);
Howard Hinnant324bb032010-08-22 00:02:43 +00004463#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004464}
4465
4466template <class _RandomAccessIterator>
4467inline _LIBCPP_INLINE_VISIBILITY
4468void
4469push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4470{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004471 _VSTD::push_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004472}
4473
4474// pop_heap
4475
4476template <class _Compare, class _RandomAccessIterator>
4477inline _LIBCPP_INLINE_VISIBILITY
4478void
4479__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4480 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
4481{
4482 if (__len > 1)
4483 {
4484 swap(*__first, *--__last);
4485 __push_heap_front<_Compare>(__first, __last, __comp, __len-1);
4486 }
4487}
4488
4489template <class _RandomAccessIterator, class _Compare>
4490inline _LIBCPP_INLINE_VISIBILITY
4491void
4492pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4493{
4494#ifdef _LIBCPP_DEBUG
4495 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4496 __debug_less<_Compare> __c(__comp);
4497 __pop_heap<_Comp_ref>(__first, __last, __c, __last - __first);
Howard Hinnant324bb032010-08-22 00:02:43 +00004498#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004499 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4500 __pop_heap<_Comp_ref>(__first, __last, __comp, __last - __first);
Howard Hinnant324bb032010-08-22 00:02:43 +00004501#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004502}
4503
4504template <class _RandomAccessIterator>
4505inline _LIBCPP_INLINE_VISIBILITY
4506void
4507pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4508{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004509 _VSTD::pop_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004510}
4511
4512// make_heap
4513
4514template <class _Compare, class _RandomAccessIterator>
4515void
4516__make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4517{
4518 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4519 difference_type __n = __last - __first;
4520 if (__n > 1)
4521 {
4522 __last = __first;
4523 ++__last;
4524 for (difference_type __i = 1; __i < __n;)
4525 __push_heap_back<_Compare>(__first, ++__last, __comp, ++__i);
4526 }
4527}
4528
4529template <class _RandomAccessIterator, class _Compare>
4530inline _LIBCPP_INLINE_VISIBILITY
4531void
4532make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4533{
4534#ifdef _LIBCPP_DEBUG
4535 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4536 __debug_less<_Compare> __c(__comp);
4537 __make_heap<_Comp_ref>(__first, __last, __c);
Howard Hinnant324bb032010-08-22 00:02:43 +00004538#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004539 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4540 __make_heap<_Comp_ref>(__first, __last, __comp);
Howard Hinnant324bb032010-08-22 00:02:43 +00004541#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004542}
4543
4544template <class _RandomAccessIterator>
4545inline _LIBCPP_INLINE_VISIBILITY
4546void
4547make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4548{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004549 _VSTD::make_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004550}
4551
4552// sort_heap
4553
4554template <class _Compare, class _RandomAccessIterator>
4555void
4556__sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4557{
4558 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4559 for (difference_type __n = __last - __first; __n > 1; --__last, --__n)
4560 __pop_heap<_Compare>(__first, __last, __comp, __n);
4561}
4562
4563template <class _RandomAccessIterator, class _Compare>
4564inline _LIBCPP_INLINE_VISIBILITY
4565void
4566sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4567{
4568#ifdef _LIBCPP_DEBUG
4569 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4570 __debug_less<_Compare> __c(__comp);
4571 __sort_heap<_Comp_ref>(__first, __last, __c);
Howard Hinnant324bb032010-08-22 00:02:43 +00004572#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004573 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4574 __sort_heap<_Comp_ref>(__first, __last, __comp);
Howard Hinnant324bb032010-08-22 00:02:43 +00004575#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004576}
4577
4578template <class _RandomAccessIterator>
4579inline _LIBCPP_INLINE_VISIBILITY
4580void
4581sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4582{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004583 _VSTD::sort_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004584}
4585
4586// partial_sort
4587
4588template <class _Compare, class _RandomAccessIterator>
4589void
4590__partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
4591 _Compare __comp)
4592{
4593 __make_heap<_Compare>(__first, __middle, __comp);
4594 typename iterator_traits<_RandomAccessIterator>::difference_type __len = __middle - __first;
4595 for (_RandomAccessIterator __i = __middle; __i != __last; ++__i)
4596 {
4597 if (__comp(*__i, *__first))
4598 {
4599 swap(*__i, *__first);
4600 __push_heap_front<_Compare>(__first, __middle, __comp, __len);
4601 }
4602 }
4603 __sort_heap<_Compare>(__first, __middle, __comp);
4604}
4605
4606template <class _RandomAccessIterator, class _Compare>
4607inline _LIBCPP_INLINE_VISIBILITY
4608void
4609partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
4610 _Compare __comp)
4611{
4612#ifdef _LIBCPP_DEBUG
4613 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4614 __debug_less<_Compare> __c(__comp);
4615 __partial_sort<_Comp_ref>(__first, __middle, __last, __c);
Howard Hinnant324bb032010-08-22 00:02:43 +00004616#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004617 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4618 __partial_sort<_Comp_ref>(__first, __middle, __last, __comp);
Howard Hinnant324bb032010-08-22 00:02:43 +00004619#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004620}
4621
4622template <class _RandomAccessIterator>
4623inline _LIBCPP_INLINE_VISIBILITY
4624void
4625partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last)
4626{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004627 _VSTD::partial_sort(__first, __middle, __last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004628 __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4629}
4630
4631// partial_sort_copy
4632
4633template <class _Compare, class _InputIterator, class _RandomAccessIterator>
4634_RandomAccessIterator
4635__partial_sort_copy(_InputIterator __first, _InputIterator __last,
4636 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp)
4637{
4638 _RandomAccessIterator __r = __result_first;
4639 if (__r != __result_last)
4640 {
4641 typename iterator_traits<_RandomAccessIterator>::difference_type __len = 0;
4642 for (; __first != __last && __r != __result_last; ++__first, ++__r, ++__len)
4643 *__r = *__first;
4644 __make_heap<_Compare>(__result_first, __r, __comp);
4645 for (; __first != __last; ++__first)
4646 if (__comp(*__first, *__result_first))
4647 {
4648 *__result_first = *__first;
4649 __push_heap_front<_Compare>(__result_first, __r, __comp, __len);
4650 }
4651 __sort_heap<_Compare>(__result_first, __r, __comp);
4652 }
4653 return __r;
4654}
4655
4656template <class _InputIterator, class _RandomAccessIterator, class _Compare>
4657inline _LIBCPP_INLINE_VISIBILITY
4658_RandomAccessIterator
4659partial_sort_copy(_InputIterator __first, _InputIterator __last,
4660 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp)
4661{
4662#ifdef _LIBCPP_DEBUG
4663 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4664 __debug_less<_Compare> __c(__comp);
4665 return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __c);
Howard Hinnant324bb032010-08-22 00:02:43 +00004666#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004667 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4668 return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __comp);
Howard Hinnant324bb032010-08-22 00:02:43 +00004669#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004670}
4671
4672template <class _InputIterator, class _RandomAccessIterator>
4673inline _LIBCPP_INLINE_VISIBILITY
4674_RandomAccessIterator
4675partial_sort_copy(_InputIterator __first, _InputIterator __last,
4676 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last)
4677{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004678 return _VSTD::partial_sort_copy(__first, __last, __result_first, __result_last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004679 __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4680}
4681
4682// nth_element
4683
4684template <class _Compare, class _RandomAccessIterator>
4685void
4686__nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
4687{
4688 // _Compare is known to be a reference type
4689 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4690 const difference_type __limit = 7;
4691 while (true)
4692 {
4693 __restart:
4694 difference_type __len = __last - __first;
4695 switch (__len)
4696 {
4697 case 0:
4698 case 1:
4699 return;
4700 case 2:
4701 if (__comp(*--__last, *__first))
4702 swap(*__first, *__last);
4703 return;
4704 case 3:
4705 {
4706 _RandomAccessIterator __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004707 _VSTD::__sort3<_Compare>(__first, ++__m, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004708 return;
4709 }
4710 }
4711 if (__len <= __limit)
4712 {
4713 __selection_sort<_Compare>(__first, __last, __comp);
4714 return;
4715 }
4716 // __len > __limit >= 3
4717 _RandomAccessIterator __m = __first + __len/2;
4718 _RandomAccessIterator __lm1 = __last;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004719 unsigned __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, --__lm1, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004720 // *__m is median
4721 // partition [__first, __m) < *__m and *__m <= [__m, __last)
4722 // (this inhibits tossing elements equivalent to __m around unnecessarily)
4723 _RandomAccessIterator __i = __first;
4724 _RandomAccessIterator __j = __lm1;
4725 // j points beyond range to be tested, *__lm1 is known to be <= *__m
4726 // The search going up is known to be guarded but the search coming down isn't.
4727 // Prime the downward search with a guard.
4728 if (!__comp(*__i, *__m)) // if *__first == *__m
4729 {
4730 // *__first == *__m, *__first doesn't go in first part
4731 // manually guard downward moving __j against __i
4732 while (true)
4733 {
4734 if (__i == --__j)
4735 {
4736 // *__first == *__m, *__m <= all other elements
4737 // Parition instead into [__first, __i) == *__first and *__first < [__i, __last)
4738 ++__i; // __first + 1
4739 __j = __last;
4740 if (!__comp(*__first, *--__j)) // we need a guard if *__first == *(__last-1)
4741 {
4742 while (true)
4743 {
4744 if (__i == __j)
4745 return; // [__first, __last) all equivalent elements
4746 if (__comp(*__first, *__i))
4747 {
4748 swap(*__i, *__j);
4749 ++__n_swaps;
4750 ++__i;
4751 break;
4752 }
4753 ++__i;
4754 }
4755 }
4756 // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1
4757 if (__i == __j)
4758 return;
4759 while (true)
4760 {
4761 while (!__comp(*__first, *__i))
4762 ++__i;
4763 while (__comp(*__first, *--__j))
4764 ;
4765 if (__i >= __j)
4766 break;
4767 swap(*__i, *__j);
4768 ++__n_swaps;
4769 ++__i;
4770 }
4771 // [__first, __i) == *__first and *__first < [__i, __last)
4772 // The first part is sorted,
4773 if (__nth < __i)
4774 return;
4775 // __nth_element the secod part
4776 // __nth_element<_Compare>(__i, __nth, __last, __comp);
4777 __first = __i;
4778 goto __restart;
4779 }
4780 if (__comp(*__j, *__m))
4781 {
4782 swap(*__i, *__j);
4783 ++__n_swaps;
4784 break; // found guard for downward moving __j, now use unguarded partition
4785 }
4786 }
4787 }
4788 ++__i;
4789 // j points beyond range to be tested, *__lm1 is known to be <= *__m
4790 // if not yet partitioned...
4791 if (__i < __j)
4792 {
4793 // known that *(__i - 1) < *__m
4794 while (true)
4795 {
4796 // __m still guards upward moving __i
4797 while (__comp(*__i, *__m))
4798 ++__i;
4799 // It is now known that a guard exists for downward moving __j
4800 while (!__comp(*--__j, *__m))
4801 ;
4802 if (__i >= __j)
4803 break;
4804 swap(*__i, *__j);
4805 ++__n_swaps;
4806 // It is known that __m != __j
4807 // If __m just moved, follow it
4808 if (__m == __i)
4809 __m = __j;
4810 ++__i;
4811 }
4812 }
4813 // [__first, __i) < *__m and *__m <= [__i, __last)
4814 if (__i != __m && __comp(*__m, *__i))
4815 {
4816 swap(*__i, *__m);
4817 ++__n_swaps;
4818 }
4819 // [__first, __i) < *__i and *__i <= [__i+1, __last)
4820 if (__nth == __i)
4821 return;
4822 if (__n_swaps == 0)
4823 {
4824 // We were given a perfectly partitioned sequence. Coincidence?
4825 if (__nth < __i)
4826 {
4827 // Check for [__first, __i) already sorted
4828 __j = __m = __first;
4829 while (++__j != __i)
4830 {
4831 if (__comp(*__j, *__m))
4832 // not yet sorted, so sort
4833 goto not_sorted;
4834 __m = __j;
4835 }
4836 // [__first, __i) sorted
4837 return;
4838 }
4839 else
4840 {
4841 // Check for [__i, __last) already sorted
4842 __j = __m = __i;
4843 while (++__j != __last)
4844 {
4845 if (__comp(*__j, *__m))
4846 // not yet sorted, so sort
4847 goto not_sorted;
4848 __m = __j;
4849 }
4850 // [__i, __last) sorted
4851 return;
4852 }
4853 }
4854not_sorted:
4855 // __nth_element on range containing __nth
4856 if (__nth < __i)
4857 {
4858 // __nth_element<_Compare>(__first, __nth, __i, __comp);
4859 __last = __i;
4860 }
4861 else
4862 {
4863 // __nth_element<_Compare>(__i+1, __nth, __last, __comp);
4864 __first = ++__i;
4865 }
4866 }
4867}
4868
4869template <class _RandomAccessIterator, class _Compare>
4870inline _LIBCPP_INLINE_VISIBILITY
4871void
4872nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
4873{
4874#ifdef _LIBCPP_DEBUG
4875 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4876 __debug_less<_Compare> __c(__comp);
4877 __nth_element<_Comp_ref>(__first, __nth, __last, __c);
Howard Hinnant324bb032010-08-22 00:02:43 +00004878#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004879 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4880 __nth_element<_Comp_ref>(__first, __nth, __last, __comp);
Howard Hinnant324bb032010-08-22 00:02:43 +00004881#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004882}
4883
4884template <class _RandomAccessIterator>
4885inline _LIBCPP_INLINE_VISIBILITY
4886void
4887nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last)
4888{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004889 _VSTD::nth_element(__first, __nth, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004890}
4891
4892// includes
4893
4894template <class _Compare, class _InputIterator1, class _InputIterator2>
4895bool
4896__includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
4897 _Compare __comp)
4898{
4899 for (; __first2 != __last2; ++__first1)
4900 {
4901 if (__first1 == __last1 || __comp(*__first2, *__first1))
4902 return false;
4903 if (!__comp(*__first1, *__first2))
4904 ++__first2;
4905 }
4906 return true;
4907}
4908
4909template <class _InputIterator1, class _InputIterator2, class _Compare>
4910inline _LIBCPP_INLINE_VISIBILITY
4911bool
4912includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
4913 _Compare __comp)
4914{
4915#ifdef _LIBCPP_DEBUG
4916 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4917 __debug_less<_Compare> __c(__comp);
4918 return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __c);
Howard Hinnant324bb032010-08-22 00:02:43 +00004919#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004920 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4921 return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
Howard Hinnant324bb032010-08-22 00:02:43 +00004922#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004923}
4924
4925template <class _InputIterator1, class _InputIterator2>
4926inline _LIBCPP_INLINE_VISIBILITY
4927bool
4928includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2)
4929{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004930 return _VSTD::includes(__first1, __last1, __first2, __last2,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004931 __less<typename iterator_traits<_InputIterator1>::value_type,
4932 typename iterator_traits<_InputIterator2>::value_type>());
4933}
4934
4935// set_union
4936
4937template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4938_OutputIterator
4939__set_union(_InputIterator1 __first1, _InputIterator1 __last1,
4940 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4941{
4942 for (; __first1 != __last1; ++__result)
4943 {
4944 if (__first2 == __last2)
Howard Hinnant0949eed2011-06-30 21:18:19 +00004945 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004946 if (__comp(*__first2, *__first1))
4947 {
4948 *__result = *__first2;
4949 ++__first2;
4950 }
4951 else
4952 {
4953 *__result = *__first1;
4954 if (!__comp(*__first1, *__first2))
4955 ++__first2;
4956 ++__first1;
4957 }
4958 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00004959 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004960}
4961
4962template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
4963inline _LIBCPP_INLINE_VISIBILITY
4964_OutputIterator
4965set_union(_InputIterator1 __first1, _InputIterator1 __last1,
4966 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4967{
4968#ifdef _LIBCPP_DEBUG
4969 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4970 __debug_less<_Compare> __c(__comp);
4971 return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant324bb032010-08-22 00:02:43 +00004972#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004973 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4974 return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant324bb032010-08-22 00:02:43 +00004975#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004976}
4977
4978template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
4979inline _LIBCPP_INLINE_VISIBILITY
4980_OutputIterator
4981set_union(_InputIterator1 __first1, _InputIterator1 __last1,
4982 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
4983{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004984 return _VSTD::set_union(__first1, __last1, __first2, __last2, __result,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004985 __less<typename iterator_traits<_InputIterator1>::value_type,
4986 typename iterator_traits<_InputIterator2>::value_type>());
4987}
4988
4989// set_intersection
4990
4991template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4992_OutputIterator
4993__set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
4994 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4995{
4996 while (__first1 != __last1 && __first2 != __last2)
4997 {
4998 if (__comp(*__first1, *__first2))
4999 ++__first1;
5000 else
5001 {
5002 if (!__comp(*__first2, *__first1))
5003 {
5004 *__result = *__first1;
5005 ++__result;
5006 ++__first1;
5007 }
5008 ++__first2;
5009 }
5010 }
5011 return __result;
5012}
5013
5014template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5015inline _LIBCPP_INLINE_VISIBILITY
5016_OutputIterator
5017set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5018 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5019{
5020#ifdef _LIBCPP_DEBUG
5021 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5022 __debug_less<_Compare> __c(__comp);
5023 return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant324bb032010-08-22 00:02:43 +00005024#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005025 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5026 return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant324bb032010-08-22 00:02:43 +00005027#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005028}
5029
5030template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5031inline _LIBCPP_INLINE_VISIBILITY
5032_OutputIterator
5033set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5034 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5035{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005036 return _VSTD::set_intersection(__first1, __last1, __first2, __last2, __result,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005037 __less<typename iterator_traits<_InputIterator1>::value_type,
5038 typename iterator_traits<_InputIterator2>::value_type>());
5039}
5040
5041// set_difference
5042
5043template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5044_OutputIterator
5045__set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5046 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5047{
5048 while (__first1 != __last1)
5049 {
5050 if (__first2 == __last2)
Howard Hinnant0949eed2011-06-30 21:18:19 +00005051 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005052 if (__comp(*__first1, *__first2))
5053 {
5054 *__result = *__first1;
5055 ++__result;
5056 ++__first1;
5057 }
5058 else
5059 {
5060 if (!__comp(*__first2, *__first1))
5061 ++__first1;
5062 ++__first2;
5063 }
5064 }
5065 return __result;
5066}
5067
5068template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5069inline _LIBCPP_INLINE_VISIBILITY
5070_OutputIterator
5071set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5072 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5073{
5074#ifdef _LIBCPP_DEBUG
5075 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5076 __debug_less<_Compare> __c(__comp);
5077 return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant324bb032010-08-22 00:02:43 +00005078#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005079 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5080 return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant324bb032010-08-22 00:02:43 +00005081#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005082}
5083
5084template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5085inline _LIBCPP_INLINE_VISIBILITY
5086_OutputIterator
5087set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5088 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5089{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005090 return _VSTD::set_difference(__first1, __last1, __first2, __last2, __result,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005091 __less<typename iterator_traits<_InputIterator1>::value_type,
5092 typename iterator_traits<_InputIterator2>::value_type>());
5093}
5094
5095// set_symmetric_difference
5096
5097template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5098_OutputIterator
5099__set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5100 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5101{
5102 while (__first1 != __last1)
5103 {
5104 if (__first2 == __last2)
Howard Hinnant0949eed2011-06-30 21:18:19 +00005105 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005106 if (__comp(*__first1, *__first2))
5107 {
5108 *__result = *__first1;
5109 ++__result;
5110 ++__first1;
5111 }
5112 else
5113 {
5114 if (__comp(*__first2, *__first1))
5115 {
5116 *__result = *__first2;
5117 ++__result;
5118 }
5119 else
5120 ++__first1;
5121 ++__first2;
5122 }
5123 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00005124 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005125}
5126
5127template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5128inline _LIBCPP_INLINE_VISIBILITY
5129_OutputIterator
5130set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5131 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5132{
5133#ifdef _LIBCPP_DEBUG
5134 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5135 __debug_less<_Compare> __c(__comp);
5136 return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant324bb032010-08-22 00:02:43 +00005137#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005138 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5139 return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant324bb032010-08-22 00:02:43 +00005140#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005141}
5142
5143template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5144inline _LIBCPP_INLINE_VISIBILITY
5145_OutputIterator
5146set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5147 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5148{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005149 return _VSTD::set_symmetric_difference(__first1, __last1, __first2, __last2, __result,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005150 __less<typename iterator_traits<_InputIterator1>::value_type,
5151 typename iterator_traits<_InputIterator2>::value_type>());
5152}
5153
5154// lexicographical_compare
5155
5156template <class _Compare, class _InputIterator1, class _InputIterator2>
5157bool
5158__lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5159 _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
5160{
5161 for (; __first2 != __last2; ++__first1, ++__first2)
5162 {
5163 if (__first1 == __last1 || __comp(*__first1, *__first2))
5164 return true;
5165 if (__comp(*__first2, *__first1))
5166 return false;
5167 }
5168 return false;
5169}
5170
5171template <class _InputIterator1, class _InputIterator2, class _Compare>
5172inline _LIBCPP_INLINE_VISIBILITY
5173bool
5174lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5175 _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
5176{
5177#ifdef _LIBCPP_DEBUG
5178 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5179 __debug_less<_Compare> __c(__comp);
5180 return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __c);
Howard Hinnant324bb032010-08-22 00:02:43 +00005181#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005182 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5183 return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
Howard Hinnant324bb032010-08-22 00:02:43 +00005184#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005185}
5186
5187template <class _InputIterator1, class _InputIterator2>
5188inline _LIBCPP_INLINE_VISIBILITY
5189bool
5190lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5191 _InputIterator2 __first2, _InputIterator2 __last2)
5192{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005193 return _VSTD::lexicographical_compare(__first1, __last1, __first2, __last2,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005194 __less<typename iterator_traits<_InputIterator1>::value_type,
5195 typename iterator_traits<_InputIterator2>::value_type>());
5196}
5197
5198// next_permutation
5199
5200template <class _Compare, class _BidirectionalIterator>
5201bool
5202__next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5203{
5204 _BidirectionalIterator __i = __last;
5205 if (__first == __last || __first == --__i)
5206 return false;
5207 while (true)
5208 {
5209 _BidirectionalIterator __ip1 = __i;
5210 if (__comp(*--__i, *__ip1))
5211 {
5212 _BidirectionalIterator __j = __last;
5213 while (!__comp(*__i, *--__j))
5214 ;
5215 swap(*__i, *__j);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005216 _VSTD::reverse(__ip1, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005217 return true;
5218 }
5219 if (__i == __first)
5220 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00005221 _VSTD::reverse(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005222 return false;
5223 }
5224 }
5225}
5226
5227template <class _BidirectionalIterator, class _Compare>
5228inline _LIBCPP_INLINE_VISIBILITY
5229bool
5230next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5231{
5232#ifdef _LIBCPP_DEBUG
5233 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5234 __debug_less<_Compare> __c(__comp);
5235 return __next_permutation<_Comp_ref>(__first, __last, __c);
Howard Hinnant324bb032010-08-22 00:02:43 +00005236#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005237 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5238 return __next_permutation<_Comp_ref>(__first, __last, __comp);
Howard Hinnant324bb032010-08-22 00:02:43 +00005239#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005240}
5241
5242template <class _BidirectionalIterator>
5243inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant324bb032010-08-22 00:02:43 +00005244bool
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005245next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
5246{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005247 return _VSTD::next_permutation(__first, __last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005248 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
5249}
5250
5251// prev_permutation
5252
5253template <class _Compare, class _BidirectionalIterator>
5254bool
5255__prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5256{
5257 _BidirectionalIterator __i = __last;
5258 if (__first == __last || __first == --__i)
5259 return false;
5260 while (true)
5261 {
5262 _BidirectionalIterator __ip1 = __i;
5263 if (__comp(*__ip1, *--__i))
5264 {
5265 _BidirectionalIterator __j = __last;
5266 while (!__comp(*--__j, *__i))
5267 ;
5268 swap(*__i, *__j);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005269 _VSTD::reverse(__ip1, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005270 return true;
5271 }
5272 if (__i == __first)
5273 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00005274 _VSTD::reverse(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005275 return false;
5276 }
5277 }
5278}
5279
5280template <class _BidirectionalIterator, class _Compare>
5281inline _LIBCPP_INLINE_VISIBILITY
5282bool
5283prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5284{
5285#ifdef _LIBCPP_DEBUG
5286 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5287 __debug_less<_Compare> __c(__comp);
5288 return __prev_permutation<_Comp_ref>(__first, __last, __c);
Howard Hinnant324bb032010-08-22 00:02:43 +00005289#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005290 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5291 return __prev_permutation<_Comp_ref>(__first, __last, __comp);
Howard Hinnant324bb032010-08-22 00:02:43 +00005292#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005293}
5294
5295template <class _BidirectionalIterator>
5296inline _LIBCPP_INLINE_VISIBILITY
5297bool
5298prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
5299{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005300 return _VSTD::prev_permutation(__first, __last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005301 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
5302}
5303
5304template <class _Tp>
5305inline _LIBCPP_INLINE_VISIBILITY
5306typename enable_if
5307<
5308 is_integral<_Tp>::value,
5309 _Tp
5310>::type
5311__rotate_left(_Tp __t, _Tp __n = 1)
5312{
5313 const unsigned __bits = static_cast<unsigned>(sizeof(_Tp) * __CHAR_BIT__ - 1);
5314 __n &= __bits;
5315 return static_cast<_Tp>((__t << __n) | (static_cast<typename make_unsigned<_Tp>::type>(__t) >> (__bits - __n)));
5316}
5317
5318template <class _Tp>
5319inline _LIBCPP_INLINE_VISIBILITY
5320typename enable_if
5321<
5322 is_integral<_Tp>::value,
5323 _Tp
5324>::type
5325__rotate_right(_Tp __t, _Tp __n = 1)
5326{
5327 const unsigned __bits = static_cast<unsigned>(sizeof(_Tp) * __CHAR_BIT__ - 1);
5328 __n &= __bits;
5329 return static_cast<_Tp>((__t << (__bits - __n)) | (static_cast<typename make_unsigned<_Tp>::type>(__t) >> __n));
5330}
5331
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005332_LIBCPP_END_NAMESPACE_STD
5333
5334#endif // _LIBCPP_ALGORITHM