blob: 119fbbbbac4daff05952aca5d2df0a2f872e2d98 [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
Marshall Clowb30abdd2013-05-09 21:14:23 +000090template <class InputIterator1, class InputIterator2>
91 pair<InputIterator1, InputIterator2>
92 mismatch(InputIterator1 first1, InputIterator1 last1,
93 InputIterator2 first2, InputIterator2 last2); // **C++14**
94
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000095template <class InputIterator1, class InputIterator2, class BinaryPredicate>
96 pair<InputIterator1, InputIterator2>
97 mismatch(InputIterator1 first1, InputIterator1 last1,
98 InputIterator2 first2, BinaryPredicate pred);
99
Marshall Clowb30abdd2013-05-09 21:14:23 +0000100template <class InputIterator1, class InputIterator2, class BinaryPredicate>
101 pair<InputIterator1, InputIterator2>
102 mismatch(InputIterator1 first1, InputIterator1 last1,
103 InputIterator2 first2, InputIterator2 last2,
104 BinaryPredicate pred); // **C++14**
105
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000106template <class InputIterator1, class InputIterator2>
107 bool
108 equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
109
Marshall Clowb30abdd2013-05-09 21:14:23 +0000110template <class InputIterator1, class InputIterator2>
111 bool
112 equal(InputIterator1 first1, InputIterator1 last1,
113 InputIterator2 first2, InputIterator2 last2); // **C++14**
114
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000115template <class InputIterator1, class InputIterator2, class BinaryPredicate>
116 bool
117 equal(InputIterator1 first1, InputIterator1 last1,
118 InputIterator2 first2, BinaryPredicate pred);
119
Marshall Clowb30abdd2013-05-09 21:14:23 +0000120template <class InputIterator1, class InputIterator2, class BinaryPredicate>
121 bool
122 equal(InputIterator1 first1, InputIterator1 last1,
123 InputIterator2 first2, InputIterator2 last2,
124 BinaryPredicate pred); // **C++14**
125
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000126template<class ForwardIterator1, class ForwardIterator2>
127 bool
128 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
129 ForwardIterator2 first2);
130
Marshall Clowb30abdd2013-05-09 21:14:23 +0000131template<class ForwardIterator1, class ForwardIterator2>
132 bool
133 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
134 ForwardIterator2 first2, ForwardIterator2 last2); // **C++14**
135
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000136template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
137 bool
138 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
139 ForwardIterator2 first2, BinaryPredicate pred);
140
Marshall Clowb30abdd2013-05-09 21:14:23 +0000141template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
142 bool
143 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
144 ForwardIterator2 first2, ForwardIterator2 last2,
145 BinaryPredicate pred); // **C++14**
146
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000147template <class ForwardIterator1, class ForwardIterator2>
148 ForwardIterator1
149 search(ForwardIterator1 first1, ForwardIterator1 last1,
150 ForwardIterator2 first2, ForwardIterator2 last2);
151
152template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
153 ForwardIterator1
154 search(ForwardIterator1 first1, ForwardIterator1 last1,
155 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
156
157template <class ForwardIterator, class Size, class T>
158 ForwardIterator
159 search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value);
160
161template <class ForwardIterator, class Size, class T, class BinaryPredicate>
162 ForwardIterator
163 search_n(ForwardIterator first, ForwardIterator last,
164 Size count, const T& value, BinaryPredicate pred);
165
166template <class InputIterator, class OutputIterator>
167 OutputIterator
168 copy(InputIterator first, InputIterator last, OutputIterator result);
169
170template<class InputIterator, class OutputIterator, class Predicate>
171 OutputIterator
172 copy_if(InputIterator first, InputIterator last,
173 OutputIterator result, Predicate pred);
174
175template<class InputIterator, class Size, class OutputIterator>
176 OutputIterator
177 copy_n(InputIterator first, Size n, OutputIterator result);
178
179template <class BidirectionalIterator1, class BidirectionalIterator2>
180 BidirectionalIterator2
181 copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last,
182 BidirectionalIterator2 result);
183
184template <class ForwardIterator1, class ForwardIterator2>
185 ForwardIterator2
186 swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2);
187
188template <class ForwardIterator1, class ForwardIterator2>
189 void
190 iter_swap(ForwardIterator1 a, ForwardIterator2 b);
191
192template <class InputIterator, class OutputIterator, class UnaryOperation>
193 OutputIterator
194 transform(InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op);
195
196template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation>
197 OutputIterator
198 transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2,
199 OutputIterator result, BinaryOperation binary_op);
200
201template <class ForwardIterator, class T>
202 void
203 replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value);
204
205template <class ForwardIterator, class Predicate, class T>
206 void
207 replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value);
208
209template <class InputIterator, class OutputIterator, class T>
210 OutputIterator
211 replace_copy(InputIterator first, InputIterator last, OutputIterator result,
212 const T& old_value, const T& new_value);
213
214template <class InputIterator, class OutputIterator, class Predicate, class T>
215 OutputIterator
216 replace_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value);
217
218template <class ForwardIterator, class T>
219 void
220 fill(ForwardIterator first, ForwardIterator last, const T& value);
221
222template <class OutputIterator, class Size, class T>
223 OutputIterator
224 fill_n(OutputIterator first, Size n, const T& value);
225
226template <class ForwardIterator, class Generator>
227 void
228 generate(ForwardIterator first, ForwardIterator last, Generator gen);
229
230template <class OutputIterator, class Size, class Generator>
231 OutputIterator
232 generate_n(OutputIterator first, Size n, Generator gen);
233
234template <class ForwardIterator, class T>
235 ForwardIterator
236 remove(ForwardIterator first, ForwardIterator last, const T& value);
237
238template <class ForwardIterator, class Predicate>
239 ForwardIterator
240 remove_if(ForwardIterator first, ForwardIterator last, Predicate pred);
241
242template <class InputIterator, class OutputIterator, class T>
243 OutputIterator
244 remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value);
245
246template <class InputIterator, class OutputIterator, class Predicate>
247 OutputIterator
248 remove_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred);
249
250template <class ForwardIterator>
251 ForwardIterator
252 unique(ForwardIterator first, ForwardIterator last);
253
254template <class ForwardIterator, class BinaryPredicate>
255 ForwardIterator
256 unique(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
257
258template <class InputIterator, class OutputIterator>
259 OutputIterator
260 unique_copy(InputIterator first, InputIterator last, OutputIterator result);
261
262template <class InputIterator, class OutputIterator, class BinaryPredicate>
263 OutputIterator
264 unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate pred);
265
266template <class BidirectionalIterator>
267 void
268 reverse(BidirectionalIterator first, BidirectionalIterator last);
269
270template <class BidirectionalIterator, class OutputIterator>
271 OutputIterator
272 reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result);
273
274template <class ForwardIterator>
275 ForwardIterator
276 rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last);
277
278template <class ForwardIterator, class OutputIterator>
279 OutputIterator
280 rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result);
281
282template <class RandomAccessIterator>
283 void
284 random_shuffle(RandomAccessIterator first, RandomAccessIterator last);
285
286template <class RandomAccessIterator, class RandomNumberGenerator>
287 void
288 random_shuffle(RandomAccessIterator first, RandomAccessIterator last, RandomNumberGenerator& rand);
289
Howard Hinnantc3267212010-05-26 17:49:34 +0000290template<class RandomAccessIterator, class UniformRandomNumberGenerator>
291 void shuffle(RandomAccessIterator first, RandomAccessIterator last,
Howard Hinnant278bf2d2010-11-18 01:47:02 +0000292 UniformRandomNumberGenerator&& g);
Howard Hinnantc3267212010-05-26 17:49:34 +0000293
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000294template <class InputIterator, class Predicate>
295 bool
296 is_partitioned(InputIterator first, InputIterator last, Predicate pred);
297
298template <class ForwardIterator, class Predicate>
299 ForwardIterator
300 partition(ForwardIterator first, ForwardIterator last, Predicate pred);
301
302template <class InputIterator, class OutputIterator1,
303 class OutputIterator2, class Predicate>
304 pair<OutputIterator1, OutputIterator2>
305 partition_copy(InputIterator first, InputIterator last,
306 OutputIterator1 out_true, OutputIterator2 out_false,
307 Predicate pred);
308
309template <class ForwardIterator, class Predicate>
310 ForwardIterator
311 stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred);
312
313template<class ForwardIterator, class Predicate>
314 ForwardIterator
315 partition_point(ForwardIterator first, ForwardIterator last, Predicate pred);
316
317template <class ForwardIterator>
318 bool
319 is_sorted(ForwardIterator first, ForwardIterator last);
320
321template <class ForwardIterator, class Compare>
322 bool
323 is_sorted(ForwardIterator first, ForwardIterator last, Compare comp);
324
325template<class ForwardIterator>
326 ForwardIterator
327 is_sorted_until(ForwardIterator first, ForwardIterator last);
328
329template <class ForwardIterator, class Compare>
330 ForwardIterator
331 is_sorted_until(ForwardIterator first, ForwardIterator last, Compare comp);
332
333template <class RandomAccessIterator>
334 void
335 sort(RandomAccessIterator first, RandomAccessIterator last);
336
337template <class RandomAccessIterator, class Compare>
338 void
339 sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
340
341template <class RandomAccessIterator>
342 void
343 stable_sort(RandomAccessIterator first, RandomAccessIterator last);
344
345template <class RandomAccessIterator, class Compare>
346 void
347 stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
348
349template <class RandomAccessIterator>
350 void
351 partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last);
352
353template <class RandomAccessIterator, class Compare>
354 void
355 partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp);
356
357template <class InputIterator, class RandomAccessIterator>
358 RandomAccessIterator
359 partial_sort_copy(InputIterator first, InputIterator last,
360 RandomAccessIterator result_first, RandomAccessIterator result_last);
361
362template <class InputIterator, class RandomAccessIterator, class Compare>
363 RandomAccessIterator
364 partial_sort_copy(InputIterator first, InputIterator last,
365 RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp);
366
367template <class RandomAccessIterator>
368 void
369 nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last);
370
371template <class RandomAccessIterator, class Compare>
372 void
373 nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp);
374
375template <class ForwardIterator, class T>
376 ForwardIterator
377 lower_bound(ForwardIterator first, ForwardIterator last, const T& value);
378
379template <class ForwardIterator, class T, class Compare>
380 ForwardIterator
381 lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
382
383template <class ForwardIterator, class T>
384 ForwardIterator
385 upper_bound(ForwardIterator first, ForwardIterator last, const T& value);
386
387template <class ForwardIterator, class T, class Compare>
388 ForwardIterator
389 upper_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
390
391template <class ForwardIterator, class T>
392 pair<ForwardIterator, ForwardIterator>
393 equal_range(ForwardIterator first, ForwardIterator last, const T& value);
394
395template <class ForwardIterator, class T, class Compare>
396 pair<ForwardIterator, ForwardIterator>
397 equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
398
399template <class ForwardIterator, class T>
400 bool
401 binary_search(ForwardIterator first, ForwardIterator last, const T& value);
402
403template <class ForwardIterator, class T, class Compare>
404 bool
405 binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
406
407template <class InputIterator1, class InputIterator2, class OutputIterator>
408 OutputIterator
409 merge(InputIterator1 first1, InputIterator1 last1,
410 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
411
412template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
413 OutputIterator
414 merge(InputIterator1 first1, InputIterator1 last1,
415 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
416
417template <class BidirectionalIterator>
418 void
419 inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last);
420
421template <class BidirectionalIterator, class Compare>
422 void
423 inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp);
424
425template <class InputIterator1, class InputIterator2>
426 bool
427 includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
428
429template <class InputIterator1, class InputIterator2, class Compare>
430 bool
431 includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp);
432
433template <class InputIterator1, class InputIterator2, class OutputIterator>
434 OutputIterator
435 set_union(InputIterator1 first1, InputIterator1 last1,
436 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
437
438template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
439 OutputIterator
440 set_union(InputIterator1 first1, InputIterator1 last1,
441 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
442
443template <class InputIterator1, class InputIterator2, class OutputIterator>
444 OutputIterator
445 set_intersection(InputIterator1 first1, InputIterator1 last1,
446 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
447
448template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
449 OutputIterator
450 set_intersection(InputIterator1 first1, InputIterator1 last1,
451 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
452
453template <class InputIterator1, class InputIterator2, class OutputIterator>
454 OutputIterator
455 set_difference(InputIterator1 first1, InputIterator1 last1,
456 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
457
458template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
459 OutputIterator
460 set_difference(InputIterator1 first1, InputIterator1 last1,
461 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
462
463template <class InputIterator1, class InputIterator2, class OutputIterator>
464 OutputIterator
465 set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
466 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
467
468template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
469 OutputIterator
470 set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
471 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
472
473template <class RandomAccessIterator>
474 void
475 push_heap(RandomAccessIterator first, RandomAccessIterator last);
476
477template <class RandomAccessIterator, class Compare>
478 void
479 push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
480
481template <class RandomAccessIterator>
482 void
483 pop_heap(RandomAccessIterator first, RandomAccessIterator last);
484
485template <class RandomAccessIterator, class Compare>
486 void
487 pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
488
489template <class RandomAccessIterator>
490 void
491 make_heap(RandomAccessIterator first, RandomAccessIterator last);
492
493template <class RandomAccessIterator, class Compare>
494 void
495 make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
496
497template <class RandomAccessIterator>
498 void
499 sort_heap(RandomAccessIterator first, RandomAccessIterator last);
500
501template <class RandomAccessIterator, class Compare>
502 void
503 sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
504
Howard Hinnant324bb032010-08-22 00:02:43 +0000505template <class RandomAccessIterator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000506 bool
Howard Hinnant324bb032010-08-22 00:02:43 +0000507 is_heap(RandomAccessIterator first, RandomAccessiterator last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000508
Howard Hinnant324bb032010-08-22 00:02:43 +0000509template <class RandomAccessIterator, class Compare>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000510 bool
Howard Hinnant324bb032010-08-22 00:02:43 +0000511 is_heap(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000512
Howard Hinnant324bb032010-08-22 00:02:43 +0000513template <class RandomAccessIterator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000514 RandomAccessIterator
Howard Hinnant324bb032010-08-22 00:02:43 +0000515 is_heap_until(RandomAccessIterator first, RandomAccessiterator last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000516
Howard Hinnant324bb032010-08-22 00:02:43 +0000517template <class RandomAccessIterator, class Compare>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000518 RandomAccessIterator
Howard Hinnant324bb032010-08-22 00:02:43 +0000519 is_heap_until(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000520
Howard Hinnant98e5d972010-08-21 20:10:01 +0000521template <class ForwardIterator>
522 ForwardIterator
523 min_element(ForwardIterator first, ForwardIterator last);
524
525template <class ForwardIterator, class Compare>
526 ForwardIterator
527 min_element(ForwardIterator first, ForwardIterator last, Compare comp);
528
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000529template <class T>
530 const T&
531 min(const T& a, const T& b);
532
533template <class T, class Compare>
534 const T&
535 min(const T& a, const T& b, Compare comp);
536
Howard Hinnant98e5d972010-08-21 20:10:01 +0000537template<class T>
538 T
539 min(initializer_list<T> t);
540
541template<class T, class Compare>
542 T
543 min(initializer_list<T> t, Compare comp);
544
545template <class ForwardIterator>
546 ForwardIterator
547 max_element(ForwardIterator first, ForwardIterator last);
548
549template <class ForwardIterator, class Compare>
550 ForwardIterator
551 max_element(ForwardIterator first, ForwardIterator last, Compare comp);
552
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000553template <class T>
554 const T&
555 max(const T& a, const T& b);
556
557template <class T, class Compare>
558 const T&
559 max(const T& a, const T& b, Compare comp);
560
Howard Hinnant98e5d972010-08-21 20:10:01 +0000561template<class T>
562 T
563 max(initializer_list<T> t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000564
Howard Hinnant98e5d972010-08-21 20:10:01 +0000565template<class T, class Compare>
566 T
567 max(initializer_list<T> t, Compare comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000568
Howard Hinnant98e5d972010-08-21 20:10:01 +0000569template<class ForwardIterator>
570 pair<ForwardIterator, ForwardIterator>
571 minmax_element(ForwardIterator first, ForwardIterator last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000572
Howard Hinnant98e5d972010-08-21 20:10:01 +0000573template<class ForwardIterator, class Compare>
574 pair<ForwardIterator, ForwardIterator>
575 minmax_element(ForwardIterator first, ForwardIterator last, Compare comp);
576
577template<class T>
578 pair<const T&, const T&>
579 minmax(const T& a, const T& b);
580
581template<class T, class Compare>
582 pair<const T&, const T&>
583 minmax(const T& a, const T& b, Compare comp);
584
585template<class T>
586 pair<T, T>
587 minmax(initializer_list<T> t);
588
589template<class T, class Compare>
590 pair<T, T>
591 minmax(initializer_list<T> t, Compare comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000592
593template <class InputIterator1, class InputIterator2>
594 bool
595 lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
596
597template <class InputIterator1, class InputIterator2, class Compare>
598 bool
599 lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
600 InputIterator2 first2, InputIterator2 last2, Compare comp);
601
602template <class BidirectionalIterator>
Howard Hinnant324bb032010-08-22 00:02:43 +0000603 bool
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000604 next_permutation(BidirectionalIterator first, BidirectionalIterator last);
605
606template <class BidirectionalIterator, class Compare>
607 bool
608 next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
609
610template <class BidirectionalIterator>
611 bool
612 prev_permutation(BidirectionalIterator first, BidirectionalIterator last);
613
614template <class BidirectionalIterator, class Compare>
615 bool
616 prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
617
618} // std
619
620*/
621
622#include <__config>
623#include <initializer_list>
624#include <type_traits>
625#include <cstring>
626#include <utility>
627#include <memory>
628#include <iterator>
Howard Hinnantca8eb832012-07-26 17:09:09 +0000629#include <cstddef>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000630
Howard Hinnant66c6f972011-11-29 16:45:27 +0000631#include <__undef_min_max>
632
Howard Hinnant08e17472011-10-17 20:05:10 +0000633#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000634#pragma GCC system_header
Howard Hinnant08e17472011-10-17 20:05:10 +0000635#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000636
637_LIBCPP_BEGIN_NAMESPACE_STD
638
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000639template <class _T1, class _T2 = _T1>
640struct __equal_to
641{
642 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
643 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T2& __y) const {return __x == __y;}
644 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T1& __y) const {return __x == __y;}
645 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T2& __y) const {return __x == __y;}
646};
647
648template <class _T1>
649struct __equal_to<_T1, _T1>
650{
651 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
652};
653
654template <class _T1>
655struct __equal_to<const _T1, _T1>
656{
657 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
658};
659
660template <class _T1>
661struct __equal_to<_T1, const _T1>
662{
663 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
664};
665
666template <class _T1, class _T2 = _T1>
667struct __less
668{
669 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
670 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T2& __y) const {return __x < __y;}
671 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T1& __y) const {return __x < __y;}
672 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T2& __y) const {return __x < __y;}
673};
674
675template <class _T1>
676struct __less<_T1, _T1>
677{
678 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
679};
680
681template <class _T1>
682struct __less<const _T1, _T1>
683{
684 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
685};
686
687template <class _T1>
688struct __less<_T1, const _T1>
689{
690 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
691};
692
693template <class _Predicate>
694class __negate
695{
696private:
697 _Predicate __p_;
698public:
699 _LIBCPP_INLINE_VISIBILITY __negate() {}
700
701 _LIBCPP_INLINE_VISIBILITY
702 explicit __negate(_Predicate __p) : __p_(__p) {}
703
704 template <class _T1>
705 _LIBCPP_INLINE_VISIBILITY
706 bool operator()(const _T1& __x) {return !__p_(__x);}
707
708 template <class _T1, class _T2>
709 _LIBCPP_INLINE_VISIBILITY
710 bool operator()(const _T1& __x, const _T2& __y) {return !__p_(__x, __y);}
711};
712
Howard Hinnant7a563db2011-09-14 18:33:51 +0000713#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000714
715template <class _Compare>
716struct __debug_less
717{
718 _Compare __comp_;
719 __debug_less(_Compare& __c) : __comp_(__c) {}
720 template <class _Tp, class _Up>
721 bool operator()(const _Tp& __x, const _Up& __y)
722 {
723 bool __r = __comp_(__x, __y);
724 if (__r)
Howard Hinnant7a563db2011-09-14 18:33:51 +0000725 _LIBCPP_ASSERT(!__comp_(__y, __x), "Comparator does not induce a strict weak ordering");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000726 return __r;
727 }
728};
729
Howard Hinnant7a563db2011-09-14 18:33:51 +0000730#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000731
Howard Hinnant13c98cc2010-05-27 20:06:01 +0000732// Precondition: __x != 0
Howard Hinnantec3773c2011-12-01 20:21:04 +0000733inline _LIBCPP_INLINE_VISIBILITY
734unsigned
735__ctz(unsigned __x)
736{
737 return static_cast<unsigned>(__builtin_ctz(__x));
738}
739
740inline _LIBCPP_INLINE_VISIBILITY
741unsigned long
742__ctz(unsigned long __x)
743{
744 return static_cast<unsigned long>(__builtin_ctzl(__x));
745}
746
747inline _LIBCPP_INLINE_VISIBILITY
748unsigned long long
749__ctz(unsigned long long __x)
750{
751 return static_cast<unsigned long long>(__builtin_ctzll(__x));
752}
Howard Hinnant13c98cc2010-05-27 20:06:01 +0000753
754// Precondition: __x != 0
Howard Hinnantec3773c2011-12-01 20:21:04 +0000755inline _LIBCPP_INLINE_VISIBILITY
756unsigned
757__clz(unsigned __x)
758{
759 return static_cast<unsigned>(__builtin_clz(__x));
760}
761
762inline _LIBCPP_INLINE_VISIBILITY
763unsigned long
764__clz(unsigned long __x)
765{
766 return static_cast<unsigned long>(__builtin_clzl (__x));
767}
768
769inline _LIBCPP_INLINE_VISIBILITY
770unsigned long long
771__clz(unsigned long long __x)
772{
773 return static_cast<unsigned long long>(__builtin_clzll(__x));
774}
Howard Hinnant13c98cc2010-05-27 20:06:01 +0000775
776inline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned __x) {return __builtin_popcount (__x);}
777inline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned long __x) {return __builtin_popcountl (__x);}
778inline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned long long __x) {return __builtin_popcountll(__x);}
779
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000780// all_of
781
782template <class _InputIterator, class _Predicate>
783inline _LIBCPP_INLINE_VISIBILITY
784bool
785all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
786{
787 for (; __first != __last; ++__first)
788 if (!__pred(*__first))
789 return false;
790 return true;
791}
792
793// any_of
794
795template <class _InputIterator, class _Predicate>
796inline _LIBCPP_INLINE_VISIBILITY
797bool
798any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
799{
800 for (; __first != __last; ++__first)
801 if (__pred(*__first))
802 return true;
803 return false;
804}
805
806// none_of
807
808template <class _InputIterator, class _Predicate>
809inline _LIBCPP_INLINE_VISIBILITY
810bool
811none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
812{
813 for (; __first != __last; ++__first)
814 if (__pred(*__first))
815 return false;
816 return true;
817}
818
819// for_each
820
821template <class _InputIterator, class _Function>
822inline _LIBCPP_INLINE_VISIBILITY
823_Function
824for_each(_InputIterator __first, _InputIterator __last, _Function __f)
825{
826 for (; __first != __last; ++__first)
827 __f(*__first);
Howard Hinnant0949eed2011-06-30 21:18:19 +0000828 return _VSTD::move(__f);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000829}
830
831// find
832
833template <class _InputIterator, class _Tp>
834inline _LIBCPP_INLINE_VISIBILITY
835_InputIterator
Howard Hinnant78b68282011-10-22 20:59:45 +0000836find(_InputIterator __first, _InputIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000837{
838 for (; __first != __last; ++__first)
Howard Hinnant78b68282011-10-22 20:59:45 +0000839 if (*__first == __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000840 break;
841 return __first;
842}
843
844// find_if
845
846template <class _InputIterator, class _Predicate>
847inline _LIBCPP_INLINE_VISIBILITY
848_InputIterator
849find_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
850{
851 for (; __first != __last; ++__first)
852 if (__pred(*__first))
853 break;
854 return __first;
855}
856
857// find_if_not
858
859template<class _InputIterator, class _Predicate>
860inline _LIBCPP_INLINE_VISIBILITY
861_InputIterator
862find_if_not(_InputIterator __first, _InputIterator __last, _Predicate __pred)
863{
864 for (; __first != __last; ++__first)
865 if (!__pred(*__first))
866 break;
867 return __first;
868}
869
870// find_end
871
872template <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
873_ForwardIterator1
874__find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
875 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred,
876 forward_iterator_tag, forward_iterator_tag)
877{
878 // modeled after search algorithm
879 _ForwardIterator1 __r = __last1; // __last1 is the "default" answer
880 if (__first2 == __last2)
881 return __r;
882 while (true)
883 {
884 while (true)
885 {
886 if (__first1 == __last1) // if source exhausted return last correct answer
887 return __r; // (or __last1 if never found)
888 if (__pred(*__first1, *__first2))
889 break;
890 ++__first1;
891 }
892 // *__first1 matches *__first2, now match elements after here
893 _ForwardIterator1 __m1 = __first1;
894 _ForwardIterator2 __m2 = __first2;
895 while (true)
896 {
897 if (++__m2 == __last2)
898 { // Pattern exhaused, record answer and search for another one
899 __r = __first1;
900 ++__first1;
901 break;
902 }
903 if (++__m1 == __last1) // Source exhausted, return last answer
904 return __r;
905 if (!__pred(*__m1, *__m2)) // mismatch, restart with a new __first
906 {
907 ++__first1;
908 break;
909 } // else there is a match, check next elements
910 }
911 }
912}
913
914template <class _BinaryPredicate, class _BidirectionalIterator1, class _BidirectionalIterator2>
915_BidirectionalIterator1
916__find_end(_BidirectionalIterator1 __first1, _BidirectionalIterator1 __last1,
917 _BidirectionalIterator2 __first2, _BidirectionalIterator2 __last2, _BinaryPredicate __pred,
918 bidirectional_iterator_tag, bidirectional_iterator_tag)
919{
920 // modeled after search algorithm (in reverse)
921 if (__first2 == __last2)
922 return __last1; // Everything matches an empty sequence
923 _BidirectionalIterator1 __l1 = __last1;
924 _BidirectionalIterator2 __l2 = __last2;
925 --__l2;
926 while (true)
927 {
928 // Find last element in sequence 1 that matchs *(__last2-1), with a mininum of loop checks
929 while (true)
930 {
931 if (__first1 == __l1) // return __last1 if no element matches *__first2
932 return __last1;
933 if (__pred(*--__l1, *__l2))
934 break;
935 }
936 // *__l1 matches *__l2, now match elements before here
937 _BidirectionalIterator1 __m1 = __l1;
938 _BidirectionalIterator2 __m2 = __l2;
939 while (true)
940 {
941 if (__m2 == __first2) // If pattern exhausted, __m1 is the answer (works for 1 element pattern)
942 return __m1;
943 if (__m1 == __first1) // Otherwise if source exhaused, pattern not found
944 return __last1;
945 if (!__pred(*--__m1, *--__m2)) // if there is a mismatch, restart with a new __l1
946 {
947 break;
948 } // else there is a match, check next elements
949 }
950 }
951}
952
953template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
954_RandomAccessIterator1
955__find_end(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
956 _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
957 random_access_iterator_tag, random_access_iterator_tag)
958{
959 // Take advantage of knowing source and pattern lengths. Stop short when source is smaller than pattern
960 typename iterator_traits<_RandomAccessIterator2>::difference_type __len2 = __last2 - __first2;
961 if (__len2 == 0)
962 return __last1;
963 typename iterator_traits<_RandomAccessIterator1>::difference_type __len1 = __last1 - __first1;
964 if (__len1 < __len2)
965 return __last1;
966 const _RandomAccessIterator1 __s = __first1 + (__len2 - 1); // End of pattern match can't go before here
967 _RandomAccessIterator1 __l1 = __last1;
968 _RandomAccessIterator2 __l2 = __last2;
969 --__l2;
970 while (true)
971 {
972 while (true)
973 {
974 if (__s == __l1)
975 return __last1;
976 if (__pred(*--__l1, *__l2))
977 break;
978 }
979 _RandomAccessIterator1 __m1 = __l1;
980 _RandomAccessIterator2 __m2 = __l2;
981 while (true)
982 {
983 if (__m2 == __first2)
984 return __m1;
985 // no need to check range on __m1 because __s guarantees we have enough source
986 if (!__pred(*--__m1, *--__m2))
987 {
988 break;
989 }
990 }
991 }
992}
993
994template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
995inline _LIBCPP_INLINE_VISIBILITY
996_ForwardIterator1
997find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
998 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
999{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001000 return _VSTD::__find_end<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001001 (__first1, __last1, __first2, __last2, __pred,
1002 typename iterator_traits<_ForwardIterator1>::iterator_category(),
1003 typename iterator_traits<_ForwardIterator2>::iterator_category());
1004}
1005
1006template <class _ForwardIterator1, class _ForwardIterator2>
1007inline _LIBCPP_INLINE_VISIBILITY
1008_ForwardIterator1
1009find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1010 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1011{
1012 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1013 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001014 return _VSTD::find_end(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001015}
1016
1017// find_first_of
1018
1019template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
1020_ForwardIterator1
1021find_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1022 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1023{
1024 for (; __first1 != __last1; ++__first1)
1025 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
1026 if (__pred(*__first1, *__j))
1027 return __first1;
1028 return __last1;
1029}
1030
1031template <class _ForwardIterator1, class _ForwardIterator2>
1032inline _LIBCPP_INLINE_VISIBILITY
1033_ForwardIterator1
1034find_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1035 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1036{
1037 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1038 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001039 return _VSTD::find_first_of(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001040}
1041
1042// adjacent_find
1043
1044template <class _ForwardIterator, class _BinaryPredicate>
1045inline _LIBCPP_INLINE_VISIBILITY
1046_ForwardIterator
1047adjacent_find(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred)
1048{
1049 if (__first != __last)
1050 {
1051 _ForwardIterator __i = __first;
1052 while (++__i != __last)
1053 {
1054 if (__pred(*__first, *__i))
1055 return __first;
1056 __first = __i;
1057 }
1058 }
1059 return __last;
1060}
1061
1062template <class _ForwardIterator>
1063inline _LIBCPP_INLINE_VISIBILITY
1064_ForwardIterator
1065adjacent_find(_ForwardIterator __first, _ForwardIterator __last)
1066{
1067 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001068 return _VSTD::adjacent_find(__first, __last, __equal_to<__v>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001069}
1070
1071// count
1072
1073template <class _InputIterator, class _Tp>
1074inline _LIBCPP_INLINE_VISIBILITY
1075typename iterator_traits<_InputIterator>::difference_type
Howard Hinnant78b68282011-10-22 20:59:45 +00001076count(_InputIterator __first, _InputIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001077{
1078 typename iterator_traits<_InputIterator>::difference_type __r(0);
1079 for (; __first != __last; ++__first)
Howard Hinnant78b68282011-10-22 20:59:45 +00001080 if (*__first == __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001081 ++__r;
1082 return __r;
1083}
1084
1085// count_if
1086
1087template <class _InputIterator, class _Predicate>
1088inline _LIBCPP_INLINE_VISIBILITY
1089typename iterator_traits<_InputIterator>::difference_type
1090count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
1091{
1092 typename iterator_traits<_InputIterator>::difference_type __r(0);
1093 for (; __first != __last; ++__first)
1094 if (__pred(*__first))
1095 ++__r;
1096 return __r;
1097}
1098
1099// mismatch
1100
1101template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
1102inline _LIBCPP_INLINE_VISIBILITY
1103pair<_InputIterator1, _InputIterator2>
1104mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1105 _InputIterator2 __first2, _BinaryPredicate __pred)
1106{
1107 for (; __first1 != __last1; ++__first1, ++__first2)
1108 if (!__pred(*__first1, *__first2))
1109 break;
1110 return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
1111}
1112
1113template <class _InputIterator1, class _InputIterator2>
1114inline _LIBCPP_INLINE_VISIBILITY
1115pair<_InputIterator1, _InputIterator2>
1116mismatch(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2)
1117{
1118 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1119 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001120 return _VSTD::mismatch(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001121}
1122
Marshall Clowb30abdd2013-05-09 21:14:23 +00001123#if _LIBCPP_STD_VER > 11
1124template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
1125inline _LIBCPP_INLINE_VISIBILITY
1126pair<_InputIterator1, _InputIterator2>
1127mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1128 _InputIterator2 __first2, _InputIterator2 __last2,
1129 _BinaryPredicate __pred)
1130{
1131 for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
1132 if (!__pred(*__first1, *__first2))
1133 break;
1134 return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
1135}
1136
1137template <class _InputIterator1, class _InputIterator2>
1138inline _LIBCPP_INLINE_VISIBILITY
1139pair<_InputIterator1, _InputIterator2>
1140mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1141 _InputIterator2 __first2, _InputIterator2 __last2)
1142{
1143 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1144 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
1145 return _VSTD::mismatch(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
1146}
1147#endif
1148
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001149// equal
1150
1151template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
1152inline _LIBCPP_INLINE_VISIBILITY
1153bool
1154equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _BinaryPredicate __pred)
1155{
1156 for (; __first1 != __last1; ++__first1, ++__first2)
1157 if (!__pred(*__first1, *__first2))
1158 return false;
1159 return true;
1160}
1161
1162template <class _InputIterator1, class _InputIterator2>
1163inline _LIBCPP_INLINE_VISIBILITY
1164bool
1165equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2)
1166{
1167 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1168 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001169 return _VSTD::equal(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001170}
1171
Marshall Clowb30abdd2013-05-09 21:14:23 +00001172#if _LIBCPP_STD_VER > 11
1173template <class _BinaryPredicate, class _InputIterator1, class _InputIterator2>
1174inline _LIBCPP_INLINE_VISIBILITY
1175bool
1176__equal(_InputIterator1 __first1, _InputIterator1 __last1,
1177 _InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred,
1178 input_iterator_tag, input_iterator_tag )
1179{
1180 for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
1181 if (!__pred(*__first1, *__first2))
1182 return false;
1183 return __first1 == __last1 && __first2 == __last2;
1184}
1185
1186template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
1187inline _LIBCPP_INLINE_VISIBILITY
1188bool
1189__equal(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
1190 _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
1191 random_access_iterator_tag, random_access_iterator_tag )
1192{
1193 if ( _VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2))
1194 return false;
1195 return _VSTD::equal<_RandomAccessIterator1, _RandomAccessIterator2,
1196 typename add_lvalue_reference<_BinaryPredicate>::type>
1197 (__first1, __last1, __first2, __pred );
1198}
1199
1200template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
1201inline _LIBCPP_INLINE_VISIBILITY
1202bool
1203equal(_InputIterator1 __first1, _InputIterator1 __last1,
1204 _InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred )
1205{
1206 return _VSTD::__equal<typename add_lvalue_reference<_BinaryPredicate>::type>
1207 (__first1, __last1, __first2, __last2, __pred,
1208 typename iterator_traits<_InputIterator1>::iterator_category(),
1209 typename iterator_traits<_InputIterator2>::iterator_category());
1210}
1211
1212template <class _InputIterator1, class _InputIterator2>
1213inline _LIBCPP_INLINE_VISIBILITY
1214bool
1215equal(_InputIterator1 __first1, _InputIterator1 __last1,
1216 _InputIterator2 __first2, _InputIterator2 __last2)
1217{
1218 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1219 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
1220 return _VSTD::__equal(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>(),
1221 typename iterator_traits<_InputIterator1>::iterator_category(),
1222 typename iterator_traits<_InputIterator2>::iterator_category());
1223}
1224#endif
1225
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001226// is_permutation
1227
1228template<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
1229bool
1230is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1231 _ForwardIterator2 __first2, _BinaryPredicate __pred)
1232{
1233 // shorten sequences as much as possible by lopping of any equal parts
1234 for (; __first1 != __last1; ++__first1, ++__first2)
1235 if (!__pred(*__first1, *__first2))
1236 goto __not_done;
1237 return true;
1238__not_done:
1239 // __first1 != __last1 && *__first1 != *__first2
1240 typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001241 _D1 __l1 = _VSTD::distance(__first1, __last1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001242 if (__l1 == _D1(1))
1243 return false;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001244 _ForwardIterator2 __last2 = _VSTD::next(__first2, __l1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001245 // For each element in [f1, l1) see if there are the same number of
1246 // equal elements in [f2, l2)
1247 for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i)
1248 {
1249 // Have we already counted the number of *__i in [f1, l1)?
1250 for (_ForwardIterator1 __j = __first1; __j != __i; ++__j)
1251 if (__pred(*__j, *__i))
1252 goto __next_iter;
1253 {
1254 // Count number of *__i in [f2, l2)
1255 _D1 __c2 = 0;
1256 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
1257 if (__pred(*__i, *__j))
1258 ++__c2;
1259 if (__c2 == 0)
1260 return false;
1261 // Count number of *__i in [__i, l1) (we can start with 1)
1262 _D1 __c1 = 1;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001263 for (_ForwardIterator1 __j = _VSTD::next(__i); __j != __last1; ++__j)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001264 if (__pred(*__i, *__j))
1265 ++__c1;
1266 if (__c1 != __c2)
1267 return false;
1268 }
1269__next_iter:;
1270 }
1271 return true;
1272}
1273
1274template<class _ForwardIterator1, class _ForwardIterator2>
1275inline _LIBCPP_INLINE_VISIBILITY
1276bool
1277is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1278 _ForwardIterator2 __first2)
1279{
1280 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1281 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001282 return _VSTD::is_permutation(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001283}
1284
Marshall Clowb30abdd2013-05-09 21:14:23 +00001285#if _LIBCPP_STD_VER > 11
1286template<class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
1287bool
1288__is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1289 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
1290 _BinaryPredicate __pred,
1291 forward_iterator_tag, forward_iterator_tag )
1292{
1293 // shorten sequences as much as possible by lopping of any equal parts
1294 for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
1295 if (!__pred(*__first1, *__first2))
1296 goto __not_done;
1297 return __first1 == __last1 && __first2 == __last2;
1298__not_done:
1299 // __first1 != __last1 && __first2 != __last2 && *__first1 != *__first2
1300 typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1;
1301 _D1 __l1 = _VSTD::distance(__first1, __last1);
1302
1303 typedef typename iterator_traits<_ForwardIterator2>::difference_type _D2;
Marshall Clow9f8f5242013-05-10 00:16:10 +00001304 _D2 __l2 = _VSTD::distance(__first2, __last2);
Marshall Clowb30abdd2013-05-09 21:14:23 +00001305 if (__l1 != __l2)
1306 return false;
1307
1308 // For each element in [f1, l1) see if there are the same number of
1309 // equal elements in [f2, l2)
1310 for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i)
1311 {
1312 // Have we already counted the number of *__i in [f1, l1)?
1313 for (_ForwardIterator1 __j = __first1; __j != __i; ++__j)
1314 if (__pred(*__j, *__i))
1315 goto __next_iter;
1316 {
1317 // Count number of *__i in [f2, l2)
1318 _D1 __c2 = 0;
1319 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
1320 if (__pred(*__i, *__j))
1321 ++__c2;
1322 if (__c2 == 0)
1323 return false;
1324 // Count number of *__i in [__i, l1) (we can start with 1)
1325 _D1 __c1 = 1;
1326 for (_ForwardIterator1 __j = _VSTD::next(__i); __j != __last1; ++__j)
1327 if (__pred(*__i, *__j))
1328 ++__c1;
1329 if (__c1 != __c2)
1330 return false;
1331 }
1332__next_iter:;
1333 }
1334 return true;
1335}
1336
1337template<class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
1338bool
1339__is_permutation(_RandomAccessIterator1 __first1, _RandomAccessIterator2 __last1,
1340 _RandomAccessIterator1 __first2, _RandomAccessIterator2 __last2,
1341 _BinaryPredicate __pred,
1342 random_access_iterator_tag, random_access_iterator_tag )
1343{
1344 if ( _VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2))
1345 return false;
1346 return _VSTD::is_permutation<_RandomAccessIterator1, _RandomAccessIterator2,
1347 typename add_lvalue_reference<_BinaryPredicate>::type>
1348 (__first1, __last1, __first2, __pred );
1349}
1350
1351template<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
1352inline _LIBCPP_INLINE_VISIBILITY
1353bool
1354is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1355 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
1356 _BinaryPredicate __pred )
1357{
1358 return _VSTD::__is_permutation<typename add_lvalue_reference<_BinaryPredicate>::type>
1359 (__first1, __last1, __first2, __last2, __pred,
1360 typename iterator_traits<_ForwardIterator1>::iterator_category(),
1361 typename iterator_traits<_ForwardIterator2>::iterator_category());
1362}
1363
1364template<class _ForwardIterator1, class _ForwardIterator2>
1365inline _LIBCPP_INLINE_VISIBILITY
1366bool
1367is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1368 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1369{
1370 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1371 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
1372 return _VSTD::__is_permutation(__first1, __last1, __first2, __last2,
1373 __equal_to<__v1, __v2>(),
1374 typename iterator_traits<_ForwardIterator1>::iterator_category(),
1375 typename iterator_traits<_ForwardIterator2>::iterator_category());
1376}
1377#endif
1378
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001379// search
1380
1381template <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
1382_ForwardIterator1
1383__search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1384 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred,
1385 forward_iterator_tag, forward_iterator_tag)
1386{
1387 if (__first2 == __last2)
1388 return __first1; // Everything matches an empty sequence
1389 while (true)
1390 {
1391 // Find first element in sequence 1 that matchs *__first2, with a mininum of loop checks
1392 while (true)
1393 {
1394 if (__first1 == __last1) // return __last1 if no element matches *__first2
1395 return __last1;
1396 if (__pred(*__first1, *__first2))
1397 break;
1398 ++__first1;
1399 }
1400 // *__first1 matches *__first2, now match elements after here
1401 _ForwardIterator1 __m1 = __first1;
1402 _ForwardIterator2 __m2 = __first2;
1403 while (true)
1404 {
1405 if (++__m2 == __last2) // If pattern exhausted, __first1 is the answer (works for 1 element pattern)
1406 return __first1;
1407 if (++__m1 == __last1) // Otherwise if source exhaused, pattern not found
1408 return __last1;
1409 if (!__pred(*__m1, *__m2)) // if there is a mismatch, restart with a new __first1
1410 {
1411 ++__first1;
1412 break;
1413 } // else there is a match, check next elements
1414 }
1415 }
1416}
1417
1418template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
1419_RandomAccessIterator1
1420__search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
1421 _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
1422 random_access_iterator_tag, random_access_iterator_tag)
1423{
1424 typedef typename std::iterator_traits<_RandomAccessIterator1>::difference_type _D1;
1425 typedef typename std::iterator_traits<_RandomAccessIterator2>::difference_type _D2;
1426 // Take advantage of knowing source and pattern lengths. Stop short when source is smaller than pattern
1427 _D2 __len2 = __last2 - __first2;
1428 if (__len2 == 0)
1429 return __first1;
1430 _D1 __len1 = __last1 - __first1;
1431 if (__len1 < __len2)
1432 return __last1;
1433 const _RandomAccessIterator1 __s = __last1 - (__len2 - 1); // Start of pattern match can't go beyond here
1434 while (true)
1435 {
1436#if !_LIBCPP_UNROLL_LOOPS
1437 while (true)
1438 {
1439 if (__first1 == __s)
1440 return __last1;
1441 if (__pred(*__first1, *__first2))
1442 break;
1443 ++__first1;
1444 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001445#else // !_LIBCPP_UNROLL_LOOPS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001446 for (_D1 __loop_unroll = (__s - __first1) / 4; __loop_unroll > 0; --__loop_unroll)
1447 {
1448 if (__pred(*__first1, *__first2))
1449 goto __phase2;
1450 if (__pred(*++__first1, *__first2))
1451 goto __phase2;
1452 if (__pred(*++__first1, *__first2))
1453 goto __phase2;
1454 if (__pred(*++__first1, *__first2))
1455 goto __phase2;
1456 ++__first1;
1457 }
1458 switch (__s - __first1)
1459 {
1460 case 3:
1461 if (__pred(*__first1, *__first2))
1462 break;
1463 ++__first1;
1464 case 2:
1465 if (__pred(*__first1, *__first2))
1466 break;
1467 ++__first1;
1468 case 1:
1469 if (__pred(*__first1, *__first2))
1470 break;
1471 case 0:
1472 return __last1;
1473 }
1474 __phase2:
Howard Hinnant324bb032010-08-22 00:02:43 +00001475#endif // !_LIBCPP_UNROLL_LOOPS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001476 _RandomAccessIterator1 __m1 = __first1;
1477 _RandomAccessIterator2 __m2 = __first2;
1478#if !_LIBCPP_UNROLL_LOOPS
1479 while (true)
1480 {
1481 if (++__m2 == __last2)
1482 return __first1;
1483 ++__m1; // no need to check range on __m1 because __s guarantees we have enough source
1484 if (!__pred(*__m1, *__m2))
1485 {
1486 ++__first1;
1487 break;
1488 }
1489 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001490#else // !_LIBCPP_UNROLL_LOOPS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001491 ++__m2;
1492 ++__m1;
1493 for (_D2 __loop_unroll = (__last2 - __m2) / 4; __loop_unroll > 0; --__loop_unroll)
1494 {
1495 if (!__pred(*__m1, *__m2))
1496 goto __continue;
1497 if (!__pred(*++__m1, *++__m2))
1498 goto __continue;
1499 if (!__pred(*++__m1, *++__m2))
1500 goto __continue;
1501 if (!__pred(*++__m1, *++__m2))
1502 goto __continue;
1503 ++__m1;
1504 ++__m2;
1505 }
1506 switch (__last2 - __m2)
1507 {
1508 case 3:
1509 if (!__pred(*__m1, *__m2))
1510 break;
1511 ++__m1;
1512 ++__m2;
1513 case 2:
1514 if (!__pred(*__m1, *__m2))
1515 break;
1516 ++__m1;
1517 ++__m2;
1518 case 1:
1519 if (!__pred(*__m1, *__m2))
1520 break;
1521 case 0:
1522 return __first1;
1523 }
1524 __continue:
1525 ++__first1;
Howard Hinnant324bb032010-08-22 00:02:43 +00001526#endif // !_LIBCPP_UNROLL_LOOPS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001527 }
1528}
1529
1530template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
1531inline _LIBCPP_INLINE_VISIBILITY
1532_ForwardIterator1
1533search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1534 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1535{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001536 return _VSTD::__search<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001537 (__first1, __last1, __first2, __last2, __pred,
1538 typename std::iterator_traits<_ForwardIterator1>::iterator_category(),
1539 typename std::iterator_traits<_ForwardIterator2>::iterator_category());
1540}
1541
1542template <class _ForwardIterator1, class _ForwardIterator2>
1543inline _LIBCPP_INLINE_VISIBILITY
1544_ForwardIterator1
1545search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1546 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1547{
1548 typedef typename std::iterator_traits<_ForwardIterator1>::value_type __v1;
1549 typedef typename std::iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001550 return _VSTD::search(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001551}
1552
1553// search_n
1554
1555template <class _BinaryPredicate, class _ForwardIterator, class _Size, class _Tp>
1556_ForwardIterator
1557__search_n(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnant78b68282011-10-22 20:59:45 +00001558 _Size __count, const _Tp& __value_, _BinaryPredicate __pred, forward_iterator_tag)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001559{
1560 if (__count <= 0)
1561 return __first;
1562 while (true)
1563 {
Howard Hinnant78b68282011-10-22 20:59:45 +00001564 // Find first element in sequence that matchs __value_, with a mininum of loop checks
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001565 while (true)
1566 {
Howard Hinnant78b68282011-10-22 20:59:45 +00001567 if (__first == __last) // return __last if no element matches __value_
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001568 return __last;
Howard Hinnant78b68282011-10-22 20:59:45 +00001569 if (__pred(*__first, __value_))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001570 break;
1571 ++__first;
1572 }
Howard Hinnant78b68282011-10-22 20:59:45 +00001573 // *__first matches __value_, now match elements after here
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001574 _ForwardIterator __m = __first;
1575 _Size __c(0);
1576 while (true)
1577 {
1578 if (++__c == __count) // If pattern exhausted, __first is the answer (works for 1 element pattern)
1579 return __first;
1580 if (++__m == __last) // Otherwise if source exhaused, pattern not found
1581 return __last;
Howard Hinnant78b68282011-10-22 20:59:45 +00001582 if (!__pred(*__m, __value_)) // if there is a mismatch, restart with a new __first
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001583 {
1584 __first = __m;
1585 ++__first;
1586 break;
1587 } // else there is a match, check next elements
1588 }
1589 }
1590}
1591
1592template <class _BinaryPredicate, class _RandomAccessIterator, class _Size, class _Tp>
1593_RandomAccessIterator
1594__search_n(_RandomAccessIterator __first, _RandomAccessIterator __last,
Howard Hinnant78b68282011-10-22 20:59:45 +00001595 _Size __count, const _Tp& __value_, _BinaryPredicate __pred, random_access_iterator_tag)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001596{
1597 if (__count <= 0)
1598 return __first;
1599 _Size __len = static_cast<_Size>(__last - __first);
1600 if (__len < __count)
1601 return __last;
1602 const _RandomAccessIterator __s = __last - (__count - 1); // Start of pattern match can't go beyond here
1603 while (true)
1604 {
Howard Hinnant78b68282011-10-22 20:59:45 +00001605 // Find first element in sequence that matchs __value_, with a mininum of loop checks
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001606 while (true)
1607 {
Howard Hinnant128f7bf2013-04-04 15:40:48 +00001608 if (__first >= __s) // return __last if no element matches __value_
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001609 return __last;
Howard Hinnant78b68282011-10-22 20:59:45 +00001610 if (__pred(*__first, __value_))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001611 break;
1612 ++__first;
1613 }
Howard Hinnant78b68282011-10-22 20:59:45 +00001614 // *__first matches __value_, now match elements after here
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001615 _RandomAccessIterator __m = __first;
1616 _Size __c(0);
1617 while (true)
1618 {
1619 if (++__c == __count) // If pattern exhausted, __first is the answer (works for 1 element pattern)
1620 return __first;
1621 ++__m; // no need to check range on __m because __s guarantees we have enough source
Howard Hinnant78b68282011-10-22 20:59:45 +00001622 if (!__pred(*__m, __value_)) // if there is a mismatch, restart with a new __first
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001623 {
1624 __first = __m;
1625 ++__first;
1626 break;
1627 } // else there is a match, check next elements
1628 }
1629 }
1630}
1631
1632template <class _ForwardIterator, class _Size, class _Tp, class _BinaryPredicate>
1633inline _LIBCPP_INLINE_VISIBILITY
1634_ForwardIterator
1635search_n(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnant78b68282011-10-22 20:59:45 +00001636 _Size __count, const _Tp& __value_, _BinaryPredicate __pred)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001637{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001638 return _VSTD::__search_n<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnant78b68282011-10-22 20:59:45 +00001639 (__first, __last, __count, __value_, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001640}
1641
1642template <class _ForwardIterator, class _Size, class _Tp>
1643inline _LIBCPP_INLINE_VISIBILITY
1644_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00001645search_n(_ForwardIterator __first, _ForwardIterator __last, _Size __count, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001646{
1647 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Howard Hinnant78b68282011-10-22 20:59:45 +00001648 return _VSTD::search_n(__first, __last, __count, __value_, __equal_to<__v, _Tp>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001649}
1650
1651// copy
1652
1653template <class _Iter>
1654struct __libcpp_is_trivial_iterator
1655{
1656 static const bool value = is_pointer<_Iter>::value;
1657};
1658
1659template <class _Iter>
1660struct __libcpp_is_trivial_iterator<move_iterator<_Iter> >
1661{
1662 static const bool value = is_pointer<_Iter>::value;
1663};
1664
1665template <class _Iter>
1666struct __libcpp_is_trivial_iterator<__wrap_iter<_Iter> >
1667{
1668 static const bool value = is_pointer<_Iter>::value;
1669};
1670
1671template <class _Iter>
1672inline _LIBCPP_INLINE_VISIBILITY
1673_Iter
1674__unwrap_iter(_Iter __i)
1675{
1676 return __i;
1677}
1678
1679template <class _Tp>
1680inline _LIBCPP_INLINE_VISIBILITY
1681typename enable_if
1682<
Howard Hinnant1468b662010-11-19 22:17:28 +00001683 is_trivially_copy_assignable<_Tp>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001684 _Tp*
1685>::type
1686__unwrap_iter(move_iterator<_Tp*> __i)
1687{
1688 return __i.base();
1689}
1690
1691template <class _Tp>
1692inline _LIBCPP_INLINE_VISIBILITY
1693typename enable_if
1694<
Howard Hinnant1468b662010-11-19 22:17:28 +00001695 is_trivially_copy_assignable<_Tp>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001696 _Tp*
1697>::type
1698__unwrap_iter(__wrap_iter<_Tp*> __i)
1699{
1700 return __i.base();
1701}
1702
1703template <class _InputIterator, class _OutputIterator>
1704inline _LIBCPP_INLINE_VISIBILITY
1705_OutputIterator
1706__copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1707{
1708 for (; __first != __last; ++__first, ++__result)
1709 *__result = *__first;
1710 return __result;
1711}
1712
1713template <class _Tp, class _Up>
1714inline _LIBCPP_INLINE_VISIBILITY
1715typename enable_if
1716<
1717 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnant1468b662010-11-19 22:17:28 +00001718 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001719 _Up*
1720>::type
1721__copy(_Tp* __first, _Tp* __last, _Up* __result)
1722{
1723 const size_t __n = static_cast<size_t>(__last - __first);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001724 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001725 return __result + __n;
1726}
1727
1728template <class _InputIterator, class _OutputIterator>
1729inline _LIBCPP_INLINE_VISIBILITY
1730_OutputIterator
1731copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1732{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001733 return _VSTD::__copy(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001734}
1735
1736// copy_backward
1737
Howard Hinnantb73568d2013-02-06 21:03:39 +00001738template <class _BidirectionalIterator, class _OutputIterator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001739inline _LIBCPP_INLINE_VISIBILITY
1740_OutputIterator
Howard Hinnantb73568d2013-02-06 21:03:39 +00001741__copy_backward(_BidirectionalIterator __first, _BidirectionalIterator __last, _OutputIterator __result)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001742{
1743 while (__first != __last)
1744 *--__result = *--__last;
1745 return __result;
1746}
1747
1748template <class _Tp, class _Up>
1749inline _LIBCPP_INLINE_VISIBILITY
1750typename enable_if
1751<
1752 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnant1468b662010-11-19 22:17:28 +00001753 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001754 _Up*
1755>::type
1756__copy_backward(_Tp* __first, _Tp* __last, _Up* __result)
1757{
1758 const size_t __n = static_cast<size_t>(__last - __first);
1759 __result -= __n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001760 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001761 return __result;
1762}
1763
1764template <class _BidirectionalIterator1, class _BidirectionalIterator2>
1765inline _LIBCPP_INLINE_VISIBILITY
1766_BidirectionalIterator2
1767copy_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
1768 _BidirectionalIterator2 __result)
1769{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001770 return _VSTD::__copy_backward(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001771}
1772
1773// copy_if
1774
1775template<class _InputIterator, class _OutputIterator, class _Predicate>
1776inline _LIBCPP_INLINE_VISIBILITY
1777_OutputIterator
1778copy_if(_InputIterator __first, _InputIterator __last,
1779 _OutputIterator __result, _Predicate __pred)
1780{
1781 for (; __first != __last; ++__first)
1782 {
1783 if (__pred(*__first))
1784 {
1785 *__result = *__first;
1786 ++__result;
1787 }
1788 }
1789 return __result;
1790}
1791
1792// copy_n
1793
1794template<class _InputIterator, class _Size, class _OutputIterator>
1795inline _LIBCPP_INLINE_VISIBILITY
1796typename enable_if
1797<
1798 __is_input_iterator<_InputIterator>::value &&
1799 !__is_random_access_iterator<_InputIterator>::value,
1800 _OutputIterator
1801>::type
1802copy_n(_InputIterator __first, _Size __n, _OutputIterator __result)
1803{
Howard Hinnant171869e2011-02-27 20:55:39 +00001804 if (__n > 0)
1805 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001806 *__result = *__first;
Howard Hinnant171869e2011-02-27 20:55:39 +00001807 ++__result;
1808 for (--__n; __n > 0; --__n)
1809 {
1810 ++__first;
1811 *__result = *__first;
1812 ++__result;
1813 }
1814 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001815 return __result;
1816}
1817
1818template<class _InputIterator, class _Size, class _OutputIterator>
1819inline _LIBCPP_INLINE_VISIBILITY
1820typename enable_if
1821<
1822 __is_random_access_iterator<_InputIterator>::value,
1823 _OutputIterator
1824>::type
1825copy_n(_InputIterator __first, _Size __n, _OutputIterator __result)
1826{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001827 return _VSTD::copy(__first, __first + __n, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001828}
1829
1830// move
1831
1832template <class _InputIterator, class _OutputIterator>
1833inline _LIBCPP_INLINE_VISIBILITY
1834_OutputIterator
1835__move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1836{
1837 for (; __first != __last; ++__first, ++__result)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001838 *__result = _VSTD::move(*__first);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001839 return __result;
1840}
1841
1842template <class _Tp, class _Up>
1843inline _LIBCPP_INLINE_VISIBILITY
1844typename enable_if
1845<
1846 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnant1468b662010-11-19 22:17:28 +00001847 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001848 _Up*
1849>::type
1850__move(_Tp* __first, _Tp* __last, _Up* __result)
1851{
1852 const size_t __n = static_cast<size_t>(__last - __first);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001853 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001854 return __result + __n;
1855}
1856
1857template <class _InputIterator, class _OutputIterator>
1858inline _LIBCPP_INLINE_VISIBILITY
1859_OutputIterator
1860move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1861{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001862 return _VSTD::__move(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001863}
1864
1865// move_backward
1866
1867template <class _InputIterator, class _OutputIterator>
1868inline _LIBCPP_INLINE_VISIBILITY
1869_OutputIterator
1870__move_backward(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1871{
1872 while (__first != __last)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001873 *--__result = _VSTD::move(*--__last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001874 return __result;
1875}
1876
1877template <class _Tp, class _Up>
1878inline _LIBCPP_INLINE_VISIBILITY
1879typename enable_if
1880<
1881 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnant1468b662010-11-19 22:17:28 +00001882 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001883 _Up*
1884>::type
1885__move_backward(_Tp* __first, _Tp* __last, _Up* __result)
1886{
1887 const size_t __n = static_cast<size_t>(__last - __first);
1888 __result -= __n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001889 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001890 return __result;
1891}
1892
1893template <class _BidirectionalIterator1, class _BidirectionalIterator2>
1894inline _LIBCPP_INLINE_VISIBILITY
1895_BidirectionalIterator2
1896move_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
1897 _BidirectionalIterator2 __result)
1898{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001899 return _VSTD::__move_backward(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001900}
1901
1902// iter_swap
1903
Howard Hinnante9b2c2d2011-05-27 15:04:19 +00001904// moved to <type_traits> for better swap / noexcept support
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001905
1906// transform
1907
1908template <class _InputIterator, class _OutputIterator, class _UnaryOperation>
1909inline _LIBCPP_INLINE_VISIBILITY
1910_OutputIterator
1911transform(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _UnaryOperation __op)
1912{
1913 for (; __first != __last; ++__first, ++__result)
1914 *__result = __op(*__first);
1915 return __result;
1916}
1917
1918template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _BinaryOperation>
1919inline _LIBCPP_INLINE_VISIBILITY
1920_OutputIterator
1921transform(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2,
1922 _OutputIterator __result, _BinaryOperation __binary_op)
1923{
1924 for (; __first1 != __last1; ++__first1, ++__first2, ++__result)
1925 *__result = __binary_op(*__first1, *__first2);
1926 return __result;
1927}
1928
1929// replace
1930
1931template <class _ForwardIterator, class _Tp>
1932inline _LIBCPP_INLINE_VISIBILITY
1933void
1934replace(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __old_value, const _Tp& __new_value)
1935{
1936 for (; __first != __last; ++__first)
1937 if (*__first == __old_value)
1938 *__first = __new_value;
1939}
1940
1941// replace_if
1942
1943template <class _ForwardIterator, class _Predicate, class _Tp>
1944inline _LIBCPP_INLINE_VISIBILITY
1945void
1946replace_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, const _Tp& __new_value)
1947{
1948 for (; __first != __last; ++__first)
1949 if (__pred(*__first))
1950 *__first = __new_value;
1951}
1952
1953// replace_copy
1954
1955template <class _InputIterator, class _OutputIterator, class _Tp>
1956inline _LIBCPP_INLINE_VISIBILITY
1957_OutputIterator
1958replace_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
1959 const _Tp& __old_value, const _Tp& __new_value)
1960{
1961 for (; __first != __last; ++__first, ++__result)
1962 if (*__first == __old_value)
1963 *__result = __new_value;
1964 else
1965 *__result = *__first;
1966 return __result;
1967}
1968
1969// replace_copy_if
1970
1971template <class _InputIterator, class _OutputIterator, class _Predicate, class _Tp>
1972inline _LIBCPP_INLINE_VISIBILITY
1973_OutputIterator
1974replace_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
1975 _Predicate __pred, const _Tp& __new_value)
1976{
1977 for (; __first != __last; ++__first, ++__result)
1978 if (__pred(*__first))
1979 *__result = __new_value;
1980 else
1981 *__result = *__first;
1982 return __result;
1983}
1984
1985// fill_n
1986
1987template <class _OutputIterator, class _Size, class _Tp>
1988inline _LIBCPP_INLINE_VISIBILITY
1989_OutputIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00001990__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_, false_type)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001991{
1992 for (; __n > 0; ++__first, --__n)
Howard Hinnant78b68282011-10-22 20:59:45 +00001993 *__first = __value_;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001994 return __first;
1995}
1996
1997template <class _OutputIterator, class _Size, class _Tp>
1998inline _LIBCPP_INLINE_VISIBILITY
1999_OutputIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00002000__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_, true_type)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002001{
2002 if (__n > 0)
Howard Hinnant78b68282011-10-22 20:59:45 +00002003 _VSTD::memset(__first, (unsigned char)__value_, (size_t)(__n));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002004 return __first + __n;
2005}
2006
2007template <class _OutputIterator, class _Size, class _Tp>
2008inline _LIBCPP_INLINE_VISIBILITY
2009_OutputIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00002010fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002011{
Howard Hinnant78b68282011-10-22 20:59:45 +00002012 return _VSTD::__fill_n(__first, __n, __value_, integral_constant<bool,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002013 is_pointer<_OutputIterator>::value &&
Anders Carlssonb8e0d902013-07-22 21:08:00 +00002014 is_trivially_assignable<typename remove_pointer<_OutputIterator>::type, _Tp>::value &&
Howard Hinnanteb341222013-08-01 00:41:55 +00002015 is_convertible<_Tp, unsigned char>::value &&
Anders Carlssonb8e0d902013-07-22 21:08:00 +00002016 sizeof(typename remove_pointer<_OutputIterator>::type) == 1>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002017}
2018
2019// fill
2020
2021template <class _ForwardIterator, class _Tp>
2022inline _LIBCPP_INLINE_VISIBILITY
2023void
Howard Hinnant78b68282011-10-22 20:59:45 +00002024__fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, forward_iterator_tag)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002025{
2026 for (; __first != __last; ++__first)
Howard Hinnant78b68282011-10-22 20:59:45 +00002027 *__first = __value_;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002028}
2029
2030template <class _RandomAccessIterator, class _Tp>
2031inline _LIBCPP_INLINE_VISIBILITY
2032void
Howard Hinnant78b68282011-10-22 20:59:45 +00002033__fill(_RandomAccessIterator __first, _RandomAccessIterator __last, const _Tp& __value_, random_access_iterator_tag)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002034{
Howard Hinnant78b68282011-10-22 20:59:45 +00002035 _VSTD::fill_n(__first, __last - __first, __value_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002036}
2037
2038template <class _ForwardIterator, class _Tp>
2039inline _LIBCPP_INLINE_VISIBILITY
2040void
Howard Hinnant78b68282011-10-22 20:59:45 +00002041fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002042{
Howard Hinnant78b68282011-10-22 20:59:45 +00002043 _VSTD::__fill(__first, __last, __value_, typename iterator_traits<_ForwardIterator>::iterator_category());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002044}
2045
2046// generate
2047
2048template <class _ForwardIterator, class _Generator>
2049inline _LIBCPP_INLINE_VISIBILITY
2050void
2051generate(_ForwardIterator __first, _ForwardIterator __last, _Generator __gen)
2052{
2053 for (; __first != __last; ++__first)
2054 *__first = __gen();
2055}
2056
2057// generate_n
2058
2059template <class _OutputIterator, class _Size, class _Generator>
2060inline _LIBCPP_INLINE_VISIBILITY
2061_OutputIterator
2062generate_n(_OutputIterator __first, _Size __n, _Generator __gen)
2063{
2064 for (; __n > 0; ++__first, --__n)
2065 *__first = __gen();
2066 return __first;
2067}
2068
2069// remove
2070
2071template <class _ForwardIterator, class _Tp>
2072_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00002073remove(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002074{
Howard Hinnant78b68282011-10-22 20:59:45 +00002075 __first = _VSTD::find(__first, __last, __value_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002076 if (__first != __last)
2077 {
2078 _ForwardIterator __i = __first;
2079 while (++__i != __last)
2080 {
Howard Hinnant78b68282011-10-22 20:59:45 +00002081 if (!(*__i == __value_))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002082 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002083 *__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002084 ++__first;
2085 }
2086 }
2087 }
2088 return __first;
2089}
2090
2091// remove_if
2092
2093template <class _ForwardIterator, class _Predicate>
2094_ForwardIterator
2095remove_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
2096{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002097 __first = _VSTD::find_if<_ForwardIterator, typename add_lvalue_reference<_Predicate>::type>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002098 (__first, __last, __pred);
2099 if (__first != __last)
2100 {
2101 _ForwardIterator __i = __first;
2102 while (++__i != __last)
2103 {
2104 if (!__pred(*__i))
2105 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002106 *__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002107 ++__first;
2108 }
2109 }
2110 }
2111 return __first;
2112}
2113
2114// remove_copy
2115
2116template <class _InputIterator, class _OutputIterator, class _Tp>
2117inline _LIBCPP_INLINE_VISIBILITY
2118_OutputIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00002119remove_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002120{
2121 for (; __first != __last; ++__first)
2122 {
Howard Hinnant78b68282011-10-22 20:59:45 +00002123 if (!(*__first == __value_))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002124 {
2125 *__result = *__first;
2126 ++__result;
2127 }
2128 }
2129 return __result;
2130}
2131
2132// remove_copy_if
2133
2134template <class _InputIterator, class _OutputIterator, class _Predicate>
2135inline _LIBCPP_INLINE_VISIBILITY
2136_OutputIterator
2137remove_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Predicate __pred)
2138{
2139 for (; __first != __last; ++__first)
2140 {
2141 if (!__pred(*__first))
2142 {
2143 *__result = *__first;
2144 ++__result;
2145 }
2146 }
2147 return __result;
2148}
2149
2150// unique
2151
2152template <class _ForwardIterator, class _BinaryPredicate>
2153_ForwardIterator
2154unique(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred)
2155{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002156 __first = _VSTD::adjacent_find<_ForwardIterator, typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002157 (__first, __last, __pred);
2158 if (__first != __last)
2159 {
2160 // ... a a ? ...
2161 // f i
2162 _ForwardIterator __i = __first;
2163 for (++__i; ++__i != __last;)
2164 if (!__pred(*__first, *__i))
Howard Hinnant0949eed2011-06-30 21:18:19 +00002165 *++__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002166 ++__first;
2167 }
2168 return __first;
2169}
2170
2171template <class _ForwardIterator>
2172inline _LIBCPP_INLINE_VISIBILITY
2173_ForwardIterator
2174unique(_ForwardIterator __first, _ForwardIterator __last)
2175{
2176 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002177 return _VSTD::unique(__first, __last, __equal_to<__v>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002178}
2179
2180// unique_copy
2181
2182template <class _BinaryPredicate, class _InputIterator, class _OutputIterator>
2183_OutputIterator
2184__unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred,
2185 input_iterator_tag, output_iterator_tag)
2186{
2187 if (__first != __last)
2188 {
2189 typename iterator_traits<_InputIterator>::value_type __t(*__first);
2190 *__result = __t;
2191 ++__result;
2192 while (++__first != __last)
2193 {
2194 if (!__pred(__t, *__first))
2195 {
2196 __t = *__first;
2197 *__result = __t;
2198 ++__result;
2199 }
2200 }
2201 }
2202 return __result;
2203}
2204
2205template <class _BinaryPredicate, class _ForwardIterator, class _OutputIterator>
2206_OutputIterator
2207__unique_copy(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result, _BinaryPredicate __pred,
2208 forward_iterator_tag, output_iterator_tag)
2209{
2210 if (__first != __last)
2211 {
2212 _ForwardIterator __i = __first;
2213 *__result = *__i;
2214 ++__result;
2215 while (++__first != __last)
2216 {
2217 if (!__pred(*__i, *__first))
2218 {
2219 *__result = *__first;
2220 ++__result;
2221 __i = __first;
2222 }
2223 }
2224 }
2225 return __result;
2226}
2227
2228template <class _BinaryPredicate, class _InputIterator, class _ForwardIterator>
2229_ForwardIterator
2230__unique_copy(_InputIterator __first, _InputIterator __last, _ForwardIterator __result, _BinaryPredicate __pred,
2231 input_iterator_tag, forward_iterator_tag)
2232{
2233 if (__first != __last)
2234 {
2235 *__result = *__first;
2236 while (++__first != __last)
2237 if (!__pred(*__result, *__first))
2238 *++__result = *__first;
2239 ++__result;
2240 }
2241 return __result;
2242}
2243
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002244template <class _InputIterator, class _OutputIterator, class _BinaryPredicate>
2245inline _LIBCPP_INLINE_VISIBILITY
2246_OutputIterator
2247unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred)
2248{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002249 return _VSTD::__unique_copy<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002250 (__first, __last, __result, __pred,
2251 typename iterator_traits<_InputIterator>::iterator_category(),
2252 typename iterator_traits<_OutputIterator>::iterator_category());
2253}
2254
2255template <class _InputIterator, class _OutputIterator>
2256inline _LIBCPP_INLINE_VISIBILITY
2257_OutputIterator
2258unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
2259{
2260 typedef typename iterator_traits<_InputIterator>::value_type __v;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002261 return _VSTD::unique_copy(__first, __last, __result, __equal_to<__v>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002262}
2263
2264// reverse
2265
2266template <class _BidirectionalIterator>
2267inline _LIBCPP_INLINE_VISIBILITY
2268void
2269__reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirectional_iterator_tag)
2270{
2271 while (__first != __last)
2272 {
2273 if (__first == --__last)
2274 break;
2275 swap(*__first, *__last);
2276 ++__first;
2277 }
2278}
2279
2280template <class _RandomAccessIterator>
2281inline _LIBCPP_INLINE_VISIBILITY
2282void
2283__reverse(_RandomAccessIterator __first, _RandomAccessIterator __last, random_access_iterator_tag)
2284{
2285 if (__first != __last)
2286 for (; __first < --__last; ++__first)
2287 swap(*__first, *__last);
2288}
2289
2290template <class _BidirectionalIterator>
2291inline _LIBCPP_INLINE_VISIBILITY
2292void
2293reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
2294{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002295 _VSTD::__reverse(__first, __last, typename iterator_traits<_BidirectionalIterator>::iterator_category());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002296}
2297
2298// reverse_copy
2299
2300template <class _BidirectionalIterator, class _OutputIterator>
2301inline _LIBCPP_INLINE_VISIBILITY
2302_OutputIterator
2303reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last, _OutputIterator __result)
2304{
2305 for (; __first != __last; ++__result)
2306 *__result = *--__last;
2307 return __result;
2308}
2309
2310// rotate
2311
2312template <class _ForwardIterator>
2313_ForwardIterator
Howard Hinnant4b2f4202012-08-03 18:01:20 +00002314__rotate_left(_ForwardIterator __first, _ForwardIterator __last)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002315{
Howard Hinnant4b2f4202012-08-03 18:01:20 +00002316 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
2317 value_type __tmp = _VSTD::move(*__first);
2318 _ForwardIterator __lm1 = _VSTD::move(_VSTD::next(__first), __last, __first);
2319 *__lm1 = _VSTD::move(__tmp);
2320 return __lm1;
2321}
2322
2323template <class _BidirectionalIterator>
2324_BidirectionalIterator
2325__rotate_right(_BidirectionalIterator __first, _BidirectionalIterator __last)
2326{
2327 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
2328 _BidirectionalIterator __lm1 = _VSTD::prev(__last);
2329 value_type __tmp = _VSTD::move(*__lm1);
2330 _BidirectionalIterator __fp1 = _VSTD::move_backward(__first, __lm1, __last);
2331 *__first = _VSTD::move(__tmp);
2332 return __fp1;
2333}
2334
2335template <class _ForwardIterator>
2336_ForwardIterator
2337__rotate_forward(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last)
2338{
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002339 _ForwardIterator __i = __middle;
2340 while (true)
2341 {
2342 swap(*__first, *__i);
2343 ++__first;
2344 if (++__i == __last)
2345 break;
2346 if (__first == __middle)
2347 __middle = __i;
2348 }
2349 _ForwardIterator __r = __first;
2350 if (__first != __middle)
2351 {
2352 __i = __middle;
2353 while (true)
2354 {
2355 swap(*__first, *__i);
2356 ++__first;
2357 if (++__i == __last)
2358 {
2359 if (__first == __middle)
2360 break;
2361 __i = __middle;
2362 }
2363 else if (__first == __middle)
2364 __middle = __i;
2365 }
2366 }
2367 return __r;
2368}
2369
2370template<typename _Integral>
2371inline _LIBCPP_INLINE_VISIBILITY
2372_Integral
2373__gcd(_Integral __x, _Integral __y)
2374{
2375 do
2376 {
2377 _Integral __t = __x % __y;
2378 __x = __y;
2379 __y = __t;
2380 } while (__y);
2381 return __x;
2382}
2383
2384template<typename _RandomAccessIterator>
2385_RandomAccessIterator
Howard Hinnant4b2f4202012-08-03 18:01:20 +00002386__rotate_gcd(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002387{
2388 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
2389 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
Howard Hinnant324bb032010-08-22 00:02:43 +00002390
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002391 const difference_type __m1 = __middle - __first;
2392 const difference_type __m2 = __last - __middle;
2393 if (__m1 == __m2)
2394 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002395 _VSTD::swap_ranges(__first, __middle, __middle);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002396 return __middle;
2397 }
Howard Hinnant4b2f4202012-08-03 18:01:20 +00002398 const difference_type __g = _VSTD::__gcd(__m1, __m2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002399 for (_RandomAccessIterator __p = __first + __g; __p != __first;)
2400 {
Howard Hinnant4b2f4202012-08-03 18:01:20 +00002401 value_type __t(_VSTD::move(*--__p));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002402 _RandomAccessIterator __p1 = __p;
2403 _RandomAccessIterator __p2 = __p1 + __m1;
2404 do
2405 {
Howard Hinnant4b2f4202012-08-03 18:01:20 +00002406 *__p1 = _VSTD::move(*__p2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002407 __p1 = __p2;
2408 const difference_type __d = __last - __p2;
2409 if (__m1 < __d)
2410 __p2 += __m1;
2411 else
2412 __p2 = __first + (__m1 - __d);
2413 } while (__p2 != __p);
Howard Hinnant4b2f4202012-08-03 18:01:20 +00002414 *__p1 = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002415 }
2416 return __first + __m2;
2417}
2418
2419template <class _ForwardIterator>
2420inline _LIBCPP_INLINE_VISIBILITY
2421_ForwardIterator
Howard Hinnant4b2f4202012-08-03 18:01:20 +00002422__rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last,
2423 _VSTD::forward_iterator_tag)
2424{
2425 typedef typename _VSTD::iterator_traits<_ForwardIterator>::value_type value_type;
2426 if (_VSTD::is_trivially_move_assignable<value_type>::value)
2427 {
2428 if (_VSTD::next(__first) == __middle)
2429 return _VSTD::__rotate_left(__first, __last);
2430 }
2431 return _VSTD::__rotate_forward(__first, __middle, __last);
2432}
2433
2434template <class _BidirectionalIterator>
2435inline _LIBCPP_INLINE_VISIBILITY
2436_BidirectionalIterator
2437__rotate(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
2438 _VSTD::bidirectional_iterator_tag)
2439{
2440 typedef typename _VSTD::iterator_traits<_BidirectionalIterator>::value_type value_type;
2441 if (_VSTD::is_trivially_move_assignable<value_type>::value)
2442 {
2443 if (_VSTD::next(__first) == __middle)
2444 return _VSTD::__rotate_left(__first, __last);
2445 if (_VSTD::next(__middle) == __last)
2446 return _VSTD::__rotate_right(__first, __last);
2447 }
2448 return _VSTD::__rotate_forward(__first, __middle, __last);
2449}
2450
2451template <class _RandomAccessIterator>
2452inline _LIBCPP_INLINE_VISIBILITY
2453_RandomAccessIterator
2454__rotate(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
2455 _VSTD::random_access_iterator_tag)
2456{
2457 typedef typename _VSTD::iterator_traits<_RandomAccessIterator>::value_type value_type;
2458 if (_VSTD::is_trivially_move_assignable<value_type>::value)
2459 {
2460 if (_VSTD::next(__first) == __middle)
2461 return _VSTD::__rotate_left(__first, __last);
2462 if (_VSTD::next(__middle) == __last)
2463 return _VSTD::__rotate_right(__first, __last);
2464 return _VSTD::__rotate_gcd(__first, __middle, __last);
2465 }
2466 return _VSTD::__rotate_forward(__first, __middle, __last);
2467}
2468
2469template <class _ForwardIterator>
2470inline _LIBCPP_INLINE_VISIBILITY
2471_ForwardIterator
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002472rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last)
2473{
Howard Hinnant4b2f4202012-08-03 18:01:20 +00002474 if (__first == __middle)
2475 return __last;
2476 if (__middle == __last)
2477 return __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002478 return _VSTD::__rotate(__first, __middle, __last,
Howard Hinnant4b2f4202012-08-03 18:01:20 +00002479 typename _VSTD::iterator_traits<_ForwardIterator>::iterator_category());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002480}
2481
2482// rotate_copy
2483
2484template <class _ForwardIterator, class _OutputIterator>
2485inline _LIBCPP_INLINE_VISIBILITY
2486_OutputIterator
2487rotate_copy(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last, _OutputIterator __result)
2488{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002489 return _VSTD::copy(__first, __middle, _VSTD::copy(__middle, __last, __result));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002490}
2491
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002492// min_element
2493
2494template <class _ForwardIterator, class _Compare>
2495inline _LIBCPP_INLINE_VISIBILITY
2496_ForwardIterator
2497min_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
2498{
2499 if (__first != __last)
2500 {
2501 _ForwardIterator __i = __first;
2502 while (++__i != __last)
2503 if (__comp(*__i, *__first))
2504 __first = __i;
2505 }
2506 return __first;
2507}
2508
2509template <class _ForwardIterator>
2510inline _LIBCPP_INLINE_VISIBILITY
2511_ForwardIterator
2512min_element(_ForwardIterator __first, _ForwardIterator __last)
2513{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002514 return _VSTD::min_element(__first, __last,
Howard Hinnant98e5d972010-08-21 20:10:01 +00002515 __less<typename iterator_traits<_ForwardIterator>::value_type>());
2516}
2517
2518// min
2519
2520template <class _Tp, class _Compare>
2521inline _LIBCPP_INLINE_VISIBILITY
2522const _Tp&
2523min(const _Tp& __a, const _Tp& __b, _Compare __comp)
2524{
2525 return __comp(__b, __a) ? __b : __a;
2526}
2527
2528template <class _Tp>
2529inline _LIBCPP_INLINE_VISIBILITY
2530const _Tp&
2531min(const _Tp& __a, const _Tp& __b)
2532{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002533 return _VSTD::min(__a, __b, __less<_Tp>());
Howard Hinnant98e5d972010-08-21 20:10:01 +00002534}
2535
Howard Hinnante3e32912011-08-12 21:56:02 +00002536#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2537
Howard Hinnant98e5d972010-08-21 20:10:01 +00002538template<class _Tp, class _Compare>
2539inline _LIBCPP_INLINE_VISIBILITY
2540_Tp
2541min(initializer_list<_Tp> __t, _Compare __comp)
2542{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002543 return *_VSTD::min_element(__t.begin(), __t.end(), __comp);
Howard Hinnant98e5d972010-08-21 20:10:01 +00002544}
2545
2546template<class _Tp>
2547inline _LIBCPP_INLINE_VISIBILITY
2548_Tp
2549min(initializer_list<_Tp> __t)
2550{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002551 return *_VSTD::min_element(__t.begin(), __t.end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002552}
2553
Howard Hinnante3e32912011-08-12 21:56:02 +00002554#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2555
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002556// max_element
2557
2558template <class _ForwardIterator, class _Compare>
2559inline _LIBCPP_INLINE_VISIBILITY
2560_ForwardIterator
2561max_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
2562{
2563 if (__first != __last)
2564 {
2565 _ForwardIterator __i = __first;
2566 while (++__i != __last)
2567 if (__comp(*__first, *__i))
2568 __first = __i;
2569 }
2570 return __first;
2571}
2572
2573template <class _ForwardIterator>
2574inline _LIBCPP_INLINE_VISIBILITY
2575_ForwardIterator
2576max_element(_ForwardIterator __first, _ForwardIterator __last)
2577{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002578 return _VSTD::max_element(__first, __last,
Howard Hinnant98e5d972010-08-21 20:10:01 +00002579 __less<typename iterator_traits<_ForwardIterator>::value_type>());
2580}
2581
2582// max
2583
2584template <class _Tp, class _Compare>
2585inline _LIBCPP_INLINE_VISIBILITY
2586const _Tp&
2587max(const _Tp& __a, const _Tp& __b, _Compare __comp)
2588{
2589 return __comp(__a, __b) ? __b : __a;
2590}
2591
2592template <class _Tp>
2593inline _LIBCPP_INLINE_VISIBILITY
2594const _Tp&
2595max(const _Tp& __a, const _Tp& __b)
2596{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002597 return _VSTD::max(__a, __b, __less<_Tp>());
Howard Hinnant98e5d972010-08-21 20:10:01 +00002598}
2599
Howard Hinnante3e32912011-08-12 21:56:02 +00002600#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2601
Howard Hinnant98e5d972010-08-21 20:10:01 +00002602template<class _Tp, class _Compare>
2603inline _LIBCPP_INLINE_VISIBILITY
2604_Tp
2605max(initializer_list<_Tp> __t, _Compare __comp)
2606{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002607 return *_VSTD::max_element(__t.begin(), __t.end(), __comp);
Howard Hinnant98e5d972010-08-21 20:10:01 +00002608}
2609
2610template<class _Tp>
2611inline _LIBCPP_INLINE_VISIBILITY
2612_Tp
2613max(initializer_list<_Tp> __t)
2614{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002615 return *_VSTD::max_element(__t.begin(), __t.end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002616}
2617
Howard Hinnante3e32912011-08-12 21:56:02 +00002618#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2619
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002620// minmax_element
2621
2622template <class _ForwardIterator, class _Compare>
2623std::pair<_ForwardIterator, _ForwardIterator>
2624minmax_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
2625{
2626 std::pair<_ForwardIterator, _ForwardIterator> __result(__first, __first);
2627 if (__first != __last)
2628 {
2629 if (++__first != __last)
2630 {
2631 if (__comp(*__first, *__result.first))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002632 __result.first = __first;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002633 else
2634 __result.second = __first;
2635 while (++__first != __last)
2636 {
2637 _ForwardIterator __i = __first;
2638 if (++__first == __last)
2639 {
2640 if (__comp(*__i, *__result.first))
2641 __result.first = __i;
2642 else if (!__comp(*__i, *__result.second))
2643 __result.second = __i;
2644 break;
2645 }
2646 else
2647 {
2648 if (__comp(*__first, *__i))
2649 {
2650 if (__comp(*__first, *__result.first))
2651 __result.first = __first;
2652 if (!__comp(*__i, *__result.second))
2653 __result.second = __i;
2654 }
2655 else
2656 {
2657 if (__comp(*__i, *__result.first))
2658 __result.first = __i;
2659 if (!__comp(*__first, *__result.second))
2660 __result.second = __first;
2661 }
2662 }
2663 }
2664 }
2665 }
2666 return __result;
2667}
2668
2669template <class _ForwardIterator>
2670inline _LIBCPP_INLINE_VISIBILITY
2671std::pair<_ForwardIterator, _ForwardIterator>
2672minmax_element(_ForwardIterator __first, _ForwardIterator __last)
2673{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002674 return _VSTD::minmax_element(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002675}
2676
Howard Hinnant98e5d972010-08-21 20:10:01 +00002677// minmax
2678
2679template<class _Tp, class _Compare>
2680inline _LIBCPP_INLINE_VISIBILITY
2681pair<const _Tp&, const _Tp&>
2682minmax(const _Tp& __a, const _Tp& __b, _Compare __comp)
2683{
2684 return __comp(__b, __a) ? pair<const _Tp&, const _Tp&>(__b, __a) :
2685 pair<const _Tp&, const _Tp&>(__a, __b);
2686}
2687
2688template<class _Tp>
2689inline _LIBCPP_INLINE_VISIBILITY
2690pair<const _Tp&, const _Tp&>
2691minmax(const _Tp& __a, const _Tp& __b)
2692{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002693 return _VSTD::minmax(__a, __b, __less<_Tp>());
Howard Hinnant98e5d972010-08-21 20:10:01 +00002694}
2695
Howard Hinnante3e32912011-08-12 21:56:02 +00002696#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2697
Howard Hinnant98e5d972010-08-21 20:10:01 +00002698template<class _Tp>
2699inline _LIBCPP_INLINE_VISIBILITY
2700pair<_Tp, _Tp>
2701minmax(initializer_list<_Tp> __t)
2702{
2703 pair<const _Tp*, const _Tp*> __p =
Howard Hinnant0949eed2011-06-30 21:18:19 +00002704 _VSTD::minmax_element(__t.begin(), __t.end());
Howard Hinnant98e5d972010-08-21 20:10:01 +00002705 return pair<_Tp, _Tp>(*__p.first, *__p.second);
2706}
2707
2708template<class _Tp, class _Compare>
2709inline _LIBCPP_INLINE_VISIBILITY
2710pair<_Tp, _Tp>
2711minmax(initializer_list<_Tp> __t, _Compare __comp)
2712{
2713 pair<const _Tp*, const _Tp*> __p =
Howard Hinnant0949eed2011-06-30 21:18:19 +00002714 _VSTD::minmax_element(__t.begin(), __t.end(), __comp);
Howard Hinnant98e5d972010-08-21 20:10:01 +00002715 return pair<_Tp, _Tp>(*__p.first, *__p.second);
2716}
2717
Howard Hinnante3e32912011-08-12 21:56:02 +00002718#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2719
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002720// random_shuffle
2721
Howard Hinnantc3267212010-05-26 17:49:34 +00002722// __independent_bits_engine
2723
Howard Hinnant99968442011-11-29 18:15:50 +00002724template <unsigned long long _Xp, size_t _Rp>
Howard Hinnantc3267212010-05-26 17:49:34 +00002725struct __log2_imp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002726{
Howard Hinnant99968442011-11-29 18:15:50 +00002727 static const size_t value = _Xp & ((unsigned long long)(1) << _Rp) ? _Rp
2728 : __log2_imp<_Xp, _Rp - 1>::value;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002729};
2730
Howard Hinnant99968442011-11-29 18:15:50 +00002731template <unsigned long long _Xp>
2732struct __log2_imp<_Xp, 0>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002733{
Howard Hinnantc3267212010-05-26 17:49:34 +00002734 static const size_t value = 0;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002735};
2736
Howard Hinnant99968442011-11-29 18:15:50 +00002737template <size_t _Rp>
2738struct __log2_imp<0, _Rp>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002739{
Howard Hinnant99968442011-11-29 18:15:50 +00002740 static const size_t value = _Rp + 1;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002741};
2742
Howard Hinnant99968442011-11-29 18:15:50 +00002743template <class _UI, _UI _Xp>
Howard Hinnantc3267212010-05-26 17:49:34 +00002744struct __log2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002745{
Howard Hinnant99968442011-11-29 18:15:50 +00002746 static const size_t value = __log2_imp<_Xp,
Howard Hinnantc3267212010-05-26 17:49:34 +00002747 sizeof(_UI) * __CHAR_BIT__ - 1>::value;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002748};
2749
Howard Hinnantc3267212010-05-26 17:49:34 +00002750template<class _Engine, class _UIntType>
2751class __independent_bits_engine
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002752{
Howard Hinnantc3267212010-05-26 17:49:34 +00002753public:
2754 // types
2755 typedef _UIntType result_type;
2756
2757private:
2758 typedef typename _Engine::result_type _Engine_result_type;
2759 typedef typename conditional
2760 <
2761 sizeof(_Engine_result_type) <= sizeof(result_type),
2762 result_type,
2763 _Engine_result_type
2764 >::type _Working_result_type;
2765
2766 _Engine& __e_;
2767 size_t __w_;
2768 size_t __w0_;
2769 size_t __n_;
2770 size_t __n0_;
2771 _Working_result_type __y0_;
2772 _Working_result_type __y1_;
2773 _Engine_result_type __mask0_;
2774 _Engine_result_type __mask1_;
2775
Howard Hinnant8efd3da2012-04-02 21:00:45 +00002776#ifdef _LIBCPP_HAS_NO_CONSTEXPR
Howard Hinnant99968442011-11-29 18:15:50 +00002777 static const _Working_result_type _Rp = _Engine::_Max - _Engine::_Min
Howard Hinnant8efd3da2012-04-02 21:00:45 +00002778 + _Working_result_type(1);
2779#else
2780 static _LIBCPP_CONSTEXPR const _Working_result_type _Rp = _Engine::max() - _Engine::min()
2781 + _Working_result_type(1);
2782#endif
2783 static _LIBCPP_CONSTEXPR const size_t __m = __log2<_Working_result_type, _Rp>::value;
2784 static _LIBCPP_CONSTEXPR const size_t _WDt = numeric_limits<_Working_result_type>::digits;
2785 static _LIBCPP_CONSTEXPR const size_t _EDt = numeric_limits<_Engine_result_type>::digits;
Howard Hinnantc3267212010-05-26 17:49:34 +00002786
2787public:
2788 // constructors and seeding functions
2789 __independent_bits_engine(_Engine& __e, size_t __w);
2790
2791 // generating functions
Howard Hinnant99968442011-11-29 18:15:50 +00002792 result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>());}
Howard Hinnantc3267212010-05-26 17:49:34 +00002793
2794private:
2795 result_type __eval(false_type);
2796 result_type __eval(true_type);
2797};
2798
2799template<class _Engine, class _UIntType>
2800__independent_bits_engine<_Engine, _UIntType>
2801 ::__independent_bits_engine(_Engine& __e, size_t __w)
2802 : __e_(__e),
2803 __w_(__w)
2804{
2805 __n_ = __w_ / __m + (__w_ % __m != 0);
2806 __w0_ = __w_ / __n_;
Howard Hinnant99968442011-11-29 18:15:50 +00002807 if (_Rp == 0)
2808 __y0_ = _Rp;
Howard Hinnantc3267212010-05-26 17:49:34 +00002809 else if (__w0_ < _WDt)
Howard Hinnant99968442011-11-29 18:15:50 +00002810 __y0_ = (_Rp >> __w0_) << __w0_;
Howard Hinnantc3267212010-05-26 17:49:34 +00002811 else
2812 __y0_ = 0;
Howard Hinnant99968442011-11-29 18:15:50 +00002813 if (_Rp - __y0_ > __y0_ / __n_)
Howard Hinnantc3267212010-05-26 17:49:34 +00002814 {
2815 ++__n_;
2816 __w0_ = __w_ / __n_;
2817 if (__w0_ < _WDt)
Howard Hinnant99968442011-11-29 18:15:50 +00002818 __y0_ = (_Rp >> __w0_) << __w0_;
Howard Hinnantc3267212010-05-26 17:49:34 +00002819 else
2820 __y0_ = 0;
2821 }
2822 __n0_ = __n_ - __w_ % __n_;
2823 if (__w0_ < _WDt - 1)
Howard Hinnant99968442011-11-29 18:15:50 +00002824 __y1_ = (_Rp >> (__w0_ + 1)) << (__w0_ + 1);
Howard Hinnantc3267212010-05-26 17:49:34 +00002825 else
2826 __y1_ = 0;
2827 __mask0_ = __w0_ > 0 ? _Engine_result_type(~0) >> (_EDt - __w0_) :
2828 _Engine_result_type(0);
2829 __mask1_ = __w0_ < _EDt - 1 ?
2830 _Engine_result_type(~0) >> (_EDt - (__w0_ + 1)) :
2831 _Engine_result_type(~0);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002832}
2833
Howard Hinnantc3267212010-05-26 17:49:34 +00002834template<class _Engine, class _UIntType>
2835inline
2836_UIntType
2837__independent_bits_engine<_Engine, _UIntType>::__eval(false_type)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002838{
Howard Hinnantc3267212010-05-26 17:49:34 +00002839 return static_cast<result_type>(__e_() & __mask0_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002840}
2841
Howard Hinnantc3267212010-05-26 17:49:34 +00002842template<class _Engine, class _UIntType>
2843_UIntType
2844__independent_bits_engine<_Engine, _UIntType>::__eval(true_type)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002845{
Howard Hinnant99968442011-11-29 18:15:50 +00002846 result_type _Sp = 0;
Howard Hinnantc3267212010-05-26 17:49:34 +00002847 for (size_t __k = 0; __k < __n0_; ++__k)
2848 {
2849 _Engine_result_type __u;
2850 do
2851 {
2852 __u = __e_() - _Engine::min();
2853 } while (__u >= __y0_);
Howard Hinnant8faa95f2011-10-27 16:12:10 +00002854 if (__w0_ < _WDt)
Howard Hinnant99968442011-11-29 18:15:50 +00002855 _Sp <<= __w0_;
Howard Hinnantc3267212010-05-26 17:49:34 +00002856 else
Howard Hinnant99968442011-11-29 18:15:50 +00002857 _Sp = 0;
2858 _Sp += __u & __mask0_;
Howard Hinnantc3267212010-05-26 17:49:34 +00002859 }
2860 for (size_t __k = __n0_; __k < __n_; ++__k)
2861 {
2862 _Engine_result_type __u;
2863 do
2864 {
2865 __u = __e_() - _Engine::min();
2866 } while (__u >= __y1_);
Howard Hinnant8faa95f2011-10-27 16:12:10 +00002867 if (__w0_ < _WDt - 1)
Howard Hinnant99968442011-11-29 18:15:50 +00002868 _Sp <<= __w0_ + 1;
Howard Hinnantc3267212010-05-26 17:49:34 +00002869 else
Howard Hinnant99968442011-11-29 18:15:50 +00002870 _Sp = 0;
2871 _Sp += __u & __mask1_;
Howard Hinnantc3267212010-05-26 17:49:34 +00002872 }
Howard Hinnant99968442011-11-29 18:15:50 +00002873 return _Sp;
Howard Hinnantc3267212010-05-26 17:49:34 +00002874}
2875
2876// uniform_int_distribution
2877
2878template<class _IntType = int>
2879class uniform_int_distribution
2880{
2881public:
2882 // types
2883 typedef _IntType result_type;
2884
2885 class param_type
2886 {
2887 result_type __a_;
2888 result_type __b_;
2889 public:
2890 typedef uniform_int_distribution distribution_type;
2891
2892 explicit param_type(result_type __a = 0,
2893 result_type __b = numeric_limits<result_type>::max())
2894 : __a_(__a), __b_(__b) {}
2895
2896 result_type a() const {return __a_;}
2897 result_type b() const {return __b_;}
2898
2899 friend bool operator==(const param_type& __x, const param_type& __y)
2900 {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;}
2901 friend bool operator!=(const param_type& __x, const param_type& __y)
2902 {return !(__x == __y);}
2903 };
2904
2905private:
2906 param_type __p_;
2907
2908public:
2909 // constructors and reset functions
2910 explicit uniform_int_distribution(result_type __a = 0,
2911 result_type __b = numeric_limits<result_type>::max())
2912 : __p_(param_type(__a, __b)) {}
2913 explicit uniform_int_distribution(const param_type& __p) : __p_(__p) {}
2914 void reset() {}
2915
2916 // generating functions
2917 template<class _URNG> result_type operator()(_URNG& __g)
2918 {return (*this)(__g, __p_);}
2919 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
2920
2921 // property functions
2922 result_type a() const {return __p_.a();}
2923 result_type b() const {return __p_.b();}
2924
2925 param_type param() const {return __p_;}
2926 void param(const param_type& __p) {__p_ = __p;}
2927
2928 result_type min() const {return a();}
2929 result_type max() const {return b();}
2930
2931 friend bool operator==(const uniform_int_distribution& __x,
2932 const uniform_int_distribution& __y)
2933 {return __x.__p_ == __y.__p_;}
2934 friend bool operator!=(const uniform_int_distribution& __x,
2935 const uniform_int_distribution& __y)
2936 {return !(__x == __y);}
2937};
2938
2939template<class _IntType>
2940template<class _URNG>
2941typename uniform_int_distribution<_IntType>::result_type
2942uniform_int_distribution<_IntType>::operator()(_URNG& __g, const param_type& __p)
2943{
2944 typedef typename conditional<sizeof(result_type) <= sizeof(uint32_t),
2945 uint32_t, uint64_t>::type _UIntType;
Howard Hinnant99968442011-11-29 18:15:50 +00002946 const _UIntType _Rp = __p.b() - __p.a() + _UIntType(1);
2947 if (_Rp == 1)
Howard Hinnantc3267212010-05-26 17:49:34 +00002948 return __p.a();
2949 const size_t _Dt = numeric_limits<_UIntType>::digits;
2950 typedef __independent_bits_engine<_URNG, _UIntType> _Eng;
Howard Hinnant99968442011-11-29 18:15:50 +00002951 if (_Rp == 0)
Howard Hinnantc3267212010-05-26 17:49:34 +00002952 return static_cast<result_type>(_Eng(__g, _Dt)());
Howard Hinnant99968442011-11-29 18:15:50 +00002953 size_t __w = _Dt - __clz(_Rp) - 1;
2954 if ((_Rp & (_UIntType(~0) >> (_Dt - __w))) != 0)
Howard Hinnantc3267212010-05-26 17:49:34 +00002955 ++__w;
2956 _Eng __e(__g, __w);
2957 _UIntType __u;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002958 do
Howard Hinnantc3267212010-05-26 17:49:34 +00002959 {
2960 __u = __e();
Howard Hinnant99968442011-11-29 18:15:50 +00002961 } while (__u >= _Rp);
Howard Hinnantc3267212010-05-26 17:49:34 +00002962 return static_cast<result_type>(__u + __p.a());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002963}
2964
Howard Hinnantc3267212010-05-26 17:49:34 +00002965class __rs_default;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002966
Howard Hinnantc3267212010-05-26 17:49:34 +00002967__rs_default __rs_get();
2968
2969class __rs_default
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002970{
Howard Hinnantc3267212010-05-26 17:49:34 +00002971 static unsigned __c_;
2972
2973 __rs_default();
2974public:
Marshall Clow5920cfc2013-02-07 22:12:02 +00002975 typedef uint_fast32_t result_type;
Howard Hinnantc3267212010-05-26 17:49:34 +00002976
2977 static const result_type _Min = 0;
2978 static const result_type _Max = 0xFFFFFFFF;
2979
2980 __rs_default(const __rs_default&);
2981 ~__rs_default();
2982
2983 result_type operator()();
2984
Howard Hinnant27b4fd32012-04-02 00:40:41 +00002985 static _LIBCPP_CONSTEXPR result_type min() {return _Min;}
2986 static _LIBCPP_CONSTEXPR result_type max() {return _Max;}
Howard Hinnantc3267212010-05-26 17:49:34 +00002987
2988 friend __rs_default __rs_get();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002989};
2990
Howard Hinnantc3267212010-05-26 17:49:34 +00002991__rs_default __rs_get();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002992
2993template <class _RandomAccessIterator>
2994void
2995random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
2996{
2997 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnant99968442011-11-29 18:15:50 +00002998 typedef uniform_int_distribution<ptrdiff_t> _Dp;
2999 typedef typename _Dp::param_type _Pp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003000 difference_type __d = __last - __first;
3001 if (__d > 1)
3002 {
Howard Hinnant99968442011-11-29 18:15:50 +00003003 _Dp __uid;
Howard Hinnantc3267212010-05-26 17:49:34 +00003004 __rs_default __g = __rs_get();
3005 for (--__last, --__d; __first < __last; ++__first, --__d)
Howard Hinnant4e599482010-10-22 15:26:39 +00003006 {
Howard Hinnant99968442011-11-29 18:15:50 +00003007 difference_type __i = __uid(__g, _Pp(0, __d));
Howard Hinnant4e599482010-10-22 15:26:39 +00003008 if (__i != difference_type(0))
3009 swap(*__first, *(__first + __i));
3010 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003011 }
3012}
3013
3014template <class _RandomAccessIterator, class _RandomNumberGenerator>
3015void
3016random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
Howard Hinnant73d21a42010-09-04 23:28:19 +00003017#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003018 _RandomNumberGenerator&& __rand)
3019#else
3020 _RandomNumberGenerator& __rand)
3021#endif
3022{
3023 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
3024 difference_type __d = __last - __first;
3025 if (__d > 1)
3026 {
3027 for (--__last; __first < __last; ++__first, --__d)
Howard Hinnant4e599482010-10-22 15:26:39 +00003028 {
3029 difference_type __i = __rand(__d);
3030 swap(*__first, *(__first + __i));
3031 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003032 }
3033}
3034
Howard Hinnantc3267212010-05-26 17:49:34 +00003035template<class _RandomAccessIterator, class _UniformRandomNumberGenerator>
3036 void shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
Howard Hinnant278bf2d2010-11-18 01:47:02 +00003037#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
3038 _UniformRandomNumberGenerator&& __g)
3039#else
Howard Hinnantc3267212010-05-26 17:49:34 +00003040 _UniformRandomNumberGenerator& __g)
Howard Hinnant278bf2d2010-11-18 01:47:02 +00003041#endif
Howard Hinnantc3267212010-05-26 17:49:34 +00003042{
3043 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnant99968442011-11-29 18:15:50 +00003044 typedef uniform_int_distribution<ptrdiff_t> _Dp;
3045 typedef typename _Dp::param_type _Pp;
Howard Hinnantc3267212010-05-26 17:49:34 +00003046 difference_type __d = __last - __first;
3047 if (__d > 1)
3048 {
Howard Hinnant99968442011-11-29 18:15:50 +00003049 _Dp __uid;
Howard Hinnantc3267212010-05-26 17:49:34 +00003050 for (--__last, --__d; __first < __last; ++__first, --__d)
Howard Hinnant4e599482010-10-22 15:26:39 +00003051 {
Howard Hinnant99968442011-11-29 18:15:50 +00003052 difference_type __i = __uid(__g, _Pp(0, __d));
Howard Hinnant4e599482010-10-22 15:26:39 +00003053 if (__i != difference_type(0))
3054 swap(*__first, *(__first + __i));
3055 }
Howard Hinnantc3267212010-05-26 17:49:34 +00003056 }
3057}
3058
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003059template <class _InputIterator, class _Predicate>
3060bool
3061is_partitioned(_InputIterator __first, _InputIterator __last, _Predicate __pred)
3062{
3063 for (; __first != __last; ++__first)
3064 if (!__pred(*__first))
3065 break;
3066 for (; __first != __last; ++__first)
3067 if (__pred(*__first))
3068 return false;
3069 return true;
3070}
3071
3072// partition
3073
3074template <class _Predicate, class _ForwardIterator>
3075_ForwardIterator
3076__partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, forward_iterator_tag)
3077{
3078 while (true)
3079 {
3080 if (__first == __last)
3081 return __first;
3082 if (!__pred(*__first))
3083 break;
3084 ++__first;
3085 }
3086 for (_ForwardIterator __p = __first; ++__p != __last;)
3087 {
3088 if (__pred(*__p))
3089 {
3090 swap(*__first, *__p);
3091 ++__first;
3092 }
3093 }
3094 return __first;
3095}
3096
3097template <class _Predicate, class _BidirectionalIterator>
3098_BidirectionalIterator
3099__partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3100 bidirectional_iterator_tag)
3101{
3102 while (true)
3103 {
3104 while (true)
3105 {
3106 if (__first == __last)
3107 return __first;
3108 if (!__pred(*__first))
3109 break;
3110 ++__first;
3111 }
3112 do
3113 {
3114 if (__first == --__last)
3115 return __first;
3116 } while (!__pred(*__last));
3117 swap(*__first, *__last);
3118 ++__first;
3119 }
3120}
3121
3122template <class _ForwardIterator, class _Predicate>
3123inline _LIBCPP_INLINE_VISIBILITY
3124_ForwardIterator
3125partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
3126{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003127 return _VSTD::__partition<typename add_lvalue_reference<_Predicate>::type>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003128 (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
3129}
3130
3131// partition_copy
3132
3133template <class _InputIterator, class _OutputIterator1,
3134 class _OutputIterator2, class _Predicate>
3135pair<_OutputIterator1, _OutputIterator2>
3136partition_copy(_InputIterator __first, _InputIterator __last,
3137 _OutputIterator1 __out_true, _OutputIterator2 __out_false,
3138 _Predicate __pred)
3139{
3140 for (; __first != __last; ++__first)
3141 {
3142 if (__pred(*__first))
3143 {
3144 *__out_true = *__first;
3145 ++__out_true;
3146 }
3147 else
3148 {
3149 *__out_false = *__first;
3150 ++__out_false;
3151 }
3152 }
3153 return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false);
3154}
3155
3156// partition_point
3157
3158template<class _ForwardIterator, class _Predicate>
3159_ForwardIterator
3160partition_point(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
3161{
3162 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003163 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003164 while (__len != 0)
3165 {
3166 difference_type __l2 = __len / 2;
3167 _ForwardIterator __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003168 _VSTD::advance(__m, __l2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003169 if (__pred(*__m))
3170 {
3171 __first = ++__m;
3172 __len -= __l2 + 1;
3173 }
3174 else
3175 __len = __l2;
3176 }
3177 return __first;
3178}
3179
3180// stable_partition
3181
3182template <class _Predicate, class _ForwardIterator, class _Distance, class _Pair>
3183_ForwardIterator
3184__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
3185 _Distance __len, _Pair __p, forward_iterator_tag __fit)
3186{
3187 // *__first is known to be false
3188 // __len >= 1
3189 if (__len == 1)
3190 return __first;
3191 if (__len == 2)
3192 {
3193 _ForwardIterator __m = __first;
3194 if (__pred(*++__m))
3195 {
3196 swap(*__first, *__m);
3197 return __m;
3198 }
3199 return __first;
3200 }
3201 if (__len <= __p.second)
3202 { // The buffer is big enough to use
3203 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
3204 __destruct_n __d(0);
3205 unique_ptr<value_type, __destruct_n&> __h(__p.first, __d);
3206 // Move the falses into the temporary buffer, and the trues to the front of the line
3207 // Update __first to always point to the end of the trues
3208 value_type* __t = __p.first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003209 ::new(__t) value_type(_VSTD::move(*__first));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003210 __d.__incr((value_type*)0);
3211 ++__t;
3212 _ForwardIterator __i = __first;
3213 while (++__i != __last)
3214 {
3215 if (__pred(*__i))
3216 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003217 *__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003218 ++__first;
3219 }
3220 else
3221 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003222 ::new(__t) value_type(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003223 __d.__incr((value_type*)0);
3224 ++__t;
3225 }
3226 }
3227 // All trues now at start of range, all falses in buffer
3228 // Move falses back into range, but don't mess up __first which points to first false
3229 __i = __first;
3230 for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i)
Howard Hinnant0949eed2011-06-30 21:18:19 +00003231 *__i = _VSTD::move(*__t2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003232 // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer
3233 return __first;
3234 }
3235 // Else not enough buffer, do in place
3236 // __len >= 3
3237 _ForwardIterator __m = __first;
3238 _Distance __len2 = __len / 2; // __len2 >= 2
Howard Hinnant0949eed2011-06-30 21:18:19 +00003239 _VSTD::advance(__m, __len2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003240 // recurse on [__first, __m), *__first know to be false
3241 // F?????????????????
3242 // f m l
3243 typedef typename add_lvalue_reference<_Predicate>::type _PredRef;
3244 _ForwardIterator __first_false = __stable_partition<_PredRef>(__first, __m, __pred, __len2, __p, __fit);
3245 // TTTFFFFF??????????
3246 // f ff m l
3247 // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true
3248 _ForwardIterator __m1 = __m;
3249 _ForwardIterator __second_false = __last;
3250 _Distance __len_half = __len - __len2;
3251 while (__pred(*__m1))
3252 {
3253 if (++__m1 == __last)
3254 goto __second_half_done;
3255 --__len_half;
3256 }
3257 // TTTFFFFFTTTF??????
3258 // f ff m m1 l
3259 __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __fit);
3260__second_half_done:
3261 // TTTFFFFFTTTTTFFFFF
3262 // f ff m sf l
Howard Hinnant0949eed2011-06-30 21:18:19 +00003263 return _VSTD::rotate(__first_false, __m, __second_false);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003264 // TTTTTTTTFFFFFFFFFF
3265 // |
3266}
3267
3268struct __return_temporary_buffer
3269{
3270 template <class _Tp>
Howard Hinnant0949eed2011-06-30 21:18:19 +00003271 _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) const {_VSTD::return_temporary_buffer(__p);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003272};
3273
3274template <class _Predicate, class _ForwardIterator>
3275_ForwardIterator
3276__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
3277 forward_iterator_tag)
3278{
3279 const unsigned __alloc_limit = 3; // might want to make this a function of trivial assignment
3280 // Either prove all true and return __first or point to first false
3281 while (true)
3282 {
3283 if (__first == __last)
3284 return __first;
3285 if (!__pred(*__first))
3286 break;
3287 ++__first;
3288 }
3289 // We now have a reduced range [__first, __last)
3290 // *__first is known to be false
3291 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
3292 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003293 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003294 pair<value_type*, ptrdiff_t> __p(0, 0);
3295 unique_ptr<value_type, __return_temporary_buffer> __h;
3296 if (__len >= __alloc_limit)
3297 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003298 __p = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003299 __h.reset(__p.first);
3300 }
3301 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
3302 (__first, __last, __pred, __len, __p, forward_iterator_tag());
3303}
3304
3305template <class _Predicate, class _BidirectionalIterator, class _Distance, class _Pair>
3306_BidirectionalIterator
3307__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3308 _Distance __len, _Pair __p, bidirectional_iterator_tag __bit)
3309{
3310 // *__first is known to be false
3311 // *__last is known to be true
3312 // __len >= 2
3313 if (__len == 2)
3314 {
3315 swap(*__first, *__last);
3316 return __last;
3317 }
3318 if (__len == 3)
3319 {
3320 _BidirectionalIterator __m = __first;
3321 if (__pred(*++__m))
3322 {
3323 swap(*__first, *__m);
3324 swap(*__m, *__last);
3325 return __last;
3326 }
3327 swap(*__m, *__last);
3328 swap(*__first, *__m);
3329 return __m;
3330 }
3331 if (__len <= __p.second)
3332 { // The buffer is big enough to use
3333 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3334 __destruct_n __d(0);
3335 unique_ptr<value_type, __destruct_n&> __h(__p.first, __d);
3336 // Move the falses into the temporary buffer, and the trues to the front of the line
3337 // Update __first to always point to the end of the trues
3338 value_type* __t = __p.first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003339 ::new(__t) value_type(_VSTD::move(*__first));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003340 __d.__incr((value_type*)0);
3341 ++__t;
3342 _BidirectionalIterator __i = __first;
3343 while (++__i != __last)
3344 {
3345 if (__pred(*__i))
3346 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003347 *__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003348 ++__first;
3349 }
3350 else
3351 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003352 ::new(__t) value_type(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003353 __d.__incr((value_type*)0);
3354 ++__t;
3355 }
3356 }
3357 // move *__last, known to be true
Howard Hinnant0949eed2011-06-30 21:18:19 +00003358 *__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003359 __i = ++__first;
3360 // All trues now at start of range, all falses in buffer
3361 // Move falses back into range, but don't mess up __first which points to first false
3362 for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i)
Howard Hinnant0949eed2011-06-30 21:18:19 +00003363 *__i = _VSTD::move(*__t2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003364 // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer
3365 return __first;
3366 }
3367 // Else not enough buffer, do in place
3368 // __len >= 4
3369 _BidirectionalIterator __m = __first;
3370 _Distance __len2 = __len / 2; // __len2 >= 2
Howard Hinnant0949eed2011-06-30 21:18:19 +00003371 _VSTD::advance(__m, __len2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003372 // recurse on [__first, __m-1], except reduce __m-1 until *(__m-1) is true, *__first know to be false
3373 // F????????????????T
3374 // f m l
3375 _BidirectionalIterator __m1 = __m;
3376 _BidirectionalIterator __first_false = __first;
3377 _Distance __len_half = __len2;
3378 while (!__pred(*--__m1))
3379 {
3380 if (__m1 == __first)
3381 goto __first_half_done;
3382 --__len_half;
3383 }
3384 // F???TFFF?????????T
3385 // f m1 m l
3386 typedef typename add_lvalue_reference<_Predicate>::type _PredRef;
3387 __first_false = __stable_partition<_PredRef>(__first, __m1, __pred, __len_half, __p, __bit);
3388__first_half_done:
3389 // TTTFFFFF?????????T
3390 // f ff m l
3391 // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true
3392 __m1 = __m;
3393 _BidirectionalIterator __second_false = __last;
3394 ++__second_false;
3395 __len_half = __len - __len2;
3396 while (__pred(*__m1))
3397 {
3398 if (++__m1 == __last)
3399 goto __second_half_done;
3400 --__len_half;
3401 }
3402 // TTTFFFFFTTTF?????T
3403 // f ff m m1 l
3404 __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __bit);
3405__second_half_done:
3406 // TTTFFFFFTTTTTFFFFF
3407 // f ff m sf l
Howard Hinnant0949eed2011-06-30 21:18:19 +00003408 return _VSTD::rotate(__first_false, __m, __second_false);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003409 // TTTTTTTTFFFFFFFFFF
3410 // |
3411}
3412
3413template <class _Predicate, class _BidirectionalIterator>
3414_BidirectionalIterator
3415__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3416 bidirectional_iterator_tag)
3417{
3418 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
3419 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3420 const difference_type __alloc_limit = 4; // might want to make this a function of trivial assignment
3421 // Either prove all true and return __first or point to first false
3422 while (true)
3423 {
3424 if (__first == __last)
3425 return __first;
3426 if (!__pred(*__first))
3427 break;
3428 ++__first;
3429 }
3430 // __first points to first false, everything prior to __first is already set.
3431 // Either prove [__first, __last) is all false and return __first, or point __last to last true
3432 do
3433 {
3434 if (__first == --__last)
3435 return __first;
3436 } while (!__pred(*__last));
3437 // We now have a reduced range [__first, __last]
3438 // *__first is known to be false
3439 // *__last is known to be true
3440 // __len >= 2
Howard Hinnant0949eed2011-06-30 21:18:19 +00003441 difference_type __len = _VSTD::distance(__first, __last) + 1;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003442 pair<value_type*, ptrdiff_t> __p(0, 0);
3443 unique_ptr<value_type, __return_temporary_buffer> __h;
3444 if (__len >= __alloc_limit)
3445 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003446 __p = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003447 __h.reset(__p.first);
3448 }
3449 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
3450 (__first, __last, __pred, __len, __p, bidirectional_iterator_tag());
3451}
3452
3453template <class _ForwardIterator, class _Predicate>
3454inline _LIBCPP_INLINE_VISIBILITY
3455_ForwardIterator
3456stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
3457{
3458 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
3459 (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
3460}
3461
3462// is_sorted_until
3463
3464template <class _ForwardIterator, class _Compare>
3465_ForwardIterator
3466is_sorted_until(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
3467{
3468 if (__first != __last)
3469 {
3470 _ForwardIterator __i = __first;
3471 while (++__i != __last)
3472 {
3473 if (__comp(*__i, *__first))
3474 return __i;
3475 __first = __i;
3476 }
3477 }
3478 return __last;
3479}
3480
Howard Hinnant324bb032010-08-22 00:02:43 +00003481template<class _ForwardIterator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003482inline _LIBCPP_INLINE_VISIBILITY
3483_ForwardIterator
3484is_sorted_until(_ForwardIterator __first, _ForwardIterator __last)
3485{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003486 return _VSTD::is_sorted_until(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003487}
3488
3489// is_sorted
3490
3491template <class _ForwardIterator, class _Compare>
3492inline _LIBCPP_INLINE_VISIBILITY
3493bool
3494is_sorted(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
3495{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003496 return _VSTD::is_sorted_until(__first, __last, __comp) == __last;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003497}
3498
Howard Hinnant324bb032010-08-22 00:02:43 +00003499template<class _ForwardIterator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003500inline _LIBCPP_INLINE_VISIBILITY
3501bool
3502is_sorted(_ForwardIterator __first, _ForwardIterator __last)
3503{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003504 return _VSTD::is_sorted(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003505}
3506
3507// sort
3508
3509// stable, 2-3 compares, 0-2 swaps
3510
3511template <class _Compare, class _ForwardIterator>
3512unsigned
3513__sort3(_ForwardIterator __x, _ForwardIterator __y, _ForwardIterator __z, _Compare __c)
3514{
3515 unsigned __r = 0;
3516 if (!__c(*__y, *__x)) // if x <= y
3517 {
3518 if (!__c(*__z, *__y)) // if y <= z
3519 return __r; // x <= y && y <= z
3520 // x <= y && y > z
3521 swap(*__y, *__z); // x <= z && y < z
3522 __r = 1;
3523 if (__c(*__y, *__x)) // if x > y
3524 {
3525 swap(*__x, *__y); // x < y && y <= z
3526 __r = 2;
3527 }
3528 return __r; // x <= y && y < z
3529 }
3530 if (__c(*__z, *__y)) // x > y, if y > z
3531 {
3532 swap(*__x, *__z); // x < y && y < z
3533 __r = 1;
3534 return __r;
3535 }
3536 swap(*__x, *__y); // x > y && y <= z
3537 __r = 1; // x < y && x <= z
3538 if (__c(*__z, *__y)) // if y > z
3539 {
3540 swap(*__y, *__z); // x <= y && y < z
3541 __r = 2;
3542 }
3543 return __r;
3544} // x <= y && y <= z
3545
3546// stable, 3-6 compares, 0-5 swaps
3547
3548template <class _Compare, class _ForwardIterator>
3549unsigned
3550__sort4(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3,
3551 _ForwardIterator __x4, _Compare __c)
3552{
3553 unsigned __r = __sort3<_Compare>(__x1, __x2, __x3, __c);
3554 if (__c(*__x4, *__x3))
3555 {
3556 swap(*__x3, *__x4);
3557 ++__r;
3558 if (__c(*__x3, *__x2))
3559 {
3560 swap(*__x2, *__x3);
3561 ++__r;
3562 if (__c(*__x2, *__x1))
3563 {
3564 swap(*__x1, *__x2);
3565 ++__r;
3566 }
3567 }
3568 }
3569 return __r;
3570}
3571
3572// stable, 4-10 compares, 0-9 swaps
3573
3574template <class _Compare, class _ForwardIterator>
3575unsigned
3576__sort5(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3,
3577 _ForwardIterator __x4, _ForwardIterator __x5, _Compare __c)
3578{
3579 unsigned __r = __sort4<_Compare>(__x1, __x2, __x3, __x4, __c);
3580 if (__c(*__x5, *__x4))
3581 {
3582 swap(*__x4, *__x5);
3583 ++__r;
3584 if (__c(*__x4, *__x3))
3585 {
3586 swap(*__x3, *__x4);
3587 ++__r;
3588 if (__c(*__x3, *__x2))
3589 {
3590 swap(*__x2, *__x3);
3591 ++__r;
3592 if (__c(*__x2, *__x1))
3593 {
3594 swap(*__x1, *__x2);
3595 ++__r;
3596 }
3597 }
3598 }
3599 }
3600 return __r;
3601}
3602
3603// Assumes size > 0
3604template <class _Compare, class _BirdirectionalIterator>
3605void
3606__selection_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp)
3607{
3608 _BirdirectionalIterator __lm1 = __last;
3609 for (--__lm1; __first != __lm1; ++__first)
3610 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003611 _BirdirectionalIterator __i = _VSTD::min_element<_BirdirectionalIterator,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003612 typename add_lvalue_reference<_Compare>::type>
3613 (__first, __last, __comp);
3614 if (__i != __first)
3615 swap(*__first, *__i);
3616 }
3617}
3618
3619template <class _Compare, class _BirdirectionalIterator>
3620void
3621__insertion_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp)
3622{
3623 typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type;
3624 if (__first != __last)
3625 {
3626 _BirdirectionalIterator __i = __first;
3627 for (++__i; __i != __last; ++__i)
3628 {
3629 _BirdirectionalIterator __j = __i;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003630 value_type __t(_VSTD::move(*__j));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003631 for (_BirdirectionalIterator __k = __i; __k != __first && __comp(__t, *--__k); --__j)
Howard Hinnant0949eed2011-06-30 21:18:19 +00003632 *__j = _VSTD::move(*__k);
3633 *__j = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003634 }
3635 }
3636}
3637
3638template <class _Compare, class _RandomAccessIterator>
3639void
3640__insertion_sort_3(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3641{
3642 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3643 _RandomAccessIterator __j = __first+2;
3644 __sort3<_Compare>(__first, __first+1, __j, __comp);
3645 for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
3646 {
3647 if (__comp(*__i, *__j))
3648 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003649 value_type __t(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003650 _RandomAccessIterator __k = __j;
3651 __j = __i;
3652 do
3653 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003654 *__j = _VSTD::move(*__k);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003655 __j = __k;
3656 } while (__j != __first && __comp(__t, *--__k));
Howard Hinnant0949eed2011-06-30 21:18:19 +00003657 *__j = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003658 }
3659 __j = __i;
3660 }
3661}
3662
3663template <class _Compare, class _RandomAccessIterator>
3664bool
3665__insertion_sort_incomplete(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3666{
3667 switch (__last - __first)
3668 {
3669 case 0:
3670 case 1:
3671 return true;
3672 case 2:
3673 if (__comp(*--__last, *__first))
3674 swap(*__first, *__last);
3675 return true;
3676 case 3:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003677 _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003678 return true;
3679 case 4:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003680 _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003681 return true;
3682 case 5:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003683 _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003684 return true;
3685 }
3686 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3687 _RandomAccessIterator __j = __first+2;
3688 __sort3<_Compare>(__first, __first+1, __j, __comp);
3689 const unsigned __limit = 8;
3690 unsigned __count = 0;
3691 for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
3692 {
3693 if (__comp(*__i, *__j))
3694 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003695 value_type __t(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003696 _RandomAccessIterator __k = __j;
3697 __j = __i;
3698 do
3699 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003700 *__j = _VSTD::move(*__k);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003701 __j = __k;
3702 } while (__j != __first && __comp(__t, *--__k));
Howard Hinnant0949eed2011-06-30 21:18:19 +00003703 *__j = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003704 if (++__count == __limit)
3705 return ++__i == __last;
3706 }
3707 __j = __i;
3708 }
3709 return true;
3710}
3711
3712template <class _Compare, class _BirdirectionalIterator>
3713void
3714__insertion_sort_move(_BirdirectionalIterator __first1, _BirdirectionalIterator __last1,
3715 typename iterator_traits<_BirdirectionalIterator>::value_type* __first2, _Compare __comp)
3716{
3717 typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type;
3718 if (__first1 != __last1)
3719 {
3720 __destruct_n __d(0);
3721 unique_ptr<value_type, __destruct_n&> __h(__first2, __d);
3722 value_type* __last2 = __first2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003723 ::new(__last2) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003724 __d.__incr((value_type*)0);
3725 for (++__last2; ++__first1 != __last1; ++__last2)
3726 {
3727 value_type* __j2 = __last2;
3728 value_type* __i2 = __j2;
3729 if (__comp(*__first1, *--__i2))
3730 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003731 ::new(__j2) value_type(_VSTD::move(*__i2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003732 __d.__incr((value_type*)0);
3733 for (--__j2; __i2 != __first2 && __comp(*__first1, *--__i2); --__j2)
Howard Hinnant0949eed2011-06-30 21:18:19 +00003734 *__j2 = _VSTD::move(*__i2);
3735 *__j2 = _VSTD::move(*__first1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003736 }
3737 else
3738 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003739 ::new(__j2) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003740 __d.__incr((value_type*)0);
3741 }
3742 }
3743 __h.release();
3744 }
3745}
3746
3747template <class _Compare, class _RandomAccessIterator>
3748void
3749__sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3750{
3751 // _Compare is known to be a reference type
3752 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
3753 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
Howard Hinnant1468b662010-11-19 22:17:28 +00003754 const difference_type __limit = is_trivially_copy_constructible<value_type>::value &&
3755 is_trivially_copy_assignable<value_type>::value ? 30 : 6;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003756 while (true)
3757 {
3758 __restart:
3759 difference_type __len = __last - __first;
3760 switch (__len)
3761 {
3762 case 0:
3763 case 1:
3764 return;
3765 case 2:
3766 if (__comp(*--__last, *__first))
3767 swap(*__first, *__last);
3768 return;
3769 case 3:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003770 _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003771 return;
3772 case 4:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003773 _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003774 return;
3775 case 5:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003776 _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003777 return;
3778 }
3779 if (__len <= __limit)
3780 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003781 _VSTD::__insertion_sort_3<_Compare>(__first, __last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003782 return;
3783 }
3784 // __len > 5
3785 _RandomAccessIterator __m = __first;
3786 _RandomAccessIterator __lm1 = __last;
3787 --__lm1;
3788 unsigned __n_swaps;
3789 {
3790 difference_type __delta;
3791 if (__len >= 1000)
3792 {
3793 __delta = __len/2;
3794 __m += __delta;
3795 __delta /= 2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003796 __n_swaps = _VSTD::__sort5<_Compare>(__first, __first + __delta, __m, __m+__delta, __lm1, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003797 }
3798 else
3799 {
3800 __delta = __len/2;
3801 __m += __delta;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003802 __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, __lm1, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003803 }
3804 }
3805 // *__m is median
3806 // partition [__first, __m) < *__m and *__m <= [__m, __last)
3807 // (this inhibits tossing elements equivalent to __m around unnecessarily)
3808 _RandomAccessIterator __i = __first;
3809 _RandomAccessIterator __j = __lm1;
3810 // j points beyond range to be tested, *__m is known to be <= *__lm1
3811 // The search going up is known to be guarded but the search coming down isn't.
3812 // Prime the downward search with a guard.
3813 if (!__comp(*__i, *__m)) // if *__first == *__m
3814 {
3815 // *__first == *__m, *__first doesn't go in first part
3816 // manually guard downward moving __j against __i
3817 while (true)
3818 {
3819 if (__i == --__j)
3820 {
3821 // *__first == *__m, *__m <= all other elements
3822 // Parition instead into [__first, __i) == *__first and *__first < [__i, __last)
3823 ++__i; // __first + 1
3824 __j = __last;
3825 if (!__comp(*__first, *--__j)) // we need a guard if *__first == *(__last-1)
3826 {
3827 while (true)
3828 {
3829 if (__i == __j)
3830 return; // [__first, __last) all equivalent elements
3831 if (__comp(*__first, *__i))
3832 {
3833 swap(*__i, *__j);
3834 ++__n_swaps;
3835 ++__i;
3836 break;
3837 }
3838 ++__i;
3839 }
3840 }
3841 // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1
3842 if (__i == __j)
3843 return;
3844 while (true)
3845 {
3846 while (!__comp(*__first, *__i))
3847 ++__i;
3848 while (__comp(*__first, *--__j))
3849 ;
3850 if (__i >= __j)
3851 break;
3852 swap(*__i, *__j);
3853 ++__n_swaps;
3854 ++__i;
3855 }
3856 // [__first, __i) == *__first and *__first < [__i, __last)
3857 // The first part is sorted, sort the secod part
Howard Hinnant0949eed2011-06-30 21:18:19 +00003858 // _VSTD::__sort<_Compare>(__i, __last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003859 __first = __i;
3860 goto __restart;
3861 }
3862 if (__comp(*__j, *__m))
3863 {
3864 swap(*__i, *__j);
3865 ++__n_swaps;
3866 break; // found guard for downward moving __j, now use unguarded partition
3867 }
3868 }
3869 }
3870 // It is known that *__i < *__m
3871 ++__i;
3872 // j points beyond range to be tested, *__m is known to be <= *__lm1
3873 // if not yet partitioned...
3874 if (__i < __j)
3875 {
3876 // known that *(__i - 1) < *__m
3877 // known that __i <= __m
3878 while (true)
3879 {
3880 // __m still guards upward moving __i
3881 while (__comp(*__i, *__m))
3882 ++__i;
3883 // It is now known that a guard exists for downward moving __j
3884 while (!__comp(*--__j, *__m))
3885 ;
3886 if (__i > __j)
3887 break;
3888 swap(*__i, *__j);
3889 ++__n_swaps;
3890 // It is known that __m != __j
3891 // If __m just moved, follow it
3892 if (__m == __i)
3893 __m = __j;
3894 ++__i;
3895 }
3896 }
3897 // [__first, __i) < *__m and *__m <= [__i, __last)
3898 if (__i != __m && __comp(*__m, *__i))
3899 {
3900 swap(*__i, *__m);
3901 ++__n_swaps;
3902 }
3903 // [__first, __i) < *__i and *__i <= [__i+1, __last)
3904 // If we were given a perfect partition, see if insertion sort is quick...
3905 if (__n_swaps == 0)
3906 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003907 bool __fs = _VSTD::__insertion_sort_incomplete<_Compare>(__first, __i, __comp);
3908 if (_VSTD::__insertion_sort_incomplete<_Compare>(__i+1, __last, __comp))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003909 {
3910 if (__fs)
3911 return;
3912 __last = __i;
3913 continue;
3914 }
3915 else
3916 {
3917 if (__fs)
3918 {
3919 __first = ++__i;
3920 continue;
3921 }
3922 }
3923 }
3924 // sort smaller range with recursive call and larger with tail recursion elimination
3925 if (__i - __first < __last - __i)
3926 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003927 _VSTD::__sort<_Compare>(__first, __i, __comp);
3928 // _VSTD::__sort<_Compare>(__i+1, __last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003929 __first = ++__i;
3930 }
3931 else
3932 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003933 _VSTD::__sort<_Compare>(__i+1, __last, __comp);
3934 // _VSTD::__sort<_Compare>(__first, __i, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003935 __last = __i;
3936 }
3937 }
3938}
3939
3940// This forwarder keeps the top call and the recursive calls using the same instantiation, forcing a reference _Compare
3941template <class _RandomAccessIterator, class _Compare>
3942inline _LIBCPP_INLINE_VISIBILITY
3943void
3944sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _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);
3949 __sort<_Comp_ref>(__first, __last, __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;
3952 __sort<_Comp_ref>(__first, __last, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00003953#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003954}
3955
3956template <class _RandomAccessIterator>
3957inline _LIBCPP_INLINE_VISIBILITY
3958void
3959sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
3960{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003961 _VSTD::sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003962}
3963
3964template <class _Tp>
3965inline _LIBCPP_INLINE_VISIBILITY
3966void
3967sort(_Tp** __first, _Tp** __last)
3968{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003969 _VSTD::sort((size_t*)__first, (size_t*)__last, __less<size_t>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003970}
3971
3972template <class _Tp>
3973inline _LIBCPP_INLINE_VISIBILITY
3974void
3975sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last)
3976{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003977 _VSTD::sort(__first.base(), __last.base());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003978}
3979
Howard Hinnant7a563db2011-09-14 18:33:51 +00003980template <class _Tp, class _Compare>
3981inline _LIBCPP_INLINE_VISIBILITY
3982void
3983sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last, _Compare __comp)
3984{
3985 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3986 _VSTD::sort<_Tp*, _Comp_ref>(__first.base(), __last.base(), __comp);
3987}
3988
Howard Hinnant78b68282011-10-22 20:59:45 +00003989#ifdef _MSC_VER
3990#pragma warning( push )
3991#pragma warning( disable: 4231)
3992#endif // _MSC_VER
Howard Hinnantff926772012-11-06 21:08:48 +00003993_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<char>&, char*>(char*, char*, __less<char>&))
3994_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&))
3995_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&))
3996_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&))
3997_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<short>&, short*>(short*, short*, __less<short>&))
3998_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&))
3999_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<int>&, int*>(int*, int*, __less<int>&))
4000_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&))
4001_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<long>&, long*>(long*, long*, __less<long>&))
4002_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&))
4003_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<long long>&, long long*>(long long*, long long*, __less<long long>&))
4004_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned long long>&))
4005_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<float>&, float*>(float*, float*, __less<float>&))
4006_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<double>&, double*>(double*, double*, __less<double>&))
4007_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<long double>&, long double*>(long double*, long double*, __less<long double>&))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004008
Howard Hinnantff926772012-11-06 21:08:48 +00004009_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<char>&, char*>(char*, char*, __less<char>&))
4010_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&))
4011_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&))
4012_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&))
4013_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<short>&, short*>(short*, short*, __less<short>&))
4014_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&))
4015_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<int>&, int*>(int*, int*, __less<int>&))
4016_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&))
4017_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<long>&, long*>(long*, long*, __less<long>&))
4018_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&))
4019_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<long long>&, long long*>(long long*, long long*, __less<long long>&))
4020_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned long long>&))
4021_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<float>&, float*>(float*, float*, __less<float>&))
4022_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<double>&, double*>(double*, double*, __less<double>&))
4023_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<long double>&, long double*>(long double*, long double*, __less<long double>&))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004024
Howard Hinnantff926772012-11-06 21:08:48 +00004025_LIBCPP_EXTERN_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 +00004026#ifdef _MSC_VER
4027#pragma warning( pop )
Howard Hinnantec3773c2011-12-01 20:21:04 +00004028#endif // _MSC_VER
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004029
4030// lower_bound
4031
4032template <class _Compare, class _ForwardIterator, class _Tp>
4033_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00004034__lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004035{
4036 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004037 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004038 while (__len != 0)
4039 {
4040 difference_type __l2 = __len / 2;
4041 _ForwardIterator __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004042 _VSTD::advance(__m, __l2);
Howard Hinnant78b68282011-10-22 20:59:45 +00004043 if (__comp(*__m, __value_))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004044 {
4045 __first = ++__m;
4046 __len -= __l2 + 1;
4047 }
4048 else
4049 __len = __l2;
4050 }
4051 return __first;
4052}
4053
4054template <class _ForwardIterator, class _Tp, class _Compare>
4055inline _LIBCPP_INLINE_VISIBILITY
4056_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00004057lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004058{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004059#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004060 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4061 __debug_less<_Compare> __c(__comp);
Howard Hinnant78b68282011-10-22 20:59:45 +00004062 return __lower_bound<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004063#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004064 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnant78b68282011-10-22 20:59:45 +00004065 return __lower_bound<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004066#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004067}
4068
4069template <class _ForwardIterator, class _Tp>
4070inline _LIBCPP_INLINE_VISIBILITY
4071_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00004072lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004073{
Howard Hinnant78b68282011-10-22 20:59:45 +00004074 return _VSTD::lower_bound(__first, __last, __value_,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004075 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
4076}
4077
4078// upper_bound
4079
4080template <class _Compare, class _ForwardIterator, class _Tp>
4081_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00004082__upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004083{
4084 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004085 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004086 while (__len != 0)
4087 {
4088 difference_type __l2 = __len / 2;
4089 _ForwardIterator __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004090 _VSTD::advance(__m, __l2);
Howard Hinnant78b68282011-10-22 20:59:45 +00004091 if (__comp(__value_, *__m))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004092 __len = __l2;
4093 else
4094 {
4095 __first = ++__m;
4096 __len -= __l2 + 1;
4097 }
4098 }
4099 return __first;
4100}
4101
4102template <class _ForwardIterator, class _Tp, class _Compare>
4103inline _LIBCPP_INLINE_VISIBILITY
4104_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00004105upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004106{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004107#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004108 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4109 __debug_less<_Compare> __c(__comp);
Howard Hinnant78b68282011-10-22 20:59:45 +00004110 return __upper_bound<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004111#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004112 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnant78b68282011-10-22 20:59:45 +00004113 return __upper_bound<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004114#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004115}
4116
4117template <class _ForwardIterator, class _Tp>
4118inline _LIBCPP_INLINE_VISIBILITY
4119_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00004120upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004121{
Howard Hinnant78b68282011-10-22 20:59:45 +00004122 return _VSTD::upper_bound(__first, __last, __value_,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004123 __less<_Tp, typename iterator_traits<_ForwardIterator>::value_type>());
4124}
4125
4126// equal_range
4127
4128template <class _Compare, class _ForwardIterator, class _Tp>
4129pair<_ForwardIterator, _ForwardIterator>
Howard Hinnant78b68282011-10-22 20:59:45 +00004130__equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004131{
4132 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004133 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004134 while (__len != 0)
4135 {
4136 difference_type __l2 = __len / 2;
4137 _ForwardIterator __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004138 _VSTD::advance(__m, __l2);
Howard Hinnant78b68282011-10-22 20:59:45 +00004139 if (__comp(*__m, __value_))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004140 {
4141 __first = ++__m;
4142 __len -= __l2 + 1;
4143 }
Howard Hinnant78b68282011-10-22 20:59:45 +00004144 else if (__comp(__value_, *__m))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004145 {
4146 __last = __m;
4147 __len = __l2;
4148 }
4149 else
4150 {
4151 _ForwardIterator __mp1 = __m;
4152 return pair<_ForwardIterator, _ForwardIterator>
4153 (
Howard Hinnant78b68282011-10-22 20:59:45 +00004154 __lower_bound<_Compare>(__first, __m, __value_, __comp),
4155 __upper_bound<_Compare>(++__mp1, __last, __value_, __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004156 );
4157 }
4158 }
4159 return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
4160}
4161
4162template <class _ForwardIterator, class _Tp, class _Compare>
4163inline _LIBCPP_INLINE_VISIBILITY
4164pair<_ForwardIterator, _ForwardIterator>
Howard Hinnant78b68282011-10-22 20:59:45 +00004165equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004166{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004167#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004168 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4169 __debug_less<_Compare> __c(__comp);
Howard Hinnant78b68282011-10-22 20:59:45 +00004170 return __equal_range<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004171#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004172 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnant78b68282011-10-22 20:59:45 +00004173 return __equal_range<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004174#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004175}
4176
4177template <class _ForwardIterator, class _Tp>
4178inline _LIBCPP_INLINE_VISIBILITY
4179pair<_ForwardIterator, _ForwardIterator>
Howard Hinnant78b68282011-10-22 20:59:45 +00004180equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004181{
Howard Hinnant78b68282011-10-22 20:59:45 +00004182 return _VSTD::equal_range(__first, __last, __value_,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004183 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
4184}
4185
4186// binary_search
4187
4188template <class _Compare, class _ForwardIterator, class _Tp>
4189inline _LIBCPP_INLINE_VISIBILITY
4190bool
Howard Hinnant78b68282011-10-22 20:59:45 +00004191__binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004192{
Howard Hinnant78b68282011-10-22 20:59:45 +00004193 __first = __lower_bound<_Compare>(__first, __last, __value_, __comp);
4194 return __first != __last && !__comp(__value_, *__first);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004195}
4196
4197template <class _ForwardIterator, class _Tp, class _Compare>
4198inline _LIBCPP_INLINE_VISIBILITY
4199bool
Howard Hinnant78b68282011-10-22 20:59:45 +00004200binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004201{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004202#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004203 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4204 __debug_less<_Compare> __c(__comp);
Howard Hinnant78b68282011-10-22 20:59:45 +00004205 return __binary_search<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004206#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004207 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnant78b68282011-10-22 20:59:45 +00004208 return __binary_search<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004209#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004210}
4211
4212template <class _ForwardIterator, class _Tp>
4213inline _LIBCPP_INLINE_VISIBILITY
4214bool
Howard Hinnant78b68282011-10-22 20:59:45 +00004215binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004216{
Howard Hinnant78b68282011-10-22 20:59:45 +00004217 return _VSTD::binary_search(__first, __last, __value_,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004218 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
4219}
4220
4221// merge
4222
4223template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4224_OutputIterator
4225__merge(_InputIterator1 __first1, _InputIterator1 __last1,
4226 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4227{
4228 for (; __first1 != __last1; ++__result)
4229 {
4230 if (__first2 == __last2)
Howard Hinnant0949eed2011-06-30 21:18:19 +00004231 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004232 if (__comp(*__first2, *__first1))
4233 {
4234 *__result = *__first2;
4235 ++__first2;
4236 }
4237 else
4238 {
4239 *__result = *__first1;
4240 ++__first1;
4241 }
4242 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00004243 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004244}
4245
4246template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
4247inline _LIBCPP_INLINE_VISIBILITY
4248_OutputIterator
4249merge(_InputIterator1 __first1, _InputIterator1 __last1,
4250 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4251{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004252#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004253 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4254 __debug_less<_Compare> __c(__comp);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004255 return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004256#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004257 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004258 return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004259#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004260}
4261
4262template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
4263inline _LIBCPP_INLINE_VISIBILITY
4264_OutputIterator
4265merge(_InputIterator1 __first1, _InputIterator1 __last1,
4266 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
4267{
4268 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
4269 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
4270 return merge(__first1, __last1, __first2, __last2, __result, __less<__v1, __v2>());
4271}
4272
4273// inplace_merge
4274
4275template <class _Compare, class _BidirectionalIterator>
4276void
4277__buffered_inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4278 _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1,
4279 typename iterator_traits<_BidirectionalIterator>::difference_type __len2,
4280 typename iterator_traits<_BidirectionalIterator>::value_type* __buff)
4281{
4282 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
4283 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
4284 typedef typename iterator_traits<_BidirectionalIterator>::pointer pointer;
4285 __destruct_n __d(0);
4286 unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
4287 if (__len1 <= __len2)
4288 {
4289 value_type* __p = __buff;
4290 for (_BidirectionalIterator __i = __first; __i != __middle; __d.__incr((value_type*)0), ++__i, ++__p)
Howard Hinnant0949eed2011-06-30 21:18:19 +00004291 ::new(__p) value_type(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004292 __merge<_Compare>(move_iterator<value_type*>(__buff),
4293 move_iterator<value_type*>(__p),
4294 move_iterator<_BidirectionalIterator>(__middle),
4295 move_iterator<_BidirectionalIterator>(__last),
4296 __first, __comp);
4297 }
4298 else
4299 {
4300 value_type* __p = __buff;
4301 for (_BidirectionalIterator __i = __middle; __i != __last; __d.__incr((value_type*)0), ++__i, ++__p)
Howard Hinnant0949eed2011-06-30 21:18:19 +00004302 ::new(__p) value_type(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004303 typedef reverse_iterator<_BidirectionalIterator> _RBi;
4304 typedef reverse_iterator<value_type*> _Rv;
4305 __merge(move_iterator<_RBi>(_RBi(__middle)), move_iterator<_RBi>(_RBi(__first)),
4306 move_iterator<_Rv>(_Rv(__p)), move_iterator<_Rv>(_Rv(__buff)),
4307 _RBi(__last), __negate<_Compare>(__comp));
4308 }
4309}
4310
4311template <class _Compare, class _BidirectionalIterator>
4312void
4313__inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4314 _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1,
4315 typename iterator_traits<_BidirectionalIterator>::difference_type __len2,
4316 typename iterator_traits<_BidirectionalIterator>::value_type* __buff, ptrdiff_t __buff_size)
4317{
4318 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
4319 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
4320 while (true)
4321 {
4322 // if __middle == __last, we're done
4323 if (__len2 == 0)
4324 return;
4325 // shrink [__first, __middle) as much as possible (with no moves), returning if it shrinks to 0
4326 for (; true; ++__first, --__len1)
4327 {
4328 if (__len1 == 0)
4329 return;
4330 if (__comp(*__middle, *__first))
4331 break;
4332 }
4333 if (__len1 <= __buff_size || __len2 <= __buff_size)
4334 {
4335 __buffered_inplace_merge<_Compare>(__first, __middle, __last, __comp, __len1, __len2, __buff);
4336 return;
4337 }
4338 // __first < __middle < __last
4339 // *__first > *__middle
4340 // partition [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last) such that
4341 // all elements in:
4342 // [__first, __m1) <= [__middle, __m2)
4343 // [__middle, __m2) < [__m1, __middle)
4344 // [__m1, __middle) <= [__m2, __last)
4345 // and __m1 or __m2 is in the middle of its range
4346 _BidirectionalIterator __m1; // "median" of [__first, __middle)
4347 _BidirectionalIterator __m2; // "median" of [__middle, __last)
4348 difference_type __len11; // distance(__first, __m1)
4349 difference_type __len21; // distance(__middle, __m2)
4350 // binary search smaller range
4351 if (__len1 < __len2)
4352 { // __len >= 1, __len2 >= 2
4353 __len21 = __len2 / 2;
4354 __m2 = __middle;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004355 _VSTD::advance(__m2, __len21);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004356 __m1 = __upper_bound<_Compare>(__first, __middle, *__m2, __comp);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004357 __len11 = _VSTD::distance(__first, __m1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004358 }
4359 else
4360 {
4361 if (__len1 == 1)
4362 { // __len1 >= __len2 && __len2 > 0, therefore __len2 == 1
4363 // It is known *__first > *__middle
4364 swap(*__first, *__middle);
4365 return;
4366 }
4367 // __len1 >= 2, __len2 >= 1
4368 __len11 = __len1 / 2;
4369 __m1 = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004370 _VSTD::advance(__m1, __len11);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004371 __m2 = __lower_bound<_Compare>(__middle, __last, *__m1, __comp);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004372 __len21 = _VSTD::distance(__middle, __m2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004373 }
4374 difference_type __len12 = __len1 - __len11; // distance(__m1, __middle)
4375 difference_type __len22 = __len2 - __len21; // distance(__m2, __last)
4376 // [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last)
4377 // swap middle two partitions
Howard Hinnant0949eed2011-06-30 21:18:19 +00004378 __middle = _VSTD::rotate(__m1, __middle, __m2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004379 // __len12 and __len21 now have swapped meanings
4380 // merge smaller range with recurisve call and larger with tail recursion elimination
4381 if (__len11 + __len21 < __len12 + __len22)
4382 {
4383 __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size);
4384// __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size);
4385 __first = __middle;
4386 __middle = __m2;
4387 __len1 = __len12;
4388 __len2 = __len22;
4389 }
4390 else
4391 {
4392 __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size);
4393// __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size);
4394 __last = __middle;
4395 __middle = __m1;
4396 __len1 = __len11;
4397 __len2 = __len21;
4398 }
4399 }
4400}
4401
4402template <class _Tp>
4403struct __inplace_merge_switch
4404{
Howard Hinnant1468b662010-11-19 22:17:28 +00004405 static const unsigned value = is_trivially_copy_assignable<_Tp>::value;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004406};
4407
4408template <class _BidirectionalIterator, class _Compare>
4409inline _LIBCPP_INLINE_VISIBILITY
4410void
4411inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4412 _Compare __comp)
4413{
4414 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
4415 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004416 difference_type __len1 = _VSTD::distance(__first, __middle);
4417 difference_type __len2 = _VSTD::distance(__middle, __last);
4418 difference_type __buf_size = _VSTD::min(__len1, __len2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004419 pair<value_type*, ptrdiff_t> __buf(0, 0);
4420 unique_ptr<value_type, __return_temporary_buffer> __h;
4421 if (__inplace_merge_switch<value_type>::value && __buf_size > 8)
4422 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004423 __buf = _VSTD::get_temporary_buffer<value_type>(__buf_size);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004424 __h.reset(__buf.first);
4425 }
Howard Hinnant7a563db2011-09-14 18:33:51 +00004426#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004427 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4428 __debug_less<_Compare> __c(__comp);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004429 return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __c, __len1, __len2,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004430 __buf.first, __buf.second);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004431#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004432 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004433 return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __comp, __len1, __len2,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004434 __buf.first, __buf.second);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004435#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004436}
4437
4438template <class _BidirectionalIterator>
4439inline _LIBCPP_INLINE_VISIBILITY
4440void
4441inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last)
4442{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004443 _VSTD::inplace_merge(__first, __middle, __last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004444 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
4445}
4446
4447// stable_sort
4448
4449template <class _Compare, class _InputIterator1, class _InputIterator2>
4450void
4451__merge_move_construct(_InputIterator1 __first1, _InputIterator1 __last1,
4452 _InputIterator2 __first2, _InputIterator2 __last2,
4453 typename iterator_traits<_InputIterator1>::value_type* __result, _Compare __comp)
4454{
4455 typedef typename iterator_traits<_InputIterator1>::value_type value_type;
4456 __destruct_n __d(0);
4457 unique_ptr<value_type, __destruct_n&> __h(__result, __d);
4458 for (; true; ++__result)
4459 {
4460 if (__first1 == __last1)
4461 {
4462 for (; __first2 != __last2; ++__first2, ++__result, __d.__incr((value_type*)0))
Howard Hinnant0949eed2011-06-30 21:18:19 +00004463 ::new (__result) value_type(_VSTD::move(*__first2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004464 __h.release();
4465 return;
4466 }
4467 if (__first2 == __last2)
4468 {
4469 for (; __first1 != __last1; ++__first1, ++__result, __d.__incr((value_type*)0))
Howard Hinnant0949eed2011-06-30 21:18:19 +00004470 ::new (__result) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004471 __h.release();
4472 return;
4473 }
4474 if (__comp(*__first2, *__first1))
4475 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004476 ::new (__result) value_type(_VSTD::move(*__first2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004477 __d.__incr((value_type*)0);
4478 ++__first2;
4479 }
4480 else
4481 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004482 ::new (__result) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004483 __d.__incr((value_type*)0);
4484 ++__first1;
4485 }
4486 }
4487}
4488
4489template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4490void
4491__merge_move_assign(_InputIterator1 __first1, _InputIterator1 __last1,
4492 _InputIterator2 __first2, _InputIterator2 __last2,
4493 _OutputIterator __result, _Compare __comp)
4494{
4495 for (; __first1 != __last1; ++__result)
4496 {
4497 if (__first2 == __last2)
4498 {
4499 for (; __first1 != __last1; ++__first1, ++__result)
Howard Hinnant0949eed2011-06-30 21:18:19 +00004500 *__result = _VSTD::move(*__first1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004501 return;
4502 }
4503 if (__comp(*__first2, *__first1))
4504 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004505 *__result = _VSTD::move(*__first2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004506 ++__first2;
4507 }
4508 else
4509 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004510 *__result = _VSTD::move(*__first1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004511 ++__first1;
4512 }
4513 }
4514 for (; __first2 != __last2; ++__first2, ++__result)
Howard Hinnant0949eed2011-06-30 21:18:19 +00004515 *__result = _VSTD::move(*__first2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004516}
4517
4518template <class _Compare, class _RandomAccessIterator>
4519void
4520__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4521 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4522 typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size);
4523
4524template <class _Compare, class _RandomAccessIterator>
4525void
4526__stable_sort_move(_RandomAccessIterator __first1, _RandomAccessIterator __last1, _Compare __comp,
4527 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4528 typename iterator_traits<_RandomAccessIterator>::value_type* __first2)
4529{
4530 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4531 switch (__len)
4532 {
4533 case 0:
4534 return;
4535 case 1:
Howard Hinnant0949eed2011-06-30 21:18:19 +00004536 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004537 return;
4538 case 2:
4539 __destruct_n __d(0);
4540 unique_ptr<value_type, __destruct_n&> __h2(__first2, __d);
4541 if (__comp(*--__last1, *__first1))
4542 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004543 ::new(__first2) value_type(_VSTD::move(*__last1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004544 __d.__incr((value_type*)0);
4545 ++__first2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004546 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004547 }
4548 else
4549 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004550 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004551 __d.__incr((value_type*)0);
4552 ++__first2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004553 ::new(__first2) value_type(_VSTD::move(*__last1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004554 }
4555 __h2.release();
4556 return;
4557 }
4558 if (__len <= 8)
4559 {
4560 __insertion_sort_move<_Compare>(__first1, __last1, __first2, __comp);
4561 return;
4562 }
4563 typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2;
4564 _RandomAccessIterator __m = __first1 + __l2;
4565 __stable_sort<_Compare>(__first1, __m, __comp, __l2, __first2, __l2);
4566 __stable_sort<_Compare>(__m, __last1, __comp, __len - __l2, __first2 + __l2, __len - __l2);
4567 __merge_move_construct<_Compare>(__first1, __m, __m, __last1, __first2, __comp);
4568}
4569
4570template <class _Tp>
4571struct __stable_sort_switch
4572{
Howard Hinnant1468b662010-11-19 22:17:28 +00004573 static const unsigned value = 128*is_trivially_copy_assignable<_Tp>::value;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004574};
4575
4576template <class _Compare, class _RandomAccessIterator>
4577void
4578__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4579 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4580 typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size)
4581{
4582 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4583 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4584 switch (__len)
4585 {
4586 case 0:
4587 case 1:
4588 return;
4589 case 2:
4590 if (__comp(*--__last, *__first))
4591 swap(*__first, *__last);
4592 return;
4593 }
4594 if (__len <= static_cast<difference_type>(__stable_sort_switch<value_type>::value))
4595 {
4596 __insertion_sort<_Compare>(__first, __last, __comp);
4597 return;
4598 }
4599 typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2;
4600 _RandomAccessIterator __m = __first + __l2;
4601 if (__len <= __buff_size)
4602 {
4603 __destruct_n __d(0);
4604 unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
4605 __stable_sort_move<_Compare>(__first, __m, __comp, __l2, __buff);
4606 __d.__set(__l2, (value_type*)0);
4607 __stable_sort_move<_Compare>(__m, __last, __comp, __len - __l2, __buff + __l2);
4608 __d.__set(__len, (value_type*)0);
4609 __merge_move_assign<_Compare>(__buff, __buff + __l2, __buff + __l2, __buff + __len, __first, __comp);
4610// __merge<_Compare>(move_iterator<value_type*>(__buff),
4611// move_iterator<value_type*>(__buff + __l2),
4612// move_iterator<_RandomAccessIterator>(__buff + __l2),
4613// move_iterator<_RandomAccessIterator>(__buff + __len),
4614// __first, __comp);
4615 return;
4616 }
4617 __stable_sort<_Compare>(__first, __m, __comp, __l2, __buff, __buff_size);
4618 __stable_sort<_Compare>(__m, __last, __comp, __len - __l2, __buff, __buff_size);
4619 __inplace_merge<_Compare>(__first, __m, __last, __comp, __l2, __len - __l2, __buff, __buff_size);
4620}
4621
4622template <class _RandomAccessIterator, class _Compare>
4623inline _LIBCPP_INLINE_VISIBILITY
4624void
4625stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4626{
4627 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4628 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4629 difference_type __len = __last - __first;
4630 pair<value_type*, ptrdiff_t> __buf(0, 0);
4631 unique_ptr<value_type, __return_temporary_buffer> __h;
4632 if (__len > static_cast<difference_type>(__stable_sort_switch<value_type>::value))
4633 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004634 __buf = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004635 __h.reset(__buf.first);
4636 }
Howard Hinnant7a563db2011-09-14 18:33:51 +00004637#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004638 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4639 __debug_less<_Compare> __c(__comp);
4640 __stable_sort<_Comp_ref>(__first, __last, __c, __len, __buf.first, __buf.second);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004641#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004642 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4643 __stable_sort<_Comp_ref>(__first, __last, __comp, __len, __buf.first, __buf.second);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004644#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004645}
4646
4647template <class _RandomAccessIterator>
4648inline _LIBCPP_INLINE_VISIBILITY
4649void
4650stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
4651{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004652 _VSTD::stable_sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004653}
4654
4655// is_heap_until
4656
4657template <class _RandomAccessIterator, class _Compare>
4658_RandomAccessIterator
4659is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4660{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004661 typedef typename _VSTD::iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004662 difference_type __len = __last - __first;
4663 difference_type __p = 0;
4664 difference_type __c = 1;
4665 _RandomAccessIterator __pp = __first;
4666 while (__c < __len)
4667 {
4668 _RandomAccessIterator __cp = __first + __c;
4669 if (__comp(*__pp, *__cp))
4670 return __cp;
4671 ++__c;
4672 ++__cp;
4673 if (__c == __len)
4674 return __last;
4675 if (__comp(*__pp, *__cp))
4676 return __cp;
4677 ++__p;
4678 ++__pp;
4679 __c = 2 * __p + 1;
4680 }
4681 return __last;
4682}
4683
Howard Hinnant324bb032010-08-22 00:02:43 +00004684template<class _RandomAccessIterator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004685inline _LIBCPP_INLINE_VISIBILITY
4686_RandomAccessIterator
4687is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last)
4688{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004689 return _VSTD::is_heap_until(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004690}
4691
4692// is_heap
4693
4694template <class _RandomAccessIterator, class _Compare>
4695inline _LIBCPP_INLINE_VISIBILITY
4696bool
4697is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4698{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004699 return _VSTD::is_heap_until(__first, __last, __comp) == __last;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004700}
4701
Howard Hinnant324bb032010-08-22 00:02:43 +00004702template<class _RandomAccessIterator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004703inline _LIBCPP_INLINE_VISIBILITY
4704bool
4705is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4706{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004707 return _VSTD::is_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004708}
4709
4710// push_heap
4711
4712template <class _Compare, class _RandomAccessIterator>
4713void
4714__push_heap_front(_RandomAccessIterator __first, _RandomAccessIterator, _Compare __comp,
4715 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
4716{
4717 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4718 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4719 if (__len > 1)
4720 {
4721 difference_type __p = 0;
4722 _RandomAccessIterator __pp = __first;
4723 difference_type __c = 2;
4724 _RandomAccessIterator __cp = __first + __c;
4725 if (__c == __len || __comp(*__cp, *(__cp - 1)))
4726 {
4727 --__c;
4728 --__cp;
4729 }
4730 if (__comp(*__pp, *__cp))
4731 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004732 value_type __t(_VSTD::move(*__pp));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004733 do
4734 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004735 *__pp = _VSTD::move(*__cp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004736 __pp = __cp;
4737 __p = __c;
4738 __c = (__p + 1) * 2;
4739 if (__c > __len)
4740 break;
4741 __cp = __first + __c;
4742 if (__c == __len || __comp(*__cp, *(__cp - 1)))
4743 {
4744 --__c;
4745 --__cp;
4746 }
4747 } while (__comp(__t, *__cp));
Howard Hinnant0949eed2011-06-30 21:18:19 +00004748 *__pp = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004749 }
4750 }
4751}
4752
4753template <class _Compare, class _RandomAccessIterator>
4754void
4755__push_heap_back(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4756 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
4757{
4758 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4759 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4760 if (__len > 1)
4761 {
4762 __len = (__len - 2) / 2;
4763 _RandomAccessIterator __ptr = __first + __len;
4764 if (__comp(*__ptr, *--__last))
4765 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004766 value_type __t(_VSTD::move(*__last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004767 do
4768 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004769 *__last = _VSTD::move(*__ptr);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004770 __last = __ptr;
4771 if (__len == 0)
4772 break;
4773 __len = (__len - 1) / 2;
4774 __ptr = __first + __len;
4775 } while (__comp(*__ptr, __t));
Howard Hinnant0949eed2011-06-30 21:18:19 +00004776 *__last = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004777 }
4778 }
4779}
4780
4781template <class _RandomAccessIterator, class _Compare>
4782inline _LIBCPP_INLINE_VISIBILITY
4783void
4784push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4785{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004786#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004787 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4788 __debug_less<_Compare> __c(__comp);
4789 __push_heap_back<_Comp_ref>(__first, __last, __c, __last - __first);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004790#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004791 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4792 __push_heap_back<_Comp_ref>(__first, __last, __comp, __last - __first);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004793#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004794}
4795
4796template <class _RandomAccessIterator>
4797inline _LIBCPP_INLINE_VISIBILITY
4798void
4799push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4800{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004801 _VSTD::push_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004802}
4803
4804// pop_heap
4805
4806template <class _Compare, class _RandomAccessIterator>
4807inline _LIBCPP_INLINE_VISIBILITY
4808void
4809__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4810 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
4811{
4812 if (__len > 1)
4813 {
4814 swap(*__first, *--__last);
4815 __push_heap_front<_Compare>(__first, __last, __comp, __len-1);
4816 }
4817}
4818
4819template <class _RandomAccessIterator, class _Compare>
4820inline _LIBCPP_INLINE_VISIBILITY
4821void
4822pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4823{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004824#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004825 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4826 __debug_less<_Compare> __c(__comp);
4827 __pop_heap<_Comp_ref>(__first, __last, __c, __last - __first);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004828#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004829 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4830 __pop_heap<_Comp_ref>(__first, __last, __comp, __last - __first);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004831#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004832}
4833
4834template <class _RandomAccessIterator>
4835inline _LIBCPP_INLINE_VISIBILITY
4836void
4837pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4838{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004839 _VSTD::pop_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004840}
4841
4842// make_heap
4843
4844template <class _Compare, class _RandomAccessIterator>
4845void
4846__make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4847{
4848 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4849 difference_type __n = __last - __first;
4850 if (__n > 1)
4851 {
4852 __last = __first;
4853 ++__last;
4854 for (difference_type __i = 1; __i < __n;)
4855 __push_heap_back<_Compare>(__first, ++__last, __comp, ++__i);
4856 }
4857}
4858
4859template <class _RandomAccessIterator, class _Compare>
4860inline _LIBCPP_INLINE_VISIBILITY
4861void
4862make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4863{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004864#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004865 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4866 __debug_less<_Compare> __c(__comp);
4867 __make_heap<_Comp_ref>(__first, __last, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004868#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004869 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4870 __make_heap<_Comp_ref>(__first, __last, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004871#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004872}
4873
4874template <class _RandomAccessIterator>
4875inline _LIBCPP_INLINE_VISIBILITY
4876void
4877make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4878{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004879 _VSTD::make_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004880}
4881
4882// sort_heap
4883
4884template <class _Compare, class _RandomAccessIterator>
4885void
4886__sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4887{
4888 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4889 for (difference_type __n = __last - __first; __n > 1; --__last, --__n)
4890 __pop_heap<_Compare>(__first, __last, __comp, __n);
4891}
4892
4893template <class _RandomAccessIterator, class _Compare>
4894inline _LIBCPP_INLINE_VISIBILITY
4895void
4896sort_heap(_RandomAccessIterator __first, _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 __sort_heap<_Comp_ref>(__first, __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 __sort_heap<_Comp_ref>(__first, __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
4911sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4912{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004913 _VSTD::sort_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004914}
4915
4916// partial_sort
4917
4918template <class _Compare, class _RandomAccessIterator>
4919void
4920__partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
4921 _Compare __comp)
4922{
4923 __make_heap<_Compare>(__first, __middle, __comp);
4924 typename iterator_traits<_RandomAccessIterator>::difference_type __len = __middle - __first;
4925 for (_RandomAccessIterator __i = __middle; __i != __last; ++__i)
4926 {
4927 if (__comp(*__i, *__first))
4928 {
4929 swap(*__i, *__first);
4930 __push_heap_front<_Compare>(__first, __middle, __comp, __len);
4931 }
4932 }
4933 __sort_heap<_Compare>(__first, __middle, __comp);
4934}
4935
4936template <class _RandomAccessIterator, class _Compare>
4937inline _LIBCPP_INLINE_VISIBILITY
4938void
4939partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
4940 _Compare __comp)
4941{
Howard Hinnant7a563db2011-09-14 18:33:51 +00004942#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004943 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4944 __debug_less<_Compare> __c(__comp);
4945 __partial_sort<_Comp_ref>(__first, __middle, __last, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004946#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004947 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4948 __partial_sort<_Comp_ref>(__first, __middle, __last, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004949#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004950}
4951
4952template <class _RandomAccessIterator>
4953inline _LIBCPP_INLINE_VISIBILITY
4954void
4955partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last)
4956{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004957 _VSTD::partial_sort(__first, __middle, __last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004958 __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4959}
4960
4961// partial_sort_copy
4962
4963template <class _Compare, class _InputIterator, class _RandomAccessIterator>
4964_RandomAccessIterator
4965__partial_sort_copy(_InputIterator __first, _InputIterator __last,
4966 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp)
4967{
4968 _RandomAccessIterator __r = __result_first;
4969 if (__r != __result_last)
4970 {
4971 typename iterator_traits<_RandomAccessIterator>::difference_type __len = 0;
4972 for (; __first != __last && __r != __result_last; ++__first, ++__r, ++__len)
4973 *__r = *__first;
4974 __make_heap<_Compare>(__result_first, __r, __comp);
4975 for (; __first != __last; ++__first)
4976 if (__comp(*__first, *__result_first))
4977 {
4978 *__result_first = *__first;
4979 __push_heap_front<_Compare>(__result_first, __r, __comp, __len);
4980 }
4981 __sort_heap<_Compare>(__result_first, __r, __comp);
4982 }
4983 return __r;
4984}
4985
4986template <class _InputIterator, class _RandomAccessIterator, class _Compare>
4987inline _LIBCPP_INLINE_VISIBILITY
4988_RandomAccessIterator
4989partial_sort_copy(_InputIterator __first, _InputIterator __last,
4990 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _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 __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __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 __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00004999#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005000}
5001
5002template <class _InputIterator, class _RandomAccessIterator>
5003inline _LIBCPP_INLINE_VISIBILITY
5004_RandomAccessIterator
5005partial_sort_copy(_InputIterator __first, _InputIterator __last,
5006 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last)
5007{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005008 return _VSTD::partial_sort_copy(__first, __last, __result_first, __result_last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005009 __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
5010}
5011
5012// nth_element
5013
5014template <class _Compare, class _RandomAccessIterator>
5015void
5016__nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
5017{
5018 // _Compare is known to be a reference type
5019 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
5020 const difference_type __limit = 7;
5021 while (true)
5022 {
5023 __restart:
Howard Hinnant8292d742011-12-29 17:45:35 +00005024 if (__nth == __last)
5025 return;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005026 difference_type __len = __last - __first;
5027 switch (__len)
5028 {
5029 case 0:
5030 case 1:
5031 return;
5032 case 2:
5033 if (__comp(*--__last, *__first))
5034 swap(*__first, *__last);
5035 return;
5036 case 3:
5037 {
5038 _RandomAccessIterator __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005039 _VSTD::__sort3<_Compare>(__first, ++__m, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005040 return;
5041 }
5042 }
5043 if (__len <= __limit)
5044 {
5045 __selection_sort<_Compare>(__first, __last, __comp);
5046 return;
5047 }
5048 // __len > __limit >= 3
5049 _RandomAccessIterator __m = __first + __len/2;
5050 _RandomAccessIterator __lm1 = __last;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005051 unsigned __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, --__lm1, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005052 // *__m is median
5053 // partition [__first, __m) < *__m and *__m <= [__m, __last)
5054 // (this inhibits tossing elements equivalent to __m around unnecessarily)
5055 _RandomAccessIterator __i = __first;
5056 _RandomAccessIterator __j = __lm1;
5057 // j points beyond range to be tested, *__lm1 is known to be <= *__m
5058 // The search going up is known to be guarded but the search coming down isn't.
5059 // Prime the downward search with a guard.
5060 if (!__comp(*__i, *__m)) // if *__first == *__m
5061 {
5062 // *__first == *__m, *__first doesn't go in first part
5063 // manually guard downward moving __j against __i
5064 while (true)
5065 {
5066 if (__i == --__j)
5067 {
5068 // *__first == *__m, *__m <= all other elements
5069 // Parition instead into [__first, __i) == *__first and *__first < [__i, __last)
5070 ++__i; // __first + 1
5071 __j = __last;
5072 if (!__comp(*__first, *--__j)) // we need a guard if *__first == *(__last-1)
5073 {
5074 while (true)
5075 {
5076 if (__i == __j)
5077 return; // [__first, __last) all equivalent elements
5078 if (__comp(*__first, *__i))
5079 {
5080 swap(*__i, *__j);
5081 ++__n_swaps;
5082 ++__i;
5083 break;
5084 }
5085 ++__i;
5086 }
5087 }
5088 // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1
5089 if (__i == __j)
5090 return;
5091 while (true)
5092 {
5093 while (!__comp(*__first, *__i))
5094 ++__i;
5095 while (__comp(*__first, *--__j))
5096 ;
5097 if (__i >= __j)
5098 break;
5099 swap(*__i, *__j);
5100 ++__n_swaps;
5101 ++__i;
5102 }
5103 // [__first, __i) == *__first and *__first < [__i, __last)
5104 // The first part is sorted,
5105 if (__nth < __i)
5106 return;
5107 // __nth_element the secod part
5108 // __nth_element<_Compare>(__i, __nth, __last, __comp);
5109 __first = __i;
5110 goto __restart;
5111 }
5112 if (__comp(*__j, *__m))
5113 {
5114 swap(*__i, *__j);
5115 ++__n_swaps;
5116 break; // found guard for downward moving __j, now use unguarded partition
5117 }
5118 }
5119 }
5120 ++__i;
5121 // j points beyond range to be tested, *__lm1 is known to be <= *__m
5122 // if not yet partitioned...
5123 if (__i < __j)
5124 {
5125 // known that *(__i - 1) < *__m
5126 while (true)
5127 {
5128 // __m still guards upward moving __i
5129 while (__comp(*__i, *__m))
5130 ++__i;
5131 // It is now known that a guard exists for downward moving __j
5132 while (!__comp(*--__j, *__m))
5133 ;
5134 if (__i >= __j)
5135 break;
5136 swap(*__i, *__j);
5137 ++__n_swaps;
5138 // It is known that __m != __j
5139 // If __m just moved, follow it
5140 if (__m == __i)
5141 __m = __j;
5142 ++__i;
5143 }
5144 }
5145 // [__first, __i) < *__m and *__m <= [__i, __last)
5146 if (__i != __m && __comp(*__m, *__i))
5147 {
5148 swap(*__i, *__m);
5149 ++__n_swaps;
5150 }
5151 // [__first, __i) < *__i and *__i <= [__i+1, __last)
5152 if (__nth == __i)
5153 return;
5154 if (__n_swaps == 0)
5155 {
5156 // We were given a perfectly partitioned sequence. Coincidence?
5157 if (__nth < __i)
5158 {
5159 // Check for [__first, __i) already sorted
5160 __j = __m = __first;
5161 while (++__j != __i)
5162 {
5163 if (__comp(*__j, *__m))
5164 // not yet sorted, so sort
5165 goto not_sorted;
5166 __m = __j;
5167 }
5168 // [__first, __i) sorted
5169 return;
5170 }
5171 else
5172 {
5173 // Check for [__i, __last) already sorted
5174 __j = __m = __i;
5175 while (++__j != __last)
5176 {
5177 if (__comp(*__j, *__m))
5178 // not yet sorted, so sort
5179 goto not_sorted;
5180 __m = __j;
5181 }
5182 // [__i, __last) sorted
5183 return;
5184 }
5185 }
5186not_sorted:
5187 // __nth_element on range containing __nth
5188 if (__nth < __i)
5189 {
5190 // __nth_element<_Compare>(__first, __nth, __i, __comp);
5191 __last = __i;
5192 }
5193 else
5194 {
5195 // __nth_element<_Compare>(__i+1, __nth, __last, __comp);
5196 __first = ++__i;
5197 }
5198 }
5199}
5200
5201template <class _RandomAccessIterator, class _Compare>
5202inline _LIBCPP_INLINE_VISIBILITY
5203void
5204nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
5205{
Howard Hinnant7a563db2011-09-14 18:33:51 +00005206#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005207 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5208 __debug_less<_Compare> __c(__comp);
5209 __nth_element<_Comp_ref>(__first, __nth, __last, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005210#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005211 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5212 __nth_element<_Comp_ref>(__first, __nth, __last, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005213#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005214}
5215
5216template <class _RandomAccessIterator>
5217inline _LIBCPP_INLINE_VISIBILITY
5218void
5219nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last)
5220{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005221 _VSTD::nth_element(__first, __nth, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005222}
5223
5224// includes
5225
5226template <class _Compare, class _InputIterator1, class _InputIterator2>
5227bool
5228__includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
5229 _Compare __comp)
5230{
5231 for (; __first2 != __last2; ++__first1)
5232 {
5233 if (__first1 == __last1 || __comp(*__first2, *__first1))
5234 return false;
5235 if (!__comp(*__first1, *__first2))
5236 ++__first2;
5237 }
5238 return true;
5239}
5240
5241template <class _InputIterator1, class _InputIterator2, class _Compare>
5242inline _LIBCPP_INLINE_VISIBILITY
5243bool
5244includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
5245 _Compare __comp)
5246{
Howard Hinnant7a563db2011-09-14 18:33:51 +00005247#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005248 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5249 __debug_less<_Compare> __c(__comp);
5250 return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005251#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005252 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5253 return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005254#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005255}
5256
5257template <class _InputIterator1, class _InputIterator2>
5258inline _LIBCPP_INLINE_VISIBILITY
5259bool
5260includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2)
5261{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005262 return _VSTD::includes(__first1, __last1, __first2, __last2,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005263 __less<typename iterator_traits<_InputIterator1>::value_type,
5264 typename iterator_traits<_InputIterator2>::value_type>());
5265}
5266
5267// set_union
5268
5269template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5270_OutputIterator
5271__set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5272 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5273{
5274 for (; __first1 != __last1; ++__result)
5275 {
5276 if (__first2 == __last2)
Howard Hinnant0949eed2011-06-30 21:18:19 +00005277 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005278 if (__comp(*__first2, *__first1))
5279 {
5280 *__result = *__first2;
5281 ++__first2;
5282 }
5283 else
5284 {
5285 *__result = *__first1;
5286 if (!__comp(*__first1, *__first2))
5287 ++__first2;
5288 ++__first1;
5289 }
5290 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00005291 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005292}
5293
5294template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5295inline _LIBCPP_INLINE_VISIBILITY
5296_OutputIterator
5297set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5298 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5299{
Howard Hinnant7a563db2011-09-14 18:33:51 +00005300#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005301 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5302 __debug_less<_Compare> __c(__comp);
5303 return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005304#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005305 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5306 return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005307#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005308}
5309
5310template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5311inline _LIBCPP_INLINE_VISIBILITY
5312_OutputIterator
5313set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5314 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5315{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005316 return _VSTD::set_union(__first1, __last1, __first2, __last2, __result,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005317 __less<typename iterator_traits<_InputIterator1>::value_type,
5318 typename iterator_traits<_InputIterator2>::value_type>());
5319}
5320
5321// set_intersection
5322
5323template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5324_OutputIterator
5325__set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5326 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5327{
5328 while (__first1 != __last1 && __first2 != __last2)
5329 {
5330 if (__comp(*__first1, *__first2))
5331 ++__first1;
5332 else
5333 {
5334 if (!__comp(*__first2, *__first1))
5335 {
5336 *__result = *__first1;
5337 ++__result;
5338 ++__first1;
5339 }
5340 ++__first2;
5341 }
5342 }
5343 return __result;
5344}
5345
5346template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5347inline _LIBCPP_INLINE_VISIBILITY
5348_OutputIterator
5349set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5350 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5351{
Howard Hinnant7a563db2011-09-14 18:33:51 +00005352#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005353 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5354 __debug_less<_Compare> __c(__comp);
5355 return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005356#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005357 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5358 return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005359#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005360}
5361
5362template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5363inline _LIBCPP_INLINE_VISIBILITY
5364_OutputIterator
5365set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5366 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5367{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005368 return _VSTD::set_intersection(__first1, __last1, __first2, __last2, __result,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005369 __less<typename iterator_traits<_InputIterator1>::value_type,
5370 typename iterator_traits<_InputIterator2>::value_type>());
5371}
5372
5373// set_difference
5374
5375template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5376_OutputIterator
5377__set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5378 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5379{
5380 while (__first1 != __last1)
5381 {
5382 if (__first2 == __last2)
Howard Hinnant0949eed2011-06-30 21:18:19 +00005383 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005384 if (__comp(*__first1, *__first2))
5385 {
5386 *__result = *__first1;
5387 ++__result;
5388 ++__first1;
5389 }
5390 else
5391 {
5392 if (!__comp(*__first2, *__first1))
5393 ++__first1;
5394 ++__first2;
5395 }
5396 }
5397 return __result;
5398}
5399
5400template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5401inline _LIBCPP_INLINE_VISIBILITY
5402_OutputIterator
5403set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5404 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5405{
Howard Hinnant7a563db2011-09-14 18:33:51 +00005406#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005407 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5408 __debug_less<_Compare> __c(__comp);
5409 return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005410#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005411 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5412 return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005413#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005414}
5415
5416template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5417inline _LIBCPP_INLINE_VISIBILITY
5418_OutputIterator
5419set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5420 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5421{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005422 return _VSTD::set_difference(__first1, __last1, __first2, __last2, __result,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005423 __less<typename iterator_traits<_InputIterator1>::value_type,
5424 typename iterator_traits<_InputIterator2>::value_type>());
5425}
5426
5427// set_symmetric_difference
5428
5429template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5430_OutputIterator
5431__set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5432 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5433{
5434 while (__first1 != __last1)
5435 {
5436 if (__first2 == __last2)
Howard Hinnant0949eed2011-06-30 21:18:19 +00005437 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005438 if (__comp(*__first1, *__first2))
5439 {
5440 *__result = *__first1;
5441 ++__result;
5442 ++__first1;
5443 }
5444 else
5445 {
5446 if (__comp(*__first2, *__first1))
5447 {
5448 *__result = *__first2;
5449 ++__result;
5450 }
5451 else
5452 ++__first1;
5453 ++__first2;
5454 }
5455 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00005456 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005457}
5458
5459template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5460inline _LIBCPP_INLINE_VISIBILITY
5461_OutputIterator
5462set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5463 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5464{
Howard Hinnant7a563db2011-09-14 18:33:51 +00005465#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005466 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5467 __debug_less<_Compare> __c(__comp);
5468 return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005469#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005470 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5471 return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005472#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005473}
5474
5475template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5476inline _LIBCPP_INLINE_VISIBILITY
5477_OutputIterator
5478set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5479 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5480{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005481 return _VSTD::set_symmetric_difference(__first1, __last1, __first2, __last2, __result,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005482 __less<typename iterator_traits<_InputIterator1>::value_type,
5483 typename iterator_traits<_InputIterator2>::value_type>());
5484}
5485
5486// lexicographical_compare
5487
5488template <class _Compare, class _InputIterator1, class _InputIterator2>
5489bool
5490__lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5491 _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
5492{
5493 for (; __first2 != __last2; ++__first1, ++__first2)
5494 {
5495 if (__first1 == __last1 || __comp(*__first1, *__first2))
5496 return true;
5497 if (__comp(*__first2, *__first1))
5498 return false;
5499 }
5500 return false;
5501}
5502
5503template <class _InputIterator1, class _InputIterator2, class _Compare>
5504inline _LIBCPP_INLINE_VISIBILITY
5505bool
5506lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5507 _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
5508{
Howard Hinnant7a563db2011-09-14 18:33:51 +00005509#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005510 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5511 __debug_less<_Compare> __c(__comp);
5512 return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005513#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005514 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5515 return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005516#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005517}
5518
5519template <class _InputIterator1, class _InputIterator2>
5520inline _LIBCPP_INLINE_VISIBILITY
5521bool
5522lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5523 _InputIterator2 __first2, _InputIterator2 __last2)
5524{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005525 return _VSTD::lexicographical_compare(__first1, __last1, __first2, __last2,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005526 __less<typename iterator_traits<_InputIterator1>::value_type,
5527 typename iterator_traits<_InputIterator2>::value_type>());
5528}
5529
5530// next_permutation
5531
5532template <class _Compare, class _BidirectionalIterator>
5533bool
5534__next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5535{
5536 _BidirectionalIterator __i = __last;
5537 if (__first == __last || __first == --__i)
5538 return false;
5539 while (true)
5540 {
5541 _BidirectionalIterator __ip1 = __i;
5542 if (__comp(*--__i, *__ip1))
5543 {
5544 _BidirectionalIterator __j = __last;
5545 while (!__comp(*__i, *--__j))
5546 ;
5547 swap(*__i, *__j);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005548 _VSTD::reverse(__ip1, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005549 return true;
5550 }
5551 if (__i == __first)
5552 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00005553 _VSTD::reverse(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005554 return false;
5555 }
5556 }
5557}
5558
5559template <class _BidirectionalIterator, class _Compare>
5560inline _LIBCPP_INLINE_VISIBILITY
5561bool
5562next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5563{
Howard Hinnant7a563db2011-09-14 18:33:51 +00005564#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005565 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5566 __debug_less<_Compare> __c(__comp);
5567 return __next_permutation<_Comp_ref>(__first, __last, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005568#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005569 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5570 return __next_permutation<_Comp_ref>(__first, __last, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005571#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005572}
5573
5574template <class _BidirectionalIterator>
5575inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant324bb032010-08-22 00:02:43 +00005576bool
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005577next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
5578{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005579 return _VSTD::next_permutation(__first, __last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005580 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
5581}
5582
5583// prev_permutation
5584
5585template <class _Compare, class _BidirectionalIterator>
5586bool
5587__prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5588{
5589 _BidirectionalIterator __i = __last;
5590 if (__first == __last || __first == --__i)
5591 return false;
5592 while (true)
5593 {
5594 _BidirectionalIterator __ip1 = __i;
5595 if (__comp(*__ip1, *--__i))
5596 {
5597 _BidirectionalIterator __j = __last;
5598 while (!__comp(*--__j, *__i))
5599 ;
5600 swap(*__i, *__j);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005601 _VSTD::reverse(__ip1, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005602 return true;
5603 }
5604 if (__i == __first)
5605 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00005606 _VSTD::reverse(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005607 return false;
5608 }
5609 }
5610}
5611
5612template <class _BidirectionalIterator, class _Compare>
5613inline _LIBCPP_INLINE_VISIBILITY
5614bool
5615prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5616{
Howard Hinnant7a563db2011-09-14 18:33:51 +00005617#ifdef _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005618 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5619 __debug_less<_Compare> __c(__comp);
5620 return __prev_permutation<_Comp_ref>(__first, __last, __c);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005621#else // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005622 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5623 return __prev_permutation<_Comp_ref>(__first, __last, __comp);
Howard Hinnant7a563db2011-09-14 18:33:51 +00005624#endif // _LIBCPP_DEBUG2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005625}
5626
5627template <class _BidirectionalIterator>
5628inline _LIBCPP_INLINE_VISIBILITY
5629bool
5630prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
5631{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005632 return _VSTD::prev_permutation(__first, __last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005633 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
5634}
5635
5636template <class _Tp>
5637inline _LIBCPP_INLINE_VISIBILITY
5638typename enable_if
5639<
5640 is_integral<_Tp>::value,
5641 _Tp
5642>::type
5643__rotate_left(_Tp __t, _Tp __n = 1)
5644{
5645 const unsigned __bits = static_cast<unsigned>(sizeof(_Tp) * __CHAR_BIT__ - 1);
5646 __n &= __bits;
5647 return static_cast<_Tp>((__t << __n) | (static_cast<typename make_unsigned<_Tp>::type>(__t) >> (__bits - __n)));
5648}
5649
5650template <class _Tp>
5651inline _LIBCPP_INLINE_VISIBILITY
5652typename enable_if
5653<
5654 is_integral<_Tp>::value,
5655 _Tp
5656>::type
5657__rotate_right(_Tp __t, _Tp __n = 1)
5658{
5659 const unsigned __bits = static_cast<unsigned>(sizeof(_Tp) * __CHAR_BIT__ - 1);
5660 __n &= __bits;
5661 return static_cast<_Tp>((__t << (__bits - __n)) | (static_cast<typename make_unsigned<_Tp>::type>(__t) >> __n));
5662}
5663
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005664_LIBCPP_END_NAMESPACE_STD
5665
5666#endif // _LIBCPP_ALGORITHM