blob: e662632b043c08499165aa32c8f0b4f5105539d2 [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>
Howard Hinnantadff4892010-05-24 17:49:41 +0000596#include <cstdlib>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000597
Howard Hinnant08e17472011-10-17 20:05:10 +0000598#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000599#pragma GCC system_header
Howard Hinnant08e17472011-10-17 20:05:10 +0000600#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000601
602_LIBCPP_BEGIN_NAMESPACE_STD
603
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000604template <class _T1, class _T2 = _T1>
605struct __equal_to
606{
607 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
608 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T2& __y) const {return __x == __y;}
609 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T1& __y) const {return __x == __y;}
610 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T2& __y) const {return __x == __y;}
611};
612
613template <class _T1>
614struct __equal_to<_T1, _T1>
615{
616 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
617};
618
619template <class _T1>
620struct __equal_to<const _T1, _T1>
621{
622 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
623};
624
625template <class _T1>
626struct __equal_to<_T1, const _T1>
627{
628 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
629};
630
631template <class _T1, class _T2 = _T1>
632struct __less
633{
634 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
635 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T2& __y) const {return __x < __y;}
636 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T1& __y) const {return __x < __y;}
637 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T2& __y) const {return __x < __y;}
638};
639
640template <class _T1>
641struct __less<_T1, _T1>
642{
643 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
644};
645
646template <class _T1>
647struct __less<const _T1, _T1>
648{
649 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
650};
651
652template <class _T1>
653struct __less<_T1, const _T1>
654{
655 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
656};
657
658template <class _Predicate>
659class __negate
660{
661private:
662 _Predicate __p_;
663public:
664 _LIBCPP_INLINE_VISIBILITY __negate() {}
665
666 _LIBCPP_INLINE_VISIBILITY
667 explicit __negate(_Predicate __p) : __p_(__p) {}
668
669 template <class _T1>
670 _LIBCPP_INLINE_VISIBILITY
671 bool operator()(const _T1& __x) {return !__p_(__x);}
672
673 template <class _T1, class _T2>
674 _LIBCPP_INLINE_VISIBILITY
675 bool operator()(const _T1& __x, const _T2& __y) {return !__p_(__x, __y);}
676};
677
Howard Hinnant7a563db2011-09-14 18:33:51 +0000678#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000679
680template <class _Compare>
681struct __debug_less
682{
683 _Compare __comp_;
684 __debug_less(_Compare& __c) : __comp_(__c) {}
685 template <class _Tp, class _Up>
686 bool operator()(const _Tp& __x, const _Up& __y)
687 {
688 bool __r = __comp_(__x, __y);
689 if (__r)
Howard Hinnant7a563db2011-09-14 18:33:51 +0000690 _LIBCPP_ASSERT(!__comp_(__y, __x), "Comparator does not induce a strict weak ordering");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000691 return __r;
692 }
693};
694
Howard Hinnant7a563db2011-09-14 18:33:51 +0000695#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000696
Howard Hinnant13c98cc2010-05-27 20:06:01 +0000697// Precondition: __x != 0
698inline _LIBCPP_INLINE_VISIBILITY unsigned __ctz(unsigned __x) {return __builtin_ctz (__x);}
699inline _LIBCPP_INLINE_VISIBILITY unsigned long __ctz(unsigned long __x) {return __builtin_ctzl (__x);}
700inline _LIBCPP_INLINE_VISIBILITY unsigned long long __ctz(unsigned long long __x) {return __builtin_ctzll(__x);}
701
702// Precondition: __x != 0
703inline _LIBCPP_INLINE_VISIBILITY unsigned __clz(unsigned __x) {return __builtin_clz (__x);}
704inline _LIBCPP_INLINE_VISIBILITY unsigned long __clz(unsigned long __x) {return __builtin_clzl (__x);}
705inline _LIBCPP_INLINE_VISIBILITY unsigned long long __clz(unsigned long long __x) {return __builtin_clzll(__x);}
706
707inline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned __x) {return __builtin_popcount (__x);}
708inline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned long __x) {return __builtin_popcountl (__x);}
709inline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned long long __x) {return __builtin_popcountll(__x);}
710
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000711// all_of
712
713template <class _InputIterator, class _Predicate>
714inline _LIBCPP_INLINE_VISIBILITY
715bool
716all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
717{
718 for (; __first != __last; ++__first)
719 if (!__pred(*__first))
720 return false;
721 return true;
722}
723
724// any_of
725
726template <class _InputIterator, class _Predicate>
727inline _LIBCPP_INLINE_VISIBILITY
728bool
729any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
730{
731 for (; __first != __last; ++__first)
732 if (__pred(*__first))
733 return true;
734 return false;
735}
736
737// none_of
738
739template <class _InputIterator, class _Predicate>
740inline _LIBCPP_INLINE_VISIBILITY
741bool
742none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
743{
744 for (; __first != __last; ++__first)
745 if (__pred(*__first))
746 return false;
747 return true;
748}
749
750// for_each
751
752template <class _InputIterator, class _Function>
753inline _LIBCPP_INLINE_VISIBILITY
754_Function
755for_each(_InputIterator __first, _InputIterator __last, _Function __f)
756{
757 for (; __first != __last; ++__first)
758 __f(*__first);
Howard Hinnant0949eed2011-06-30 21:18:19 +0000759 return _VSTD::move(__f);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000760}
761
762// find
763
764template <class _InputIterator, class _Tp>
765inline _LIBCPP_INLINE_VISIBILITY
766_InputIterator
Howard Hinnant78b68282011-10-22 20:59:45 +0000767find(_InputIterator __first, _InputIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000768{
769 for (; __first != __last; ++__first)
Howard Hinnant78b68282011-10-22 20:59:45 +0000770 if (*__first == __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000771 break;
772 return __first;
773}
774
775// find_if
776
777template <class _InputIterator, class _Predicate>
778inline _LIBCPP_INLINE_VISIBILITY
779_InputIterator
780find_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
781{
782 for (; __first != __last; ++__first)
783 if (__pred(*__first))
784 break;
785 return __first;
786}
787
788// find_if_not
789
790template<class _InputIterator, class _Predicate>
791inline _LIBCPP_INLINE_VISIBILITY
792_InputIterator
793find_if_not(_InputIterator __first, _InputIterator __last, _Predicate __pred)
794{
795 for (; __first != __last; ++__first)
796 if (!__pred(*__first))
797 break;
798 return __first;
799}
800
801// find_end
802
803template <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
804_ForwardIterator1
805__find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
806 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred,
807 forward_iterator_tag, forward_iterator_tag)
808{
809 // modeled after search algorithm
810 _ForwardIterator1 __r = __last1; // __last1 is the "default" answer
811 if (__first2 == __last2)
812 return __r;
813 while (true)
814 {
815 while (true)
816 {
817 if (__first1 == __last1) // if source exhausted return last correct answer
818 return __r; // (or __last1 if never found)
819 if (__pred(*__first1, *__first2))
820 break;
821 ++__first1;
822 }
823 // *__first1 matches *__first2, now match elements after here
824 _ForwardIterator1 __m1 = __first1;
825 _ForwardIterator2 __m2 = __first2;
826 while (true)
827 {
828 if (++__m2 == __last2)
829 { // Pattern exhaused, record answer and search for another one
830 __r = __first1;
831 ++__first1;
832 break;
833 }
834 if (++__m1 == __last1) // Source exhausted, return last answer
835 return __r;
836 if (!__pred(*__m1, *__m2)) // mismatch, restart with a new __first
837 {
838 ++__first1;
839 break;
840 } // else there is a match, check next elements
841 }
842 }
843}
844
845template <class _BinaryPredicate, class _BidirectionalIterator1, class _BidirectionalIterator2>
846_BidirectionalIterator1
847__find_end(_BidirectionalIterator1 __first1, _BidirectionalIterator1 __last1,
848 _BidirectionalIterator2 __first2, _BidirectionalIterator2 __last2, _BinaryPredicate __pred,
849 bidirectional_iterator_tag, bidirectional_iterator_tag)
850{
851 // modeled after search algorithm (in reverse)
852 if (__first2 == __last2)
853 return __last1; // Everything matches an empty sequence
854 _BidirectionalIterator1 __l1 = __last1;
855 _BidirectionalIterator2 __l2 = __last2;
856 --__l2;
857 while (true)
858 {
859 // Find last element in sequence 1 that matchs *(__last2-1), with a mininum of loop checks
860 while (true)
861 {
862 if (__first1 == __l1) // return __last1 if no element matches *__first2
863 return __last1;
864 if (__pred(*--__l1, *__l2))
865 break;
866 }
867 // *__l1 matches *__l2, now match elements before here
868 _BidirectionalIterator1 __m1 = __l1;
869 _BidirectionalIterator2 __m2 = __l2;
870 while (true)
871 {
872 if (__m2 == __first2) // If pattern exhausted, __m1 is the answer (works for 1 element pattern)
873 return __m1;
874 if (__m1 == __first1) // Otherwise if source exhaused, pattern not found
875 return __last1;
876 if (!__pred(*--__m1, *--__m2)) // if there is a mismatch, restart with a new __l1
877 {
878 break;
879 } // else there is a match, check next elements
880 }
881 }
882}
883
884template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
885_RandomAccessIterator1
886__find_end(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
887 _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
888 random_access_iterator_tag, random_access_iterator_tag)
889{
890 // Take advantage of knowing source and pattern lengths. Stop short when source is smaller than pattern
891 typename iterator_traits<_RandomAccessIterator2>::difference_type __len2 = __last2 - __first2;
892 if (__len2 == 0)
893 return __last1;
894 typename iterator_traits<_RandomAccessIterator1>::difference_type __len1 = __last1 - __first1;
895 if (__len1 < __len2)
896 return __last1;
897 const _RandomAccessIterator1 __s = __first1 + (__len2 - 1); // End of pattern match can't go before here
898 _RandomAccessIterator1 __l1 = __last1;
899 _RandomAccessIterator2 __l2 = __last2;
900 --__l2;
901 while (true)
902 {
903 while (true)
904 {
905 if (__s == __l1)
906 return __last1;
907 if (__pred(*--__l1, *__l2))
908 break;
909 }
910 _RandomAccessIterator1 __m1 = __l1;
911 _RandomAccessIterator2 __m2 = __l2;
912 while (true)
913 {
914 if (__m2 == __first2)
915 return __m1;
916 // no need to check range on __m1 because __s guarantees we have enough source
917 if (!__pred(*--__m1, *--__m2))
918 {
919 break;
920 }
921 }
922 }
923}
924
925template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
926inline _LIBCPP_INLINE_VISIBILITY
927_ForwardIterator1
928find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
929 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
930{
Howard Hinnant0949eed2011-06-30 21:18:19 +0000931 return _VSTD::__find_end<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000932 (__first1, __last1, __first2, __last2, __pred,
933 typename iterator_traits<_ForwardIterator1>::iterator_category(),
934 typename iterator_traits<_ForwardIterator2>::iterator_category());
935}
936
937template <class _ForwardIterator1, class _ForwardIterator2>
938inline _LIBCPP_INLINE_VISIBILITY
939_ForwardIterator1
940find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
941 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
942{
943 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
944 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnant0949eed2011-06-30 21:18:19 +0000945 return _VSTD::find_end(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000946}
947
948// find_first_of
949
950template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
951_ForwardIterator1
952find_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
953 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
954{
955 for (; __first1 != __last1; ++__first1)
956 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
957 if (__pred(*__first1, *__j))
958 return __first1;
959 return __last1;
960}
961
962template <class _ForwardIterator1, class _ForwardIterator2>
963inline _LIBCPP_INLINE_VISIBILITY
964_ForwardIterator1
965find_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
966 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
967{
968 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
969 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnant0949eed2011-06-30 21:18:19 +0000970 return _VSTD::find_first_of(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000971}
972
973// adjacent_find
974
975template <class _ForwardIterator, class _BinaryPredicate>
976inline _LIBCPP_INLINE_VISIBILITY
977_ForwardIterator
978adjacent_find(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred)
979{
980 if (__first != __last)
981 {
982 _ForwardIterator __i = __first;
983 while (++__i != __last)
984 {
985 if (__pred(*__first, *__i))
986 return __first;
987 __first = __i;
988 }
989 }
990 return __last;
991}
992
993template <class _ForwardIterator>
994inline _LIBCPP_INLINE_VISIBILITY
995_ForwardIterator
996adjacent_find(_ForwardIterator __first, _ForwardIterator __last)
997{
998 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Howard Hinnant0949eed2011-06-30 21:18:19 +0000999 return _VSTD::adjacent_find(__first, __last, __equal_to<__v>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001000}
1001
1002// count
1003
1004template <class _InputIterator, class _Tp>
1005inline _LIBCPP_INLINE_VISIBILITY
1006typename iterator_traits<_InputIterator>::difference_type
Howard Hinnant78b68282011-10-22 20:59:45 +00001007count(_InputIterator __first, _InputIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001008{
1009 typename iterator_traits<_InputIterator>::difference_type __r(0);
1010 for (; __first != __last; ++__first)
Howard Hinnant78b68282011-10-22 20:59:45 +00001011 if (*__first == __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001012 ++__r;
1013 return __r;
1014}
1015
1016// count_if
1017
1018template <class _InputIterator, class _Predicate>
1019inline _LIBCPP_INLINE_VISIBILITY
1020typename iterator_traits<_InputIterator>::difference_type
1021count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
1022{
1023 typename iterator_traits<_InputIterator>::difference_type __r(0);
1024 for (; __first != __last; ++__first)
1025 if (__pred(*__first))
1026 ++__r;
1027 return __r;
1028}
1029
1030// mismatch
1031
1032template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
1033inline _LIBCPP_INLINE_VISIBILITY
1034pair<_InputIterator1, _InputIterator2>
1035mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1036 _InputIterator2 __first2, _BinaryPredicate __pred)
1037{
1038 for (; __first1 != __last1; ++__first1, ++__first2)
1039 if (!__pred(*__first1, *__first2))
1040 break;
1041 return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
1042}
1043
1044template <class _InputIterator1, class _InputIterator2>
1045inline _LIBCPP_INLINE_VISIBILITY
1046pair<_InputIterator1, _InputIterator2>
1047mismatch(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2)
1048{
1049 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1050 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001051 return _VSTD::mismatch(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001052}
1053
1054// equal
1055
1056template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
1057inline _LIBCPP_INLINE_VISIBILITY
1058bool
1059equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _BinaryPredicate __pred)
1060{
1061 for (; __first1 != __last1; ++__first1, ++__first2)
1062 if (!__pred(*__first1, *__first2))
1063 return false;
1064 return true;
1065}
1066
1067template <class _InputIterator1, class _InputIterator2>
1068inline _LIBCPP_INLINE_VISIBILITY
1069bool
1070equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2)
1071{
1072 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1073 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001074 return _VSTD::equal(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001075}
1076
1077// is_permutation
1078
1079template<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
1080bool
1081is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1082 _ForwardIterator2 __first2, _BinaryPredicate __pred)
1083{
1084 // shorten sequences as much as possible by lopping of any equal parts
1085 for (; __first1 != __last1; ++__first1, ++__first2)
1086 if (!__pred(*__first1, *__first2))
1087 goto __not_done;
1088 return true;
1089__not_done:
1090 // __first1 != __last1 && *__first1 != *__first2
1091 typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001092 _D1 __l1 = _VSTD::distance(__first1, __last1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001093 if (__l1 == _D1(1))
1094 return false;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001095 _ForwardIterator2 __last2 = _VSTD::next(__first2, __l1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001096 // For each element in [f1, l1) see if there are the same number of
1097 // equal elements in [f2, l2)
1098 for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i)
1099 {
1100 // Have we already counted the number of *__i in [f1, l1)?
1101 for (_ForwardIterator1 __j = __first1; __j != __i; ++__j)
1102 if (__pred(*__j, *__i))
1103 goto __next_iter;
1104 {
1105 // Count number of *__i in [f2, l2)
1106 _D1 __c2 = 0;
1107 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
1108 if (__pred(*__i, *__j))
1109 ++__c2;
1110 if (__c2 == 0)
1111 return false;
1112 // Count number of *__i in [__i, l1) (we can start with 1)
1113 _D1 __c1 = 1;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001114 for (_ForwardIterator1 __j = _VSTD::next(__i); __j != __last1; ++__j)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001115 if (__pred(*__i, *__j))
1116 ++__c1;
1117 if (__c1 != __c2)
1118 return false;
1119 }
1120__next_iter:;
1121 }
1122 return true;
1123}
1124
1125template<class _ForwardIterator1, class _ForwardIterator2>
1126inline _LIBCPP_INLINE_VISIBILITY
1127bool
1128is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1129 _ForwardIterator2 __first2)
1130{
1131 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1132 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001133 return _VSTD::is_permutation(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001134}
1135
1136// search
1137
1138template <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
1139_ForwardIterator1
1140__search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1141 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred,
1142 forward_iterator_tag, forward_iterator_tag)
1143{
1144 if (__first2 == __last2)
1145 return __first1; // Everything matches an empty sequence
1146 while (true)
1147 {
1148 // Find first element in sequence 1 that matchs *__first2, with a mininum of loop checks
1149 while (true)
1150 {
1151 if (__first1 == __last1) // return __last1 if no element matches *__first2
1152 return __last1;
1153 if (__pred(*__first1, *__first2))
1154 break;
1155 ++__first1;
1156 }
1157 // *__first1 matches *__first2, now match elements after here
1158 _ForwardIterator1 __m1 = __first1;
1159 _ForwardIterator2 __m2 = __first2;
1160 while (true)
1161 {
1162 if (++__m2 == __last2) // If pattern exhausted, __first1 is the answer (works for 1 element pattern)
1163 return __first1;
1164 if (++__m1 == __last1) // Otherwise if source exhaused, pattern not found
1165 return __last1;
1166 if (!__pred(*__m1, *__m2)) // if there is a mismatch, restart with a new __first1
1167 {
1168 ++__first1;
1169 break;
1170 } // else there is a match, check next elements
1171 }
1172 }
1173}
1174
1175template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
1176_RandomAccessIterator1
1177__search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
1178 _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
1179 random_access_iterator_tag, random_access_iterator_tag)
1180{
1181 typedef typename std::iterator_traits<_RandomAccessIterator1>::difference_type _D1;
1182 typedef typename std::iterator_traits<_RandomAccessIterator2>::difference_type _D2;
1183 // Take advantage of knowing source and pattern lengths. Stop short when source is smaller than pattern
1184 _D2 __len2 = __last2 - __first2;
1185 if (__len2 == 0)
1186 return __first1;
1187 _D1 __len1 = __last1 - __first1;
1188 if (__len1 < __len2)
1189 return __last1;
1190 const _RandomAccessIterator1 __s = __last1 - (__len2 - 1); // Start of pattern match can't go beyond here
1191 while (true)
1192 {
1193#if !_LIBCPP_UNROLL_LOOPS
1194 while (true)
1195 {
1196 if (__first1 == __s)
1197 return __last1;
1198 if (__pred(*__first1, *__first2))
1199 break;
1200 ++__first1;
1201 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001202#else // !_LIBCPP_UNROLL_LOOPS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001203 for (_D1 __loop_unroll = (__s - __first1) / 4; __loop_unroll > 0; --__loop_unroll)
1204 {
1205 if (__pred(*__first1, *__first2))
1206 goto __phase2;
1207 if (__pred(*++__first1, *__first2))
1208 goto __phase2;
1209 if (__pred(*++__first1, *__first2))
1210 goto __phase2;
1211 if (__pred(*++__first1, *__first2))
1212 goto __phase2;
1213 ++__first1;
1214 }
1215 switch (__s - __first1)
1216 {
1217 case 3:
1218 if (__pred(*__first1, *__first2))
1219 break;
1220 ++__first1;
1221 case 2:
1222 if (__pred(*__first1, *__first2))
1223 break;
1224 ++__first1;
1225 case 1:
1226 if (__pred(*__first1, *__first2))
1227 break;
1228 case 0:
1229 return __last1;
1230 }
1231 __phase2:
Howard Hinnant324bb032010-08-22 00:02:43 +00001232#endif // !_LIBCPP_UNROLL_LOOPS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001233 _RandomAccessIterator1 __m1 = __first1;
1234 _RandomAccessIterator2 __m2 = __first2;
1235#if !_LIBCPP_UNROLL_LOOPS
1236 while (true)
1237 {
1238 if (++__m2 == __last2)
1239 return __first1;
1240 ++__m1; // no need to check range on __m1 because __s guarantees we have enough source
1241 if (!__pred(*__m1, *__m2))
1242 {
1243 ++__first1;
1244 break;
1245 }
1246 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001247#else // !_LIBCPP_UNROLL_LOOPS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001248 ++__m2;
1249 ++__m1;
1250 for (_D2 __loop_unroll = (__last2 - __m2) / 4; __loop_unroll > 0; --__loop_unroll)
1251 {
1252 if (!__pred(*__m1, *__m2))
1253 goto __continue;
1254 if (!__pred(*++__m1, *++__m2))
1255 goto __continue;
1256 if (!__pred(*++__m1, *++__m2))
1257 goto __continue;
1258 if (!__pred(*++__m1, *++__m2))
1259 goto __continue;
1260 ++__m1;
1261 ++__m2;
1262 }
1263 switch (__last2 - __m2)
1264 {
1265 case 3:
1266 if (!__pred(*__m1, *__m2))
1267 break;
1268 ++__m1;
1269 ++__m2;
1270 case 2:
1271 if (!__pred(*__m1, *__m2))
1272 break;
1273 ++__m1;
1274 ++__m2;
1275 case 1:
1276 if (!__pred(*__m1, *__m2))
1277 break;
1278 case 0:
1279 return __first1;
1280 }
1281 __continue:
1282 ++__first1;
Howard Hinnant324bb032010-08-22 00:02:43 +00001283#endif // !_LIBCPP_UNROLL_LOOPS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001284 }
1285}
1286
1287template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
1288inline _LIBCPP_INLINE_VISIBILITY
1289_ForwardIterator1
1290search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1291 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1292{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001293 return _VSTD::__search<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001294 (__first1, __last1, __first2, __last2, __pred,
1295 typename std::iterator_traits<_ForwardIterator1>::iterator_category(),
1296 typename std::iterator_traits<_ForwardIterator2>::iterator_category());
1297}
1298
1299template <class _ForwardIterator1, class _ForwardIterator2>
1300inline _LIBCPP_INLINE_VISIBILITY
1301_ForwardIterator1
1302search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1303 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1304{
1305 typedef typename std::iterator_traits<_ForwardIterator1>::value_type __v1;
1306 typedef typename std::iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001307 return _VSTD::search(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001308}
1309
1310// search_n
1311
1312template <class _BinaryPredicate, class _ForwardIterator, class _Size, class _Tp>
1313_ForwardIterator
1314__search_n(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnant78b68282011-10-22 20:59:45 +00001315 _Size __count, const _Tp& __value_, _BinaryPredicate __pred, forward_iterator_tag)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001316{
1317 if (__count <= 0)
1318 return __first;
1319 while (true)
1320 {
Howard Hinnant78b68282011-10-22 20:59:45 +00001321 // Find first element in sequence that matchs __value_, with a mininum of loop checks
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001322 while (true)
1323 {
Howard Hinnant78b68282011-10-22 20:59:45 +00001324 if (__first == __last) // return __last if no element matches __value_
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001325 return __last;
Howard Hinnant78b68282011-10-22 20:59:45 +00001326 if (__pred(*__first, __value_))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001327 break;
1328 ++__first;
1329 }
Howard Hinnant78b68282011-10-22 20:59:45 +00001330 // *__first matches __value_, now match elements after here
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001331 _ForwardIterator __m = __first;
1332 _Size __c(0);
1333 while (true)
1334 {
1335 if (++__c == __count) // If pattern exhausted, __first is the answer (works for 1 element pattern)
1336 return __first;
1337 if (++__m == __last) // Otherwise if source exhaused, pattern not found
1338 return __last;
Howard Hinnant78b68282011-10-22 20:59:45 +00001339 if (!__pred(*__m, __value_)) // if there is a mismatch, restart with a new __first
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001340 {
1341 __first = __m;
1342 ++__first;
1343 break;
1344 } // else there is a match, check next elements
1345 }
1346 }
1347}
1348
1349template <class _BinaryPredicate, class _RandomAccessIterator, class _Size, class _Tp>
1350_RandomAccessIterator
1351__search_n(_RandomAccessIterator __first, _RandomAccessIterator __last,
Howard Hinnant78b68282011-10-22 20:59:45 +00001352 _Size __count, const _Tp& __value_, _BinaryPredicate __pred, random_access_iterator_tag)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001353{
1354 if (__count <= 0)
1355 return __first;
1356 _Size __len = static_cast<_Size>(__last - __first);
1357 if (__len < __count)
1358 return __last;
1359 const _RandomAccessIterator __s = __last - (__count - 1); // Start of pattern match can't go beyond here
1360 while (true)
1361 {
Howard Hinnant78b68282011-10-22 20:59:45 +00001362 // Find first element in sequence that matchs __value_, with a mininum of loop checks
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001363 while (true)
1364 {
Howard Hinnant78b68282011-10-22 20:59:45 +00001365 if (__first == __s) // return __last if no element matches __value_
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001366 return __last;
Howard Hinnant78b68282011-10-22 20:59:45 +00001367 if (__pred(*__first, __value_))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001368 break;
1369 ++__first;
1370 }
Howard Hinnant78b68282011-10-22 20:59:45 +00001371 // *__first matches __value_, now match elements after here
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001372 _RandomAccessIterator __m = __first;
1373 _Size __c(0);
1374 while (true)
1375 {
1376 if (++__c == __count) // If pattern exhausted, __first is the answer (works for 1 element pattern)
1377 return __first;
1378 ++__m; // no need to check range on __m because __s guarantees we have enough source
Howard Hinnant78b68282011-10-22 20:59:45 +00001379 if (!__pred(*__m, __value_)) // if there is a mismatch, restart with a new __first
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001380 {
1381 __first = __m;
1382 ++__first;
1383 break;
1384 } // else there is a match, check next elements
1385 }
1386 }
1387}
1388
1389template <class _ForwardIterator, class _Size, class _Tp, class _BinaryPredicate>
1390inline _LIBCPP_INLINE_VISIBILITY
1391_ForwardIterator
1392search_n(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnant78b68282011-10-22 20:59:45 +00001393 _Size __count, const _Tp& __value_, _BinaryPredicate __pred)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001394{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001395 return _VSTD::__search_n<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnant78b68282011-10-22 20:59:45 +00001396 (__first, __last, __count, __value_, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001397}
1398
1399template <class _ForwardIterator, class _Size, class _Tp>
1400inline _LIBCPP_INLINE_VISIBILITY
1401_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00001402search_n(_ForwardIterator __first, _ForwardIterator __last, _Size __count, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001403{
1404 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Howard Hinnant78b68282011-10-22 20:59:45 +00001405 return _VSTD::search_n(__first, __last, __count, __value_, __equal_to<__v, _Tp>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001406}
1407
1408// copy
1409
1410template <class _Iter>
1411struct __libcpp_is_trivial_iterator
1412{
1413 static const bool value = is_pointer<_Iter>::value;
1414};
1415
1416template <class _Iter>
1417struct __libcpp_is_trivial_iterator<move_iterator<_Iter> >
1418{
1419 static const bool value = is_pointer<_Iter>::value;
1420};
1421
1422template <class _Iter>
1423struct __libcpp_is_trivial_iterator<__wrap_iter<_Iter> >
1424{
1425 static const bool value = is_pointer<_Iter>::value;
1426};
1427
1428template <class _Iter>
1429inline _LIBCPP_INLINE_VISIBILITY
1430_Iter
1431__unwrap_iter(_Iter __i)
1432{
1433 return __i;
1434}
1435
1436template <class _Tp>
1437inline _LIBCPP_INLINE_VISIBILITY
1438typename enable_if
1439<
Howard Hinnant1468b662010-11-19 22:17:28 +00001440 is_trivially_copy_assignable<_Tp>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001441 _Tp*
1442>::type
1443__unwrap_iter(move_iterator<_Tp*> __i)
1444{
1445 return __i.base();
1446}
1447
1448template <class _Tp>
1449inline _LIBCPP_INLINE_VISIBILITY
1450typename enable_if
1451<
Howard Hinnant1468b662010-11-19 22:17:28 +00001452 is_trivially_copy_assignable<_Tp>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001453 _Tp*
1454>::type
1455__unwrap_iter(__wrap_iter<_Tp*> __i)
1456{
1457 return __i.base();
1458}
1459
1460template <class _InputIterator, class _OutputIterator>
1461inline _LIBCPP_INLINE_VISIBILITY
1462_OutputIterator
1463__copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1464{
1465 for (; __first != __last; ++__first, ++__result)
1466 *__result = *__first;
1467 return __result;
1468}
1469
1470template <class _Tp, class _Up>
1471inline _LIBCPP_INLINE_VISIBILITY
1472typename enable_if
1473<
1474 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnant1468b662010-11-19 22:17:28 +00001475 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001476 _Up*
1477>::type
1478__copy(_Tp* __first, _Tp* __last, _Up* __result)
1479{
1480 const size_t __n = static_cast<size_t>(__last - __first);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001481 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001482 return __result + __n;
1483}
1484
1485template <class _InputIterator, class _OutputIterator>
1486inline _LIBCPP_INLINE_VISIBILITY
1487_OutputIterator
1488copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1489{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001490 return _VSTD::__copy(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001491}
1492
1493// copy_backward
1494
1495template <class _InputIterator, class _OutputIterator>
1496inline _LIBCPP_INLINE_VISIBILITY
1497_OutputIterator
1498__copy_backward(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1499{
1500 while (__first != __last)
1501 *--__result = *--__last;
1502 return __result;
1503}
1504
1505template <class _Tp, class _Up>
1506inline _LIBCPP_INLINE_VISIBILITY
1507typename enable_if
1508<
1509 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnant1468b662010-11-19 22:17:28 +00001510 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001511 _Up*
1512>::type
1513__copy_backward(_Tp* __first, _Tp* __last, _Up* __result)
1514{
1515 const size_t __n = static_cast<size_t>(__last - __first);
1516 __result -= __n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001517 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001518 return __result;
1519}
1520
1521template <class _BidirectionalIterator1, class _BidirectionalIterator2>
1522inline _LIBCPP_INLINE_VISIBILITY
1523_BidirectionalIterator2
1524copy_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
1525 _BidirectionalIterator2 __result)
1526{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001527 return _VSTD::__copy_backward(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001528}
1529
1530// copy_if
1531
1532template<class _InputIterator, class _OutputIterator, class _Predicate>
1533inline _LIBCPP_INLINE_VISIBILITY
1534_OutputIterator
1535copy_if(_InputIterator __first, _InputIterator __last,
1536 _OutputIterator __result, _Predicate __pred)
1537{
1538 for (; __first != __last; ++__first)
1539 {
1540 if (__pred(*__first))
1541 {
1542 *__result = *__first;
1543 ++__result;
1544 }
1545 }
1546 return __result;
1547}
1548
1549// copy_n
1550
1551template<class _InputIterator, class _Size, class _OutputIterator>
1552inline _LIBCPP_INLINE_VISIBILITY
1553typename enable_if
1554<
1555 __is_input_iterator<_InputIterator>::value &&
1556 !__is_random_access_iterator<_InputIterator>::value,
1557 _OutputIterator
1558>::type
1559copy_n(_InputIterator __first, _Size __n, _OutputIterator __result)
1560{
Howard Hinnant171869e2011-02-27 20:55:39 +00001561 if (__n > 0)
1562 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001563 *__result = *__first;
Howard Hinnant171869e2011-02-27 20:55:39 +00001564 ++__result;
1565 for (--__n; __n > 0; --__n)
1566 {
1567 ++__first;
1568 *__result = *__first;
1569 ++__result;
1570 }
1571 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001572 return __result;
1573}
1574
1575template<class _InputIterator, class _Size, class _OutputIterator>
1576inline _LIBCPP_INLINE_VISIBILITY
1577typename enable_if
1578<
1579 __is_random_access_iterator<_InputIterator>::value,
1580 _OutputIterator
1581>::type
1582copy_n(_InputIterator __first, _Size __n, _OutputIterator __result)
1583{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001584 return _VSTD::copy(__first, __first + __n, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001585}
1586
1587// move
1588
1589template <class _InputIterator, class _OutputIterator>
1590inline _LIBCPP_INLINE_VISIBILITY
1591_OutputIterator
1592__move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1593{
1594 for (; __first != __last; ++__first, ++__result)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001595 *__result = _VSTD::move(*__first);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001596 return __result;
1597}
1598
1599template <class _Tp, class _Up>
1600inline _LIBCPP_INLINE_VISIBILITY
1601typename enable_if
1602<
1603 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnant1468b662010-11-19 22:17:28 +00001604 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001605 _Up*
1606>::type
1607__move(_Tp* __first, _Tp* __last, _Up* __result)
1608{
1609 const size_t __n = static_cast<size_t>(__last - __first);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001610 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001611 return __result + __n;
1612}
1613
1614template <class _InputIterator, class _OutputIterator>
1615inline _LIBCPP_INLINE_VISIBILITY
1616_OutputIterator
1617move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1618{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001619 return _VSTD::__move(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001620}
1621
1622// move_backward
1623
1624template <class _InputIterator, class _OutputIterator>
1625inline _LIBCPP_INLINE_VISIBILITY
1626_OutputIterator
1627__move_backward(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1628{
1629 while (__first != __last)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001630 *--__result = _VSTD::move(*--__last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001631 return __result;
1632}
1633
1634template <class _Tp, class _Up>
1635inline _LIBCPP_INLINE_VISIBILITY
1636typename enable_if
1637<
1638 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnant1468b662010-11-19 22:17:28 +00001639 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001640 _Up*
1641>::type
1642__move_backward(_Tp* __first, _Tp* __last, _Up* __result)
1643{
1644 const size_t __n = static_cast<size_t>(__last - __first);
1645 __result -= __n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001646 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001647 return __result;
1648}
1649
1650template <class _BidirectionalIterator1, class _BidirectionalIterator2>
1651inline _LIBCPP_INLINE_VISIBILITY
1652_BidirectionalIterator2
1653move_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
1654 _BidirectionalIterator2 __result)
1655{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001656 return _VSTD::__move_backward(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001657}
1658
1659// iter_swap
1660
Howard Hinnante9b2c2d2011-05-27 15:04:19 +00001661// moved to <type_traits> for better swap / noexcept support
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001662
1663// transform
1664
1665template <class _InputIterator, class _OutputIterator, class _UnaryOperation>
1666inline _LIBCPP_INLINE_VISIBILITY
1667_OutputIterator
1668transform(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _UnaryOperation __op)
1669{
1670 for (; __first != __last; ++__first, ++__result)
1671 *__result = __op(*__first);
1672 return __result;
1673}
1674
1675template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _BinaryOperation>
1676inline _LIBCPP_INLINE_VISIBILITY
1677_OutputIterator
1678transform(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2,
1679 _OutputIterator __result, _BinaryOperation __binary_op)
1680{
1681 for (; __first1 != __last1; ++__first1, ++__first2, ++__result)
1682 *__result = __binary_op(*__first1, *__first2);
1683 return __result;
1684}
1685
1686// replace
1687
1688template <class _ForwardIterator, class _Tp>
1689inline _LIBCPP_INLINE_VISIBILITY
1690void
1691replace(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __old_value, const _Tp& __new_value)
1692{
1693 for (; __first != __last; ++__first)
1694 if (*__first == __old_value)
1695 *__first = __new_value;
1696}
1697
1698// replace_if
1699
1700template <class _ForwardIterator, class _Predicate, class _Tp>
1701inline _LIBCPP_INLINE_VISIBILITY
1702void
1703replace_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, const _Tp& __new_value)
1704{
1705 for (; __first != __last; ++__first)
1706 if (__pred(*__first))
1707 *__first = __new_value;
1708}
1709
1710// replace_copy
1711
1712template <class _InputIterator, class _OutputIterator, class _Tp>
1713inline _LIBCPP_INLINE_VISIBILITY
1714_OutputIterator
1715replace_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
1716 const _Tp& __old_value, const _Tp& __new_value)
1717{
1718 for (; __first != __last; ++__first, ++__result)
1719 if (*__first == __old_value)
1720 *__result = __new_value;
1721 else
1722 *__result = *__first;
1723 return __result;
1724}
1725
1726// replace_copy_if
1727
1728template <class _InputIterator, class _OutputIterator, class _Predicate, class _Tp>
1729inline _LIBCPP_INLINE_VISIBILITY
1730_OutputIterator
1731replace_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
1732 _Predicate __pred, const _Tp& __new_value)
1733{
1734 for (; __first != __last; ++__first, ++__result)
1735 if (__pred(*__first))
1736 *__result = __new_value;
1737 else
1738 *__result = *__first;
1739 return __result;
1740}
1741
1742// fill_n
1743
1744template <class _OutputIterator, class _Size, class _Tp>
1745inline _LIBCPP_INLINE_VISIBILITY
1746_OutputIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00001747__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_, false_type)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001748{
1749 for (; __n > 0; ++__first, --__n)
Howard Hinnant78b68282011-10-22 20:59:45 +00001750 *__first = __value_;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001751 return __first;
1752}
1753
1754template <class _OutputIterator, class _Size, class _Tp>
1755inline _LIBCPP_INLINE_VISIBILITY
1756_OutputIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00001757__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_, true_type)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001758{
1759 if (__n > 0)
Howard Hinnant78b68282011-10-22 20:59:45 +00001760 _VSTD::memset(__first, (unsigned char)__value_, (size_t)(__n));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001761 return __first + __n;
1762}
1763
1764template <class _OutputIterator, class _Size, class _Tp>
1765inline _LIBCPP_INLINE_VISIBILITY
1766_OutputIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00001767fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001768{
Howard Hinnant78b68282011-10-22 20:59:45 +00001769 return _VSTD::__fill_n(__first, __n, __value_, integral_constant<bool,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001770 is_pointer<_OutputIterator>::value &&
Howard Hinnant1468b662010-11-19 22:17:28 +00001771 is_trivially_copy_assignable<_Tp>::value &&
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001772 sizeof(_Tp) == 1>());
1773}
1774
1775// fill
1776
1777template <class _ForwardIterator, class _Tp>
1778inline _LIBCPP_INLINE_VISIBILITY
1779void
Howard Hinnant78b68282011-10-22 20:59:45 +00001780__fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, forward_iterator_tag)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001781{
1782 for (; __first != __last; ++__first)
Howard Hinnant78b68282011-10-22 20:59:45 +00001783 *__first = __value_;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001784}
1785
1786template <class _RandomAccessIterator, class _Tp>
1787inline _LIBCPP_INLINE_VISIBILITY
1788void
Howard Hinnant78b68282011-10-22 20:59:45 +00001789__fill(_RandomAccessIterator __first, _RandomAccessIterator __last, const _Tp& __value_, random_access_iterator_tag)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001790{
Howard Hinnant78b68282011-10-22 20:59:45 +00001791 _VSTD::fill_n(__first, __last - __first, __value_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001792}
1793
1794template <class _ForwardIterator, class _Tp>
1795inline _LIBCPP_INLINE_VISIBILITY
1796void
Howard Hinnant78b68282011-10-22 20:59:45 +00001797fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001798{
Howard Hinnant78b68282011-10-22 20:59:45 +00001799 _VSTD::__fill(__first, __last, __value_, typename iterator_traits<_ForwardIterator>::iterator_category());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001800}
1801
1802// generate
1803
1804template <class _ForwardIterator, class _Generator>
1805inline _LIBCPP_INLINE_VISIBILITY
1806void
1807generate(_ForwardIterator __first, _ForwardIterator __last, _Generator __gen)
1808{
1809 for (; __first != __last; ++__first)
1810 *__first = __gen();
1811}
1812
1813// generate_n
1814
1815template <class _OutputIterator, class _Size, class _Generator>
1816inline _LIBCPP_INLINE_VISIBILITY
1817_OutputIterator
1818generate_n(_OutputIterator __first, _Size __n, _Generator __gen)
1819{
1820 for (; __n > 0; ++__first, --__n)
1821 *__first = __gen();
1822 return __first;
1823}
1824
1825// remove
1826
1827template <class _ForwardIterator, class _Tp>
1828_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00001829remove(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001830{
Howard Hinnant78b68282011-10-22 20:59:45 +00001831 __first = _VSTD::find(__first, __last, __value_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001832 if (__first != __last)
1833 {
1834 _ForwardIterator __i = __first;
1835 while (++__i != __last)
1836 {
Howard Hinnant78b68282011-10-22 20:59:45 +00001837 if (!(*__i == __value_))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001838 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00001839 *__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001840 ++__first;
1841 }
1842 }
1843 }
1844 return __first;
1845}
1846
1847// remove_if
1848
1849template <class _ForwardIterator, class _Predicate>
1850_ForwardIterator
1851remove_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
1852{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001853 __first = _VSTD::find_if<_ForwardIterator, typename add_lvalue_reference<_Predicate>::type>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001854 (__first, __last, __pred);
1855 if (__first != __last)
1856 {
1857 _ForwardIterator __i = __first;
1858 while (++__i != __last)
1859 {
1860 if (!__pred(*__i))
1861 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00001862 *__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001863 ++__first;
1864 }
1865 }
1866 }
1867 return __first;
1868}
1869
1870// remove_copy
1871
1872template <class _InputIterator, class _OutputIterator, class _Tp>
1873inline _LIBCPP_INLINE_VISIBILITY
1874_OutputIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00001875remove_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001876{
1877 for (; __first != __last; ++__first)
1878 {
Howard Hinnant78b68282011-10-22 20:59:45 +00001879 if (!(*__first == __value_))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001880 {
1881 *__result = *__first;
1882 ++__result;
1883 }
1884 }
1885 return __result;
1886}
1887
1888// remove_copy_if
1889
1890template <class _InputIterator, class _OutputIterator, class _Predicate>
1891inline _LIBCPP_INLINE_VISIBILITY
1892_OutputIterator
1893remove_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Predicate __pred)
1894{
1895 for (; __first != __last; ++__first)
1896 {
1897 if (!__pred(*__first))
1898 {
1899 *__result = *__first;
1900 ++__result;
1901 }
1902 }
1903 return __result;
1904}
1905
1906// unique
1907
1908template <class _ForwardIterator, class _BinaryPredicate>
1909_ForwardIterator
1910unique(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred)
1911{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001912 __first = _VSTD::adjacent_find<_ForwardIterator, typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001913 (__first, __last, __pred);
1914 if (__first != __last)
1915 {
1916 // ... a a ? ...
1917 // f i
1918 _ForwardIterator __i = __first;
1919 for (++__i; ++__i != __last;)
1920 if (!__pred(*__first, *__i))
Howard Hinnant0949eed2011-06-30 21:18:19 +00001921 *++__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001922 ++__first;
1923 }
1924 return __first;
1925}
1926
1927template <class _ForwardIterator>
1928inline _LIBCPP_INLINE_VISIBILITY
1929_ForwardIterator
1930unique(_ForwardIterator __first, _ForwardIterator __last)
1931{
1932 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001933 return _VSTD::unique(__first, __last, __equal_to<__v>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001934}
1935
1936// unique_copy
1937
1938template <class _BinaryPredicate, class _InputIterator, class _OutputIterator>
1939_OutputIterator
1940__unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred,
1941 input_iterator_tag, output_iterator_tag)
1942{
1943 if (__first != __last)
1944 {
1945 typename iterator_traits<_InputIterator>::value_type __t(*__first);
1946 *__result = __t;
1947 ++__result;
1948 while (++__first != __last)
1949 {
1950 if (!__pred(__t, *__first))
1951 {
1952 __t = *__first;
1953 *__result = __t;
1954 ++__result;
1955 }
1956 }
1957 }
1958 return __result;
1959}
1960
1961template <class _BinaryPredicate, class _ForwardIterator, class _OutputIterator>
1962_OutputIterator
1963__unique_copy(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result, _BinaryPredicate __pred,
1964 forward_iterator_tag, output_iterator_tag)
1965{
1966 if (__first != __last)
1967 {
1968 _ForwardIterator __i = __first;
1969 *__result = *__i;
1970 ++__result;
1971 while (++__first != __last)
1972 {
1973 if (!__pred(*__i, *__first))
1974 {
1975 *__result = *__first;
1976 ++__result;
1977 __i = __first;
1978 }
1979 }
1980 }
1981 return __result;
1982}
1983
1984template <class _BinaryPredicate, class _InputIterator, class _ForwardIterator>
1985_ForwardIterator
1986__unique_copy(_InputIterator __first, _InputIterator __last, _ForwardIterator __result, _BinaryPredicate __pred,
1987 input_iterator_tag, forward_iterator_tag)
1988{
1989 if (__first != __last)
1990 {
1991 *__result = *__first;
1992 while (++__first != __last)
1993 if (!__pred(*__result, *__first))
1994 *++__result = *__first;
1995 ++__result;
1996 }
1997 return __result;
1998}
1999
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002000template <class _InputIterator, class _OutputIterator, class _BinaryPredicate>
2001inline _LIBCPP_INLINE_VISIBILITY
2002_OutputIterator
2003unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred)
2004{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002005 return _VSTD::__unique_copy<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002006 (__first, __last, __result, __pred,
2007 typename iterator_traits<_InputIterator>::iterator_category(),
2008 typename iterator_traits<_OutputIterator>::iterator_category());
2009}
2010
2011template <class _InputIterator, class _OutputIterator>
2012inline _LIBCPP_INLINE_VISIBILITY
2013_OutputIterator
2014unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
2015{
2016 typedef typename iterator_traits<_InputIterator>::value_type __v;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002017 return _VSTD::unique_copy(__first, __last, __result, __equal_to<__v>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002018}
2019
2020// reverse
2021
2022template <class _BidirectionalIterator>
2023inline _LIBCPP_INLINE_VISIBILITY
2024void
2025__reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirectional_iterator_tag)
2026{
2027 while (__first != __last)
2028 {
2029 if (__first == --__last)
2030 break;
2031 swap(*__first, *__last);
2032 ++__first;
2033 }
2034}
2035
2036template <class _RandomAccessIterator>
2037inline _LIBCPP_INLINE_VISIBILITY
2038void
2039__reverse(_RandomAccessIterator __first, _RandomAccessIterator __last, random_access_iterator_tag)
2040{
2041 if (__first != __last)
2042 for (; __first < --__last; ++__first)
2043 swap(*__first, *__last);
2044}
2045
2046template <class _BidirectionalIterator>
2047inline _LIBCPP_INLINE_VISIBILITY
2048void
2049reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
2050{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002051 _VSTD::__reverse(__first, __last, typename iterator_traits<_BidirectionalIterator>::iterator_category());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002052}
2053
2054// reverse_copy
2055
2056template <class _BidirectionalIterator, class _OutputIterator>
2057inline _LIBCPP_INLINE_VISIBILITY
2058_OutputIterator
2059reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last, _OutputIterator __result)
2060{
2061 for (; __first != __last; ++__result)
2062 *__result = *--__last;
2063 return __result;
2064}
2065
2066// rotate
2067
2068template <class _ForwardIterator>
2069_ForwardIterator
2070__rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last, false_type)
2071{
2072 if (__first == __middle)
2073 return __last;
2074 if (__middle == __last)
2075 return __first;
2076 _ForwardIterator __i = __middle;
2077 while (true)
2078 {
2079 swap(*__first, *__i);
2080 ++__first;
2081 if (++__i == __last)
2082 break;
2083 if (__first == __middle)
2084 __middle = __i;
2085 }
2086 _ForwardIterator __r = __first;
2087 if (__first != __middle)
2088 {
2089 __i = __middle;
2090 while (true)
2091 {
2092 swap(*__first, *__i);
2093 ++__first;
2094 if (++__i == __last)
2095 {
2096 if (__first == __middle)
2097 break;
2098 __i = __middle;
2099 }
2100 else if (__first == __middle)
2101 __middle = __i;
2102 }
2103 }
2104 return __r;
2105}
2106
2107template<typename _Integral>
2108inline _LIBCPP_INLINE_VISIBILITY
2109_Integral
2110__gcd(_Integral __x, _Integral __y)
2111{
2112 do
2113 {
2114 _Integral __t = __x % __y;
2115 __x = __y;
2116 __y = __t;
2117 } while (__y);
2118 return __x;
2119}
2120
2121template<typename _RandomAccessIterator>
2122_RandomAccessIterator
2123__rotate(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last, true_type)
2124{
2125 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
2126 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
Howard Hinnant324bb032010-08-22 00:02:43 +00002127
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002128 if (__first == __middle)
2129 return __last;
2130 if (__middle == __last)
2131 return __first;
2132 const difference_type __m1 = __middle - __first;
2133 const difference_type __m2 = __last - __middle;
2134 if (__m1 == __m2)
2135 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002136 _VSTD::swap_ranges(__first, __middle, __middle);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002137 return __middle;
2138 }
2139 const difference_type __g = __gcd(__m1, __m2);
2140 for (_RandomAccessIterator __p = __first + __g; __p != __first;)
2141 {
2142 value_type __t(*--__p);
2143 _RandomAccessIterator __p1 = __p;
2144 _RandomAccessIterator __p2 = __p1 + __m1;
2145 do
2146 {
2147 *__p1 = *__p2;
2148 __p1 = __p2;
2149 const difference_type __d = __last - __p2;
2150 if (__m1 < __d)
2151 __p2 += __m1;
2152 else
2153 __p2 = __first + (__m1 - __d);
2154 } while (__p2 != __p);
2155 *__p1 = __t;
2156 }
2157 return __first + __m2;
2158}
2159
2160template <class _ForwardIterator>
2161inline _LIBCPP_INLINE_VISIBILITY
2162_ForwardIterator
2163rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last)
2164{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002165 return _VSTD::__rotate(__first, __middle, __last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002166 integral_constant
2167 <
2168 bool,
2169 is_convertible
2170 <
2171 typename iterator_traits<_ForwardIterator>::iterator_category,
2172 random_access_iterator_tag
2173 >::value &&
Howard Hinnant1468b662010-11-19 22:17:28 +00002174 is_trivially_copy_assignable
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002175 <
2176 typename iterator_traits<_ForwardIterator>::value_type
2177 >::value
2178 >());
2179}
2180
2181// rotate_copy
2182
2183template <class _ForwardIterator, class _OutputIterator>
2184inline _LIBCPP_INLINE_VISIBILITY
2185_OutputIterator
2186rotate_copy(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last, _OutputIterator __result)
2187{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002188 return _VSTD::copy(__first, __middle, _VSTD::copy(__middle, __last, __result));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002189}
2190
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002191// min_element
2192
2193template <class _ForwardIterator, class _Compare>
2194inline _LIBCPP_INLINE_VISIBILITY
2195_ForwardIterator
2196min_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
2197{
2198 if (__first != __last)
2199 {
2200 _ForwardIterator __i = __first;
2201 while (++__i != __last)
2202 if (__comp(*__i, *__first))
2203 __first = __i;
2204 }
2205 return __first;
2206}
2207
2208template <class _ForwardIterator>
2209inline _LIBCPP_INLINE_VISIBILITY
2210_ForwardIterator
2211min_element(_ForwardIterator __first, _ForwardIterator __last)
2212{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002213 return _VSTD::min_element(__first, __last,
Howard Hinnant98e5d972010-08-21 20:10:01 +00002214 __less<typename iterator_traits<_ForwardIterator>::value_type>());
2215}
2216
2217// min
2218
2219template <class _Tp, class _Compare>
2220inline _LIBCPP_INLINE_VISIBILITY
2221const _Tp&
2222min(const _Tp& __a, const _Tp& __b, _Compare __comp)
2223{
2224 return __comp(__b, __a) ? __b : __a;
2225}
2226
2227template <class _Tp>
2228inline _LIBCPP_INLINE_VISIBILITY
2229const _Tp&
2230min(const _Tp& __a, const _Tp& __b)
2231{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002232 return _VSTD::min(__a, __b, __less<_Tp>());
Howard Hinnant98e5d972010-08-21 20:10:01 +00002233}
2234
Howard Hinnante3e32912011-08-12 21:56:02 +00002235#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2236
Howard Hinnant98e5d972010-08-21 20:10:01 +00002237template<class _Tp, class _Compare>
2238inline _LIBCPP_INLINE_VISIBILITY
2239_Tp
2240min(initializer_list<_Tp> __t, _Compare __comp)
2241{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002242 return *_VSTD::min_element(__t.begin(), __t.end(), __comp);
Howard Hinnant98e5d972010-08-21 20:10:01 +00002243}
2244
2245template<class _Tp>
2246inline _LIBCPP_INLINE_VISIBILITY
2247_Tp
2248min(initializer_list<_Tp> __t)
2249{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002250 return *_VSTD::min_element(__t.begin(), __t.end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002251}
2252
Howard Hinnante3e32912011-08-12 21:56:02 +00002253#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2254
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002255// max_element
2256
2257template <class _ForwardIterator, class _Compare>
2258inline _LIBCPP_INLINE_VISIBILITY
2259_ForwardIterator
2260max_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
2261{
2262 if (__first != __last)
2263 {
2264 _ForwardIterator __i = __first;
2265 while (++__i != __last)
2266 if (__comp(*__first, *__i))
2267 __first = __i;
2268 }
2269 return __first;
2270}
2271
2272template <class _ForwardIterator>
2273inline _LIBCPP_INLINE_VISIBILITY
2274_ForwardIterator
2275max_element(_ForwardIterator __first, _ForwardIterator __last)
2276{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002277 return _VSTD::max_element(__first, __last,
Howard Hinnant98e5d972010-08-21 20:10:01 +00002278 __less<typename iterator_traits<_ForwardIterator>::value_type>());
2279}
2280
2281// max
2282
2283template <class _Tp, class _Compare>
2284inline _LIBCPP_INLINE_VISIBILITY
2285const _Tp&
2286max(const _Tp& __a, const _Tp& __b, _Compare __comp)
2287{
2288 return __comp(__a, __b) ? __b : __a;
2289}
2290
2291template <class _Tp>
2292inline _LIBCPP_INLINE_VISIBILITY
2293const _Tp&
2294max(const _Tp& __a, const _Tp& __b)
2295{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002296 return _VSTD::max(__a, __b, __less<_Tp>());
Howard Hinnant98e5d972010-08-21 20:10:01 +00002297}
2298
Howard Hinnante3e32912011-08-12 21:56:02 +00002299#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2300
Howard Hinnant98e5d972010-08-21 20:10:01 +00002301template<class _Tp, class _Compare>
2302inline _LIBCPP_INLINE_VISIBILITY
2303_Tp
2304max(initializer_list<_Tp> __t, _Compare __comp)
2305{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002306 return *_VSTD::max_element(__t.begin(), __t.end(), __comp);
Howard Hinnant98e5d972010-08-21 20:10:01 +00002307}
2308
2309template<class _Tp>
2310inline _LIBCPP_INLINE_VISIBILITY
2311_Tp
2312max(initializer_list<_Tp> __t)
2313{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002314 return *_VSTD::max_element(__t.begin(), __t.end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002315}
2316
Howard Hinnante3e32912011-08-12 21:56:02 +00002317#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2318
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002319// minmax_element
2320
2321template <class _ForwardIterator, class _Compare>
2322std::pair<_ForwardIterator, _ForwardIterator>
2323minmax_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
2324{
2325 std::pair<_ForwardIterator, _ForwardIterator> __result(__first, __first);
2326 if (__first != __last)
2327 {
2328 if (++__first != __last)
2329 {
2330 if (__comp(*__first, *__result.first))
2331 {
2332 __result.second = __result.first;
2333 __result.first = __first;
2334 }
2335 else
2336 __result.second = __first;
2337 while (++__first != __last)
2338 {
2339 _ForwardIterator __i = __first;
2340 if (++__first == __last)
2341 {
2342 if (__comp(*__i, *__result.first))
2343 __result.first = __i;
2344 else if (!__comp(*__i, *__result.second))
2345 __result.second = __i;
2346 break;
2347 }
2348 else
2349 {
2350 if (__comp(*__first, *__i))
2351 {
2352 if (__comp(*__first, *__result.first))
2353 __result.first = __first;
2354 if (!__comp(*__i, *__result.second))
2355 __result.second = __i;
2356 }
2357 else
2358 {
2359 if (__comp(*__i, *__result.first))
2360 __result.first = __i;
2361 if (!__comp(*__first, *__result.second))
2362 __result.second = __first;
2363 }
2364 }
2365 }
2366 }
2367 }
2368 return __result;
2369}
2370
2371template <class _ForwardIterator>
2372inline _LIBCPP_INLINE_VISIBILITY
2373std::pair<_ForwardIterator, _ForwardIterator>
2374minmax_element(_ForwardIterator __first, _ForwardIterator __last)
2375{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002376 return _VSTD::minmax_element(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002377}
2378
Howard Hinnant98e5d972010-08-21 20:10:01 +00002379// minmax
2380
2381template<class _Tp, class _Compare>
2382inline _LIBCPP_INLINE_VISIBILITY
2383pair<const _Tp&, const _Tp&>
2384minmax(const _Tp& __a, const _Tp& __b, _Compare __comp)
2385{
2386 return __comp(__b, __a) ? pair<const _Tp&, const _Tp&>(__b, __a) :
2387 pair<const _Tp&, const _Tp&>(__a, __b);
2388}
2389
2390template<class _Tp>
2391inline _LIBCPP_INLINE_VISIBILITY
2392pair<const _Tp&, const _Tp&>
2393minmax(const _Tp& __a, const _Tp& __b)
2394{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002395 return _VSTD::minmax(__a, __b, __less<_Tp>());
Howard Hinnant98e5d972010-08-21 20:10:01 +00002396}
2397
Howard Hinnante3e32912011-08-12 21:56:02 +00002398#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2399
Howard Hinnant98e5d972010-08-21 20:10:01 +00002400template<class _Tp>
2401inline _LIBCPP_INLINE_VISIBILITY
2402pair<_Tp, _Tp>
2403minmax(initializer_list<_Tp> __t)
2404{
2405 pair<const _Tp*, const _Tp*> __p =
Howard Hinnant0949eed2011-06-30 21:18:19 +00002406 _VSTD::minmax_element(__t.begin(), __t.end());
Howard Hinnant98e5d972010-08-21 20:10:01 +00002407 return pair<_Tp, _Tp>(*__p.first, *__p.second);
2408}
2409
2410template<class _Tp, class _Compare>
2411inline _LIBCPP_INLINE_VISIBILITY
2412pair<_Tp, _Tp>
2413minmax(initializer_list<_Tp> __t, _Compare __comp)
2414{
2415 pair<const _Tp*, const _Tp*> __p =
Howard Hinnant0949eed2011-06-30 21:18:19 +00002416 _VSTD::minmax_element(__t.begin(), __t.end(), __comp);
Howard Hinnant98e5d972010-08-21 20:10:01 +00002417 return pair<_Tp, _Tp>(*__p.first, *__p.second);
2418}
2419
Howard Hinnante3e32912011-08-12 21:56:02 +00002420#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2421
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002422// random_shuffle
2423
Howard Hinnantc3267212010-05-26 17:49:34 +00002424// __independent_bits_engine
2425
2426template <unsigned long long _X, size_t _R>
2427struct __log2_imp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002428{
Howard Hinnantc3267212010-05-26 17:49:34 +00002429 static const size_t value = _X & ((unsigned long long)(1) << _R) ? _R
2430 : __log2_imp<_X, _R - 1>::value;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002431};
2432
Howard Hinnantc3267212010-05-26 17:49:34 +00002433template <unsigned long long _X>
2434struct __log2_imp<_X, 0>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002435{
Howard Hinnantc3267212010-05-26 17:49:34 +00002436 static const size_t value = 0;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002437};
2438
Howard Hinnantc3267212010-05-26 17:49:34 +00002439template <size_t _R>
2440struct __log2_imp<0, _R>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002441{
Howard Hinnantc3267212010-05-26 17:49:34 +00002442 static const size_t value = _R + 1;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002443};
2444
Howard Hinnantc3267212010-05-26 17:49:34 +00002445template <class _UI, _UI _X>
2446struct __log2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002447{
Howard Hinnantc3267212010-05-26 17:49:34 +00002448 static const size_t value = __log2_imp<_X,
2449 sizeof(_UI) * __CHAR_BIT__ - 1>::value;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002450};
2451
Howard Hinnantc3267212010-05-26 17:49:34 +00002452template<class _Engine, class _UIntType>
2453class __independent_bits_engine
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002454{
Howard Hinnantc3267212010-05-26 17:49:34 +00002455public:
2456 // types
2457 typedef _UIntType result_type;
2458
2459private:
2460 typedef typename _Engine::result_type _Engine_result_type;
2461 typedef typename conditional
2462 <
2463 sizeof(_Engine_result_type) <= sizeof(result_type),
2464 result_type,
2465 _Engine_result_type
2466 >::type _Working_result_type;
2467
2468 _Engine& __e_;
2469 size_t __w_;
2470 size_t __w0_;
2471 size_t __n_;
2472 size_t __n0_;
2473 _Working_result_type __y0_;
2474 _Working_result_type __y1_;
2475 _Engine_result_type __mask0_;
2476 _Engine_result_type __mask1_;
2477
2478 static const _Working_result_type _R = _Engine::_Max - _Engine::_Min
2479 + _Working_result_type(1);
2480 static const size_t __m = __log2<_Working_result_type, _R>::value;
2481 static const size_t _WDt = numeric_limits<_Working_result_type>::digits;
2482 static const size_t _EDt = numeric_limits<_Engine_result_type>::digits;
2483
2484public:
2485 // constructors and seeding functions
2486 __independent_bits_engine(_Engine& __e, size_t __w);
2487
2488 // generating functions
2489 result_type operator()() {return __eval(integral_constant<bool, _R != 0>());}
2490
2491private:
2492 result_type __eval(false_type);
2493 result_type __eval(true_type);
2494};
2495
2496template<class _Engine, class _UIntType>
2497__independent_bits_engine<_Engine, _UIntType>
2498 ::__independent_bits_engine(_Engine& __e, size_t __w)
2499 : __e_(__e),
2500 __w_(__w)
2501{
2502 __n_ = __w_ / __m + (__w_ % __m != 0);
2503 __w0_ = __w_ / __n_;
2504 if (_R == 0)
2505 __y0_ = _R;
2506 else if (__w0_ < _WDt)
2507 __y0_ = (_R >> __w0_) << __w0_;
2508 else
2509 __y0_ = 0;
2510 if (_R - __y0_ > __y0_ / __n_)
2511 {
2512 ++__n_;
2513 __w0_ = __w_ / __n_;
2514 if (__w0_ < _WDt)
2515 __y0_ = (_R >> __w0_) << __w0_;
2516 else
2517 __y0_ = 0;
2518 }
2519 __n0_ = __n_ - __w_ % __n_;
2520 if (__w0_ < _WDt - 1)
2521 __y1_ = (_R >> (__w0_ + 1)) << (__w0_ + 1);
2522 else
2523 __y1_ = 0;
2524 __mask0_ = __w0_ > 0 ? _Engine_result_type(~0) >> (_EDt - __w0_) :
2525 _Engine_result_type(0);
2526 __mask1_ = __w0_ < _EDt - 1 ?
2527 _Engine_result_type(~0) >> (_EDt - (__w0_ + 1)) :
2528 _Engine_result_type(~0);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002529}
2530
Howard Hinnantc3267212010-05-26 17:49:34 +00002531template<class _Engine, class _UIntType>
2532inline
2533_UIntType
2534__independent_bits_engine<_Engine, _UIntType>::__eval(false_type)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002535{
Howard Hinnantc3267212010-05-26 17:49:34 +00002536 return static_cast<result_type>(__e_() & __mask0_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002537}
2538
Howard Hinnantc3267212010-05-26 17:49:34 +00002539template<class _Engine, class _UIntType>
2540_UIntType
2541__independent_bits_engine<_Engine, _UIntType>::__eval(true_type)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002542{
Howard Hinnantc3267212010-05-26 17:49:34 +00002543 result_type _S = 0;
2544 for (size_t __k = 0; __k < __n0_; ++__k)
2545 {
2546 _Engine_result_type __u;
2547 do
2548 {
2549 __u = __e_() - _Engine::min();
2550 } while (__u >= __y0_);
2551 if (__w0_ < _EDt)
2552 _S <<= __w0_;
2553 else
2554 _S = 0;
2555 _S += __u & __mask0_;
2556 }
2557 for (size_t __k = __n0_; __k < __n_; ++__k)
2558 {
2559 _Engine_result_type __u;
2560 do
2561 {
2562 __u = __e_() - _Engine::min();
2563 } while (__u >= __y1_);
2564 if (__w0_ < _EDt - 1)
2565 _S <<= __w0_ + 1;
2566 else
2567 _S = 0;
2568 _S += __u & __mask1_;
2569 }
2570 return _S;
2571}
2572
2573// uniform_int_distribution
2574
2575template<class _IntType = int>
2576class uniform_int_distribution
2577{
2578public:
2579 // types
2580 typedef _IntType result_type;
2581
2582 class param_type
2583 {
2584 result_type __a_;
2585 result_type __b_;
2586 public:
2587 typedef uniform_int_distribution distribution_type;
2588
2589 explicit param_type(result_type __a = 0,
2590 result_type __b = numeric_limits<result_type>::max())
2591 : __a_(__a), __b_(__b) {}
2592
2593 result_type a() const {return __a_;}
2594 result_type b() const {return __b_;}
2595
2596 friend bool operator==(const param_type& __x, const param_type& __y)
2597 {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;}
2598 friend bool operator!=(const param_type& __x, const param_type& __y)
2599 {return !(__x == __y);}
2600 };
2601
2602private:
2603 param_type __p_;
2604
2605public:
2606 // constructors and reset functions
2607 explicit uniform_int_distribution(result_type __a = 0,
2608 result_type __b = numeric_limits<result_type>::max())
2609 : __p_(param_type(__a, __b)) {}
2610 explicit uniform_int_distribution(const param_type& __p) : __p_(__p) {}
2611 void reset() {}
2612
2613 // generating functions
2614 template<class _URNG> result_type operator()(_URNG& __g)
2615 {return (*this)(__g, __p_);}
2616 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
2617
2618 // property functions
2619 result_type a() const {return __p_.a();}
2620 result_type b() const {return __p_.b();}
2621
2622 param_type param() const {return __p_;}
2623 void param(const param_type& __p) {__p_ = __p;}
2624
2625 result_type min() const {return a();}
2626 result_type max() const {return b();}
2627
2628 friend bool operator==(const uniform_int_distribution& __x,
2629 const uniform_int_distribution& __y)
2630 {return __x.__p_ == __y.__p_;}
2631 friend bool operator!=(const uniform_int_distribution& __x,
2632 const uniform_int_distribution& __y)
2633 {return !(__x == __y);}
2634};
2635
2636template<class _IntType>
2637template<class _URNG>
2638typename uniform_int_distribution<_IntType>::result_type
2639uniform_int_distribution<_IntType>::operator()(_URNG& __g, const param_type& __p)
2640{
2641 typedef typename conditional<sizeof(result_type) <= sizeof(uint32_t),
2642 uint32_t, uint64_t>::type _UIntType;
2643 const _UIntType _R = __p.b() - __p.a() + _UIntType(1);
2644 if (_R == 1)
2645 return __p.a();
2646 const size_t _Dt = numeric_limits<_UIntType>::digits;
2647 typedef __independent_bits_engine<_URNG, _UIntType> _Eng;
2648 if (_R == 0)
2649 return static_cast<result_type>(_Eng(__g, _Dt)());
2650 size_t __w = _Dt - __clz(_R) - 1;
2651 if ((_R & (_UIntType(~0) >> (_Dt - __w))) != 0)
2652 ++__w;
2653 _Eng __e(__g, __w);
2654 _UIntType __u;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002655 do
Howard Hinnantc3267212010-05-26 17:49:34 +00002656 {
2657 __u = __e();
2658 } while (__u >= _R);
2659 return static_cast<result_type>(__u + __p.a());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002660}
2661
Howard Hinnantc3267212010-05-26 17:49:34 +00002662class __rs_default;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002663
Howard Hinnantc3267212010-05-26 17:49:34 +00002664__rs_default __rs_get();
2665
2666class __rs_default
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002667{
Howard Hinnantc3267212010-05-26 17:49:34 +00002668 static unsigned __c_;
2669
2670 __rs_default();
2671public:
2672 typedef unsigned result_type;
2673
2674 static const result_type _Min = 0;
2675 static const result_type _Max = 0xFFFFFFFF;
2676
2677 __rs_default(const __rs_default&);
2678 ~__rs_default();
2679
2680 result_type operator()();
2681
2682 static const/*expr*/ result_type min() {return _Min;}
2683 static const/*expr*/ result_type max() {return _Max;}
2684
2685 friend __rs_default __rs_get();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002686};
2687
Howard Hinnantc3267212010-05-26 17:49:34 +00002688__rs_default __rs_get();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002689
2690template <class _RandomAccessIterator>
2691void
2692random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
2693{
2694 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnantc3267212010-05-26 17:49:34 +00002695 typedef uniform_int_distribution<ptrdiff_t> _D;
2696 typedef typename _D::param_type _P;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002697 difference_type __d = __last - __first;
2698 if (__d > 1)
2699 {
Howard Hinnantc3267212010-05-26 17:49:34 +00002700 _D __uid;
2701 __rs_default __g = __rs_get();
2702 for (--__last, --__d; __first < __last; ++__first, --__d)
Howard Hinnant4e599482010-10-22 15:26:39 +00002703 {
2704 difference_type __i = __uid(__g, _P(0, __d));
2705 if (__i != difference_type(0))
2706 swap(*__first, *(__first + __i));
2707 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002708 }
2709}
2710
2711template <class _RandomAccessIterator, class _RandomNumberGenerator>
2712void
2713random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
Howard Hinnant73d21a42010-09-04 23:28:19 +00002714#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002715 _RandomNumberGenerator&& __rand)
2716#else
2717 _RandomNumberGenerator& __rand)
2718#endif
2719{
2720 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
2721 difference_type __d = __last - __first;
2722 if (__d > 1)
2723 {
2724 for (--__last; __first < __last; ++__first, --__d)
Howard Hinnant4e599482010-10-22 15:26:39 +00002725 {
2726 difference_type __i = __rand(__d);
2727 swap(*__first, *(__first + __i));
2728 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002729 }
2730}
2731
Howard Hinnantc3267212010-05-26 17:49:34 +00002732template<class _RandomAccessIterator, class _UniformRandomNumberGenerator>
2733 void shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
Howard Hinnant278bf2d2010-11-18 01:47:02 +00002734#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2735 _UniformRandomNumberGenerator&& __g)
2736#else
Howard Hinnantc3267212010-05-26 17:49:34 +00002737 _UniformRandomNumberGenerator& __g)
Howard Hinnant278bf2d2010-11-18 01:47:02 +00002738#endif
Howard Hinnantc3267212010-05-26 17:49:34 +00002739{
2740 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
2741 typedef uniform_int_distribution<ptrdiff_t> _D;
2742 typedef typename _D::param_type _P;
2743 difference_type __d = __last - __first;
2744 if (__d > 1)
2745 {
2746 _D __uid;
2747 for (--__last, --__d; __first < __last; ++__first, --__d)
Howard Hinnant4e599482010-10-22 15:26:39 +00002748 {
2749 difference_type __i = __uid(__g, _P(0, __d));
2750 if (__i != difference_type(0))
2751 swap(*__first, *(__first + __i));
2752 }
Howard Hinnantc3267212010-05-26 17:49:34 +00002753 }
2754}
2755
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002756template <class _InputIterator, class _Predicate>
2757bool
2758is_partitioned(_InputIterator __first, _InputIterator __last, _Predicate __pred)
2759{
2760 for (; __first != __last; ++__first)
2761 if (!__pred(*__first))
2762 break;
2763 for (; __first != __last; ++__first)
2764 if (__pred(*__first))
2765 return false;
2766 return true;
2767}
2768
2769// partition
2770
2771template <class _Predicate, class _ForwardIterator>
2772_ForwardIterator
2773__partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, forward_iterator_tag)
2774{
2775 while (true)
2776 {
2777 if (__first == __last)
2778 return __first;
2779 if (!__pred(*__first))
2780 break;
2781 ++__first;
2782 }
2783 for (_ForwardIterator __p = __first; ++__p != __last;)
2784 {
2785 if (__pred(*__p))
2786 {
2787 swap(*__first, *__p);
2788 ++__first;
2789 }
2790 }
2791 return __first;
2792}
2793
2794template <class _Predicate, class _BidirectionalIterator>
2795_BidirectionalIterator
2796__partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
2797 bidirectional_iterator_tag)
2798{
2799 while (true)
2800 {
2801 while (true)
2802 {
2803 if (__first == __last)
2804 return __first;
2805 if (!__pred(*__first))
2806 break;
2807 ++__first;
2808 }
2809 do
2810 {
2811 if (__first == --__last)
2812 return __first;
2813 } while (!__pred(*__last));
2814 swap(*__first, *__last);
2815 ++__first;
2816 }
2817}
2818
2819template <class _ForwardIterator, class _Predicate>
2820inline _LIBCPP_INLINE_VISIBILITY
2821_ForwardIterator
2822partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
2823{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002824 return _VSTD::__partition<typename add_lvalue_reference<_Predicate>::type>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002825 (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
2826}
2827
2828// partition_copy
2829
2830template <class _InputIterator, class _OutputIterator1,
2831 class _OutputIterator2, class _Predicate>
2832pair<_OutputIterator1, _OutputIterator2>
2833partition_copy(_InputIterator __first, _InputIterator __last,
2834 _OutputIterator1 __out_true, _OutputIterator2 __out_false,
2835 _Predicate __pred)
2836{
2837 for (; __first != __last; ++__first)
2838 {
2839 if (__pred(*__first))
2840 {
2841 *__out_true = *__first;
2842 ++__out_true;
2843 }
2844 else
2845 {
2846 *__out_false = *__first;
2847 ++__out_false;
2848 }
2849 }
2850 return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false);
2851}
2852
2853// partition_point
2854
2855template<class _ForwardIterator, class _Predicate>
2856_ForwardIterator
2857partition_point(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
2858{
2859 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002860 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002861 while (__len != 0)
2862 {
2863 difference_type __l2 = __len / 2;
2864 _ForwardIterator __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002865 _VSTD::advance(__m, __l2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002866 if (__pred(*__m))
2867 {
2868 __first = ++__m;
2869 __len -= __l2 + 1;
2870 }
2871 else
2872 __len = __l2;
2873 }
2874 return __first;
2875}
2876
2877// stable_partition
2878
2879template <class _Predicate, class _ForwardIterator, class _Distance, class _Pair>
2880_ForwardIterator
2881__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
2882 _Distance __len, _Pair __p, forward_iterator_tag __fit)
2883{
2884 // *__first is known to be false
2885 // __len >= 1
2886 if (__len == 1)
2887 return __first;
2888 if (__len == 2)
2889 {
2890 _ForwardIterator __m = __first;
2891 if (__pred(*++__m))
2892 {
2893 swap(*__first, *__m);
2894 return __m;
2895 }
2896 return __first;
2897 }
2898 if (__len <= __p.second)
2899 { // The buffer is big enough to use
2900 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
2901 __destruct_n __d(0);
2902 unique_ptr<value_type, __destruct_n&> __h(__p.first, __d);
2903 // Move the falses into the temporary buffer, and the trues to the front of the line
2904 // Update __first to always point to the end of the trues
2905 value_type* __t = __p.first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002906 ::new(__t) value_type(_VSTD::move(*__first));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002907 __d.__incr((value_type*)0);
2908 ++__t;
2909 _ForwardIterator __i = __first;
2910 while (++__i != __last)
2911 {
2912 if (__pred(*__i))
2913 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002914 *__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002915 ++__first;
2916 }
2917 else
2918 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002919 ::new(__t) value_type(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002920 __d.__incr((value_type*)0);
2921 ++__t;
2922 }
2923 }
2924 // All trues now at start of range, all falses in buffer
2925 // Move falses back into range, but don't mess up __first which points to first false
2926 __i = __first;
2927 for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i)
Howard Hinnant0949eed2011-06-30 21:18:19 +00002928 *__i = _VSTD::move(*__t2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002929 // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer
2930 return __first;
2931 }
2932 // Else not enough buffer, do in place
2933 // __len >= 3
2934 _ForwardIterator __m = __first;
2935 _Distance __len2 = __len / 2; // __len2 >= 2
Howard Hinnant0949eed2011-06-30 21:18:19 +00002936 _VSTD::advance(__m, __len2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002937 // recurse on [__first, __m), *__first know to be false
2938 // F?????????????????
2939 // f m l
2940 typedef typename add_lvalue_reference<_Predicate>::type _PredRef;
2941 _ForwardIterator __first_false = __stable_partition<_PredRef>(__first, __m, __pred, __len2, __p, __fit);
2942 // TTTFFFFF??????????
2943 // f ff m l
2944 // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true
2945 _ForwardIterator __m1 = __m;
2946 _ForwardIterator __second_false = __last;
2947 _Distance __len_half = __len - __len2;
2948 while (__pred(*__m1))
2949 {
2950 if (++__m1 == __last)
2951 goto __second_half_done;
2952 --__len_half;
2953 }
2954 // TTTFFFFFTTTF??????
2955 // f ff m m1 l
2956 __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __fit);
2957__second_half_done:
2958 // TTTFFFFFTTTTTFFFFF
2959 // f ff m sf l
Howard Hinnant0949eed2011-06-30 21:18:19 +00002960 return _VSTD::rotate(__first_false, __m, __second_false);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002961 // TTTTTTTTFFFFFFFFFF
2962 // |
2963}
2964
2965struct __return_temporary_buffer
2966{
2967 template <class _Tp>
Howard Hinnant0949eed2011-06-30 21:18:19 +00002968 _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) const {_VSTD::return_temporary_buffer(__p);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002969};
2970
2971template <class _Predicate, class _ForwardIterator>
2972_ForwardIterator
2973__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
2974 forward_iterator_tag)
2975{
2976 const unsigned __alloc_limit = 3; // might want to make this a function of trivial assignment
2977 // Either prove all true and return __first or point to first false
2978 while (true)
2979 {
2980 if (__first == __last)
2981 return __first;
2982 if (!__pred(*__first))
2983 break;
2984 ++__first;
2985 }
2986 // We now have a reduced range [__first, __last)
2987 // *__first is known to be false
2988 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
2989 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002990 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002991 pair<value_type*, ptrdiff_t> __p(0, 0);
2992 unique_ptr<value_type, __return_temporary_buffer> __h;
2993 if (__len >= __alloc_limit)
2994 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002995 __p = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002996 __h.reset(__p.first);
2997 }
2998 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
2999 (__first, __last, __pred, __len, __p, forward_iterator_tag());
3000}
3001
3002template <class _Predicate, class _BidirectionalIterator, class _Distance, class _Pair>
3003_BidirectionalIterator
3004__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3005 _Distance __len, _Pair __p, bidirectional_iterator_tag __bit)
3006{
3007 // *__first is known to be false
3008 // *__last is known to be true
3009 // __len >= 2
3010 if (__len == 2)
3011 {
3012 swap(*__first, *__last);
3013 return __last;
3014 }
3015 if (__len == 3)
3016 {
3017 _BidirectionalIterator __m = __first;
3018 if (__pred(*++__m))
3019 {
3020 swap(*__first, *__m);
3021 swap(*__m, *__last);
3022 return __last;
3023 }
3024 swap(*__m, *__last);
3025 swap(*__first, *__m);
3026 return __m;
3027 }
3028 if (__len <= __p.second)
3029 { // The buffer is big enough to use
3030 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3031 __destruct_n __d(0);
3032 unique_ptr<value_type, __destruct_n&> __h(__p.first, __d);
3033 // Move the falses into the temporary buffer, and the trues to the front of the line
3034 // Update __first to always point to the end of the trues
3035 value_type* __t = __p.first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003036 ::new(__t) value_type(_VSTD::move(*__first));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003037 __d.__incr((value_type*)0);
3038 ++__t;
3039 _BidirectionalIterator __i = __first;
3040 while (++__i != __last)
3041 {
3042 if (__pred(*__i))
3043 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003044 *__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003045 ++__first;
3046 }
3047 else
3048 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003049 ::new(__t) value_type(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003050 __d.__incr((value_type*)0);
3051 ++__t;
3052 }
3053 }
3054 // move *__last, known to be true
Howard Hinnant0949eed2011-06-30 21:18:19 +00003055 *__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003056 __i = ++__first;
3057 // All trues now at start of range, all falses in buffer
3058 // Move falses back into range, but don't mess up __first which points to first false
3059 for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i)
Howard Hinnant0949eed2011-06-30 21:18:19 +00003060 *__i = _VSTD::move(*__t2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003061 // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer
3062 return __first;
3063 }
3064 // Else not enough buffer, do in place
3065 // __len >= 4
3066 _BidirectionalIterator __m = __first;
3067 _Distance __len2 = __len / 2; // __len2 >= 2
Howard Hinnant0949eed2011-06-30 21:18:19 +00003068 _VSTD::advance(__m, __len2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003069 // recurse on [__first, __m-1], except reduce __m-1 until *(__m-1) is true, *__first know to be false
3070 // F????????????????T
3071 // f m l
3072 _BidirectionalIterator __m1 = __m;
3073 _BidirectionalIterator __first_false = __first;
3074 _Distance __len_half = __len2;
3075 while (!__pred(*--__m1))
3076 {
3077 if (__m1 == __first)
3078 goto __first_half_done;
3079 --__len_half;
3080 }
3081 // F???TFFF?????????T
3082 // f m1 m l
3083 typedef typename add_lvalue_reference<_Predicate>::type _PredRef;
3084 __first_false = __stable_partition<_PredRef>(__first, __m1, __pred, __len_half, __p, __bit);
3085__first_half_done:
3086 // TTTFFFFF?????????T
3087 // f ff m l
3088 // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true
3089 __m1 = __m;
3090 _BidirectionalIterator __second_false = __last;
3091 ++__second_false;
3092 __len_half = __len - __len2;
3093 while (__pred(*__m1))
3094 {
3095 if (++__m1 == __last)
3096 goto __second_half_done;
3097 --__len_half;
3098 }
3099 // TTTFFFFFTTTF?????T
3100 // f ff m m1 l
3101 __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __bit);
3102__second_half_done:
3103 // TTTFFFFFTTTTTFFFFF
3104 // f ff m sf l
Howard Hinnant0949eed2011-06-30 21:18:19 +00003105 return _VSTD::rotate(__first_false, __m, __second_false);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003106 // TTTTTTTTFFFFFFFFFF
3107 // |
3108}
3109
3110template <class _Predicate, class _BidirectionalIterator>
3111_BidirectionalIterator
3112__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3113 bidirectional_iterator_tag)
3114{
3115 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
3116 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3117 const difference_type __alloc_limit = 4; // might want to make this a function of trivial assignment
3118 // Either prove all true and return __first or point to first false
3119 while (true)
3120 {
3121 if (__first == __last)
3122 return __first;
3123 if (!__pred(*__first))
3124 break;
3125 ++__first;
3126 }
3127 // __first points to first false, everything prior to __first is already set.
3128 // Either prove [__first, __last) is all false and return __first, or point __last to last true
3129 do
3130 {
3131 if (__first == --__last)
3132 return __first;
3133 } while (!__pred(*__last));
3134 // We now have a reduced range [__first, __last]
3135 // *__first is known to be false
3136 // *__last is known to be true
3137 // __len >= 2
Howard Hinnant0949eed2011-06-30 21:18:19 +00003138 difference_type __len = _VSTD::distance(__first, __last) + 1;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003139 pair<value_type*, ptrdiff_t> __p(0, 0);
3140 unique_ptr<value_type, __return_temporary_buffer> __h;
3141 if (__len >= __alloc_limit)
3142 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003143 __p = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003144 __h.reset(__p.first);
3145 }
3146 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
3147 (__first, __last, __pred, __len, __p, bidirectional_iterator_tag());
3148}
3149
3150template <class _ForwardIterator, class _Predicate>
3151inline _LIBCPP_INLINE_VISIBILITY
3152_ForwardIterator
3153stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
3154{
3155 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
3156 (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
3157}
3158
3159// is_sorted_until
3160
3161template <class _ForwardIterator, class _Compare>
3162_ForwardIterator
3163is_sorted_until(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
3164{
3165 if (__first != __last)
3166 {
3167 _ForwardIterator __i = __first;
3168 while (++__i != __last)
3169 {
3170 if (__comp(*__i, *__first))
3171 return __i;
3172 __first = __i;
3173 }
3174 }
3175 return __last;
3176}
3177
Howard Hinnant324bb032010-08-22 00:02:43 +00003178template<class _ForwardIterator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003179inline _LIBCPP_INLINE_VISIBILITY
3180_ForwardIterator
3181is_sorted_until(_ForwardIterator __first, _ForwardIterator __last)
3182{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003183 return _VSTD::is_sorted_until(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003184}
3185
3186// is_sorted
3187
3188template <class _ForwardIterator, class _Compare>
3189inline _LIBCPP_INLINE_VISIBILITY
3190bool
3191is_sorted(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
3192{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003193 return _VSTD::is_sorted_until(__first, __last, __comp) == __last;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003194}
3195
Howard Hinnant324bb032010-08-22 00:02:43 +00003196template<class _ForwardIterator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003197inline _LIBCPP_INLINE_VISIBILITY
3198bool
3199is_sorted(_ForwardIterator __first, _ForwardIterator __last)
3200{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003201 return _VSTD::is_sorted(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003202}
3203
3204// sort
3205
3206// stable, 2-3 compares, 0-2 swaps
3207
3208template <class _Compare, class _ForwardIterator>
3209unsigned
3210__sort3(_ForwardIterator __x, _ForwardIterator __y, _ForwardIterator __z, _Compare __c)
3211{
3212 unsigned __r = 0;
3213 if (!__c(*__y, *__x)) // if x <= y
3214 {
3215 if (!__c(*__z, *__y)) // if y <= z
3216 return __r; // x <= y && y <= z
3217 // x <= y && y > z
3218 swap(*__y, *__z); // x <= z && y < z
3219 __r = 1;
3220 if (__c(*__y, *__x)) // if x > y
3221 {
3222 swap(*__x, *__y); // x < y && y <= z
3223 __r = 2;
3224 }
3225 return __r; // x <= y && y < z
3226 }
3227 if (__c(*__z, *__y)) // x > y, if y > z
3228 {
3229 swap(*__x, *__z); // x < y && y < z
3230 __r = 1;
3231 return __r;
3232 }
3233 swap(*__x, *__y); // x > y && y <= z
3234 __r = 1; // x < y && x <= z
3235 if (__c(*__z, *__y)) // if y > z
3236 {
3237 swap(*__y, *__z); // x <= y && y < z
3238 __r = 2;
3239 }
3240 return __r;
3241} // x <= y && y <= z
3242
3243// stable, 3-6 compares, 0-5 swaps
3244
3245template <class _Compare, class _ForwardIterator>
3246unsigned
3247__sort4(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3,
3248 _ForwardIterator __x4, _Compare __c)
3249{
3250 unsigned __r = __sort3<_Compare>(__x1, __x2, __x3, __c);
3251 if (__c(*__x4, *__x3))
3252 {
3253 swap(*__x3, *__x4);
3254 ++__r;
3255 if (__c(*__x3, *__x2))
3256 {
3257 swap(*__x2, *__x3);
3258 ++__r;
3259 if (__c(*__x2, *__x1))
3260 {
3261 swap(*__x1, *__x2);
3262 ++__r;
3263 }
3264 }
3265 }
3266 return __r;
3267}
3268
3269// stable, 4-10 compares, 0-9 swaps
3270
3271template <class _Compare, class _ForwardIterator>
3272unsigned
3273__sort5(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3,
3274 _ForwardIterator __x4, _ForwardIterator __x5, _Compare __c)
3275{
3276 unsigned __r = __sort4<_Compare>(__x1, __x2, __x3, __x4, __c);
3277 if (__c(*__x5, *__x4))
3278 {
3279 swap(*__x4, *__x5);
3280 ++__r;
3281 if (__c(*__x4, *__x3))
3282 {
3283 swap(*__x3, *__x4);
3284 ++__r;
3285 if (__c(*__x3, *__x2))
3286 {
3287 swap(*__x2, *__x3);
3288 ++__r;
3289 if (__c(*__x2, *__x1))
3290 {
3291 swap(*__x1, *__x2);
3292 ++__r;
3293 }
3294 }
3295 }
3296 }
3297 return __r;
3298}
3299
3300// Assumes size > 0
3301template <class _Compare, class _BirdirectionalIterator>
3302void
3303__selection_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp)
3304{
3305 _BirdirectionalIterator __lm1 = __last;
3306 for (--__lm1; __first != __lm1; ++__first)
3307 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003308 _BirdirectionalIterator __i = _VSTD::min_element<_BirdirectionalIterator,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003309 typename add_lvalue_reference<_Compare>::type>
3310 (__first, __last, __comp);
3311 if (__i != __first)
3312 swap(*__first, *__i);
3313 }
3314}
3315
3316template <class _Compare, class _BirdirectionalIterator>
3317void
3318__insertion_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp)
3319{
3320 typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type;
3321 if (__first != __last)
3322 {
3323 _BirdirectionalIterator __i = __first;
3324 for (++__i; __i != __last; ++__i)
3325 {
3326 _BirdirectionalIterator __j = __i;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003327 value_type __t(_VSTD::move(*__j));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003328 for (_BirdirectionalIterator __k = __i; __k != __first && __comp(__t, *--__k); --__j)
Howard Hinnant0949eed2011-06-30 21:18:19 +00003329 *__j = _VSTD::move(*__k);
3330 *__j = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003331 }
3332 }
3333}
3334
3335template <class _Compare, class _RandomAccessIterator>
3336void
3337__insertion_sort_3(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3338{
3339 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3340 _RandomAccessIterator __j = __first+2;
3341 __sort3<_Compare>(__first, __first+1, __j, __comp);
3342 for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
3343 {
3344 if (__comp(*__i, *__j))
3345 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003346 value_type __t(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003347 _RandomAccessIterator __k = __j;
3348 __j = __i;
3349 do
3350 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003351 *__j = _VSTD::move(*__k);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003352 __j = __k;
3353 } while (__j != __first && __comp(__t, *--__k));
Howard Hinnant0949eed2011-06-30 21:18:19 +00003354 *__j = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003355 }
3356 __j = __i;
3357 }
3358}
3359
3360template <class _Compare, class _RandomAccessIterator>
3361bool
3362__insertion_sort_incomplete(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3363{
3364 switch (__last - __first)
3365 {
3366 case 0:
3367 case 1:
3368 return true;
3369 case 2:
3370 if (__comp(*--__last, *__first))
3371 swap(*__first, *__last);
3372 return true;
3373 case 3:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003374 _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003375 return true;
3376 case 4:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003377 _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003378 return true;
3379 case 5:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003380 _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003381 return true;
3382 }
3383 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3384 _RandomAccessIterator __j = __first+2;
3385 __sort3<_Compare>(__first, __first+1, __j, __comp);
3386 const unsigned __limit = 8;
3387 unsigned __count = 0;
3388 for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
3389 {
3390 if (__comp(*__i, *__j))
3391 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003392 value_type __t(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003393 _RandomAccessIterator __k = __j;
3394 __j = __i;
3395 do
3396 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003397 *__j = _VSTD::move(*__k);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003398 __j = __k;
3399 } while (__j != __first && __comp(__t, *--__k));
Howard Hinnant0949eed2011-06-30 21:18:19 +00003400 *__j = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003401 if (++__count == __limit)
3402 return ++__i == __last;
3403 }
3404 __j = __i;
3405 }
3406 return true;
3407}
3408
3409template <class _Compare, class _BirdirectionalIterator>
3410void
3411__insertion_sort_move(_BirdirectionalIterator __first1, _BirdirectionalIterator __last1,
3412 typename iterator_traits<_BirdirectionalIterator>::value_type* __first2, _Compare __comp)
3413{
3414 typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type;
3415 if (__first1 != __last1)
3416 {
3417 __destruct_n __d(0);
3418 unique_ptr<value_type, __destruct_n&> __h(__first2, __d);
3419 value_type* __last2 = __first2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003420 ::new(__last2) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003421 __d.__incr((value_type*)0);
3422 for (++__last2; ++__first1 != __last1; ++__last2)
3423 {
3424 value_type* __j2 = __last2;
3425 value_type* __i2 = __j2;
3426 if (__comp(*__first1, *--__i2))
3427 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003428 ::new(__j2) value_type(_VSTD::move(*__i2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003429 __d.__incr((value_type*)0);
3430 for (--__j2; __i2 != __first2 && __comp(*__first1, *--__i2); --__j2)
Howard Hinnant0949eed2011-06-30 21:18:19 +00003431 *__j2 = _VSTD::move(*__i2);
3432 *__j2 = _VSTD::move(*__first1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003433 }
3434 else
3435 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003436 ::new(__j2) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003437 __d.__incr((value_type*)0);
3438 }
3439 }
3440 __h.release();
3441 }
3442}
3443
3444template <class _Compare, class _RandomAccessIterator>
3445void
3446__sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3447{
3448 // _Compare is known to be a reference type
3449 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
3450 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
Howard Hinnant1468b662010-11-19 22:17:28 +00003451 const difference_type __limit = is_trivially_copy_constructible<value_type>::value &&
3452 is_trivially_copy_assignable<value_type>::value ? 30 : 6;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003453 while (true)
3454 {
3455 __restart:
3456 difference_type __len = __last - __first;
3457 switch (__len)
3458 {
3459 case 0:
3460 case 1:
3461 return;
3462 case 2:
3463 if (__comp(*--__last, *__first))
3464 swap(*__first, *__last);
3465 return;
3466 case 3:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003467 _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003468 return;
3469 case 4:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003470 _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003471 return;
3472 case 5:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003473 _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003474 return;
3475 }
3476 if (__len <= __limit)
3477 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003478 _VSTD::__insertion_sort_3<_Compare>(__first, __last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003479 return;
3480 }
3481 // __len > 5
3482 _RandomAccessIterator __m = __first;
3483 _RandomAccessIterator __lm1 = __last;
3484 --__lm1;
3485 unsigned __n_swaps;
3486 {
3487 difference_type __delta;
3488 if (__len >= 1000)
3489 {
3490 __delta = __len/2;
3491 __m += __delta;
3492 __delta /= 2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003493 __n_swaps = _VSTD::__sort5<_Compare>(__first, __first + __delta, __m, __m+__delta, __lm1, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003494 }
3495 else
3496 {
3497 __delta = __len/2;
3498 __m += __delta;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003499 __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, __lm1, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003500 }
3501 }
3502 // *__m is median
3503 // partition [__first, __m) < *__m and *__m <= [__m, __last)
3504 // (this inhibits tossing elements equivalent to __m around unnecessarily)
3505 _RandomAccessIterator __i = __first;
3506 _RandomAccessIterator __j = __lm1;
3507 // j points beyond range to be tested, *__m is known to be <= *__lm1
3508 // The search going up is known to be guarded but the search coming down isn't.
3509 // Prime the downward search with a guard.
3510 if (!__comp(*__i, *__m)) // if *__first == *__m
3511 {
3512 // *__first == *__m, *__first doesn't go in first part
3513 // manually guard downward moving __j against __i
3514 while (true)
3515 {
3516 if (__i == --__j)
3517 {
3518 // *__first == *__m, *__m <= all other elements
3519 // Parition instead into [__first, __i) == *__first and *__first < [__i, __last)
3520 ++__i; // __first + 1
3521 __j = __last;
3522 if (!__comp(*__first, *--__j)) // we need a guard if *__first == *(__last-1)
3523 {
3524 while (true)
3525 {
3526 if (__i == __j)
3527 return; // [__first, __last) all equivalent elements
3528 if (__comp(*__first, *__i))
3529 {
3530 swap(*__i, *__j);
3531 ++__n_swaps;
3532 ++__i;
3533 break;
3534 }
3535 ++__i;
3536 }
3537 }
3538 // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1
3539 if (__i == __j)
3540 return;
3541 while (true)
3542 {
3543 while (!__comp(*__first, *__i))
3544 ++__i;
3545 while (__comp(*__first, *--__j))
3546 ;
3547 if (__i >= __j)
3548 break;
3549 swap(*__i, *__j);
3550 ++__n_swaps;
3551 ++__i;
3552 }
3553 // [__first, __i) == *__first and *__first < [__i, __last)
3554 // The first part is sorted, sort the secod part
Howard Hinnant0949eed2011-06-30 21:18:19 +00003555 // _VSTD::__sort<_Compare>(__i, __last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003556 __first = __i;
3557 goto __restart;
3558 }
3559 if (__comp(*__j, *__m))
3560 {
3561 swap(*__i, *__j);
3562 ++__n_swaps;
3563 break; // found guard for downward moving __j, now use unguarded partition
3564 }
3565 }
3566 }
3567 // It is known that *__i < *__m
3568 ++__i;
3569 // j points beyond range to be tested, *__m is known to be <= *__lm1
3570 // if not yet partitioned...
3571 if (__i < __j)
3572 {
3573 // known that *(__i - 1) < *__m
3574 // known that __i <= __m
3575 while (true)
3576 {
3577 // __m still guards upward moving __i
3578 while (__comp(*__i, *__m))
3579 ++__i;
3580 // It is now known that a guard exists for downward moving __j
3581 while (!__comp(*--__j, *__m))
3582 ;
3583 if (__i > __j)
3584 break;
3585 swap(*__i, *__j);
3586 ++__n_swaps;
3587 // It is known that __m != __j
3588 // If __m just moved, follow it
3589 if (__m == __i)
3590 __m = __j;
3591 ++__i;
3592 }
3593 }
3594 // [__first, __i) < *__m and *__m <= [__i, __last)
3595 if (__i != __m && __comp(*__m, *__i))
3596 {
3597 swap(*__i, *__m);
3598 ++__n_swaps;
3599 }
3600 // [__first, __i) < *__i and *__i <= [__i+1, __last)
3601 // If we were given a perfect partition, see if insertion sort is quick...
3602 if (__n_swaps == 0)
3603 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003604 bool __fs = _VSTD::__insertion_sort_incomplete<_Compare>(__first, __i, __comp);
3605 if (_VSTD::__insertion_sort_incomplete<_Compare>(__i+1, __last, __comp))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003606 {
3607 if (__fs)
3608 return;
3609 __last = __i;
3610 continue;
3611 }
3612 else
3613 {
3614 if (__fs)
3615 {
3616 __first = ++__i;
3617 continue;
3618 }
3619 }
3620 }
3621 // sort smaller range with recursive call and larger with tail recursion elimination
3622 if (__i - __first < __last - __i)
3623 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003624 _VSTD::__sort<_Compare>(__first, __i, __comp);
3625 // _VSTD::__sort<_Compare>(__i+1, __last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003626 __first = ++__i;
3627 }
3628 else
3629 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003630 _VSTD::__sort<_Compare>(__i+1, __last, __comp);
3631 // _VSTD::__sort<_Compare>(__first, __i, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003632 __last = __i;
3633 }
3634 }
3635}
3636
3637// This forwarder keeps the top call and the recursive calls using the same instantiation, forcing a reference _Compare
3638template <class _RandomAccessIterator, class _Compare>
3639inline _LIBCPP_INLINE_VISIBILITY
3640void
3641sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3642{
Howard Hinnant7a563db2011-09-14 18:33:51 +00003643#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003644 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3645 __debug_less<_Compare> __c(__comp);
3646 __sort<_Comp_ref>(__first, __last, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00003647#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003648 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3649 __sort<_Comp_ref>(__first, __last, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00003650#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003651}
3652
3653template <class _RandomAccessIterator>
3654inline _LIBCPP_INLINE_VISIBILITY
3655void
3656sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
3657{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003658 _VSTD::sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003659}
3660
3661template <class _Tp>
3662inline _LIBCPP_INLINE_VISIBILITY
3663void
3664sort(_Tp** __first, _Tp** __last)
3665{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003666 _VSTD::sort((size_t*)__first, (size_t*)__last, __less<size_t>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003667}
3668
3669template <class _Tp>
3670inline _LIBCPP_INLINE_VISIBILITY
3671void
3672sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last)
3673{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003674 _VSTD::sort(__first.base(), __last.base());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003675}
3676
Howard Hinnant7a563db2011-09-14 18:33:51 +00003677template <class _Tp, class _Compare>
3678inline _LIBCPP_INLINE_VISIBILITY
3679void
3680sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last, _Compare __comp)
3681{
3682 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3683 _VSTD::sort<_Tp*, _Comp_ref>(__first.base(), __last.base(), __comp);
3684}
3685
Howard Hinnant78b68282011-10-22 20:59:45 +00003686#ifdef _MSC_VER
3687#pragma warning( push )
3688#pragma warning( disable: 4231)
3689#endif // _MSC_VER
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003690extern template void __sort<__less<char>&, char*>(char*, char*, __less<char>&);
3691extern template void __sort<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&);
3692extern template void __sort<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&);
3693extern template void __sort<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&);
3694extern template void __sort<__less<short>&, short*>(short*, short*, __less<short>&);
3695extern template void __sort<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&);
3696extern template void __sort<__less<int>&, int*>(int*, int*, __less<int>&);
3697extern template void __sort<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&);
3698extern template void __sort<__less<long>&, long*>(long*, long*, __less<long>&);
3699extern template void __sort<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&);
3700extern template void __sort<__less<long long>&, long long*>(long long*, long long*, __less<long long>&);
3701extern template void __sort<__less<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned long long>&);
3702extern template void __sort<__less<float>&, float*>(float*, float*, __less<float>&);
3703extern template void __sort<__less<double>&, double*>(double*, double*, __less<double>&);
3704extern template void __sort<__less<long double>&, long double*>(long double*, long double*, __less<long double>&);
3705
3706extern template bool __insertion_sort_incomplete<__less<char>&, char*>(char*, char*, __less<char>&);
3707extern template bool __insertion_sort_incomplete<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&);
3708extern template bool __insertion_sort_incomplete<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&);
3709extern template bool __insertion_sort_incomplete<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&);
3710extern template bool __insertion_sort_incomplete<__less<short>&, short*>(short*, short*, __less<short>&);
3711extern template bool __insertion_sort_incomplete<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&);
3712extern template bool __insertion_sort_incomplete<__less<int>&, int*>(int*, int*, __less<int>&);
3713extern template bool __insertion_sort_incomplete<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&);
3714extern template bool __insertion_sort_incomplete<__less<long>&, long*>(long*, long*, __less<long>&);
3715extern template bool __insertion_sort_incomplete<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&);
3716extern template bool __insertion_sort_incomplete<__less<long long>&, long long*>(long long*, long long*, __less<long long>&);
3717extern template bool __insertion_sort_incomplete<__less<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned long long>&);
3718extern template bool __insertion_sort_incomplete<__less<float>&, float*>(float*, float*, __less<float>&);
3719extern template bool __insertion_sort_incomplete<__less<double>&, double*>(double*, double*, __less<double>&);
3720extern template bool __insertion_sort_incomplete<__less<long double>&, long double*>(long double*, long double*, __less<long double>&);
3721
3722extern template unsigned __sort5<__less<long double>&, long double*>(long double*, long double*, long double*, long double*, long double*, __less<long double>&);
Howard Hinnant78b68282011-10-22 20:59:45 +00003723#ifdef _MSC_VER
3724#pragma warning( pop )
3725#endif _MSC_VER
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003726
3727// lower_bound
3728
3729template <class _Compare, class _ForwardIterator, class _Tp>
3730_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00003731__lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003732{
3733 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003734 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003735 while (__len != 0)
3736 {
3737 difference_type __l2 = __len / 2;
3738 _ForwardIterator __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003739 _VSTD::advance(__m, __l2);
Howard Hinnant78b68282011-10-22 20:59:45 +00003740 if (__comp(*__m, __value_))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003741 {
3742 __first = ++__m;
3743 __len -= __l2 + 1;
3744 }
3745 else
3746 __len = __l2;
3747 }
3748 return __first;
3749}
3750
3751template <class _ForwardIterator, class _Tp, class _Compare>
3752inline _LIBCPP_INLINE_VISIBILITY
3753_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00003754lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003755{
Howard Hinnant7a563db2011-09-14 18:33:51 +00003756#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003757 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3758 __debug_less<_Compare> __c(__comp);
Howard Hinnant78b68282011-10-22 20:59:45 +00003759 return __lower_bound<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00003760#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003761 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnant78b68282011-10-22 20:59:45 +00003762 return __lower_bound<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00003763#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003764}
3765
3766template <class _ForwardIterator, class _Tp>
3767inline _LIBCPP_INLINE_VISIBILITY
3768_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00003769lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003770{
Howard Hinnant78b68282011-10-22 20:59:45 +00003771 return _VSTD::lower_bound(__first, __last, __value_,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003772 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
3773}
3774
3775// upper_bound
3776
3777template <class _Compare, class _ForwardIterator, class _Tp>
3778_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00003779__upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003780{
3781 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003782 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003783 while (__len != 0)
3784 {
3785 difference_type __l2 = __len / 2;
3786 _ForwardIterator __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003787 _VSTD::advance(__m, __l2);
Howard Hinnant78b68282011-10-22 20:59:45 +00003788 if (__comp(__value_, *__m))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003789 __len = __l2;
3790 else
3791 {
3792 __first = ++__m;
3793 __len -= __l2 + 1;
3794 }
3795 }
3796 return __first;
3797}
3798
3799template <class _ForwardIterator, class _Tp, class _Compare>
3800inline _LIBCPP_INLINE_VISIBILITY
3801_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00003802upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003803{
Howard Hinnant7a563db2011-09-14 18:33:51 +00003804#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003805 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3806 __debug_less<_Compare> __c(__comp);
Howard Hinnant78b68282011-10-22 20:59:45 +00003807 return __upper_bound<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00003808#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003809 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnant78b68282011-10-22 20:59:45 +00003810 return __upper_bound<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00003811#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003812}
3813
3814template <class _ForwardIterator, class _Tp>
3815inline _LIBCPP_INLINE_VISIBILITY
3816_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00003817upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003818{
Howard Hinnant78b68282011-10-22 20:59:45 +00003819 return _VSTD::upper_bound(__first, __last, __value_,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003820 __less<_Tp, typename iterator_traits<_ForwardIterator>::value_type>());
3821}
3822
3823// equal_range
3824
3825template <class _Compare, class _ForwardIterator, class _Tp>
3826pair<_ForwardIterator, _ForwardIterator>
Howard Hinnant78b68282011-10-22 20:59:45 +00003827__equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003828{
3829 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003830 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003831 while (__len != 0)
3832 {
3833 difference_type __l2 = __len / 2;
3834 _ForwardIterator __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003835 _VSTD::advance(__m, __l2);
Howard Hinnant78b68282011-10-22 20:59:45 +00003836 if (__comp(*__m, __value_))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003837 {
3838 __first = ++__m;
3839 __len -= __l2 + 1;
3840 }
Howard Hinnant78b68282011-10-22 20:59:45 +00003841 else if (__comp(__value_, *__m))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003842 {
3843 __last = __m;
3844 __len = __l2;
3845 }
3846 else
3847 {
3848 _ForwardIterator __mp1 = __m;
3849 return pair<_ForwardIterator, _ForwardIterator>
3850 (
Howard Hinnant78b68282011-10-22 20:59:45 +00003851 __lower_bound<_Compare>(__first, __m, __value_, __comp),
3852 __upper_bound<_Compare>(++__mp1, __last, __value_, __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003853 );
3854 }
3855 }
3856 return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
3857}
3858
3859template <class _ForwardIterator, class _Tp, class _Compare>
3860inline _LIBCPP_INLINE_VISIBILITY
3861pair<_ForwardIterator, _ForwardIterator>
Howard Hinnant78b68282011-10-22 20:59:45 +00003862equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003863{
Howard Hinnant7a563db2011-09-14 18:33:51 +00003864#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003865 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3866 __debug_less<_Compare> __c(__comp);
Howard Hinnant78b68282011-10-22 20:59:45 +00003867 return __equal_range<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00003868#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003869 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnant78b68282011-10-22 20:59:45 +00003870 return __equal_range<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00003871#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003872}
3873
3874template <class _ForwardIterator, class _Tp>
3875inline _LIBCPP_INLINE_VISIBILITY
3876pair<_ForwardIterator, _ForwardIterator>
Howard Hinnant78b68282011-10-22 20:59:45 +00003877equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003878{
Howard Hinnant78b68282011-10-22 20:59:45 +00003879 return _VSTD::equal_range(__first, __last, __value_,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003880 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
3881}
3882
3883// binary_search
3884
3885template <class _Compare, class _ForwardIterator, class _Tp>
3886inline _LIBCPP_INLINE_VISIBILITY
3887bool
Howard Hinnant78b68282011-10-22 20:59:45 +00003888__binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003889{
Howard Hinnant78b68282011-10-22 20:59:45 +00003890 __first = __lower_bound<_Compare>(__first, __last, __value_, __comp);
3891 return __first != __last && !__comp(__value_, *__first);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003892}
3893
3894template <class _ForwardIterator, class _Tp, class _Compare>
3895inline _LIBCPP_INLINE_VISIBILITY
3896bool
Howard Hinnant78b68282011-10-22 20:59:45 +00003897binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003898{
Howard Hinnant7a563db2011-09-14 18:33:51 +00003899#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003900 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3901 __debug_less<_Compare> __c(__comp);
Howard Hinnant78b68282011-10-22 20:59:45 +00003902 return __binary_search<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00003903#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003904 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnant78b68282011-10-22 20:59:45 +00003905 return __binary_search<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00003906#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003907}
3908
3909template <class _ForwardIterator, class _Tp>
3910inline _LIBCPP_INLINE_VISIBILITY
3911bool
Howard Hinnant78b68282011-10-22 20:59:45 +00003912binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003913{
Howard Hinnant78b68282011-10-22 20:59:45 +00003914 return _VSTD::binary_search(__first, __last, __value_,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003915 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
3916}
3917
3918// merge
3919
3920template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
3921_OutputIterator
3922__merge(_InputIterator1 __first1, _InputIterator1 __last1,
3923 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
3924{
3925 for (; __first1 != __last1; ++__result)
3926 {
3927 if (__first2 == __last2)
Howard Hinnant0949eed2011-06-30 21:18:19 +00003928 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003929 if (__comp(*__first2, *__first1))
3930 {
3931 *__result = *__first2;
3932 ++__first2;
3933 }
3934 else
3935 {
3936 *__result = *__first1;
3937 ++__first1;
3938 }
3939 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00003940 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003941}
3942
3943template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
3944inline _LIBCPP_INLINE_VISIBILITY
3945_OutputIterator
3946merge(_InputIterator1 __first1, _InputIterator1 __last1,
3947 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
3948{
Howard Hinnant7a563db2011-09-14 18:33:51 +00003949#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003950 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3951 __debug_less<_Compare> __c(__comp);
Howard Hinnant0949eed2011-06-30 21:18:19 +00003952 return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00003953#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003954 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003955 return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00003956#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003957}
3958
3959template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
3960inline _LIBCPP_INLINE_VISIBILITY
3961_OutputIterator
3962merge(_InputIterator1 __first1, _InputIterator1 __last1,
3963 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
3964{
3965 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
3966 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
3967 return merge(__first1, __last1, __first2, __last2, __result, __less<__v1, __v2>());
3968}
3969
3970// inplace_merge
3971
3972template <class _Compare, class _BidirectionalIterator>
3973void
3974__buffered_inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
3975 _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1,
3976 typename iterator_traits<_BidirectionalIterator>::difference_type __len2,
3977 typename iterator_traits<_BidirectionalIterator>::value_type* __buff)
3978{
3979 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3980 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
3981 typedef typename iterator_traits<_BidirectionalIterator>::pointer pointer;
3982 __destruct_n __d(0);
3983 unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
3984 if (__len1 <= __len2)
3985 {
3986 value_type* __p = __buff;
3987 for (_BidirectionalIterator __i = __first; __i != __middle; __d.__incr((value_type*)0), ++__i, ++__p)
Howard Hinnant0949eed2011-06-30 21:18:19 +00003988 ::new(__p) value_type(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003989 __merge<_Compare>(move_iterator<value_type*>(__buff),
3990 move_iterator<value_type*>(__p),
3991 move_iterator<_BidirectionalIterator>(__middle),
3992 move_iterator<_BidirectionalIterator>(__last),
3993 __first, __comp);
3994 }
3995 else
3996 {
3997 value_type* __p = __buff;
3998 for (_BidirectionalIterator __i = __middle; __i != __last; __d.__incr((value_type*)0), ++__i, ++__p)
Howard Hinnant0949eed2011-06-30 21:18:19 +00003999 ::new(__p) value_type(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004000 typedef reverse_iterator<_BidirectionalIterator> _RBi;
4001 typedef reverse_iterator<value_type*> _Rv;
4002 __merge(move_iterator<_RBi>(_RBi(__middle)), move_iterator<_RBi>(_RBi(__first)),
4003 move_iterator<_Rv>(_Rv(__p)), move_iterator<_Rv>(_Rv(__buff)),
4004 _RBi(__last), __negate<_Compare>(__comp));
4005 }
4006}
4007
4008template <class _Compare, class _BidirectionalIterator>
4009void
4010__inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4011 _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1,
4012 typename iterator_traits<_BidirectionalIterator>::difference_type __len2,
4013 typename iterator_traits<_BidirectionalIterator>::value_type* __buff, ptrdiff_t __buff_size)
4014{
4015 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
4016 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
4017 while (true)
4018 {
4019 // if __middle == __last, we're done
4020 if (__len2 == 0)
4021 return;
4022 // shrink [__first, __middle) as much as possible (with no moves), returning if it shrinks to 0
4023 for (; true; ++__first, --__len1)
4024 {
4025 if (__len1 == 0)
4026 return;
4027 if (__comp(*__middle, *__first))
4028 break;
4029 }
4030 if (__len1 <= __buff_size || __len2 <= __buff_size)
4031 {
4032 __buffered_inplace_merge<_Compare>(__first, __middle, __last, __comp, __len1, __len2, __buff);
4033 return;
4034 }
4035 // __first < __middle < __last
4036 // *__first > *__middle
4037 // partition [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last) such that
4038 // all elements in:
4039 // [__first, __m1) <= [__middle, __m2)
4040 // [__middle, __m2) < [__m1, __middle)
4041 // [__m1, __middle) <= [__m2, __last)
4042 // and __m1 or __m2 is in the middle of its range
4043 _BidirectionalIterator __m1; // "median" of [__first, __middle)
4044 _BidirectionalIterator __m2; // "median" of [__middle, __last)
4045 difference_type __len11; // distance(__first, __m1)
4046 difference_type __len21; // distance(__middle, __m2)
4047 // binary search smaller range
4048 if (__len1 < __len2)
4049 { // __len >= 1, __len2 >= 2
4050 __len21 = __len2 / 2;
4051 __m2 = __middle;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004052 _VSTD::advance(__m2, __len21);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004053 __m1 = __upper_bound<_Compare>(__first, __middle, *__m2, __comp);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004054 __len11 = _VSTD::distance(__first, __m1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004055 }
4056 else
4057 {
4058 if (__len1 == 1)
4059 { // __len1 >= __len2 && __len2 > 0, therefore __len2 == 1
4060 // It is known *__first > *__middle
4061 swap(*__first, *__middle);
4062 return;
4063 }
4064 // __len1 >= 2, __len2 >= 1
4065 __len11 = __len1 / 2;
4066 __m1 = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004067 _VSTD::advance(__m1, __len11);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004068 __m2 = __lower_bound<_Compare>(__middle, __last, *__m1, __comp);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004069 __len21 = _VSTD::distance(__middle, __m2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004070 }
4071 difference_type __len12 = __len1 - __len11; // distance(__m1, __middle)
4072 difference_type __len22 = __len2 - __len21; // distance(__m2, __last)
4073 // [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last)
4074 // swap middle two partitions
Howard Hinnant0949eed2011-06-30 21:18:19 +00004075 __middle = _VSTD::rotate(__m1, __middle, __m2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004076 // __len12 and __len21 now have swapped meanings
4077 // merge smaller range with recurisve call and larger with tail recursion elimination
4078 if (__len11 + __len21 < __len12 + __len22)
4079 {
4080 __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size);
4081// __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size);
4082 __first = __middle;
4083 __middle = __m2;
4084 __len1 = __len12;
4085 __len2 = __len22;
4086 }
4087 else
4088 {
4089 __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size);
4090// __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size);
4091 __last = __middle;
4092 __middle = __m1;
4093 __len1 = __len11;
4094 __len2 = __len21;
4095 }
4096 }
4097}
4098
4099template <class _Tp>
4100struct __inplace_merge_switch
4101{
Howard Hinnant1468b662010-11-19 22:17:28 +00004102 static const unsigned value = is_trivially_copy_assignable<_Tp>::value;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004103};
4104
4105template <class _BidirectionalIterator, class _Compare>
4106inline _LIBCPP_INLINE_VISIBILITY
4107void
4108inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4109 _Compare __comp)
4110{
4111 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
4112 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004113 difference_type __len1 = _VSTD::distance(__first, __middle);
4114 difference_type __len2 = _VSTD::distance(__middle, __last);
4115 difference_type __buf_size = _VSTD::min(__len1, __len2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004116 pair<value_type*, ptrdiff_t> __buf(0, 0);
4117 unique_ptr<value_type, __return_temporary_buffer> __h;
4118 if (__inplace_merge_switch<value_type>::value && __buf_size > 8)
4119 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004120 __buf = _VSTD::get_temporary_buffer<value_type>(__buf_size);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004121 __h.reset(__buf.first);
4122 }
Howard Hinnant7a563db2011-09-14 18:33:51 +00004123#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004124 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4125 __debug_less<_Compare> __c(__comp);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004126 return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __c, __len1, __len2,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004127 __buf.first, __buf.second);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004128#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004129 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004130 return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __comp, __len1, __len2,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004131 __buf.first, __buf.second);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004132#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004133}
4134
4135template <class _BidirectionalIterator>
4136inline _LIBCPP_INLINE_VISIBILITY
4137void
4138inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last)
4139{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004140 _VSTD::inplace_merge(__first, __middle, __last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004141 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
4142}
4143
4144// stable_sort
4145
4146template <class _Compare, class _InputIterator1, class _InputIterator2>
4147void
4148__merge_move_construct(_InputIterator1 __first1, _InputIterator1 __last1,
4149 _InputIterator2 __first2, _InputIterator2 __last2,
4150 typename iterator_traits<_InputIterator1>::value_type* __result, _Compare __comp)
4151{
4152 typedef typename iterator_traits<_InputIterator1>::value_type value_type;
4153 __destruct_n __d(0);
4154 unique_ptr<value_type, __destruct_n&> __h(__result, __d);
4155 for (; true; ++__result)
4156 {
4157 if (__first1 == __last1)
4158 {
4159 for (; __first2 != __last2; ++__first2, ++__result, __d.__incr((value_type*)0))
Howard Hinnant0949eed2011-06-30 21:18:19 +00004160 ::new (__result) value_type(_VSTD::move(*__first2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004161 __h.release();
4162 return;
4163 }
4164 if (__first2 == __last2)
4165 {
4166 for (; __first1 != __last1; ++__first1, ++__result, __d.__incr((value_type*)0))
Howard Hinnant0949eed2011-06-30 21:18:19 +00004167 ::new (__result) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004168 __h.release();
4169 return;
4170 }
4171 if (__comp(*__first2, *__first1))
4172 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004173 ::new (__result) value_type(_VSTD::move(*__first2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004174 __d.__incr((value_type*)0);
4175 ++__first2;
4176 }
4177 else
4178 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004179 ::new (__result) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004180 __d.__incr((value_type*)0);
4181 ++__first1;
4182 }
4183 }
4184}
4185
4186template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4187void
4188__merge_move_assign(_InputIterator1 __first1, _InputIterator1 __last1,
4189 _InputIterator2 __first2, _InputIterator2 __last2,
4190 _OutputIterator __result, _Compare __comp)
4191{
4192 for (; __first1 != __last1; ++__result)
4193 {
4194 if (__first2 == __last2)
4195 {
4196 for (; __first1 != __last1; ++__first1, ++__result)
Howard Hinnant0949eed2011-06-30 21:18:19 +00004197 *__result = _VSTD::move(*__first1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004198 return;
4199 }
4200 if (__comp(*__first2, *__first1))
4201 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004202 *__result = _VSTD::move(*__first2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004203 ++__first2;
4204 }
4205 else
4206 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004207 *__result = _VSTD::move(*__first1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004208 ++__first1;
4209 }
4210 }
4211 for (; __first2 != __last2; ++__first2, ++__result)
Howard Hinnant0949eed2011-06-30 21:18:19 +00004212 *__result = _VSTD::move(*__first2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004213}
4214
4215template <class _Compare, class _RandomAccessIterator>
4216void
4217__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4218 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4219 typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size);
4220
4221template <class _Compare, class _RandomAccessIterator>
4222void
4223__stable_sort_move(_RandomAccessIterator __first1, _RandomAccessIterator __last1, _Compare __comp,
4224 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4225 typename iterator_traits<_RandomAccessIterator>::value_type* __first2)
4226{
4227 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4228 switch (__len)
4229 {
4230 case 0:
4231 return;
4232 case 1:
Howard Hinnant0949eed2011-06-30 21:18:19 +00004233 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004234 return;
4235 case 2:
4236 __destruct_n __d(0);
4237 unique_ptr<value_type, __destruct_n&> __h2(__first2, __d);
4238 if (__comp(*--__last1, *__first1))
4239 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004240 ::new(__first2) value_type(_VSTD::move(*__last1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004241 __d.__incr((value_type*)0);
4242 ++__first2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004243 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004244 }
4245 else
4246 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004247 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004248 __d.__incr((value_type*)0);
4249 ++__first2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004250 ::new(__first2) value_type(_VSTD::move(*__last1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004251 }
4252 __h2.release();
4253 return;
4254 }
4255 if (__len <= 8)
4256 {
4257 __insertion_sort_move<_Compare>(__first1, __last1, __first2, __comp);
4258 return;
4259 }
4260 typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2;
4261 _RandomAccessIterator __m = __first1 + __l2;
4262 __stable_sort<_Compare>(__first1, __m, __comp, __l2, __first2, __l2);
4263 __stable_sort<_Compare>(__m, __last1, __comp, __len - __l2, __first2 + __l2, __len - __l2);
4264 __merge_move_construct<_Compare>(__first1, __m, __m, __last1, __first2, __comp);
4265}
4266
4267template <class _Tp>
4268struct __stable_sort_switch
4269{
Howard Hinnant1468b662010-11-19 22:17:28 +00004270 static const unsigned value = 128*is_trivially_copy_assignable<_Tp>::value;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004271};
4272
4273template <class _Compare, class _RandomAccessIterator>
4274void
4275__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4276 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4277 typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size)
4278{
4279 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4280 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4281 switch (__len)
4282 {
4283 case 0:
4284 case 1:
4285 return;
4286 case 2:
4287 if (__comp(*--__last, *__first))
4288 swap(*__first, *__last);
4289 return;
4290 }
4291 if (__len <= static_cast<difference_type>(__stable_sort_switch<value_type>::value))
4292 {
4293 __insertion_sort<_Compare>(__first, __last, __comp);
4294 return;
4295 }
4296 typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2;
4297 _RandomAccessIterator __m = __first + __l2;
4298 if (__len <= __buff_size)
4299 {
4300 __destruct_n __d(0);
4301 unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
4302 __stable_sort_move<_Compare>(__first, __m, __comp, __l2, __buff);
4303 __d.__set(__l2, (value_type*)0);
4304 __stable_sort_move<_Compare>(__m, __last, __comp, __len - __l2, __buff + __l2);
4305 __d.__set(__len, (value_type*)0);
4306 __merge_move_assign<_Compare>(__buff, __buff + __l2, __buff + __l2, __buff + __len, __first, __comp);
4307// __merge<_Compare>(move_iterator<value_type*>(__buff),
4308// move_iterator<value_type*>(__buff + __l2),
4309// move_iterator<_RandomAccessIterator>(__buff + __l2),
4310// move_iterator<_RandomAccessIterator>(__buff + __len),
4311// __first, __comp);
4312 return;
4313 }
4314 __stable_sort<_Compare>(__first, __m, __comp, __l2, __buff, __buff_size);
4315 __stable_sort<_Compare>(__m, __last, __comp, __len - __l2, __buff, __buff_size);
4316 __inplace_merge<_Compare>(__first, __m, __last, __comp, __l2, __len - __l2, __buff, __buff_size);
4317}
4318
4319template <class _RandomAccessIterator, class _Compare>
4320inline _LIBCPP_INLINE_VISIBILITY
4321void
4322stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4323{
4324 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4325 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4326 difference_type __len = __last - __first;
4327 pair<value_type*, ptrdiff_t> __buf(0, 0);
4328 unique_ptr<value_type, __return_temporary_buffer> __h;
4329 if (__len > static_cast<difference_type>(__stable_sort_switch<value_type>::value))
4330 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004331 __buf = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004332 __h.reset(__buf.first);
4333 }
Howard Hinnant7a563db2011-09-14 18:33:51 +00004334#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004335 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4336 __debug_less<_Compare> __c(__comp);
4337 __stable_sort<_Comp_ref>(__first, __last, __c, __len, __buf.first, __buf.second);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004338#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004339 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4340 __stable_sort<_Comp_ref>(__first, __last, __comp, __len, __buf.first, __buf.second);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004341#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004342}
4343
4344template <class _RandomAccessIterator>
4345inline _LIBCPP_INLINE_VISIBILITY
4346void
4347stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
4348{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004349 _VSTD::stable_sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004350}
4351
4352// is_heap_until
4353
4354template <class _RandomAccessIterator, class _Compare>
4355_RandomAccessIterator
4356is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4357{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004358 typedef typename _VSTD::iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004359 difference_type __len = __last - __first;
4360 difference_type __p = 0;
4361 difference_type __c = 1;
4362 _RandomAccessIterator __pp = __first;
4363 while (__c < __len)
4364 {
4365 _RandomAccessIterator __cp = __first + __c;
4366 if (__comp(*__pp, *__cp))
4367 return __cp;
4368 ++__c;
4369 ++__cp;
4370 if (__c == __len)
4371 return __last;
4372 if (__comp(*__pp, *__cp))
4373 return __cp;
4374 ++__p;
4375 ++__pp;
4376 __c = 2 * __p + 1;
4377 }
4378 return __last;
4379}
4380
Howard Hinnant324bb032010-08-22 00:02:43 +00004381template<class _RandomAccessIterator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004382inline _LIBCPP_INLINE_VISIBILITY
4383_RandomAccessIterator
4384is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last)
4385{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004386 return _VSTD::is_heap_until(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004387}
4388
4389// is_heap
4390
4391template <class _RandomAccessIterator, class _Compare>
4392inline _LIBCPP_INLINE_VISIBILITY
4393bool
4394is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4395{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004396 return _VSTD::is_heap_until(__first, __last, __comp) == __last;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004397}
4398
Howard Hinnant324bb032010-08-22 00:02:43 +00004399template<class _RandomAccessIterator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004400inline _LIBCPP_INLINE_VISIBILITY
4401bool
4402is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4403{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004404 return _VSTD::is_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004405}
4406
4407// push_heap
4408
4409template <class _Compare, class _RandomAccessIterator>
4410void
4411__push_heap_front(_RandomAccessIterator __first, _RandomAccessIterator, _Compare __comp,
4412 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
4413{
4414 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4415 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4416 if (__len > 1)
4417 {
4418 difference_type __p = 0;
4419 _RandomAccessIterator __pp = __first;
4420 difference_type __c = 2;
4421 _RandomAccessIterator __cp = __first + __c;
4422 if (__c == __len || __comp(*__cp, *(__cp - 1)))
4423 {
4424 --__c;
4425 --__cp;
4426 }
4427 if (__comp(*__pp, *__cp))
4428 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004429 value_type __t(_VSTD::move(*__pp));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004430 do
4431 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004432 *__pp = _VSTD::move(*__cp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004433 __pp = __cp;
4434 __p = __c;
4435 __c = (__p + 1) * 2;
4436 if (__c > __len)
4437 break;
4438 __cp = __first + __c;
4439 if (__c == __len || __comp(*__cp, *(__cp - 1)))
4440 {
4441 --__c;
4442 --__cp;
4443 }
4444 } while (__comp(__t, *__cp));
Howard Hinnant0949eed2011-06-30 21:18:19 +00004445 *__pp = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004446 }
4447 }
4448}
4449
4450template <class _Compare, class _RandomAccessIterator>
4451void
4452__push_heap_back(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4453 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
4454{
4455 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4456 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4457 if (__len > 1)
4458 {
4459 __len = (__len - 2) / 2;
4460 _RandomAccessIterator __ptr = __first + __len;
4461 if (__comp(*__ptr, *--__last))
4462 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004463 value_type __t(_VSTD::move(*__last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004464 do
4465 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004466 *__last = _VSTD::move(*__ptr);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004467 __last = __ptr;
4468 if (__len == 0)
4469 break;
4470 __len = (__len - 1) / 2;
4471 __ptr = __first + __len;
4472 } while (__comp(*__ptr, __t));
Howard Hinnant0949eed2011-06-30 21:18:19 +00004473 *__last = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004474 }
4475 }
4476}
4477
4478template <class _RandomAccessIterator, class _Compare>
4479inline _LIBCPP_INLINE_VISIBILITY
4480void
4481push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4482{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004483#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004484 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4485 __debug_less<_Compare> __c(__comp);
4486 __push_heap_back<_Comp_ref>(__first, __last, __c, __last - __first);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004487#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004488 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4489 __push_heap_back<_Comp_ref>(__first, __last, __comp, __last - __first);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004490#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004491}
4492
4493template <class _RandomAccessIterator>
4494inline _LIBCPP_INLINE_VISIBILITY
4495void
4496push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4497{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004498 _VSTD::push_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004499}
4500
4501// pop_heap
4502
4503template <class _Compare, class _RandomAccessIterator>
4504inline _LIBCPP_INLINE_VISIBILITY
4505void
4506__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4507 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
4508{
4509 if (__len > 1)
4510 {
4511 swap(*__first, *--__last);
4512 __push_heap_front<_Compare>(__first, __last, __comp, __len-1);
4513 }
4514}
4515
4516template <class _RandomAccessIterator, class _Compare>
4517inline _LIBCPP_INLINE_VISIBILITY
4518void
4519pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4520{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004521#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004522 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4523 __debug_less<_Compare> __c(__comp);
4524 __pop_heap<_Comp_ref>(__first, __last, __c, __last - __first);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004525#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004526 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4527 __pop_heap<_Comp_ref>(__first, __last, __comp, __last - __first);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004528#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004529}
4530
4531template <class _RandomAccessIterator>
4532inline _LIBCPP_INLINE_VISIBILITY
4533void
4534pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4535{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004536 _VSTD::pop_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004537}
4538
4539// make_heap
4540
4541template <class _Compare, class _RandomAccessIterator>
4542void
4543__make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4544{
4545 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4546 difference_type __n = __last - __first;
4547 if (__n > 1)
4548 {
4549 __last = __first;
4550 ++__last;
4551 for (difference_type __i = 1; __i < __n;)
4552 __push_heap_back<_Compare>(__first, ++__last, __comp, ++__i);
4553 }
4554}
4555
4556template <class _RandomAccessIterator, class _Compare>
4557inline _LIBCPP_INLINE_VISIBILITY
4558void
4559make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4560{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004561#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004562 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4563 __debug_less<_Compare> __c(__comp);
4564 __make_heap<_Comp_ref>(__first, __last, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004565#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004566 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4567 __make_heap<_Comp_ref>(__first, __last, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004568#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004569}
4570
4571template <class _RandomAccessIterator>
4572inline _LIBCPP_INLINE_VISIBILITY
4573void
4574make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4575{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004576 _VSTD::make_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004577}
4578
4579// sort_heap
4580
4581template <class _Compare, class _RandomAccessIterator>
4582void
4583__sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4584{
4585 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4586 for (difference_type __n = __last - __first; __n > 1; --__last, --__n)
4587 __pop_heap<_Compare>(__first, __last, __comp, __n);
4588}
4589
4590template <class _RandomAccessIterator, class _Compare>
4591inline _LIBCPP_INLINE_VISIBILITY
4592void
4593sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4594{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004595#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004596 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4597 __debug_less<_Compare> __c(__comp);
4598 __sort_heap<_Comp_ref>(__first, __last, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004599#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004600 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4601 __sort_heap<_Comp_ref>(__first, __last, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004602#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004603}
4604
4605template <class _RandomAccessIterator>
4606inline _LIBCPP_INLINE_VISIBILITY
4607void
4608sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4609{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004610 _VSTD::sort_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004611}
4612
4613// partial_sort
4614
4615template <class _Compare, class _RandomAccessIterator>
4616void
4617__partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
4618 _Compare __comp)
4619{
4620 __make_heap<_Compare>(__first, __middle, __comp);
4621 typename iterator_traits<_RandomAccessIterator>::difference_type __len = __middle - __first;
4622 for (_RandomAccessIterator __i = __middle; __i != __last; ++__i)
4623 {
4624 if (__comp(*__i, *__first))
4625 {
4626 swap(*__i, *__first);
4627 __push_heap_front<_Compare>(__first, __middle, __comp, __len);
4628 }
4629 }
4630 __sort_heap<_Compare>(__first, __middle, __comp);
4631}
4632
4633template <class _RandomAccessIterator, class _Compare>
4634inline _LIBCPP_INLINE_VISIBILITY
4635void
4636partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
4637 _Compare __comp)
4638{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004639#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004640 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4641 __debug_less<_Compare> __c(__comp);
4642 __partial_sort<_Comp_ref>(__first, __middle, __last, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004643#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004644 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4645 __partial_sort<_Comp_ref>(__first, __middle, __last, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004646#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004647}
4648
4649template <class _RandomAccessIterator>
4650inline _LIBCPP_INLINE_VISIBILITY
4651void
4652partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last)
4653{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004654 _VSTD::partial_sort(__first, __middle, __last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004655 __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4656}
4657
4658// partial_sort_copy
4659
4660template <class _Compare, class _InputIterator, class _RandomAccessIterator>
4661_RandomAccessIterator
4662__partial_sort_copy(_InputIterator __first, _InputIterator __last,
4663 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp)
4664{
4665 _RandomAccessIterator __r = __result_first;
4666 if (__r != __result_last)
4667 {
4668 typename iterator_traits<_RandomAccessIterator>::difference_type __len = 0;
4669 for (; __first != __last && __r != __result_last; ++__first, ++__r, ++__len)
4670 *__r = *__first;
4671 __make_heap<_Compare>(__result_first, __r, __comp);
4672 for (; __first != __last; ++__first)
4673 if (__comp(*__first, *__result_first))
4674 {
4675 *__result_first = *__first;
4676 __push_heap_front<_Compare>(__result_first, __r, __comp, __len);
4677 }
4678 __sort_heap<_Compare>(__result_first, __r, __comp);
4679 }
4680 return __r;
4681}
4682
4683template <class _InputIterator, class _RandomAccessIterator, class _Compare>
4684inline _LIBCPP_INLINE_VISIBILITY
4685_RandomAccessIterator
4686partial_sort_copy(_InputIterator __first, _InputIterator __last,
4687 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp)
4688{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004689#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004690 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4691 __debug_less<_Compare> __c(__comp);
4692 return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004693#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004694 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4695 return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004696#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004697}
4698
4699template <class _InputIterator, class _RandomAccessIterator>
4700inline _LIBCPP_INLINE_VISIBILITY
4701_RandomAccessIterator
4702partial_sort_copy(_InputIterator __first, _InputIterator __last,
4703 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last)
4704{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004705 return _VSTD::partial_sort_copy(__first, __last, __result_first, __result_last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004706 __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4707}
4708
4709// nth_element
4710
4711template <class _Compare, class _RandomAccessIterator>
4712void
4713__nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
4714{
4715 // _Compare is known to be a reference type
4716 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4717 const difference_type __limit = 7;
4718 while (true)
4719 {
4720 __restart:
4721 difference_type __len = __last - __first;
4722 switch (__len)
4723 {
4724 case 0:
4725 case 1:
4726 return;
4727 case 2:
4728 if (__comp(*--__last, *__first))
4729 swap(*__first, *__last);
4730 return;
4731 case 3:
4732 {
4733 _RandomAccessIterator __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004734 _VSTD::__sort3<_Compare>(__first, ++__m, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004735 return;
4736 }
4737 }
4738 if (__len <= __limit)
4739 {
4740 __selection_sort<_Compare>(__first, __last, __comp);
4741 return;
4742 }
4743 // __len > __limit >= 3
4744 _RandomAccessIterator __m = __first + __len/2;
4745 _RandomAccessIterator __lm1 = __last;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004746 unsigned __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, --__lm1, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004747 // *__m is median
4748 // partition [__first, __m) < *__m and *__m <= [__m, __last)
4749 // (this inhibits tossing elements equivalent to __m around unnecessarily)
4750 _RandomAccessIterator __i = __first;
4751 _RandomAccessIterator __j = __lm1;
4752 // j points beyond range to be tested, *__lm1 is known to be <= *__m
4753 // The search going up is known to be guarded but the search coming down isn't.
4754 // Prime the downward search with a guard.
4755 if (!__comp(*__i, *__m)) // if *__first == *__m
4756 {
4757 // *__first == *__m, *__first doesn't go in first part
4758 // manually guard downward moving __j against __i
4759 while (true)
4760 {
4761 if (__i == --__j)
4762 {
4763 // *__first == *__m, *__m <= all other elements
4764 // Parition instead into [__first, __i) == *__first and *__first < [__i, __last)
4765 ++__i; // __first + 1
4766 __j = __last;
4767 if (!__comp(*__first, *--__j)) // we need a guard if *__first == *(__last-1)
4768 {
4769 while (true)
4770 {
4771 if (__i == __j)
4772 return; // [__first, __last) all equivalent elements
4773 if (__comp(*__first, *__i))
4774 {
4775 swap(*__i, *__j);
4776 ++__n_swaps;
4777 ++__i;
4778 break;
4779 }
4780 ++__i;
4781 }
4782 }
4783 // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1
4784 if (__i == __j)
4785 return;
4786 while (true)
4787 {
4788 while (!__comp(*__first, *__i))
4789 ++__i;
4790 while (__comp(*__first, *--__j))
4791 ;
4792 if (__i >= __j)
4793 break;
4794 swap(*__i, *__j);
4795 ++__n_swaps;
4796 ++__i;
4797 }
4798 // [__first, __i) == *__first and *__first < [__i, __last)
4799 // The first part is sorted,
4800 if (__nth < __i)
4801 return;
4802 // __nth_element the secod part
4803 // __nth_element<_Compare>(__i, __nth, __last, __comp);
4804 __first = __i;
4805 goto __restart;
4806 }
4807 if (__comp(*__j, *__m))
4808 {
4809 swap(*__i, *__j);
4810 ++__n_swaps;
4811 break; // found guard for downward moving __j, now use unguarded partition
4812 }
4813 }
4814 }
4815 ++__i;
4816 // j points beyond range to be tested, *__lm1 is known to be <= *__m
4817 // if not yet partitioned...
4818 if (__i < __j)
4819 {
4820 // known that *(__i - 1) < *__m
4821 while (true)
4822 {
4823 // __m still guards upward moving __i
4824 while (__comp(*__i, *__m))
4825 ++__i;
4826 // It is now known that a guard exists for downward moving __j
4827 while (!__comp(*--__j, *__m))
4828 ;
4829 if (__i >= __j)
4830 break;
4831 swap(*__i, *__j);
4832 ++__n_swaps;
4833 // It is known that __m != __j
4834 // If __m just moved, follow it
4835 if (__m == __i)
4836 __m = __j;
4837 ++__i;
4838 }
4839 }
4840 // [__first, __i) < *__m and *__m <= [__i, __last)
4841 if (__i != __m && __comp(*__m, *__i))
4842 {
4843 swap(*__i, *__m);
4844 ++__n_swaps;
4845 }
4846 // [__first, __i) < *__i and *__i <= [__i+1, __last)
4847 if (__nth == __i)
4848 return;
4849 if (__n_swaps == 0)
4850 {
4851 // We were given a perfectly partitioned sequence. Coincidence?
4852 if (__nth < __i)
4853 {
4854 // Check for [__first, __i) already sorted
4855 __j = __m = __first;
4856 while (++__j != __i)
4857 {
4858 if (__comp(*__j, *__m))
4859 // not yet sorted, so sort
4860 goto not_sorted;
4861 __m = __j;
4862 }
4863 // [__first, __i) sorted
4864 return;
4865 }
4866 else
4867 {
4868 // Check for [__i, __last) already sorted
4869 __j = __m = __i;
4870 while (++__j != __last)
4871 {
4872 if (__comp(*__j, *__m))
4873 // not yet sorted, so sort
4874 goto not_sorted;
4875 __m = __j;
4876 }
4877 // [__i, __last) sorted
4878 return;
4879 }
4880 }
4881not_sorted:
4882 // __nth_element on range containing __nth
4883 if (__nth < __i)
4884 {
4885 // __nth_element<_Compare>(__first, __nth, __i, __comp);
4886 __last = __i;
4887 }
4888 else
4889 {
4890 // __nth_element<_Compare>(__i+1, __nth, __last, __comp);
4891 __first = ++__i;
4892 }
4893 }
4894}
4895
4896template <class _RandomAccessIterator, class _Compare>
4897inline _LIBCPP_INLINE_VISIBILITY
4898void
4899nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
4900{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004901#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004902 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4903 __debug_less<_Compare> __c(__comp);
4904 __nth_element<_Comp_ref>(__first, __nth, __last, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004905#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004906 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4907 __nth_element<_Comp_ref>(__first, __nth, __last, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004908#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004909}
4910
4911template <class _RandomAccessIterator>
4912inline _LIBCPP_INLINE_VISIBILITY
4913void
4914nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last)
4915{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004916 _VSTD::nth_element(__first, __nth, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004917}
4918
4919// includes
4920
4921template <class _Compare, class _InputIterator1, class _InputIterator2>
4922bool
4923__includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
4924 _Compare __comp)
4925{
4926 for (; __first2 != __last2; ++__first1)
4927 {
4928 if (__first1 == __last1 || __comp(*__first2, *__first1))
4929 return false;
4930 if (!__comp(*__first1, *__first2))
4931 ++__first2;
4932 }
4933 return true;
4934}
4935
4936template <class _InputIterator1, class _InputIterator2, class _Compare>
4937inline _LIBCPP_INLINE_VISIBILITY
4938bool
4939includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
4940 _Compare __comp)
4941{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004942#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004943 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4944 __debug_less<_Compare> __c(__comp);
4945 return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004946#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004947 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4948 return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004949#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004950}
4951
4952template <class _InputIterator1, class _InputIterator2>
4953inline _LIBCPP_INLINE_VISIBILITY
4954bool
4955includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2)
4956{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004957 return _VSTD::includes(__first1, __last1, __first2, __last2,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004958 __less<typename iterator_traits<_InputIterator1>::value_type,
4959 typename iterator_traits<_InputIterator2>::value_type>());
4960}
4961
4962// set_union
4963
4964template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4965_OutputIterator
4966__set_union(_InputIterator1 __first1, _InputIterator1 __last1,
4967 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4968{
4969 for (; __first1 != __last1; ++__result)
4970 {
4971 if (__first2 == __last2)
Howard Hinnant0949eed2011-06-30 21:18:19 +00004972 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004973 if (__comp(*__first2, *__first1))
4974 {
4975 *__result = *__first2;
4976 ++__first2;
4977 }
4978 else
4979 {
4980 *__result = *__first1;
4981 if (!__comp(*__first1, *__first2))
4982 ++__first2;
4983 ++__first1;
4984 }
4985 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00004986 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004987}
4988
4989template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
4990inline _LIBCPP_INLINE_VISIBILITY
4991_OutputIterator
4992set_union(_InputIterator1 __first1, _InputIterator1 __last1,
4993 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4994{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004995#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004996 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4997 __debug_less<_Compare> __c(__comp);
4998 return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004999#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005000 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5001 return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005002#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005003}
5004
5005template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5006inline _LIBCPP_INLINE_VISIBILITY
5007_OutputIterator
5008set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5009 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5010{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005011 return _VSTD::set_union(__first1, __last1, __first2, __last2, __result,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005012 __less<typename iterator_traits<_InputIterator1>::value_type,
5013 typename iterator_traits<_InputIterator2>::value_type>());
5014}
5015
5016// set_intersection
5017
5018template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5019_OutputIterator
5020__set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5021 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5022{
5023 while (__first1 != __last1 && __first2 != __last2)
5024 {
5025 if (__comp(*__first1, *__first2))
5026 ++__first1;
5027 else
5028 {
5029 if (!__comp(*__first2, *__first1))
5030 {
5031 *__result = *__first1;
5032 ++__result;
5033 ++__first1;
5034 }
5035 ++__first2;
5036 }
5037 }
5038 return __result;
5039}
5040
5041template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5042inline _LIBCPP_INLINE_VISIBILITY
5043_OutputIterator
5044set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5045 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5046{
Howard Hinnant7a563db2011-09-14 18:33:51 +00005047#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005048 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5049 __debug_less<_Compare> __c(__comp);
5050 return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005051#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005052 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5053 return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005054#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005055}
5056
5057template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5058inline _LIBCPP_INLINE_VISIBILITY
5059_OutputIterator
5060set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5061 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5062{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005063 return _VSTD::set_intersection(__first1, __last1, __first2, __last2, __result,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005064 __less<typename iterator_traits<_InputIterator1>::value_type,
5065 typename iterator_traits<_InputIterator2>::value_type>());
5066}
5067
5068// set_difference
5069
5070template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5071_OutputIterator
5072__set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5073 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5074{
5075 while (__first1 != __last1)
5076 {
5077 if (__first2 == __last2)
Howard Hinnant0949eed2011-06-30 21:18:19 +00005078 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005079 if (__comp(*__first1, *__first2))
5080 {
5081 *__result = *__first1;
5082 ++__result;
5083 ++__first1;
5084 }
5085 else
5086 {
5087 if (!__comp(*__first2, *__first1))
5088 ++__first1;
5089 ++__first2;
5090 }
5091 }
5092 return __result;
5093}
5094
5095template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5096inline _LIBCPP_INLINE_VISIBILITY
5097_OutputIterator
5098set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5099 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5100{
Howard Hinnant7a563db2011-09-14 18:33:51 +00005101#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005102 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5103 __debug_less<_Compare> __c(__comp);
5104 return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005105#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005106 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5107 return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005108#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005109}
5110
5111template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5112inline _LIBCPP_INLINE_VISIBILITY
5113_OutputIterator
5114set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5115 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5116{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005117 return _VSTD::set_difference(__first1, __last1, __first2, __last2, __result,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005118 __less<typename iterator_traits<_InputIterator1>::value_type,
5119 typename iterator_traits<_InputIterator2>::value_type>());
5120}
5121
5122// set_symmetric_difference
5123
5124template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5125_OutputIterator
5126__set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5127 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5128{
5129 while (__first1 != __last1)
5130 {
5131 if (__first2 == __last2)
Howard Hinnant0949eed2011-06-30 21:18:19 +00005132 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005133 if (__comp(*__first1, *__first2))
5134 {
5135 *__result = *__first1;
5136 ++__result;
5137 ++__first1;
5138 }
5139 else
5140 {
5141 if (__comp(*__first2, *__first1))
5142 {
5143 *__result = *__first2;
5144 ++__result;
5145 }
5146 else
5147 ++__first1;
5148 ++__first2;
5149 }
5150 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00005151 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005152}
5153
5154template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5155inline _LIBCPP_INLINE_VISIBILITY
5156_OutputIterator
5157set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5158 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5159{
Howard Hinnant7a563db2011-09-14 18:33:51 +00005160#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005161 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5162 __debug_less<_Compare> __c(__comp);
5163 return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005164#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005165 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5166 return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005167#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005168}
5169
5170template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5171inline _LIBCPP_INLINE_VISIBILITY
5172_OutputIterator
5173set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5174 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5175{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005176 return _VSTD::set_symmetric_difference(__first1, __last1, __first2, __last2, __result,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005177 __less<typename iterator_traits<_InputIterator1>::value_type,
5178 typename iterator_traits<_InputIterator2>::value_type>());
5179}
5180
5181// lexicographical_compare
5182
5183template <class _Compare, class _InputIterator1, class _InputIterator2>
5184bool
5185__lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5186 _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
5187{
5188 for (; __first2 != __last2; ++__first1, ++__first2)
5189 {
5190 if (__first1 == __last1 || __comp(*__first1, *__first2))
5191 return true;
5192 if (__comp(*__first2, *__first1))
5193 return false;
5194 }
5195 return false;
5196}
5197
5198template <class _InputIterator1, class _InputIterator2, class _Compare>
5199inline _LIBCPP_INLINE_VISIBILITY
5200bool
5201lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5202 _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
5203{
Howard Hinnant7a563db2011-09-14 18:33:51 +00005204#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005205 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5206 __debug_less<_Compare> __c(__comp);
5207 return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005208#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005209 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5210 return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005211#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005212}
5213
5214template <class _InputIterator1, class _InputIterator2>
5215inline _LIBCPP_INLINE_VISIBILITY
5216bool
5217lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5218 _InputIterator2 __first2, _InputIterator2 __last2)
5219{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005220 return _VSTD::lexicographical_compare(__first1, __last1, __first2, __last2,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005221 __less<typename iterator_traits<_InputIterator1>::value_type,
5222 typename iterator_traits<_InputIterator2>::value_type>());
5223}
5224
5225// next_permutation
5226
5227template <class _Compare, class _BidirectionalIterator>
5228bool
5229__next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5230{
5231 _BidirectionalIterator __i = __last;
5232 if (__first == __last || __first == --__i)
5233 return false;
5234 while (true)
5235 {
5236 _BidirectionalIterator __ip1 = __i;
5237 if (__comp(*--__i, *__ip1))
5238 {
5239 _BidirectionalIterator __j = __last;
5240 while (!__comp(*__i, *--__j))
5241 ;
5242 swap(*__i, *__j);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005243 _VSTD::reverse(__ip1, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005244 return true;
5245 }
5246 if (__i == __first)
5247 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00005248 _VSTD::reverse(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005249 return false;
5250 }
5251 }
5252}
5253
5254template <class _BidirectionalIterator, class _Compare>
5255inline _LIBCPP_INLINE_VISIBILITY
5256bool
5257next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5258{
Howard Hinnant7a563db2011-09-14 18:33:51 +00005259#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005260 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5261 __debug_less<_Compare> __c(__comp);
5262 return __next_permutation<_Comp_ref>(__first, __last, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005263#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005264 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5265 return __next_permutation<_Comp_ref>(__first, __last, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005266#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005267}
5268
5269template <class _BidirectionalIterator>
5270inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant324bb032010-08-22 00:02:43 +00005271bool
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005272next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
5273{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005274 return _VSTD::next_permutation(__first, __last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005275 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
5276}
5277
5278// prev_permutation
5279
5280template <class _Compare, class _BidirectionalIterator>
5281bool
5282__prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5283{
5284 _BidirectionalIterator __i = __last;
5285 if (__first == __last || __first == --__i)
5286 return false;
5287 while (true)
5288 {
5289 _BidirectionalIterator __ip1 = __i;
5290 if (__comp(*__ip1, *--__i))
5291 {
5292 _BidirectionalIterator __j = __last;
5293 while (!__comp(*--__j, *__i))
5294 ;
5295 swap(*__i, *__j);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005296 _VSTD::reverse(__ip1, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005297 return true;
5298 }
5299 if (__i == __first)
5300 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00005301 _VSTD::reverse(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005302 return false;
5303 }
5304 }
5305}
5306
5307template <class _BidirectionalIterator, class _Compare>
5308inline _LIBCPP_INLINE_VISIBILITY
5309bool
5310prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5311{
Howard Hinnant7a563db2011-09-14 18:33:51 +00005312#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005313 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5314 __debug_less<_Compare> __c(__comp);
5315 return __prev_permutation<_Comp_ref>(__first, __last, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005316#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005317 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5318 return __prev_permutation<_Comp_ref>(__first, __last, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005319#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005320}
5321
5322template <class _BidirectionalIterator>
5323inline _LIBCPP_INLINE_VISIBILITY
5324bool
5325prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
5326{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005327 return _VSTD::prev_permutation(__first, __last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005328 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
5329}
5330
5331template <class _Tp>
5332inline _LIBCPP_INLINE_VISIBILITY
5333typename enable_if
5334<
5335 is_integral<_Tp>::value,
5336 _Tp
5337>::type
5338__rotate_left(_Tp __t, _Tp __n = 1)
5339{
5340 const unsigned __bits = static_cast<unsigned>(sizeof(_Tp) * __CHAR_BIT__ - 1);
5341 __n &= __bits;
5342 return static_cast<_Tp>((__t << __n) | (static_cast<typename make_unsigned<_Tp>::type>(__t) >> (__bits - __n)));
5343}
5344
5345template <class _Tp>
5346inline _LIBCPP_INLINE_VISIBILITY
5347typename enable_if
5348<
5349 is_integral<_Tp>::value,
5350 _Tp
5351>::type
5352__rotate_right(_Tp __t, _Tp __n = 1)
5353{
5354 const unsigned __bits = static_cast<unsigned>(sizeof(_Tp) * __CHAR_BIT__ - 1);
5355 __n &= __bits;
5356 return static_cast<_Tp>((__t << (__bits - __n)) | (static_cast<typename make_unsigned<_Tp>::type>(__t) >> __n));
5357}
5358
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005359_LIBCPP_END_NAMESPACE_STD
5360
5361#endif // _LIBCPP_ALGORITHM