blob: 6749bf61178d67d38ff9b099998d571581af7b2e [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))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002331 __result.first = __first;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002332 else
2333 __result.second = __first;
2334 while (++__first != __last)
2335 {
2336 _ForwardIterator __i = __first;
2337 if (++__first == __last)
2338 {
2339 if (__comp(*__i, *__result.first))
2340 __result.first = __i;
2341 else if (!__comp(*__i, *__result.second))
2342 __result.second = __i;
2343 break;
2344 }
2345 else
2346 {
2347 if (__comp(*__first, *__i))
2348 {
2349 if (__comp(*__first, *__result.first))
2350 __result.first = __first;
2351 if (!__comp(*__i, *__result.second))
2352 __result.second = __i;
2353 }
2354 else
2355 {
2356 if (__comp(*__i, *__result.first))
2357 __result.first = __i;
2358 if (!__comp(*__first, *__result.second))
2359 __result.second = __first;
2360 }
2361 }
2362 }
2363 }
2364 }
2365 return __result;
2366}
2367
2368template <class _ForwardIterator>
2369inline _LIBCPP_INLINE_VISIBILITY
2370std::pair<_ForwardIterator, _ForwardIterator>
2371minmax_element(_ForwardIterator __first, _ForwardIterator __last)
2372{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002373 return _VSTD::minmax_element(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002374}
2375
Howard Hinnant98e5d972010-08-21 20:10:01 +00002376// minmax
2377
2378template<class _Tp, class _Compare>
2379inline _LIBCPP_INLINE_VISIBILITY
2380pair<const _Tp&, const _Tp&>
2381minmax(const _Tp& __a, const _Tp& __b, _Compare __comp)
2382{
2383 return __comp(__b, __a) ? pair<const _Tp&, const _Tp&>(__b, __a) :
2384 pair<const _Tp&, const _Tp&>(__a, __b);
2385}
2386
2387template<class _Tp>
2388inline _LIBCPP_INLINE_VISIBILITY
2389pair<const _Tp&, const _Tp&>
2390minmax(const _Tp& __a, const _Tp& __b)
2391{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002392 return _VSTD::minmax(__a, __b, __less<_Tp>());
Howard Hinnant98e5d972010-08-21 20:10:01 +00002393}
2394
Howard Hinnante3e32912011-08-12 21:56:02 +00002395#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2396
Howard Hinnant98e5d972010-08-21 20:10:01 +00002397template<class _Tp>
2398inline _LIBCPP_INLINE_VISIBILITY
2399pair<_Tp, _Tp>
2400minmax(initializer_list<_Tp> __t)
2401{
2402 pair<const _Tp*, const _Tp*> __p =
Howard Hinnant0949eed2011-06-30 21:18:19 +00002403 _VSTD::minmax_element(__t.begin(), __t.end());
Howard Hinnant98e5d972010-08-21 20:10:01 +00002404 return pair<_Tp, _Tp>(*__p.first, *__p.second);
2405}
2406
2407template<class _Tp, class _Compare>
2408inline _LIBCPP_INLINE_VISIBILITY
2409pair<_Tp, _Tp>
2410minmax(initializer_list<_Tp> __t, _Compare __comp)
2411{
2412 pair<const _Tp*, const _Tp*> __p =
Howard Hinnant0949eed2011-06-30 21:18:19 +00002413 _VSTD::minmax_element(__t.begin(), __t.end(), __comp);
Howard Hinnant98e5d972010-08-21 20:10:01 +00002414 return pair<_Tp, _Tp>(*__p.first, *__p.second);
2415}
2416
Howard Hinnante3e32912011-08-12 21:56:02 +00002417#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2418
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002419// random_shuffle
2420
Howard Hinnantc3267212010-05-26 17:49:34 +00002421// __independent_bits_engine
2422
2423template <unsigned long long _X, size_t _R>
2424struct __log2_imp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002425{
Howard Hinnantc3267212010-05-26 17:49:34 +00002426 static const size_t value = _X & ((unsigned long long)(1) << _R) ? _R
2427 : __log2_imp<_X, _R - 1>::value;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002428};
2429
Howard Hinnantc3267212010-05-26 17:49:34 +00002430template <unsigned long long _X>
2431struct __log2_imp<_X, 0>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002432{
Howard Hinnantc3267212010-05-26 17:49:34 +00002433 static const size_t value = 0;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002434};
2435
Howard Hinnantc3267212010-05-26 17:49:34 +00002436template <size_t _R>
2437struct __log2_imp<0, _R>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002438{
Howard Hinnantc3267212010-05-26 17:49:34 +00002439 static const size_t value = _R + 1;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002440};
2441
Howard Hinnantc3267212010-05-26 17:49:34 +00002442template <class _UI, _UI _X>
2443struct __log2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002444{
Howard Hinnantc3267212010-05-26 17:49:34 +00002445 static const size_t value = __log2_imp<_X,
2446 sizeof(_UI) * __CHAR_BIT__ - 1>::value;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002447};
2448
Howard Hinnantc3267212010-05-26 17:49:34 +00002449template<class _Engine, class _UIntType>
2450class __independent_bits_engine
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002451{
Howard Hinnantc3267212010-05-26 17:49:34 +00002452public:
2453 // types
2454 typedef _UIntType result_type;
2455
2456private:
2457 typedef typename _Engine::result_type _Engine_result_type;
2458 typedef typename conditional
2459 <
2460 sizeof(_Engine_result_type) <= sizeof(result_type),
2461 result_type,
2462 _Engine_result_type
2463 >::type _Working_result_type;
2464
2465 _Engine& __e_;
2466 size_t __w_;
2467 size_t __w0_;
2468 size_t __n_;
2469 size_t __n0_;
2470 _Working_result_type __y0_;
2471 _Working_result_type __y1_;
2472 _Engine_result_type __mask0_;
2473 _Engine_result_type __mask1_;
2474
2475 static const _Working_result_type _R = _Engine::_Max - _Engine::_Min
2476 + _Working_result_type(1);
2477 static const size_t __m = __log2<_Working_result_type, _R>::value;
2478 static const size_t _WDt = numeric_limits<_Working_result_type>::digits;
2479 static const size_t _EDt = numeric_limits<_Engine_result_type>::digits;
2480
2481public:
2482 // constructors and seeding functions
2483 __independent_bits_engine(_Engine& __e, size_t __w);
2484
2485 // generating functions
2486 result_type operator()() {return __eval(integral_constant<bool, _R != 0>());}
2487
2488private:
2489 result_type __eval(false_type);
2490 result_type __eval(true_type);
2491};
2492
2493template<class _Engine, class _UIntType>
2494__independent_bits_engine<_Engine, _UIntType>
2495 ::__independent_bits_engine(_Engine& __e, size_t __w)
2496 : __e_(__e),
2497 __w_(__w)
2498{
2499 __n_ = __w_ / __m + (__w_ % __m != 0);
2500 __w0_ = __w_ / __n_;
2501 if (_R == 0)
2502 __y0_ = _R;
2503 else if (__w0_ < _WDt)
2504 __y0_ = (_R >> __w0_) << __w0_;
2505 else
2506 __y0_ = 0;
2507 if (_R - __y0_ > __y0_ / __n_)
2508 {
2509 ++__n_;
2510 __w0_ = __w_ / __n_;
2511 if (__w0_ < _WDt)
2512 __y0_ = (_R >> __w0_) << __w0_;
2513 else
2514 __y0_ = 0;
2515 }
2516 __n0_ = __n_ - __w_ % __n_;
2517 if (__w0_ < _WDt - 1)
2518 __y1_ = (_R >> (__w0_ + 1)) << (__w0_ + 1);
2519 else
2520 __y1_ = 0;
2521 __mask0_ = __w0_ > 0 ? _Engine_result_type(~0) >> (_EDt - __w0_) :
2522 _Engine_result_type(0);
2523 __mask1_ = __w0_ < _EDt - 1 ?
2524 _Engine_result_type(~0) >> (_EDt - (__w0_ + 1)) :
2525 _Engine_result_type(~0);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002526}
2527
Howard Hinnantc3267212010-05-26 17:49:34 +00002528template<class _Engine, class _UIntType>
2529inline
2530_UIntType
2531__independent_bits_engine<_Engine, _UIntType>::__eval(false_type)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002532{
Howard Hinnantc3267212010-05-26 17:49:34 +00002533 return static_cast<result_type>(__e_() & __mask0_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002534}
2535
Howard Hinnantc3267212010-05-26 17:49:34 +00002536template<class _Engine, class _UIntType>
2537_UIntType
2538__independent_bits_engine<_Engine, _UIntType>::__eval(true_type)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002539{
Howard Hinnantc3267212010-05-26 17:49:34 +00002540 result_type _S = 0;
2541 for (size_t __k = 0; __k < __n0_; ++__k)
2542 {
2543 _Engine_result_type __u;
2544 do
2545 {
2546 __u = __e_() - _Engine::min();
2547 } while (__u >= __y0_);
Howard Hinnant8faa95f2011-10-27 16:12:10 +00002548 if (__w0_ < _WDt)
Howard Hinnantc3267212010-05-26 17:49:34 +00002549 _S <<= __w0_;
2550 else
2551 _S = 0;
2552 _S += __u & __mask0_;
2553 }
2554 for (size_t __k = __n0_; __k < __n_; ++__k)
2555 {
2556 _Engine_result_type __u;
2557 do
2558 {
2559 __u = __e_() - _Engine::min();
2560 } while (__u >= __y1_);
Howard Hinnant8faa95f2011-10-27 16:12:10 +00002561 if (__w0_ < _WDt - 1)
Howard Hinnantc3267212010-05-26 17:49:34 +00002562 _S <<= __w0_ + 1;
2563 else
2564 _S = 0;
2565 _S += __u & __mask1_;
2566 }
2567 return _S;
2568}
2569
2570// uniform_int_distribution
2571
2572template<class _IntType = int>
2573class uniform_int_distribution
2574{
2575public:
2576 // types
2577 typedef _IntType result_type;
2578
2579 class param_type
2580 {
2581 result_type __a_;
2582 result_type __b_;
2583 public:
2584 typedef uniform_int_distribution distribution_type;
2585
2586 explicit param_type(result_type __a = 0,
2587 result_type __b = numeric_limits<result_type>::max())
2588 : __a_(__a), __b_(__b) {}
2589
2590 result_type a() const {return __a_;}
2591 result_type b() const {return __b_;}
2592
2593 friend bool operator==(const param_type& __x, const param_type& __y)
2594 {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;}
2595 friend bool operator!=(const param_type& __x, const param_type& __y)
2596 {return !(__x == __y);}
2597 };
2598
2599private:
2600 param_type __p_;
2601
2602public:
2603 // constructors and reset functions
2604 explicit uniform_int_distribution(result_type __a = 0,
2605 result_type __b = numeric_limits<result_type>::max())
2606 : __p_(param_type(__a, __b)) {}
2607 explicit uniform_int_distribution(const param_type& __p) : __p_(__p) {}
2608 void reset() {}
2609
2610 // generating functions
2611 template<class _URNG> result_type operator()(_URNG& __g)
2612 {return (*this)(__g, __p_);}
2613 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
2614
2615 // property functions
2616 result_type a() const {return __p_.a();}
2617 result_type b() const {return __p_.b();}
2618
2619 param_type param() const {return __p_;}
2620 void param(const param_type& __p) {__p_ = __p;}
2621
2622 result_type min() const {return a();}
2623 result_type max() const {return b();}
2624
2625 friend bool operator==(const uniform_int_distribution& __x,
2626 const uniform_int_distribution& __y)
2627 {return __x.__p_ == __y.__p_;}
2628 friend bool operator!=(const uniform_int_distribution& __x,
2629 const uniform_int_distribution& __y)
2630 {return !(__x == __y);}
2631};
2632
2633template<class _IntType>
2634template<class _URNG>
2635typename uniform_int_distribution<_IntType>::result_type
2636uniform_int_distribution<_IntType>::operator()(_URNG& __g, const param_type& __p)
2637{
2638 typedef typename conditional<sizeof(result_type) <= sizeof(uint32_t),
2639 uint32_t, uint64_t>::type _UIntType;
2640 const _UIntType _R = __p.b() - __p.a() + _UIntType(1);
2641 if (_R == 1)
2642 return __p.a();
2643 const size_t _Dt = numeric_limits<_UIntType>::digits;
2644 typedef __independent_bits_engine<_URNG, _UIntType> _Eng;
2645 if (_R == 0)
2646 return static_cast<result_type>(_Eng(__g, _Dt)());
2647 size_t __w = _Dt - __clz(_R) - 1;
2648 if ((_R & (_UIntType(~0) >> (_Dt - __w))) != 0)
2649 ++__w;
2650 _Eng __e(__g, __w);
2651 _UIntType __u;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002652 do
Howard Hinnantc3267212010-05-26 17:49:34 +00002653 {
2654 __u = __e();
2655 } while (__u >= _R);
2656 return static_cast<result_type>(__u + __p.a());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002657}
2658
Howard Hinnantc3267212010-05-26 17:49:34 +00002659class __rs_default;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002660
Howard Hinnantc3267212010-05-26 17:49:34 +00002661__rs_default __rs_get();
2662
2663class __rs_default
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002664{
Howard Hinnantc3267212010-05-26 17:49:34 +00002665 static unsigned __c_;
2666
2667 __rs_default();
2668public:
2669 typedef unsigned result_type;
2670
2671 static const result_type _Min = 0;
2672 static const result_type _Max = 0xFFFFFFFF;
2673
2674 __rs_default(const __rs_default&);
2675 ~__rs_default();
2676
2677 result_type operator()();
2678
2679 static const/*expr*/ result_type min() {return _Min;}
2680 static const/*expr*/ result_type max() {return _Max;}
2681
2682 friend __rs_default __rs_get();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002683};
2684
Howard Hinnantc3267212010-05-26 17:49:34 +00002685__rs_default __rs_get();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002686
2687template <class _RandomAccessIterator>
2688void
2689random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
2690{
2691 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnantc3267212010-05-26 17:49:34 +00002692 typedef uniform_int_distribution<ptrdiff_t> _D;
2693 typedef typename _D::param_type _P;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002694 difference_type __d = __last - __first;
2695 if (__d > 1)
2696 {
Howard Hinnantc3267212010-05-26 17:49:34 +00002697 _D __uid;
2698 __rs_default __g = __rs_get();
2699 for (--__last, --__d; __first < __last; ++__first, --__d)
Howard Hinnant4e599482010-10-22 15:26:39 +00002700 {
2701 difference_type __i = __uid(__g, _P(0, __d));
2702 if (__i != difference_type(0))
2703 swap(*__first, *(__first + __i));
2704 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002705 }
2706}
2707
2708template <class _RandomAccessIterator, class _RandomNumberGenerator>
2709void
2710random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
Howard Hinnant73d21a42010-09-04 23:28:19 +00002711#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002712 _RandomNumberGenerator&& __rand)
2713#else
2714 _RandomNumberGenerator& __rand)
2715#endif
2716{
2717 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
2718 difference_type __d = __last - __first;
2719 if (__d > 1)
2720 {
2721 for (--__last; __first < __last; ++__first, --__d)
Howard Hinnant4e599482010-10-22 15:26:39 +00002722 {
2723 difference_type __i = __rand(__d);
2724 swap(*__first, *(__first + __i));
2725 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002726 }
2727}
2728
Howard Hinnantc3267212010-05-26 17:49:34 +00002729template<class _RandomAccessIterator, class _UniformRandomNumberGenerator>
2730 void shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
Howard Hinnant278bf2d2010-11-18 01:47:02 +00002731#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2732 _UniformRandomNumberGenerator&& __g)
2733#else
Howard Hinnantc3267212010-05-26 17:49:34 +00002734 _UniformRandomNumberGenerator& __g)
Howard Hinnant278bf2d2010-11-18 01:47:02 +00002735#endif
Howard Hinnantc3267212010-05-26 17:49:34 +00002736{
2737 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
2738 typedef uniform_int_distribution<ptrdiff_t> _D;
2739 typedef typename _D::param_type _P;
2740 difference_type __d = __last - __first;
2741 if (__d > 1)
2742 {
2743 _D __uid;
2744 for (--__last, --__d; __first < __last; ++__first, --__d)
Howard Hinnant4e599482010-10-22 15:26:39 +00002745 {
2746 difference_type __i = __uid(__g, _P(0, __d));
2747 if (__i != difference_type(0))
2748 swap(*__first, *(__first + __i));
2749 }
Howard Hinnantc3267212010-05-26 17:49:34 +00002750 }
2751}
2752
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002753template <class _InputIterator, class _Predicate>
2754bool
2755is_partitioned(_InputIterator __first, _InputIterator __last, _Predicate __pred)
2756{
2757 for (; __first != __last; ++__first)
2758 if (!__pred(*__first))
2759 break;
2760 for (; __first != __last; ++__first)
2761 if (__pred(*__first))
2762 return false;
2763 return true;
2764}
2765
2766// partition
2767
2768template <class _Predicate, class _ForwardIterator>
2769_ForwardIterator
2770__partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, forward_iterator_tag)
2771{
2772 while (true)
2773 {
2774 if (__first == __last)
2775 return __first;
2776 if (!__pred(*__first))
2777 break;
2778 ++__first;
2779 }
2780 for (_ForwardIterator __p = __first; ++__p != __last;)
2781 {
2782 if (__pred(*__p))
2783 {
2784 swap(*__first, *__p);
2785 ++__first;
2786 }
2787 }
2788 return __first;
2789}
2790
2791template <class _Predicate, class _BidirectionalIterator>
2792_BidirectionalIterator
2793__partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
2794 bidirectional_iterator_tag)
2795{
2796 while (true)
2797 {
2798 while (true)
2799 {
2800 if (__first == __last)
2801 return __first;
2802 if (!__pred(*__first))
2803 break;
2804 ++__first;
2805 }
2806 do
2807 {
2808 if (__first == --__last)
2809 return __first;
2810 } while (!__pred(*__last));
2811 swap(*__first, *__last);
2812 ++__first;
2813 }
2814}
2815
2816template <class _ForwardIterator, class _Predicate>
2817inline _LIBCPP_INLINE_VISIBILITY
2818_ForwardIterator
2819partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
2820{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002821 return _VSTD::__partition<typename add_lvalue_reference<_Predicate>::type>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002822 (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
2823}
2824
2825// partition_copy
2826
2827template <class _InputIterator, class _OutputIterator1,
2828 class _OutputIterator2, class _Predicate>
2829pair<_OutputIterator1, _OutputIterator2>
2830partition_copy(_InputIterator __first, _InputIterator __last,
2831 _OutputIterator1 __out_true, _OutputIterator2 __out_false,
2832 _Predicate __pred)
2833{
2834 for (; __first != __last; ++__first)
2835 {
2836 if (__pred(*__first))
2837 {
2838 *__out_true = *__first;
2839 ++__out_true;
2840 }
2841 else
2842 {
2843 *__out_false = *__first;
2844 ++__out_false;
2845 }
2846 }
2847 return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false);
2848}
2849
2850// partition_point
2851
2852template<class _ForwardIterator, class _Predicate>
2853_ForwardIterator
2854partition_point(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
2855{
2856 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002857 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002858 while (__len != 0)
2859 {
2860 difference_type __l2 = __len / 2;
2861 _ForwardIterator __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002862 _VSTD::advance(__m, __l2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002863 if (__pred(*__m))
2864 {
2865 __first = ++__m;
2866 __len -= __l2 + 1;
2867 }
2868 else
2869 __len = __l2;
2870 }
2871 return __first;
2872}
2873
2874// stable_partition
2875
2876template <class _Predicate, class _ForwardIterator, class _Distance, class _Pair>
2877_ForwardIterator
2878__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
2879 _Distance __len, _Pair __p, forward_iterator_tag __fit)
2880{
2881 // *__first is known to be false
2882 // __len >= 1
2883 if (__len == 1)
2884 return __first;
2885 if (__len == 2)
2886 {
2887 _ForwardIterator __m = __first;
2888 if (__pred(*++__m))
2889 {
2890 swap(*__first, *__m);
2891 return __m;
2892 }
2893 return __first;
2894 }
2895 if (__len <= __p.second)
2896 { // The buffer is big enough to use
2897 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
2898 __destruct_n __d(0);
2899 unique_ptr<value_type, __destruct_n&> __h(__p.first, __d);
2900 // Move the falses into the temporary buffer, and the trues to the front of the line
2901 // Update __first to always point to the end of the trues
2902 value_type* __t = __p.first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002903 ::new(__t) value_type(_VSTD::move(*__first));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002904 __d.__incr((value_type*)0);
2905 ++__t;
2906 _ForwardIterator __i = __first;
2907 while (++__i != __last)
2908 {
2909 if (__pred(*__i))
2910 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002911 *__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002912 ++__first;
2913 }
2914 else
2915 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002916 ::new(__t) value_type(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002917 __d.__incr((value_type*)0);
2918 ++__t;
2919 }
2920 }
2921 // All trues now at start of range, all falses in buffer
2922 // Move falses back into range, but don't mess up __first which points to first false
2923 __i = __first;
2924 for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i)
Howard Hinnant0949eed2011-06-30 21:18:19 +00002925 *__i = _VSTD::move(*__t2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002926 // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer
2927 return __first;
2928 }
2929 // Else not enough buffer, do in place
2930 // __len >= 3
2931 _ForwardIterator __m = __first;
2932 _Distance __len2 = __len / 2; // __len2 >= 2
Howard Hinnant0949eed2011-06-30 21:18:19 +00002933 _VSTD::advance(__m, __len2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002934 // recurse on [__first, __m), *__first know to be false
2935 // F?????????????????
2936 // f m l
2937 typedef typename add_lvalue_reference<_Predicate>::type _PredRef;
2938 _ForwardIterator __first_false = __stable_partition<_PredRef>(__first, __m, __pred, __len2, __p, __fit);
2939 // TTTFFFFF??????????
2940 // f ff m l
2941 // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true
2942 _ForwardIterator __m1 = __m;
2943 _ForwardIterator __second_false = __last;
2944 _Distance __len_half = __len - __len2;
2945 while (__pred(*__m1))
2946 {
2947 if (++__m1 == __last)
2948 goto __second_half_done;
2949 --__len_half;
2950 }
2951 // TTTFFFFFTTTF??????
2952 // f ff m m1 l
2953 __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __fit);
2954__second_half_done:
2955 // TTTFFFFFTTTTTFFFFF
2956 // f ff m sf l
Howard Hinnant0949eed2011-06-30 21:18:19 +00002957 return _VSTD::rotate(__first_false, __m, __second_false);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002958 // TTTTTTTTFFFFFFFFFF
2959 // |
2960}
2961
2962struct __return_temporary_buffer
2963{
2964 template <class _Tp>
Howard Hinnant0949eed2011-06-30 21:18:19 +00002965 _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) const {_VSTD::return_temporary_buffer(__p);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002966};
2967
2968template <class _Predicate, class _ForwardIterator>
2969_ForwardIterator
2970__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
2971 forward_iterator_tag)
2972{
2973 const unsigned __alloc_limit = 3; // might want to make this a function of trivial assignment
2974 // Either prove all true and return __first or point to first false
2975 while (true)
2976 {
2977 if (__first == __last)
2978 return __first;
2979 if (!__pred(*__first))
2980 break;
2981 ++__first;
2982 }
2983 // We now have a reduced range [__first, __last)
2984 // *__first is known to be false
2985 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
2986 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002987 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002988 pair<value_type*, ptrdiff_t> __p(0, 0);
2989 unique_ptr<value_type, __return_temporary_buffer> __h;
2990 if (__len >= __alloc_limit)
2991 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002992 __p = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002993 __h.reset(__p.first);
2994 }
2995 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
2996 (__first, __last, __pred, __len, __p, forward_iterator_tag());
2997}
2998
2999template <class _Predicate, class _BidirectionalIterator, class _Distance, class _Pair>
3000_BidirectionalIterator
3001__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3002 _Distance __len, _Pair __p, bidirectional_iterator_tag __bit)
3003{
3004 // *__first is known to be false
3005 // *__last is known to be true
3006 // __len >= 2
3007 if (__len == 2)
3008 {
3009 swap(*__first, *__last);
3010 return __last;
3011 }
3012 if (__len == 3)
3013 {
3014 _BidirectionalIterator __m = __first;
3015 if (__pred(*++__m))
3016 {
3017 swap(*__first, *__m);
3018 swap(*__m, *__last);
3019 return __last;
3020 }
3021 swap(*__m, *__last);
3022 swap(*__first, *__m);
3023 return __m;
3024 }
3025 if (__len <= __p.second)
3026 { // The buffer is big enough to use
3027 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3028 __destruct_n __d(0);
3029 unique_ptr<value_type, __destruct_n&> __h(__p.first, __d);
3030 // Move the falses into the temporary buffer, and the trues to the front of the line
3031 // Update __first to always point to the end of the trues
3032 value_type* __t = __p.first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003033 ::new(__t) value_type(_VSTD::move(*__first));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003034 __d.__incr((value_type*)0);
3035 ++__t;
3036 _BidirectionalIterator __i = __first;
3037 while (++__i != __last)
3038 {
3039 if (__pred(*__i))
3040 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003041 *__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003042 ++__first;
3043 }
3044 else
3045 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003046 ::new(__t) value_type(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003047 __d.__incr((value_type*)0);
3048 ++__t;
3049 }
3050 }
3051 // move *__last, known to be true
Howard Hinnant0949eed2011-06-30 21:18:19 +00003052 *__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003053 __i = ++__first;
3054 // All trues now at start of range, all falses in buffer
3055 // Move falses back into range, but don't mess up __first which points to first false
3056 for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i)
Howard Hinnant0949eed2011-06-30 21:18:19 +00003057 *__i = _VSTD::move(*__t2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003058 // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer
3059 return __first;
3060 }
3061 // Else not enough buffer, do in place
3062 // __len >= 4
3063 _BidirectionalIterator __m = __first;
3064 _Distance __len2 = __len / 2; // __len2 >= 2
Howard Hinnant0949eed2011-06-30 21:18:19 +00003065 _VSTD::advance(__m, __len2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003066 // recurse on [__first, __m-1], except reduce __m-1 until *(__m-1) is true, *__first know to be false
3067 // F????????????????T
3068 // f m l
3069 _BidirectionalIterator __m1 = __m;
3070 _BidirectionalIterator __first_false = __first;
3071 _Distance __len_half = __len2;
3072 while (!__pred(*--__m1))
3073 {
3074 if (__m1 == __first)
3075 goto __first_half_done;
3076 --__len_half;
3077 }
3078 // F???TFFF?????????T
3079 // f m1 m l
3080 typedef typename add_lvalue_reference<_Predicate>::type _PredRef;
3081 __first_false = __stable_partition<_PredRef>(__first, __m1, __pred, __len_half, __p, __bit);
3082__first_half_done:
3083 // TTTFFFFF?????????T
3084 // f ff m l
3085 // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true
3086 __m1 = __m;
3087 _BidirectionalIterator __second_false = __last;
3088 ++__second_false;
3089 __len_half = __len - __len2;
3090 while (__pred(*__m1))
3091 {
3092 if (++__m1 == __last)
3093 goto __second_half_done;
3094 --__len_half;
3095 }
3096 // TTTFFFFFTTTF?????T
3097 // f ff m m1 l
3098 __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __bit);
3099__second_half_done:
3100 // TTTFFFFFTTTTTFFFFF
3101 // f ff m sf l
Howard Hinnant0949eed2011-06-30 21:18:19 +00003102 return _VSTD::rotate(__first_false, __m, __second_false);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003103 // TTTTTTTTFFFFFFFFFF
3104 // |
3105}
3106
3107template <class _Predicate, class _BidirectionalIterator>
3108_BidirectionalIterator
3109__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3110 bidirectional_iterator_tag)
3111{
3112 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
3113 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3114 const difference_type __alloc_limit = 4; // might want to make this a function of trivial assignment
3115 // Either prove all true and return __first or point to first false
3116 while (true)
3117 {
3118 if (__first == __last)
3119 return __first;
3120 if (!__pred(*__first))
3121 break;
3122 ++__first;
3123 }
3124 // __first points to first false, everything prior to __first is already set.
3125 // Either prove [__first, __last) is all false and return __first, or point __last to last true
3126 do
3127 {
3128 if (__first == --__last)
3129 return __first;
3130 } while (!__pred(*__last));
3131 // We now have a reduced range [__first, __last]
3132 // *__first is known to be false
3133 // *__last is known to be true
3134 // __len >= 2
Howard Hinnant0949eed2011-06-30 21:18:19 +00003135 difference_type __len = _VSTD::distance(__first, __last) + 1;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003136 pair<value_type*, ptrdiff_t> __p(0, 0);
3137 unique_ptr<value_type, __return_temporary_buffer> __h;
3138 if (__len >= __alloc_limit)
3139 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003140 __p = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003141 __h.reset(__p.first);
3142 }
3143 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
3144 (__first, __last, __pred, __len, __p, bidirectional_iterator_tag());
3145}
3146
3147template <class _ForwardIterator, class _Predicate>
3148inline _LIBCPP_INLINE_VISIBILITY
3149_ForwardIterator
3150stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
3151{
3152 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
3153 (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
3154}
3155
3156// is_sorted_until
3157
3158template <class _ForwardIterator, class _Compare>
3159_ForwardIterator
3160is_sorted_until(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
3161{
3162 if (__first != __last)
3163 {
3164 _ForwardIterator __i = __first;
3165 while (++__i != __last)
3166 {
3167 if (__comp(*__i, *__first))
3168 return __i;
3169 __first = __i;
3170 }
3171 }
3172 return __last;
3173}
3174
Howard Hinnant324bb032010-08-22 00:02:43 +00003175template<class _ForwardIterator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003176inline _LIBCPP_INLINE_VISIBILITY
3177_ForwardIterator
3178is_sorted_until(_ForwardIterator __first, _ForwardIterator __last)
3179{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003180 return _VSTD::is_sorted_until(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003181}
3182
3183// is_sorted
3184
3185template <class _ForwardIterator, class _Compare>
3186inline _LIBCPP_INLINE_VISIBILITY
3187bool
3188is_sorted(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
3189{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003190 return _VSTD::is_sorted_until(__first, __last, __comp) == __last;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003191}
3192
Howard Hinnant324bb032010-08-22 00:02:43 +00003193template<class _ForwardIterator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003194inline _LIBCPP_INLINE_VISIBILITY
3195bool
3196is_sorted(_ForwardIterator __first, _ForwardIterator __last)
3197{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003198 return _VSTD::is_sorted(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003199}
3200
3201// sort
3202
3203// stable, 2-3 compares, 0-2 swaps
3204
3205template <class _Compare, class _ForwardIterator>
3206unsigned
3207__sort3(_ForwardIterator __x, _ForwardIterator __y, _ForwardIterator __z, _Compare __c)
3208{
3209 unsigned __r = 0;
3210 if (!__c(*__y, *__x)) // if x <= y
3211 {
3212 if (!__c(*__z, *__y)) // if y <= z
3213 return __r; // x <= y && y <= z
3214 // x <= y && y > z
3215 swap(*__y, *__z); // x <= z && y < z
3216 __r = 1;
3217 if (__c(*__y, *__x)) // if x > y
3218 {
3219 swap(*__x, *__y); // x < y && y <= z
3220 __r = 2;
3221 }
3222 return __r; // x <= y && y < z
3223 }
3224 if (__c(*__z, *__y)) // x > y, if y > z
3225 {
3226 swap(*__x, *__z); // x < y && y < z
3227 __r = 1;
3228 return __r;
3229 }
3230 swap(*__x, *__y); // x > y && y <= z
3231 __r = 1; // x < y && x <= z
3232 if (__c(*__z, *__y)) // if y > z
3233 {
3234 swap(*__y, *__z); // x <= y && y < z
3235 __r = 2;
3236 }
3237 return __r;
3238} // x <= y && y <= z
3239
3240// stable, 3-6 compares, 0-5 swaps
3241
3242template <class _Compare, class _ForwardIterator>
3243unsigned
3244__sort4(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3,
3245 _ForwardIterator __x4, _Compare __c)
3246{
3247 unsigned __r = __sort3<_Compare>(__x1, __x2, __x3, __c);
3248 if (__c(*__x4, *__x3))
3249 {
3250 swap(*__x3, *__x4);
3251 ++__r;
3252 if (__c(*__x3, *__x2))
3253 {
3254 swap(*__x2, *__x3);
3255 ++__r;
3256 if (__c(*__x2, *__x1))
3257 {
3258 swap(*__x1, *__x2);
3259 ++__r;
3260 }
3261 }
3262 }
3263 return __r;
3264}
3265
3266// stable, 4-10 compares, 0-9 swaps
3267
3268template <class _Compare, class _ForwardIterator>
3269unsigned
3270__sort5(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3,
3271 _ForwardIterator __x4, _ForwardIterator __x5, _Compare __c)
3272{
3273 unsigned __r = __sort4<_Compare>(__x1, __x2, __x3, __x4, __c);
3274 if (__c(*__x5, *__x4))
3275 {
3276 swap(*__x4, *__x5);
3277 ++__r;
3278 if (__c(*__x4, *__x3))
3279 {
3280 swap(*__x3, *__x4);
3281 ++__r;
3282 if (__c(*__x3, *__x2))
3283 {
3284 swap(*__x2, *__x3);
3285 ++__r;
3286 if (__c(*__x2, *__x1))
3287 {
3288 swap(*__x1, *__x2);
3289 ++__r;
3290 }
3291 }
3292 }
3293 }
3294 return __r;
3295}
3296
3297// Assumes size > 0
3298template <class _Compare, class _BirdirectionalIterator>
3299void
3300__selection_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp)
3301{
3302 _BirdirectionalIterator __lm1 = __last;
3303 for (--__lm1; __first != __lm1; ++__first)
3304 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003305 _BirdirectionalIterator __i = _VSTD::min_element<_BirdirectionalIterator,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003306 typename add_lvalue_reference<_Compare>::type>
3307 (__first, __last, __comp);
3308 if (__i != __first)
3309 swap(*__first, *__i);
3310 }
3311}
3312
3313template <class _Compare, class _BirdirectionalIterator>
3314void
3315__insertion_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp)
3316{
3317 typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type;
3318 if (__first != __last)
3319 {
3320 _BirdirectionalIterator __i = __first;
3321 for (++__i; __i != __last; ++__i)
3322 {
3323 _BirdirectionalIterator __j = __i;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003324 value_type __t(_VSTD::move(*__j));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003325 for (_BirdirectionalIterator __k = __i; __k != __first && __comp(__t, *--__k); --__j)
Howard Hinnant0949eed2011-06-30 21:18:19 +00003326 *__j = _VSTD::move(*__k);
3327 *__j = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003328 }
3329 }
3330}
3331
3332template <class _Compare, class _RandomAccessIterator>
3333void
3334__insertion_sort_3(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3335{
3336 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3337 _RandomAccessIterator __j = __first+2;
3338 __sort3<_Compare>(__first, __first+1, __j, __comp);
3339 for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
3340 {
3341 if (__comp(*__i, *__j))
3342 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003343 value_type __t(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003344 _RandomAccessIterator __k = __j;
3345 __j = __i;
3346 do
3347 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003348 *__j = _VSTD::move(*__k);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003349 __j = __k;
3350 } while (__j != __first && __comp(__t, *--__k));
Howard Hinnant0949eed2011-06-30 21:18:19 +00003351 *__j = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003352 }
3353 __j = __i;
3354 }
3355}
3356
3357template <class _Compare, class _RandomAccessIterator>
3358bool
3359__insertion_sort_incomplete(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3360{
3361 switch (__last - __first)
3362 {
3363 case 0:
3364 case 1:
3365 return true;
3366 case 2:
3367 if (__comp(*--__last, *__first))
3368 swap(*__first, *__last);
3369 return true;
3370 case 3:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003371 _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003372 return true;
3373 case 4:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003374 _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003375 return true;
3376 case 5:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003377 _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003378 return true;
3379 }
3380 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3381 _RandomAccessIterator __j = __first+2;
3382 __sort3<_Compare>(__first, __first+1, __j, __comp);
3383 const unsigned __limit = 8;
3384 unsigned __count = 0;
3385 for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
3386 {
3387 if (__comp(*__i, *__j))
3388 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003389 value_type __t(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003390 _RandomAccessIterator __k = __j;
3391 __j = __i;
3392 do
3393 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003394 *__j = _VSTD::move(*__k);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003395 __j = __k;
3396 } while (__j != __first && __comp(__t, *--__k));
Howard Hinnant0949eed2011-06-30 21:18:19 +00003397 *__j = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003398 if (++__count == __limit)
3399 return ++__i == __last;
3400 }
3401 __j = __i;
3402 }
3403 return true;
3404}
3405
3406template <class _Compare, class _BirdirectionalIterator>
3407void
3408__insertion_sort_move(_BirdirectionalIterator __first1, _BirdirectionalIterator __last1,
3409 typename iterator_traits<_BirdirectionalIterator>::value_type* __first2, _Compare __comp)
3410{
3411 typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type;
3412 if (__first1 != __last1)
3413 {
3414 __destruct_n __d(0);
3415 unique_ptr<value_type, __destruct_n&> __h(__first2, __d);
3416 value_type* __last2 = __first2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003417 ::new(__last2) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003418 __d.__incr((value_type*)0);
3419 for (++__last2; ++__first1 != __last1; ++__last2)
3420 {
3421 value_type* __j2 = __last2;
3422 value_type* __i2 = __j2;
3423 if (__comp(*__first1, *--__i2))
3424 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003425 ::new(__j2) value_type(_VSTD::move(*__i2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003426 __d.__incr((value_type*)0);
3427 for (--__j2; __i2 != __first2 && __comp(*__first1, *--__i2); --__j2)
Howard Hinnant0949eed2011-06-30 21:18:19 +00003428 *__j2 = _VSTD::move(*__i2);
3429 *__j2 = _VSTD::move(*__first1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003430 }
3431 else
3432 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003433 ::new(__j2) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003434 __d.__incr((value_type*)0);
3435 }
3436 }
3437 __h.release();
3438 }
3439}
3440
3441template <class _Compare, class _RandomAccessIterator>
3442void
3443__sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3444{
3445 // _Compare is known to be a reference type
3446 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
3447 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
Howard Hinnant1468b662010-11-19 22:17:28 +00003448 const difference_type __limit = is_trivially_copy_constructible<value_type>::value &&
3449 is_trivially_copy_assignable<value_type>::value ? 30 : 6;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003450 while (true)
3451 {
3452 __restart:
3453 difference_type __len = __last - __first;
3454 switch (__len)
3455 {
3456 case 0:
3457 case 1:
3458 return;
3459 case 2:
3460 if (__comp(*--__last, *__first))
3461 swap(*__first, *__last);
3462 return;
3463 case 3:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003464 _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003465 return;
3466 case 4:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003467 _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003468 return;
3469 case 5:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003470 _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003471 return;
3472 }
3473 if (__len <= __limit)
3474 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003475 _VSTD::__insertion_sort_3<_Compare>(__first, __last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003476 return;
3477 }
3478 // __len > 5
3479 _RandomAccessIterator __m = __first;
3480 _RandomAccessIterator __lm1 = __last;
3481 --__lm1;
3482 unsigned __n_swaps;
3483 {
3484 difference_type __delta;
3485 if (__len >= 1000)
3486 {
3487 __delta = __len/2;
3488 __m += __delta;
3489 __delta /= 2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003490 __n_swaps = _VSTD::__sort5<_Compare>(__first, __first + __delta, __m, __m+__delta, __lm1, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003491 }
3492 else
3493 {
3494 __delta = __len/2;
3495 __m += __delta;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003496 __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, __lm1, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003497 }
3498 }
3499 // *__m is median
3500 // partition [__first, __m) < *__m and *__m <= [__m, __last)
3501 // (this inhibits tossing elements equivalent to __m around unnecessarily)
3502 _RandomAccessIterator __i = __first;
3503 _RandomAccessIterator __j = __lm1;
3504 // j points beyond range to be tested, *__m is known to be <= *__lm1
3505 // The search going up is known to be guarded but the search coming down isn't.
3506 // Prime the downward search with a guard.
3507 if (!__comp(*__i, *__m)) // if *__first == *__m
3508 {
3509 // *__first == *__m, *__first doesn't go in first part
3510 // manually guard downward moving __j against __i
3511 while (true)
3512 {
3513 if (__i == --__j)
3514 {
3515 // *__first == *__m, *__m <= all other elements
3516 // Parition instead into [__first, __i) == *__first and *__first < [__i, __last)
3517 ++__i; // __first + 1
3518 __j = __last;
3519 if (!__comp(*__first, *--__j)) // we need a guard if *__first == *(__last-1)
3520 {
3521 while (true)
3522 {
3523 if (__i == __j)
3524 return; // [__first, __last) all equivalent elements
3525 if (__comp(*__first, *__i))
3526 {
3527 swap(*__i, *__j);
3528 ++__n_swaps;
3529 ++__i;
3530 break;
3531 }
3532 ++__i;
3533 }
3534 }
3535 // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1
3536 if (__i == __j)
3537 return;
3538 while (true)
3539 {
3540 while (!__comp(*__first, *__i))
3541 ++__i;
3542 while (__comp(*__first, *--__j))
3543 ;
3544 if (__i >= __j)
3545 break;
3546 swap(*__i, *__j);
3547 ++__n_swaps;
3548 ++__i;
3549 }
3550 // [__first, __i) == *__first and *__first < [__i, __last)
3551 // The first part is sorted, sort the secod part
Howard Hinnant0949eed2011-06-30 21:18:19 +00003552 // _VSTD::__sort<_Compare>(__i, __last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003553 __first = __i;
3554 goto __restart;
3555 }
3556 if (__comp(*__j, *__m))
3557 {
3558 swap(*__i, *__j);
3559 ++__n_swaps;
3560 break; // found guard for downward moving __j, now use unguarded partition
3561 }
3562 }
3563 }
3564 // It is known that *__i < *__m
3565 ++__i;
3566 // j points beyond range to be tested, *__m is known to be <= *__lm1
3567 // if not yet partitioned...
3568 if (__i < __j)
3569 {
3570 // known that *(__i - 1) < *__m
3571 // known that __i <= __m
3572 while (true)
3573 {
3574 // __m still guards upward moving __i
3575 while (__comp(*__i, *__m))
3576 ++__i;
3577 // It is now known that a guard exists for downward moving __j
3578 while (!__comp(*--__j, *__m))
3579 ;
3580 if (__i > __j)
3581 break;
3582 swap(*__i, *__j);
3583 ++__n_swaps;
3584 // It is known that __m != __j
3585 // If __m just moved, follow it
3586 if (__m == __i)
3587 __m = __j;
3588 ++__i;
3589 }
3590 }
3591 // [__first, __i) < *__m and *__m <= [__i, __last)
3592 if (__i != __m && __comp(*__m, *__i))
3593 {
3594 swap(*__i, *__m);
3595 ++__n_swaps;
3596 }
3597 // [__first, __i) < *__i and *__i <= [__i+1, __last)
3598 // If we were given a perfect partition, see if insertion sort is quick...
3599 if (__n_swaps == 0)
3600 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003601 bool __fs = _VSTD::__insertion_sort_incomplete<_Compare>(__first, __i, __comp);
3602 if (_VSTD::__insertion_sort_incomplete<_Compare>(__i+1, __last, __comp))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003603 {
3604 if (__fs)
3605 return;
3606 __last = __i;
3607 continue;
3608 }
3609 else
3610 {
3611 if (__fs)
3612 {
3613 __first = ++__i;
3614 continue;
3615 }
3616 }
3617 }
3618 // sort smaller range with recursive call and larger with tail recursion elimination
3619 if (__i - __first < __last - __i)
3620 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003621 _VSTD::__sort<_Compare>(__first, __i, __comp);
3622 // _VSTD::__sort<_Compare>(__i+1, __last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003623 __first = ++__i;
3624 }
3625 else
3626 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003627 _VSTD::__sort<_Compare>(__i+1, __last, __comp);
3628 // _VSTD::__sort<_Compare>(__first, __i, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003629 __last = __i;
3630 }
3631 }
3632}
3633
3634// This forwarder keeps the top call and the recursive calls using the same instantiation, forcing a reference _Compare
3635template <class _RandomAccessIterator, class _Compare>
3636inline _LIBCPP_INLINE_VISIBILITY
3637void
3638sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3639{
Howard Hinnant7a563db2011-09-14 18:33:51 +00003640#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003641 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3642 __debug_less<_Compare> __c(__comp);
3643 __sort<_Comp_ref>(__first, __last, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00003644#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003645 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3646 __sort<_Comp_ref>(__first, __last, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00003647#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003648}
3649
3650template <class _RandomAccessIterator>
3651inline _LIBCPP_INLINE_VISIBILITY
3652void
3653sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
3654{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003655 _VSTD::sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003656}
3657
3658template <class _Tp>
3659inline _LIBCPP_INLINE_VISIBILITY
3660void
3661sort(_Tp** __first, _Tp** __last)
3662{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003663 _VSTD::sort((size_t*)__first, (size_t*)__last, __less<size_t>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003664}
3665
3666template <class _Tp>
3667inline _LIBCPP_INLINE_VISIBILITY
3668void
3669sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last)
3670{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003671 _VSTD::sort(__first.base(), __last.base());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003672}
3673
Howard Hinnant7a563db2011-09-14 18:33:51 +00003674template <class _Tp, class _Compare>
3675inline _LIBCPP_INLINE_VISIBILITY
3676void
3677sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last, _Compare __comp)
3678{
3679 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3680 _VSTD::sort<_Tp*, _Comp_ref>(__first.base(), __last.base(), __comp);
3681}
3682
Howard Hinnant78b68282011-10-22 20:59:45 +00003683#ifdef _MSC_VER
3684#pragma warning( push )
3685#pragma warning( disable: 4231)
3686#endif // _MSC_VER
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003687extern template void __sort<__less<char>&, char*>(char*, char*, __less<char>&);
3688extern template void __sort<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&);
3689extern template void __sort<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&);
3690extern template void __sort<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&);
3691extern template void __sort<__less<short>&, short*>(short*, short*, __less<short>&);
3692extern template void __sort<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&);
3693extern template void __sort<__less<int>&, int*>(int*, int*, __less<int>&);
3694extern template void __sort<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&);
3695extern template void __sort<__less<long>&, long*>(long*, long*, __less<long>&);
3696extern template void __sort<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&);
3697extern template void __sort<__less<long long>&, long long*>(long long*, long long*, __less<long long>&);
3698extern template void __sort<__less<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned long long>&);
3699extern template void __sort<__less<float>&, float*>(float*, float*, __less<float>&);
3700extern template void __sort<__less<double>&, double*>(double*, double*, __less<double>&);
3701extern template void __sort<__less<long double>&, long double*>(long double*, long double*, __less<long double>&);
3702
3703extern template bool __insertion_sort_incomplete<__less<char>&, char*>(char*, char*, __less<char>&);
3704extern template bool __insertion_sort_incomplete<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&);
3705extern template bool __insertion_sort_incomplete<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&);
3706extern template bool __insertion_sort_incomplete<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&);
3707extern template bool __insertion_sort_incomplete<__less<short>&, short*>(short*, short*, __less<short>&);
3708extern template bool __insertion_sort_incomplete<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&);
3709extern template bool __insertion_sort_incomplete<__less<int>&, int*>(int*, int*, __less<int>&);
3710extern template bool __insertion_sort_incomplete<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&);
3711extern template bool __insertion_sort_incomplete<__less<long>&, long*>(long*, long*, __less<long>&);
3712extern template bool __insertion_sort_incomplete<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&);
3713extern template bool __insertion_sort_incomplete<__less<long long>&, long long*>(long long*, long long*, __less<long long>&);
3714extern template bool __insertion_sort_incomplete<__less<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned long long>&);
3715extern template bool __insertion_sort_incomplete<__less<float>&, float*>(float*, float*, __less<float>&);
3716extern template bool __insertion_sort_incomplete<__less<double>&, double*>(double*, double*, __less<double>&);
3717extern template bool __insertion_sort_incomplete<__less<long double>&, long double*>(long double*, long double*, __less<long double>&);
3718
3719extern 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 +00003720#ifdef _MSC_VER
3721#pragma warning( pop )
3722#endif _MSC_VER
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003723
3724// lower_bound
3725
3726template <class _Compare, class _ForwardIterator, class _Tp>
3727_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00003728__lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003729{
3730 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003731 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003732 while (__len != 0)
3733 {
3734 difference_type __l2 = __len / 2;
3735 _ForwardIterator __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003736 _VSTD::advance(__m, __l2);
Howard Hinnant78b68282011-10-22 20:59:45 +00003737 if (__comp(*__m, __value_))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003738 {
3739 __first = ++__m;
3740 __len -= __l2 + 1;
3741 }
3742 else
3743 __len = __l2;
3744 }
3745 return __first;
3746}
3747
3748template <class _ForwardIterator, class _Tp, class _Compare>
3749inline _LIBCPP_INLINE_VISIBILITY
3750_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00003751lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003752{
Howard Hinnant7a563db2011-09-14 18:33:51 +00003753#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003754 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3755 __debug_less<_Compare> __c(__comp);
Howard Hinnant78b68282011-10-22 20:59:45 +00003756 return __lower_bound<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00003757#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003758 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnant78b68282011-10-22 20:59:45 +00003759 return __lower_bound<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00003760#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003761}
3762
3763template <class _ForwardIterator, class _Tp>
3764inline _LIBCPP_INLINE_VISIBILITY
3765_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00003766lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003767{
Howard Hinnant78b68282011-10-22 20:59:45 +00003768 return _VSTD::lower_bound(__first, __last, __value_,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003769 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
3770}
3771
3772// upper_bound
3773
3774template <class _Compare, class _ForwardIterator, class _Tp>
3775_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00003776__upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003777{
3778 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003779 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003780 while (__len != 0)
3781 {
3782 difference_type __l2 = __len / 2;
3783 _ForwardIterator __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003784 _VSTD::advance(__m, __l2);
Howard Hinnant78b68282011-10-22 20:59:45 +00003785 if (__comp(__value_, *__m))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003786 __len = __l2;
3787 else
3788 {
3789 __first = ++__m;
3790 __len -= __l2 + 1;
3791 }
3792 }
3793 return __first;
3794}
3795
3796template <class _ForwardIterator, class _Tp, class _Compare>
3797inline _LIBCPP_INLINE_VISIBILITY
3798_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00003799upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003800{
Howard Hinnant7a563db2011-09-14 18:33:51 +00003801#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003802 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3803 __debug_less<_Compare> __c(__comp);
Howard Hinnant78b68282011-10-22 20:59:45 +00003804 return __upper_bound<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00003805#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003806 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnant78b68282011-10-22 20:59:45 +00003807 return __upper_bound<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00003808#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003809}
3810
3811template <class _ForwardIterator, class _Tp>
3812inline _LIBCPP_INLINE_VISIBILITY
3813_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00003814upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003815{
Howard Hinnant78b68282011-10-22 20:59:45 +00003816 return _VSTD::upper_bound(__first, __last, __value_,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003817 __less<_Tp, typename iterator_traits<_ForwardIterator>::value_type>());
3818}
3819
3820// equal_range
3821
3822template <class _Compare, class _ForwardIterator, class _Tp>
3823pair<_ForwardIterator, _ForwardIterator>
Howard Hinnant78b68282011-10-22 20:59:45 +00003824__equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003825{
3826 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003827 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003828 while (__len != 0)
3829 {
3830 difference_type __l2 = __len / 2;
3831 _ForwardIterator __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003832 _VSTD::advance(__m, __l2);
Howard Hinnant78b68282011-10-22 20:59:45 +00003833 if (__comp(*__m, __value_))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003834 {
3835 __first = ++__m;
3836 __len -= __l2 + 1;
3837 }
Howard Hinnant78b68282011-10-22 20:59:45 +00003838 else if (__comp(__value_, *__m))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003839 {
3840 __last = __m;
3841 __len = __l2;
3842 }
3843 else
3844 {
3845 _ForwardIterator __mp1 = __m;
3846 return pair<_ForwardIterator, _ForwardIterator>
3847 (
Howard Hinnant78b68282011-10-22 20:59:45 +00003848 __lower_bound<_Compare>(__first, __m, __value_, __comp),
3849 __upper_bound<_Compare>(++__mp1, __last, __value_, __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003850 );
3851 }
3852 }
3853 return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
3854}
3855
3856template <class _ForwardIterator, class _Tp, class _Compare>
3857inline _LIBCPP_INLINE_VISIBILITY
3858pair<_ForwardIterator, _ForwardIterator>
Howard Hinnant78b68282011-10-22 20:59:45 +00003859equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003860{
Howard Hinnant7a563db2011-09-14 18:33:51 +00003861#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003862 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3863 __debug_less<_Compare> __c(__comp);
Howard Hinnant78b68282011-10-22 20:59:45 +00003864 return __equal_range<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00003865#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003866 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnant78b68282011-10-22 20:59:45 +00003867 return __equal_range<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00003868#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003869}
3870
3871template <class _ForwardIterator, class _Tp>
3872inline _LIBCPP_INLINE_VISIBILITY
3873pair<_ForwardIterator, _ForwardIterator>
Howard Hinnant78b68282011-10-22 20:59:45 +00003874equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003875{
Howard Hinnant78b68282011-10-22 20:59:45 +00003876 return _VSTD::equal_range(__first, __last, __value_,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003877 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
3878}
3879
3880// binary_search
3881
3882template <class _Compare, class _ForwardIterator, class _Tp>
3883inline _LIBCPP_INLINE_VISIBILITY
3884bool
Howard Hinnant78b68282011-10-22 20:59:45 +00003885__binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003886{
Howard Hinnant78b68282011-10-22 20:59:45 +00003887 __first = __lower_bound<_Compare>(__first, __last, __value_, __comp);
3888 return __first != __last && !__comp(__value_, *__first);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003889}
3890
3891template <class _ForwardIterator, class _Tp, class _Compare>
3892inline _LIBCPP_INLINE_VISIBILITY
3893bool
Howard Hinnant78b68282011-10-22 20:59:45 +00003894binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003895{
Howard Hinnant7a563db2011-09-14 18:33:51 +00003896#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003897 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3898 __debug_less<_Compare> __c(__comp);
Howard Hinnant78b68282011-10-22 20:59:45 +00003899 return __binary_search<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00003900#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003901 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnant78b68282011-10-22 20:59:45 +00003902 return __binary_search<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00003903#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003904}
3905
3906template <class _ForwardIterator, class _Tp>
3907inline _LIBCPP_INLINE_VISIBILITY
3908bool
Howard Hinnant78b68282011-10-22 20:59:45 +00003909binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003910{
Howard Hinnant78b68282011-10-22 20:59:45 +00003911 return _VSTD::binary_search(__first, __last, __value_,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003912 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
3913}
3914
3915// merge
3916
3917template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
3918_OutputIterator
3919__merge(_InputIterator1 __first1, _InputIterator1 __last1,
3920 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
3921{
3922 for (; __first1 != __last1; ++__result)
3923 {
3924 if (__first2 == __last2)
Howard Hinnant0949eed2011-06-30 21:18:19 +00003925 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003926 if (__comp(*__first2, *__first1))
3927 {
3928 *__result = *__first2;
3929 ++__first2;
3930 }
3931 else
3932 {
3933 *__result = *__first1;
3934 ++__first1;
3935 }
3936 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00003937 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003938}
3939
3940template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
3941inline _LIBCPP_INLINE_VISIBILITY
3942_OutputIterator
3943merge(_InputIterator1 __first1, _InputIterator1 __last1,
3944 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
3945{
Howard Hinnant7a563db2011-09-14 18:33:51 +00003946#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003947 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3948 __debug_less<_Compare> __c(__comp);
Howard Hinnant0949eed2011-06-30 21:18:19 +00003949 return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00003950#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003951 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003952 return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00003953#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003954}
3955
3956template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
3957inline _LIBCPP_INLINE_VISIBILITY
3958_OutputIterator
3959merge(_InputIterator1 __first1, _InputIterator1 __last1,
3960 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
3961{
3962 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
3963 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
3964 return merge(__first1, __last1, __first2, __last2, __result, __less<__v1, __v2>());
3965}
3966
3967// inplace_merge
3968
3969template <class _Compare, class _BidirectionalIterator>
3970void
3971__buffered_inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
3972 _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1,
3973 typename iterator_traits<_BidirectionalIterator>::difference_type __len2,
3974 typename iterator_traits<_BidirectionalIterator>::value_type* __buff)
3975{
3976 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3977 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
3978 typedef typename iterator_traits<_BidirectionalIterator>::pointer pointer;
3979 __destruct_n __d(0);
3980 unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
3981 if (__len1 <= __len2)
3982 {
3983 value_type* __p = __buff;
3984 for (_BidirectionalIterator __i = __first; __i != __middle; __d.__incr((value_type*)0), ++__i, ++__p)
Howard Hinnant0949eed2011-06-30 21:18:19 +00003985 ::new(__p) value_type(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003986 __merge<_Compare>(move_iterator<value_type*>(__buff),
3987 move_iterator<value_type*>(__p),
3988 move_iterator<_BidirectionalIterator>(__middle),
3989 move_iterator<_BidirectionalIterator>(__last),
3990 __first, __comp);
3991 }
3992 else
3993 {
3994 value_type* __p = __buff;
3995 for (_BidirectionalIterator __i = __middle; __i != __last; __d.__incr((value_type*)0), ++__i, ++__p)
Howard Hinnant0949eed2011-06-30 21:18:19 +00003996 ::new(__p) value_type(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003997 typedef reverse_iterator<_BidirectionalIterator> _RBi;
3998 typedef reverse_iterator<value_type*> _Rv;
3999 __merge(move_iterator<_RBi>(_RBi(__middle)), move_iterator<_RBi>(_RBi(__first)),
4000 move_iterator<_Rv>(_Rv(__p)), move_iterator<_Rv>(_Rv(__buff)),
4001 _RBi(__last), __negate<_Compare>(__comp));
4002 }
4003}
4004
4005template <class _Compare, class _BidirectionalIterator>
4006void
4007__inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4008 _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1,
4009 typename iterator_traits<_BidirectionalIterator>::difference_type __len2,
4010 typename iterator_traits<_BidirectionalIterator>::value_type* __buff, ptrdiff_t __buff_size)
4011{
4012 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
4013 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
4014 while (true)
4015 {
4016 // if __middle == __last, we're done
4017 if (__len2 == 0)
4018 return;
4019 // shrink [__first, __middle) as much as possible (with no moves), returning if it shrinks to 0
4020 for (; true; ++__first, --__len1)
4021 {
4022 if (__len1 == 0)
4023 return;
4024 if (__comp(*__middle, *__first))
4025 break;
4026 }
4027 if (__len1 <= __buff_size || __len2 <= __buff_size)
4028 {
4029 __buffered_inplace_merge<_Compare>(__first, __middle, __last, __comp, __len1, __len2, __buff);
4030 return;
4031 }
4032 // __first < __middle < __last
4033 // *__first > *__middle
4034 // partition [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last) such that
4035 // all elements in:
4036 // [__first, __m1) <= [__middle, __m2)
4037 // [__middle, __m2) < [__m1, __middle)
4038 // [__m1, __middle) <= [__m2, __last)
4039 // and __m1 or __m2 is in the middle of its range
4040 _BidirectionalIterator __m1; // "median" of [__first, __middle)
4041 _BidirectionalIterator __m2; // "median" of [__middle, __last)
4042 difference_type __len11; // distance(__first, __m1)
4043 difference_type __len21; // distance(__middle, __m2)
4044 // binary search smaller range
4045 if (__len1 < __len2)
4046 { // __len >= 1, __len2 >= 2
4047 __len21 = __len2 / 2;
4048 __m2 = __middle;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004049 _VSTD::advance(__m2, __len21);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004050 __m1 = __upper_bound<_Compare>(__first, __middle, *__m2, __comp);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004051 __len11 = _VSTD::distance(__first, __m1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004052 }
4053 else
4054 {
4055 if (__len1 == 1)
4056 { // __len1 >= __len2 && __len2 > 0, therefore __len2 == 1
4057 // It is known *__first > *__middle
4058 swap(*__first, *__middle);
4059 return;
4060 }
4061 // __len1 >= 2, __len2 >= 1
4062 __len11 = __len1 / 2;
4063 __m1 = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004064 _VSTD::advance(__m1, __len11);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004065 __m2 = __lower_bound<_Compare>(__middle, __last, *__m1, __comp);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004066 __len21 = _VSTD::distance(__middle, __m2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004067 }
4068 difference_type __len12 = __len1 - __len11; // distance(__m1, __middle)
4069 difference_type __len22 = __len2 - __len21; // distance(__m2, __last)
4070 // [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last)
4071 // swap middle two partitions
Howard Hinnant0949eed2011-06-30 21:18:19 +00004072 __middle = _VSTD::rotate(__m1, __middle, __m2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004073 // __len12 and __len21 now have swapped meanings
4074 // merge smaller range with recurisve call and larger with tail recursion elimination
4075 if (__len11 + __len21 < __len12 + __len22)
4076 {
4077 __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size);
4078// __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size);
4079 __first = __middle;
4080 __middle = __m2;
4081 __len1 = __len12;
4082 __len2 = __len22;
4083 }
4084 else
4085 {
4086 __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size);
4087// __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size);
4088 __last = __middle;
4089 __middle = __m1;
4090 __len1 = __len11;
4091 __len2 = __len21;
4092 }
4093 }
4094}
4095
4096template <class _Tp>
4097struct __inplace_merge_switch
4098{
Howard Hinnant1468b662010-11-19 22:17:28 +00004099 static const unsigned value = is_trivially_copy_assignable<_Tp>::value;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004100};
4101
4102template <class _BidirectionalIterator, class _Compare>
4103inline _LIBCPP_INLINE_VISIBILITY
4104void
4105inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4106 _Compare __comp)
4107{
4108 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
4109 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004110 difference_type __len1 = _VSTD::distance(__first, __middle);
4111 difference_type __len2 = _VSTD::distance(__middle, __last);
4112 difference_type __buf_size = _VSTD::min(__len1, __len2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004113 pair<value_type*, ptrdiff_t> __buf(0, 0);
4114 unique_ptr<value_type, __return_temporary_buffer> __h;
4115 if (__inplace_merge_switch<value_type>::value && __buf_size > 8)
4116 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004117 __buf = _VSTD::get_temporary_buffer<value_type>(__buf_size);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004118 __h.reset(__buf.first);
4119 }
Howard Hinnant7a563db2011-09-14 18:33:51 +00004120#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004121 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4122 __debug_less<_Compare> __c(__comp);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004123 return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __c, __len1, __len2,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004124 __buf.first, __buf.second);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004125#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004126 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004127 return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __comp, __len1, __len2,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004128 __buf.first, __buf.second);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004129#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004130}
4131
4132template <class _BidirectionalIterator>
4133inline _LIBCPP_INLINE_VISIBILITY
4134void
4135inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last)
4136{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004137 _VSTD::inplace_merge(__first, __middle, __last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004138 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
4139}
4140
4141// stable_sort
4142
4143template <class _Compare, class _InputIterator1, class _InputIterator2>
4144void
4145__merge_move_construct(_InputIterator1 __first1, _InputIterator1 __last1,
4146 _InputIterator2 __first2, _InputIterator2 __last2,
4147 typename iterator_traits<_InputIterator1>::value_type* __result, _Compare __comp)
4148{
4149 typedef typename iterator_traits<_InputIterator1>::value_type value_type;
4150 __destruct_n __d(0);
4151 unique_ptr<value_type, __destruct_n&> __h(__result, __d);
4152 for (; true; ++__result)
4153 {
4154 if (__first1 == __last1)
4155 {
4156 for (; __first2 != __last2; ++__first2, ++__result, __d.__incr((value_type*)0))
Howard Hinnant0949eed2011-06-30 21:18:19 +00004157 ::new (__result) value_type(_VSTD::move(*__first2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004158 __h.release();
4159 return;
4160 }
4161 if (__first2 == __last2)
4162 {
4163 for (; __first1 != __last1; ++__first1, ++__result, __d.__incr((value_type*)0))
Howard Hinnant0949eed2011-06-30 21:18:19 +00004164 ::new (__result) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004165 __h.release();
4166 return;
4167 }
4168 if (__comp(*__first2, *__first1))
4169 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004170 ::new (__result) value_type(_VSTD::move(*__first2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004171 __d.__incr((value_type*)0);
4172 ++__first2;
4173 }
4174 else
4175 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004176 ::new (__result) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004177 __d.__incr((value_type*)0);
4178 ++__first1;
4179 }
4180 }
4181}
4182
4183template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4184void
4185__merge_move_assign(_InputIterator1 __first1, _InputIterator1 __last1,
4186 _InputIterator2 __first2, _InputIterator2 __last2,
4187 _OutputIterator __result, _Compare __comp)
4188{
4189 for (; __first1 != __last1; ++__result)
4190 {
4191 if (__first2 == __last2)
4192 {
4193 for (; __first1 != __last1; ++__first1, ++__result)
Howard Hinnant0949eed2011-06-30 21:18:19 +00004194 *__result = _VSTD::move(*__first1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004195 return;
4196 }
4197 if (__comp(*__first2, *__first1))
4198 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004199 *__result = _VSTD::move(*__first2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004200 ++__first2;
4201 }
4202 else
4203 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004204 *__result = _VSTD::move(*__first1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004205 ++__first1;
4206 }
4207 }
4208 for (; __first2 != __last2; ++__first2, ++__result)
Howard Hinnant0949eed2011-06-30 21:18:19 +00004209 *__result = _VSTD::move(*__first2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004210}
4211
4212template <class _Compare, class _RandomAccessIterator>
4213void
4214__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4215 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4216 typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size);
4217
4218template <class _Compare, class _RandomAccessIterator>
4219void
4220__stable_sort_move(_RandomAccessIterator __first1, _RandomAccessIterator __last1, _Compare __comp,
4221 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4222 typename iterator_traits<_RandomAccessIterator>::value_type* __first2)
4223{
4224 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4225 switch (__len)
4226 {
4227 case 0:
4228 return;
4229 case 1:
Howard Hinnant0949eed2011-06-30 21:18:19 +00004230 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004231 return;
4232 case 2:
4233 __destruct_n __d(0);
4234 unique_ptr<value_type, __destruct_n&> __h2(__first2, __d);
4235 if (__comp(*--__last1, *__first1))
4236 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004237 ::new(__first2) value_type(_VSTD::move(*__last1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004238 __d.__incr((value_type*)0);
4239 ++__first2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004240 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004241 }
4242 else
4243 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004244 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004245 __d.__incr((value_type*)0);
4246 ++__first2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004247 ::new(__first2) value_type(_VSTD::move(*__last1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004248 }
4249 __h2.release();
4250 return;
4251 }
4252 if (__len <= 8)
4253 {
4254 __insertion_sort_move<_Compare>(__first1, __last1, __first2, __comp);
4255 return;
4256 }
4257 typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2;
4258 _RandomAccessIterator __m = __first1 + __l2;
4259 __stable_sort<_Compare>(__first1, __m, __comp, __l2, __first2, __l2);
4260 __stable_sort<_Compare>(__m, __last1, __comp, __len - __l2, __first2 + __l2, __len - __l2);
4261 __merge_move_construct<_Compare>(__first1, __m, __m, __last1, __first2, __comp);
4262}
4263
4264template <class _Tp>
4265struct __stable_sort_switch
4266{
Howard Hinnant1468b662010-11-19 22:17:28 +00004267 static const unsigned value = 128*is_trivially_copy_assignable<_Tp>::value;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004268};
4269
4270template <class _Compare, class _RandomAccessIterator>
4271void
4272__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4273 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4274 typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size)
4275{
4276 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4277 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4278 switch (__len)
4279 {
4280 case 0:
4281 case 1:
4282 return;
4283 case 2:
4284 if (__comp(*--__last, *__first))
4285 swap(*__first, *__last);
4286 return;
4287 }
4288 if (__len <= static_cast<difference_type>(__stable_sort_switch<value_type>::value))
4289 {
4290 __insertion_sort<_Compare>(__first, __last, __comp);
4291 return;
4292 }
4293 typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2;
4294 _RandomAccessIterator __m = __first + __l2;
4295 if (__len <= __buff_size)
4296 {
4297 __destruct_n __d(0);
4298 unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
4299 __stable_sort_move<_Compare>(__first, __m, __comp, __l2, __buff);
4300 __d.__set(__l2, (value_type*)0);
4301 __stable_sort_move<_Compare>(__m, __last, __comp, __len - __l2, __buff + __l2);
4302 __d.__set(__len, (value_type*)0);
4303 __merge_move_assign<_Compare>(__buff, __buff + __l2, __buff + __l2, __buff + __len, __first, __comp);
4304// __merge<_Compare>(move_iterator<value_type*>(__buff),
4305// move_iterator<value_type*>(__buff + __l2),
4306// move_iterator<_RandomAccessIterator>(__buff + __l2),
4307// move_iterator<_RandomAccessIterator>(__buff + __len),
4308// __first, __comp);
4309 return;
4310 }
4311 __stable_sort<_Compare>(__first, __m, __comp, __l2, __buff, __buff_size);
4312 __stable_sort<_Compare>(__m, __last, __comp, __len - __l2, __buff, __buff_size);
4313 __inplace_merge<_Compare>(__first, __m, __last, __comp, __l2, __len - __l2, __buff, __buff_size);
4314}
4315
4316template <class _RandomAccessIterator, class _Compare>
4317inline _LIBCPP_INLINE_VISIBILITY
4318void
4319stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4320{
4321 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4322 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4323 difference_type __len = __last - __first;
4324 pair<value_type*, ptrdiff_t> __buf(0, 0);
4325 unique_ptr<value_type, __return_temporary_buffer> __h;
4326 if (__len > static_cast<difference_type>(__stable_sort_switch<value_type>::value))
4327 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004328 __buf = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004329 __h.reset(__buf.first);
4330 }
Howard Hinnant7a563db2011-09-14 18:33:51 +00004331#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004332 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4333 __debug_less<_Compare> __c(__comp);
4334 __stable_sort<_Comp_ref>(__first, __last, __c, __len, __buf.first, __buf.second);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004335#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004336 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4337 __stable_sort<_Comp_ref>(__first, __last, __comp, __len, __buf.first, __buf.second);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004338#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004339}
4340
4341template <class _RandomAccessIterator>
4342inline _LIBCPP_INLINE_VISIBILITY
4343void
4344stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
4345{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004346 _VSTD::stable_sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004347}
4348
4349// is_heap_until
4350
4351template <class _RandomAccessIterator, class _Compare>
4352_RandomAccessIterator
4353is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4354{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004355 typedef typename _VSTD::iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004356 difference_type __len = __last - __first;
4357 difference_type __p = 0;
4358 difference_type __c = 1;
4359 _RandomAccessIterator __pp = __first;
4360 while (__c < __len)
4361 {
4362 _RandomAccessIterator __cp = __first + __c;
4363 if (__comp(*__pp, *__cp))
4364 return __cp;
4365 ++__c;
4366 ++__cp;
4367 if (__c == __len)
4368 return __last;
4369 if (__comp(*__pp, *__cp))
4370 return __cp;
4371 ++__p;
4372 ++__pp;
4373 __c = 2 * __p + 1;
4374 }
4375 return __last;
4376}
4377
Howard Hinnant324bb032010-08-22 00:02:43 +00004378template<class _RandomAccessIterator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004379inline _LIBCPP_INLINE_VISIBILITY
4380_RandomAccessIterator
4381is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last)
4382{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004383 return _VSTD::is_heap_until(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004384}
4385
4386// is_heap
4387
4388template <class _RandomAccessIterator, class _Compare>
4389inline _LIBCPP_INLINE_VISIBILITY
4390bool
4391is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4392{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004393 return _VSTD::is_heap_until(__first, __last, __comp) == __last;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004394}
4395
Howard Hinnant324bb032010-08-22 00:02:43 +00004396template<class _RandomAccessIterator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004397inline _LIBCPP_INLINE_VISIBILITY
4398bool
4399is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4400{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004401 return _VSTD::is_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004402}
4403
4404// push_heap
4405
4406template <class _Compare, class _RandomAccessIterator>
4407void
4408__push_heap_front(_RandomAccessIterator __first, _RandomAccessIterator, _Compare __comp,
4409 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
4410{
4411 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4412 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4413 if (__len > 1)
4414 {
4415 difference_type __p = 0;
4416 _RandomAccessIterator __pp = __first;
4417 difference_type __c = 2;
4418 _RandomAccessIterator __cp = __first + __c;
4419 if (__c == __len || __comp(*__cp, *(__cp - 1)))
4420 {
4421 --__c;
4422 --__cp;
4423 }
4424 if (__comp(*__pp, *__cp))
4425 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004426 value_type __t(_VSTD::move(*__pp));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004427 do
4428 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004429 *__pp = _VSTD::move(*__cp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004430 __pp = __cp;
4431 __p = __c;
4432 __c = (__p + 1) * 2;
4433 if (__c > __len)
4434 break;
4435 __cp = __first + __c;
4436 if (__c == __len || __comp(*__cp, *(__cp - 1)))
4437 {
4438 --__c;
4439 --__cp;
4440 }
4441 } while (__comp(__t, *__cp));
Howard Hinnant0949eed2011-06-30 21:18:19 +00004442 *__pp = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004443 }
4444 }
4445}
4446
4447template <class _Compare, class _RandomAccessIterator>
4448void
4449__push_heap_back(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4450 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
4451{
4452 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4453 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4454 if (__len > 1)
4455 {
4456 __len = (__len - 2) / 2;
4457 _RandomAccessIterator __ptr = __first + __len;
4458 if (__comp(*__ptr, *--__last))
4459 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004460 value_type __t(_VSTD::move(*__last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004461 do
4462 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004463 *__last = _VSTD::move(*__ptr);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004464 __last = __ptr;
4465 if (__len == 0)
4466 break;
4467 __len = (__len - 1) / 2;
4468 __ptr = __first + __len;
4469 } while (__comp(*__ptr, __t));
Howard Hinnant0949eed2011-06-30 21:18:19 +00004470 *__last = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004471 }
4472 }
4473}
4474
4475template <class _RandomAccessIterator, class _Compare>
4476inline _LIBCPP_INLINE_VISIBILITY
4477void
4478push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4479{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004480#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004481 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4482 __debug_less<_Compare> __c(__comp);
4483 __push_heap_back<_Comp_ref>(__first, __last, __c, __last - __first);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004484#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004485 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4486 __push_heap_back<_Comp_ref>(__first, __last, __comp, __last - __first);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004487#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004488}
4489
4490template <class _RandomAccessIterator>
4491inline _LIBCPP_INLINE_VISIBILITY
4492void
4493push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4494{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004495 _VSTD::push_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004496}
4497
4498// pop_heap
4499
4500template <class _Compare, class _RandomAccessIterator>
4501inline _LIBCPP_INLINE_VISIBILITY
4502void
4503__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4504 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
4505{
4506 if (__len > 1)
4507 {
4508 swap(*__first, *--__last);
4509 __push_heap_front<_Compare>(__first, __last, __comp, __len-1);
4510 }
4511}
4512
4513template <class _RandomAccessIterator, class _Compare>
4514inline _LIBCPP_INLINE_VISIBILITY
4515void
4516pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4517{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004518#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004519 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4520 __debug_less<_Compare> __c(__comp);
4521 __pop_heap<_Comp_ref>(__first, __last, __c, __last - __first);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004522#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004523 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4524 __pop_heap<_Comp_ref>(__first, __last, __comp, __last - __first);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004525#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004526}
4527
4528template <class _RandomAccessIterator>
4529inline _LIBCPP_INLINE_VISIBILITY
4530void
4531pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4532{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004533 _VSTD::pop_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004534}
4535
4536// make_heap
4537
4538template <class _Compare, class _RandomAccessIterator>
4539void
4540__make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4541{
4542 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4543 difference_type __n = __last - __first;
4544 if (__n > 1)
4545 {
4546 __last = __first;
4547 ++__last;
4548 for (difference_type __i = 1; __i < __n;)
4549 __push_heap_back<_Compare>(__first, ++__last, __comp, ++__i);
4550 }
4551}
4552
4553template <class _RandomAccessIterator, class _Compare>
4554inline _LIBCPP_INLINE_VISIBILITY
4555void
4556make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4557{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004558#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004559 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4560 __debug_less<_Compare> __c(__comp);
4561 __make_heap<_Comp_ref>(__first, __last, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004562#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004563 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4564 __make_heap<_Comp_ref>(__first, __last, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004565#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004566}
4567
4568template <class _RandomAccessIterator>
4569inline _LIBCPP_INLINE_VISIBILITY
4570void
4571make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4572{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004573 _VSTD::make_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004574}
4575
4576// sort_heap
4577
4578template <class _Compare, class _RandomAccessIterator>
4579void
4580__sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4581{
4582 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4583 for (difference_type __n = __last - __first; __n > 1; --__last, --__n)
4584 __pop_heap<_Compare>(__first, __last, __comp, __n);
4585}
4586
4587template <class _RandomAccessIterator, class _Compare>
4588inline _LIBCPP_INLINE_VISIBILITY
4589void
4590sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4591{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004592#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004593 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4594 __debug_less<_Compare> __c(__comp);
4595 __sort_heap<_Comp_ref>(__first, __last, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004596#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004597 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4598 __sort_heap<_Comp_ref>(__first, __last, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004599#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004600}
4601
4602template <class _RandomAccessIterator>
4603inline _LIBCPP_INLINE_VISIBILITY
4604void
4605sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4606{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004607 _VSTD::sort_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004608}
4609
4610// partial_sort
4611
4612template <class _Compare, class _RandomAccessIterator>
4613void
4614__partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
4615 _Compare __comp)
4616{
4617 __make_heap<_Compare>(__first, __middle, __comp);
4618 typename iterator_traits<_RandomAccessIterator>::difference_type __len = __middle - __first;
4619 for (_RandomAccessIterator __i = __middle; __i != __last; ++__i)
4620 {
4621 if (__comp(*__i, *__first))
4622 {
4623 swap(*__i, *__first);
4624 __push_heap_front<_Compare>(__first, __middle, __comp, __len);
4625 }
4626 }
4627 __sort_heap<_Compare>(__first, __middle, __comp);
4628}
4629
4630template <class _RandomAccessIterator, class _Compare>
4631inline _LIBCPP_INLINE_VISIBILITY
4632void
4633partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
4634 _Compare __comp)
4635{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004636#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004637 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4638 __debug_less<_Compare> __c(__comp);
4639 __partial_sort<_Comp_ref>(__first, __middle, __last, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004640#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004641 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4642 __partial_sort<_Comp_ref>(__first, __middle, __last, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004643#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004644}
4645
4646template <class _RandomAccessIterator>
4647inline _LIBCPP_INLINE_VISIBILITY
4648void
4649partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last)
4650{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004651 _VSTD::partial_sort(__first, __middle, __last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004652 __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4653}
4654
4655// partial_sort_copy
4656
4657template <class _Compare, class _InputIterator, class _RandomAccessIterator>
4658_RandomAccessIterator
4659__partial_sort_copy(_InputIterator __first, _InputIterator __last,
4660 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp)
4661{
4662 _RandomAccessIterator __r = __result_first;
4663 if (__r != __result_last)
4664 {
4665 typename iterator_traits<_RandomAccessIterator>::difference_type __len = 0;
4666 for (; __first != __last && __r != __result_last; ++__first, ++__r, ++__len)
4667 *__r = *__first;
4668 __make_heap<_Compare>(__result_first, __r, __comp);
4669 for (; __first != __last; ++__first)
4670 if (__comp(*__first, *__result_first))
4671 {
4672 *__result_first = *__first;
4673 __push_heap_front<_Compare>(__result_first, __r, __comp, __len);
4674 }
4675 __sort_heap<_Compare>(__result_first, __r, __comp);
4676 }
4677 return __r;
4678}
4679
4680template <class _InputIterator, class _RandomAccessIterator, class _Compare>
4681inline _LIBCPP_INLINE_VISIBILITY
4682_RandomAccessIterator
4683partial_sort_copy(_InputIterator __first, _InputIterator __last,
4684 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp)
4685{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004686#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004687 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4688 __debug_less<_Compare> __c(__comp);
4689 return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004690#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004691 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4692 return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004693#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004694}
4695
4696template <class _InputIterator, class _RandomAccessIterator>
4697inline _LIBCPP_INLINE_VISIBILITY
4698_RandomAccessIterator
4699partial_sort_copy(_InputIterator __first, _InputIterator __last,
4700 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last)
4701{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004702 return _VSTD::partial_sort_copy(__first, __last, __result_first, __result_last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004703 __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4704}
4705
4706// nth_element
4707
4708template <class _Compare, class _RandomAccessIterator>
4709void
4710__nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
4711{
4712 // _Compare is known to be a reference type
4713 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4714 const difference_type __limit = 7;
4715 while (true)
4716 {
4717 __restart:
4718 difference_type __len = __last - __first;
4719 switch (__len)
4720 {
4721 case 0:
4722 case 1:
4723 return;
4724 case 2:
4725 if (__comp(*--__last, *__first))
4726 swap(*__first, *__last);
4727 return;
4728 case 3:
4729 {
4730 _RandomAccessIterator __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004731 _VSTD::__sort3<_Compare>(__first, ++__m, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004732 return;
4733 }
4734 }
4735 if (__len <= __limit)
4736 {
4737 __selection_sort<_Compare>(__first, __last, __comp);
4738 return;
4739 }
4740 // __len > __limit >= 3
4741 _RandomAccessIterator __m = __first + __len/2;
4742 _RandomAccessIterator __lm1 = __last;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004743 unsigned __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, --__lm1, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004744 // *__m is median
4745 // partition [__first, __m) < *__m and *__m <= [__m, __last)
4746 // (this inhibits tossing elements equivalent to __m around unnecessarily)
4747 _RandomAccessIterator __i = __first;
4748 _RandomAccessIterator __j = __lm1;
4749 // j points beyond range to be tested, *__lm1 is known to be <= *__m
4750 // The search going up is known to be guarded but the search coming down isn't.
4751 // Prime the downward search with a guard.
4752 if (!__comp(*__i, *__m)) // if *__first == *__m
4753 {
4754 // *__first == *__m, *__first doesn't go in first part
4755 // manually guard downward moving __j against __i
4756 while (true)
4757 {
4758 if (__i == --__j)
4759 {
4760 // *__first == *__m, *__m <= all other elements
4761 // Parition instead into [__first, __i) == *__first and *__first < [__i, __last)
4762 ++__i; // __first + 1
4763 __j = __last;
4764 if (!__comp(*__first, *--__j)) // we need a guard if *__first == *(__last-1)
4765 {
4766 while (true)
4767 {
4768 if (__i == __j)
4769 return; // [__first, __last) all equivalent elements
4770 if (__comp(*__first, *__i))
4771 {
4772 swap(*__i, *__j);
4773 ++__n_swaps;
4774 ++__i;
4775 break;
4776 }
4777 ++__i;
4778 }
4779 }
4780 // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1
4781 if (__i == __j)
4782 return;
4783 while (true)
4784 {
4785 while (!__comp(*__first, *__i))
4786 ++__i;
4787 while (__comp(*__first, *--__j))
4788 ;
4789 if (__i >= __j)
4790 break;
4791 swap(*__i, *__j);
4792 ++__n_swaps;
4793 ++__i;
4794 }
4795 // [__first, __i) == *__first and *__first < [__i, __last)
4796 // The first part is sorted,
4797 if (__nth < __i)
4798 return;
4799 // __nth_element the secod part
4800 // __nth_element<_Compare>(__i, __nth, __last, __comp);
4801 __first = __i;
4802 goto __restart;
4803 }
4804 if (__comp(*__j, *__m))
4805 {
4806 swap(*__i, *__j);
4807 ++__n_swaps;
4808 break; // found guard for downward moving __j, now use unguarded partition
4809 }
4810 }
4811 }
4812 ++__i;
4813 // j points beyond range to be tested, *__lm1 is known to be <= *__m
4814 // if not yet partitioned...
4815 if (__i < __j)
4816 {
4817 // known that *(__i - 1) < *__m
4818 while (true)
4819 {
4820 // __m still guards upward moving __i
4821 while (__comp(*__i, *__m))
4822 ++__i;
4823 // It is now known that a guard exists for downward moving __j
4824 while (!__comp(*--__j, *__m))
4825 ;
4826 if (__i >= __j)
4827 break;
4828 swap(*__i, *__j);
4829 ++__n_swaps;
4830 // It is known that __m != __j
4831 // If __m just moved, follow it
4832 if (__m == __i)
4833 __m = __j;
4834 ++__i;
4835 }
4836 }
4837 // [__first, __i) < *__m and *__m <= [__i, __last)
4838 if (__i != __m && __comp(*__m, *__i))
4839 {
4840 swap(*__i, *__m);
4841 ++__n_swaps;
4842 }
4843 // [__first, __i) < *__i and *__i <= [__i+1, __last)
4844 if (__nth == __i)
4845 return;
4846 if (__n_swaps == 0)
4847 {
4848 // We were given a perfectly partitioned sequence. Coincidence?
4849 if (__nth < __i)
4850 {
4851 // Check for [__first, __i) already sorted
4852 __j = __m = __first;
4853 while (++__j != __i)
4854 {
4855 if (__comp(*__j, *__m))
4856 // not yet sorted, so sort
4857 goto not_sorted;
4858 __m = __j;
4859 }
4860 // [__first, __i) sorted
4861 return;
4862 }
4863 else
4864 {
4865 // Check for [__i, __last) already sorted
4866 __j = __m = __i;
4867 while (++__j != __last)
4868 {
4869 if (__comp(*__j, *__m))
4870 // not yet sorted, so sort
4871 goto not_sorted;
4872 __m = __j;
4873 }
4874 // [__i, __last) sorted
4875 return;
4876 }
4877 }
4878not_sorted:
4879 // __nth_element on range containing __nth
4880 if (__nth < __i)
4881 {
4882 // __nth_element<_Compare>(__first, __nth, __i, __comp);
4883 __last = __i;
4884 }
4885 else
4886 {
4887 // __nth_element<_Compare>(__i+1, __nth, __last, __comp);
4888 __first = ++__i;
4889 }
4890 }
4891}
4892
4893template <class _RandomAccessIterator, class _Compare>
4894inline _LIBCPP_INLINE_VISIBILITY
4895void
4896nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
4897{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004898#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004899 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4900 __debug_less<_Compare> __c(__comp);
4901 __nth_element<_Comp_ref>(__first, __nth, __last, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004902#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004903 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4904 __nth_element<_Comp_ref>(__first, __nth, __last, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004905#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004906}
4907
4908template <class _RandomAccessIterator>
4909inline _LIBCPP_INLINE_VISIBILITY
4910void
4911nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last)
4912{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004913 _VSTD::nth_element(__first, __nth, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004914}
4915
4916// includes
4917
4918template <class _Compare, class _InputIterator1, class _InputIterator2>
4919bool
4920__includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
4921 _Compare __comp)
4922{
4923 for (; __first2 != __last2; ++__first1)
4924 {
4925 if (__first1 == __last1 || __comp(*__first2, *__first1))
4926 return false;
4927 if (!__comp(*__first1, *__first2))
4928 ++__first2;
4929 }
4930 return true;
4931}
4932
4933template <class _InputIterator1, class _InputIterator2, class _Compare>
4934inline _LIBCPP_INLINE_VISIBILITY
4935bool
4936includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
4937 _Compare __comp)
4938{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004939#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004940 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4941 __debug_less<_Compare> __c(__comp);
4942 return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004943#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004944 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4945 return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004946#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004947}
4948
4949template <class _InputIterator1, class _InputIterator2>
4950inline _LIBCPP_INLINE_VISIBILITY
4951bool
4952includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2)
4953{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004954 return _VSTD::includes(__first1, __last1, __first2, __last2,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004955 __less<typename iterator_traits<_InputIterator1>::value_type,
4956 typename iterator_traits<_InputIterator2>::value_type>());
4957}
4958
4959// set_union
4960
4961template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4962_OutputIterator
4963__set_union(_InputIterator1 __first1, _InputIterator1 __last1,
4964 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4965{
4966 for (; __first1 != __last1; ++__result)
4967 {
4968 if (__first2 == __last2)
Howard Hinnant0949eed2011-06-30 21:18:19 +00004969 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004970 if (__comp(*__first2, *__first1))
4971 {
4972 *__result = *__first2;
4973 ++__first2;
4974 }
4975 else
4976 {
4977 *__result = *__first1;
4978 if (!__comp(*__first1, *__first2))
4979 ++__first2;
4980 ++__first1;
4981 }
4982 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00004983 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004984}
4985
4986template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
4987inline _LIBCPP_INLINE_VISIBILITY
4988_OutputIterator
4989set_union(_InputIterator1 __first1, _InputIterator1 __last1,
4990 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4991{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004992#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004993 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4994 __debug_less<_Compare> __c(__comp);
4995 return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004996#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004997 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4998 return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004999#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005000}
5001
5002template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5003inline _LIBCPP_INLINE_VISIBILITY
5004_OutputIterator
5005set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5006 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5007{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005008 return _VSTD::set_union(__first1, __last1, __first2, __last2, __result,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005009 __less<typename iterator_traits<_InputIterator1>::value_type,
5010 typename iterator_traits<_InputIterator2>::value_type>());
5011}
5012
5013// set_intersection
5014
5015template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5016_OutputIterator
5017__set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5018 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5019{
5020 while (__first1 != __last1 && __first2 != __last2)
5021 {
5022 if (__comp(*__first1, *__first2))
5023 ++__first1;
5024 else
5025 {
5026 if (!__comp(*__first2, *__first1))
5027 {
5028 *__result = *__first1;
5029 ++__result;
5030 ++__first1;
5031 }
5032 ++__first2;
5033 }
5034 }
5035 return __result;
5036}
5037
5038template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5039inline _LIBCPP_INLINE_VISIBILITY
5040_OutputIterator
5041set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5042 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5043{
Howard Hinnant7a563db2011-09-14 18:33:51 +00005044#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005045 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5046 __debug_less<_Compare> __c(__comp);
5047 return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005048#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005049 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5050 return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005051#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005052}
5053
5054template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5055inline _LIBCPP_INLINE_VISIBILITY
5056_OutputIterator
5057set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5058 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5059{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005060 return _VSTD::set_intersection(__first1, __last1, __first2, __last2, __result,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005061 __less<typename iterator_traits<_InputIterator1>::value_type,
5062 typename iterator_traits<_InputIterator2>::value_type>());
5063}
5064
5065// set_difference
5066
5067template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5068_OutputIterator
5069__set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5070 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5071{
5072 while (__first1 != __last1)
5073 {
5074 if (__first2 == __last2)
Howard Hinnant0949eed2011-06-30 21:18:19 +00005075 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005076 if (__comp(*__first1, *__first2))
5077 {
5078 *__result = *__first1;
5079 ++__result;
5080 ++__first1;
5081 }
5082 else
5083 {
5084 if (!__comp(*__first2, *__first1))
5085 ++__first1;
5086 ++__first2;
5087 }
5088 }
5089 return __result;
5090}
5091
5092template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5093inline _LIBCPP_INLINE_VISIBILITY
5094_OutputIterator
5095set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5096 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5097{
Howard Hinnant7a563db2011-09-14 18:33:51 +00005098#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005099 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5100 __debug_less<_Compare> __c(__comp);
5101 return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005102#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005103 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5104 return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005105#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005106}
5107
5108template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5109inline _LIBCPP_INLINE_VISIBILITY
5110_OutputIterator
5111set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5112 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5113{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005114 return _VSTD::set_difference(__first1, __last1, __first2, __last2, __result,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005115 __less<typename iterator_traits<_InputIterator1>::value_type,
5116 typename iterator_traits<_InputIterator2>::value_type>());
5117}
5118
5119// set_symmetric_difference
5120
5121template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5122_OutputIterator
5123__set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5124 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5125{
5126 while (__first1 != __last1)
5127 {
5128 if (__first2 == __last2)
Howard Hinnant0949eed2011-06-30 21:18:19 +00005129 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005130 if (__comp(*__first1, *__first2))
5131 {
5132 *__result = *__first1;
5133 ++__result;
5134 ++__first1;
5135 }
5136 else
5137 {
5138 if (__comp(*__first2, *__first1))
5139 {
5140 *__result = *__first2;
5141 ++__result;
5142 }
5143 else
5144 ++__first1;
5145 ++__first2;
5146 }
5147 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00005148 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005149}
5150
5151template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5152inline _LIBCPP_INLINE_VISIBILITY
5153_OutputIterator
5154set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5155 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5156{
Howard Hinnant7a563db2011-09-14 18:33:51 +00005157#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005158 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5159 __debug_less<_Compare> __c(__comp);
5160 return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005161#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005162 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5163 return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005164#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005165}
5166
5167template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5168inline _LIBCPP_INLINE_VISIBILITY
5169_OutputIterator
5170set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5171 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5172{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005173 return _VSTD::set_symmetric_difference(__first1, __last1, __first2, __last2, __result,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005174 __less<typename iterator_traits<_InputIterator1>::value_type,
5175 typename iterator_traits<_InputIterator2>::value_type>());
5176}
5177
5178// lexicographical_compare
5179
5180template <class _Compare, class _InputIterator1, class _InputIterator2>
5181bool
5182__lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5183 _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
5184{
5185 for (; __first2 != __last2; ++__first1, ++__first2)
5186 {
5187 if (__first1 == __last1 || __comp(*__first1, *__first2))
5188 return true;
5189 if (__comp(*__first2, *__first1))
5190 return false;
5191 }
5192 return false;
5193}
5194
5195template <class _InputIterator1, class _InputIterator2, class _Compare>
5196inline _LIBCPP_INLINE_VISIBILITY
5197bool
5198lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5199 _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
5200{
Howard Hinnant7a563db2011-09-14 18:33:51 +00005201#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005202 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5203 __debug_less<_Compare> __c(__comp);
5204 return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005205#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005206 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5207 return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005208#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005209}
5210
5211template <class _InputIterator1, class _InputIterator2>
5212inline _LIBCPP_INLINE_VISIBILITY
5213bool
5214lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5215 _InputIterator2 __first2, _InputIterator2 __last2)
5216{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005217 return _VSTD::lexicographical_compare(__first1, __last1, __first2, __last2,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005218 __less<typename iterator_traits<_InputIterator1>::value_type,
5219 typename iterator_traits<_InputIterator2>::value_type>());
5220}
5221
5222// next_permutation
5223
5224template <class _Compare, class _BidirectionalIterator>
5225bool
5226__next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5227{
5228 _BidirectionalIterator __i = __last;
5229 if (__first == __last || __first == --__i)
5230 return false;
5231 while (true)
5232 {
5233 _BidirectionalIterator __ip1 = __i;
5234 if (__comp(*--__i, *__ip1))
5235 {
5236 _BidirectionalIterator __j = __last;
5237 while (!__comp(*__i, *--__j))
5238 ;
5239 swap(*__i, *__j);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005240 _VSTD::reverse(__ip1, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005241 return true;
5242 }
5243 if (__i == __first)
5244 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00005245 _VSTD::reverse(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005246 return false;
5247 }
5248 }
5249}
5250
5251template <class _BidirectionalIterator, class _Compare>
5252inline _LIBCPP_INLINE_VISIBILITY
5253bool
5254next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5255{
Howard Hinnant7a563db2011-09-14 18:33:51 +00005256#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005257 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5258 __debug_less<_Compare> __c(__comp);
5259 return __next_permutation<_Comp_ref>(__first, __last, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005260#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005261 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5262 return __next_permutation<_Comp_ref>(__first, __last, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005263#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005264}
5265
5266template <class _BidirectionalIterator>
5267inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant324bb032010-08-22 00:02:43 +00005268bool
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005269next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
5270{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005271 return _VSTD::next_permutation(__first, __last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005272 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
5273}
5274
5275// prev_permutation
5276
5277template <class _Compare, class _BidirectionalIterator>
5278bool
5279__prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5280{
5281 _BidirectionalIterator __i = __last;
5282 if (__first == __last || __first == --__i)
5283 return false;
5284 while (true)
5285 {
5286 _BidirectionalIterator __ip1 = __i;
5287 if (__comp(*__ip1, *--__i))
5288 {
5289 _BidirectionalIterator __j = __last;
5290 while (!__comp(*--__j, *__i))
5291 ;
5292 swap(*__i, *__j);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005293 _VSTD::reverse(__ip1, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005294 return true;
5295 }
5296 if (__i == __first)
5297 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00005298 _VSTD::reverse(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005299 return false;
5300 }
5301 }
5302}
5303
5304template <class _BidirectionalIterator, class _Compare>
5305inline _LIBCPP_INLINE_VISIBILITY
5306bool
5307prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5308{
Howard Hinnant7a563db2011-09-14 18:33:51 +00005309#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005310 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5311 __debug_less<_Compare> __c(__comp);
5312 return __prev_permutation<_Comp_ref>(__first, __last, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005313#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005314 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5315 return __prev_permutation<_Comp_ref>(__first, __last, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005316#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005317}
5318
5319template <class _BidirectionalIterator>
5320inline _LIBCPP_INLINE_VISIBILITY
5321bool
5322prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
5323{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005324 return _VSTD::prev_permutation(__first, __last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005325 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
5326}
5327
5328template <class _Tp>
5329inline _LIBCPP_INLINE_VISIBILITY
5330typename enable_if
5331<
5332 is_integral<_Tp>::value,
5333 _Tp
5334>::type
5335__rotate_left(_Tp __t, _Tp __n = 1)
5336{
5337 const unsigned __bits = static_cast<unsigned>(sizeof(_Tp) * __CHAR_BIT__ - 1);
5338 __n &= __bits;
5339 return static_cast<_Tp>((__t << __n) | (static_cast<typename make_unsigned<_Tp>::type>(__t) >> (__bits - __n)));
5340}
5341
5342template <class _Tp>
5343inline _LIBCPP_INLINE_VISIBILITY
5344typename enable_if
5345<
5346 is_integral<_Tp>::value,
5347 _Tp
5348>::type
5349__rotate_right(_Tp __t, _Tp __n = 1)
5350{
5351 const unsigned __bits = static_cast<unsigned>(sizeof(_Tp) * __CHAR_BIT__ - 1);
5352 __n &= __bits;
5353 return static_cast<_Tp>((__t << (__bits - __n)) | (static_cast<typename make_unsigned<_Tp>::type>(__t) >> __n));
5354}
5355
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005356_LIBCPP_END_NAMESPACE_STD
5357
5358#endif // _LIBCPP_ALGORITHM