blob: e3b088288dab7b1fdc5f30db3d6d70f7d19cc1f3 [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 Hinnant7f764502013-08-14 18:00:20 +0000631#if defined(__IBMCPP__)
632#include "support/ibm/support.h"
633#endif
634
Howard Hinnant66c6f972011-11-29 16:45:27 +0000635#include <__undef_min_max>
636
Howard Hinnant08e17472011-10-17 20:05:10 +0000637#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000638#pragma GCC system_header
Howard Hinnant08e17472011-10-17 20:05:10 +0000639#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000640
641_LIBCPP_BEGIN_NAMESPACE_STD
642
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000643template <class _T1, class _T2 = _T1>
644struct __equal_to
645{
646 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
647 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T2& __y) const {return __x == __y;}
648 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T1& __y) const {return __x == __y;}
649 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T2& __y) const {return __x == __y;}
650};
651
652template <class _T1>
653struct __equal_to<_T1, _T1>
654{
655 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
656};
657
658template <class _T1>
659struct __equal_to<const _T1, _T1>
660{
661 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
662};
663
664template <class _T1>
665struct __equal_to<_T1, const _T1>
666{
667 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
668};
669
670template <class _T1, class _T2 = _T1>
671struct __less
672{
673 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
674 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T2& __y) const {return __x < __y;}
675 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T1& __y) const {return __x < __y;}
676 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T2& __y) const {return __x < __y;}
677};
678
679template <class _T1>
680struct __less<_T1, _T1>
681{
682 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
683};
684
685template <class _T1>
686struct __less<const _T1, _T1>
687{
688 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
689};
690
691template <class _T1>
692struct __less<_T1, const _T1>
693{
694 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
695};
696
697template <class _Predicate>
698class __negate
699{
700private:
701 _Predicate __p_;
702public:
703 _LIBCPP_INLINE_VISIBILITY __negate() {}
704
705 _LIBCPP_INLINE_VISIBILITY
706 explicit __negate(_Predicate __p) : __p_(__p) {}
707
708 template <class _T1>
709 _LIBCPP_INLINE_VISIBILITY
710 bool operator()(const _T1& __x) {return !__p_(__x);}
711
712 template <class _T1, class _T2>
713 _LIBCPP_INLINE_VISIBILITY
714 bool operator()(const _T1& __x, const _T2& __y) {return !__p_(__x, __y);}
715};
716
Howard Hinnant5e571422013-08-23 20:10:18 +0000717#ifdef _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000718
719template <class _Compare>
720struct __debug_less
721{
722 _Compare __comp_;
723 __debug_less(_Compare& __c) : __comp_(__c) {}
724 template <class _Tp, class _Up>
725 bool operator()(const _Tp& __x, const _Up& __y)
726 {
727 bool __r = __comp_(__x, __y);
728 if (__r)
Howard Hinnant7a563db2011-09-14 18:33:51 +0000729 _LIBCPP_ASSERT(!__comp_(__y, __x), "Comparator does not induce a strict weak ordering");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000730 return __r;
731 }
732};
733
Howard Hinnant5e571422013-08-23 20:10:18 +0000734#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000735
Howard Hinnant13c98cc2010-05-27 20:06:01 +0000736// Precondition: __x != 0
Howard Hinnantec3773c2011-12-01 20:21:04 +0000737inline _LIBCPP_INLINE_VISIBILITY
738unsigned
739__ctz(unsigned __x)
740{
741 return static_cast<unsigned>(__builtin_ctz(__x));
742}
743
744inline _LIBCPP_INLINE_VISIBILITY
745unsigned long
746__ctz(unsigned long __x)
747{
748 return static_cast<unsigned long>(__builtin_ctzl(__x));
749}
750
751inline _LIBCPP_INLINE_VISIBILITY
752unsigned long long
753__ctz(unsigned long long __x)
754{
755 return static_cast<unsigned long long>(__builtin_ctzll(__x));
756}
Howard Hinnant13c98cc2010-05-27 20:06:01 +0000757
758// Precondition: __x != 0
Howard Hinnantec3773c2011-12-01 20:21:04 +0000759inline _LIBCPP_INLINE_VISIBILITY
760unsigned
761__clz(unsigned __x)
762{
763 return static_cast<unsigned>(__builtin_clz(__x));
764}
765
766inline _LIBCPP_INLINE_VISIBILITY
767unsigned long
768__clz(unsigned long __x)
769{
770 return static_cast<unsigned long>(__builtin_clzl (__x));
771}
772
773inline _LIBCPP_INLINE_VISIBILITY
774unsigned long long
775__clz(unsigned long long __x)
776{
777 return static_cast<unsigned long long>(__builtin_clzll(__x));
778}
Howard Hinnant13c98cc2010-05-27 20:06:01 +0000779
780inline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned __x) {return __builtin_popcount (__x);}
781inline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned long __x) {return __builtin_popcountl (__x);}
782inline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned long long __x) {return __builtin_popcountll(__x);}
783
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000784// all_of
785
786template <class _InputIterator, class _Predicate>
787inline _LIBCPP_INLINE_VISIBILITY
788bool
789all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
790{
791 for (; __first != __last; ++__first)
792 if (!__pred(*__first))
793 return false;
794 return true;
795}
796
797// any_of
798
799template <class _InputIterator, class _Predicate>
800inline _LIBCPP_INLINE_VISIBILITY
801bool
802any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
803{
804 for (; __first != __last; ++__first)
805 if (__pred(*__first))
806 return true;
807 return false;
808}
809
810// none_of
811
812template <class _InputIterator, class _Predicate>
813inline _LIBCPP_INLINE_VISIBILITY
814bool
815none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
816{
817 for (; __first != __last; ++__first)
818 if (__pred(*__first))
819 return false;
820 return true;
821}
822
823// for_each
824
825template <class _InputIterator, class _Function>
826inline _LIBCPP_INLINE_VISIBILITY
827_Function
828for_each(_InputIterator __first, _InputIterator __last, _Function __f)
829{
830 for (; __first != __last; ++__first)
831 __f(*__first);
Howard Hinnant9a894d92013-08-22 18:29:50 +0000832 return _VSTD::move(__f); // explicitly moved for (emulated) C++03
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000833}
834
835// find
836
837template <class _InputIterator, class _Tp>
838inline _LIBCPP_INLINE_VISIBILITY
839_InputIterator
Howard Hinnant78b68282011-10-22 20:59:45 +0000840find(_InputIterator __first, _InputIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000841{
842 for (; __first != __last; ++__first)
Howard Hinnant78b68282011-10-22 20:59:45 +0000843 if (*__first == __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000844 break;
845 return __first;
846}
847
848// find_if
849
850template <class _InputIterator, class _Predicate>
851inline _LIBCPP_INLINE_VISIBILITY
852_InputIterator
853find_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
854{
855 for (; __first != __last; ++__first)
856 if (__pred(*__first))
857 break;
858 return __first;
859}
860
861// find_if_not
862
863template<class _InputIterator, class _Predicate>
864inline _LIBCPP_INLINE_VISIBILITY
865_InputIterator
866find_if_not(_InputIterator __first, _InputIterator __last, _Predicate __pred)
867{
868 for (; __first != __last; ++__first)
869 if (!__pred(*__first))
870 break;
871 return __first;
872}
873
874// find_end
875
876template <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
877_ForwardIterator1
878__find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
879 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred,
880 forward_iterator_tag, forward_iterator_tag)
881{
882 // modeled after search algorithm
883 _ForwardIterator1 __r = __last1; // __last1 is the "default" answer
884 if (__first2 == __last2)
885 return __r;
886 while (true)
887 {
888 while (true)
889 {
890 if (__first1 == __last1) // if source exhausted return last correct answer
891 return __r; // (or __last1 if never found)
892 if (__pred(*__first1, *__first2))
893 break;
894 ++__first1;
895 }
896 // *__first1 matches *__first2, now match elements after here
897 _ForwardIterator1 __m1 = __first1;
898 _ForwardIterator2 __m2 = __first2;
899 while (true)
900 {
901 if (++__m2 == __last2)
902 { // Pattern exhaused, record answer and search for another one
903 __r = __first1;
904 ++__first1;
905 break;
906 }
907 if (++__m1 == __last1) // Source exhausted, return last answer
908 return __r;
909 if (!__pred(*__m1, *__m2)) // mismatch, restart with a new __first
910 {
911 ++__first1;
912 break;
913 } // else there is a match, check next elements
914 }
915 }
916}
917
918template <class _BinaryPredicate, class _BidirectionalIterator1, class _BidirectionalIterator2>
919_BidirectionalIterator1
920__find_end(_BidirectionalIterator1 __first1, _BidirectionalIterator1 __last1,
921 _BidirectionalIterator2 __first2, _BidirectionalIterator2 __last2, _BinaryPredicate __pred,
922 bidirectional_iterator_tag, bidirectional_iterator_tag)
923{
924 // modeled after search algorithm (in reverse)
925 if (__first2 == __last2)
926 return __last1; // Everything matches an empty sequence
927 _BidirectionalIterator1 __l1 = __last1;
928 _BidirectionalIterator2 __l2 = __last2;
929 --__l2;
930 while (true)
931 {
932 // Find last element in sequence 1 that matchs *(__last2-1), with a mininum of loop checks
933 while (true)
934 {
935 if (__first1 == __l1) // return __last1 if no element matches *__first2
936 return __last1;
937 if (__pred(*--__l1, *__l2))
938 break;
939 }
940 // *__l1 matches *__l2, now match elements before here
941 _BidirectionalIterator1 __m1 = __l1;
942 _BidirectionalIterator2 __m2 = __l2;
943 while (true)
944 {
945 if (__m2 == __first2) // If pattern exhausted, __m1 is the answer (works for 1 element pattern)
946 return __m1;
947 if (__m1 == __first1) // Otherwise if source exhaused, pattern not found
948 return __last1;
949 if (!__pred(*--__m1, *--__m2)) // if there is a mismatch, restart with a new __l1
950 {
951 break;
952 } // else there is a match, check next elements
953 }
954 }
955}
956
957template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
958_RandomAccessIterator1
959__find_end(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
960 _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
961 random_access_iterator_tag, random_access_iterator_tag)
962{
963 // Take advantage of knowing source and pattern lengths. Stop short when source is smaller than pattern
964 typename iterator_traits<_RandomAccessIterator2>::difference_type __len2 = __last2 - __first2;
965 if (__len2 == 0)
966 return __last1;
967 typename iterator_traits<_RandomAccessIterator1>::difference_type __len1 = __last1 - __first1;
968 if (__len1 < __len2)
969 return __last1;
970 const _RandomAccessIterator1 __s = __first1 + (__len2 - 1); // End of pattern match can't go before here
971 _RandomAccessIterator1 __l1 = __last1;
972 _RandomAccessIterator2 __l2 = __last2;
973 --__l2;
974 while (true)
975 {
976 while (true)
977 {
978 if (__s == __l1)
979 return __last1;
980 if (__pred(*--__l1, *__l2))
981 break;
982 }
983 _RandomAccessIterator1 __m1 = __l1;
984 _RandomAccessIterator2 __m2 = __l2;
985 while (true)
986 {
987 if (__m2 == __first2)
988 return __m1;
989 // no need to check range on __m1 because __s guarantees we have enough source
990 if (!__pred(*--__m1, *--__m2))
991 {
992 break;
993 }
994 }
995 }
996}
997
998template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
999inline _LIBCPP_INLINE_VISIBILITY
1000_ForwardIterator1
1001find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1002 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1003{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001004 return _VSTD::__find_end<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001005 (__first1, __last1, __first2, __last2, __pred,
1006 typename iterator_traits<_ForwardIterator1>::iterator_category(),
1007 typename iterator_traits<_ForwardIterator2>::iterator_category());
1008}
1009
1010template <class _ForwardIterator1, class _ForwardIterator2>
1011inline _LIBCPP_INLINE_VISIBILITY
1012_ForwardIterator1
1013find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1014 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1015{
1016 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1017 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001018 return _VSTD::find_end(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001019}
1020
1021// find_first_of
1022
1023template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
1024_ForwardIterator1
1025find_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1026 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1027{
1028 for (; __first1 != __last1; ++__first1)
1029 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
1030 if (__pred(*__first1, *__j))
1031 return __first1;
1032 return __last1;
1033}
1034
1035template <class _ForwardIterator1, class _ForwardIterator2>
1036inline _LIBCPP_INLINE_VISIBILITY
1037_ForwardIterator1
1038find_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1039 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1040{
1041 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1042 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001043 return _VSTD::find_first_of(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001044}
1045
1046// adjacent_find
1047
1048template <class _ForwardIterator, class _BinaryPredicate>
1049inline _LIBCPP_INLINE_VISIBILITY
1050_ForwardIterator
1051adjacent_find(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred)
1052{
1053 if (__first != __last)
1054 {
1055 _ForwardIterator __i = __first;
1056 while (++__i != __last)
1057 {
1058 if (__pred(*__first, *__i))
1059 return __first;
1060 __first = __i;
1061 }
1062 }
1063 return __last;
1064}
1065
1066template <class _ForwardIterator>
1067inline _LIBCPP_INLINE_VISIBILITY
1068_ForwardIterator
1069adjacent_find(_ForwardIterator __first, _ForwardIterator __last)
1070{
1071 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001072 return _VSTD::adjacent_find(__first, __last, __equal_to<__v>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001073}
1074
1075// count
1076
1077template <class _InputIterator, class _Tp>
1078inline _LIBCPP_INLINE_VISIBILITY
1079typename iterator_traits<_InputIterator>::difference_type
Howard Hinnant78b68282011-10-22 20:59:45 +00001080count(_InputIterator __first, _InputIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001081{
1082 typename iterator_traits<_InputIterator>::difference_type __r(0);
1083 for (; __first != __last; ++__first)
Howard Hinnant78b68282011-10-22 20:59:45 +00001084 if (*__first == __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001085 ++__r;
1086 return __r;
1087}
1088
1089// count_if
1090
1091template <class _InputIterator, class _Predicate>
1092inline _LIBCPP_INLINE_VISIBILITY
1093typename iterator_traits<_InputIterator>::difference_type
1094count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
1095{
1096 typename iterator_traits<_InputIterator>::difference_type __r(0);
1097 for (; __first != __last; ++__first)
1098 if (__pred(*__first))
1099 ++__r;
1100 return __r;
1101}
1102
1103// mismatch
1104
1105template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
1106inline _LIBCPP_INLINE_VISIBILITY
1107pair<_InputIterator1, _InputIterator2>
1108mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1109 _InputIterator2 __first2, _BinaryPredicate __pred)
1110{
1111 for (; __first1 != __last1; ++__first1, ++__first2)
1112 if (!__pred(*__first1, *__first2))
1113 break;
1114 return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
1115}
1116
1117template <class _InputIterator1, class _InputIterator2>
1118inline _LIBCPP_INLINE_VISIBILITY
1119pair<_InputIterator1, _InputIterator2>
1120mismatch(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2)
1121{
1122 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1123 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001124 return _VSTD::mismatch(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001125}
1126
Marshall Clowb30abdd2013-05-09 21:14:23 +00001127#if _LIBCPP_STD_VER > 11
1128template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
1129inline _LIBCPP_INLINE_VISIBILITY
1130pair<_InputIterator1, _InputIterator2>
1131mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1132 _InputIterator2 __first2, _InputIterator2 __last2,
1133 _BinaryPredicate __pred)
1134{
1135 for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
1136 if (!__pred(*__first1, *__first2))
1137 break;
1138 return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
1139}
1140
1141template <class _InputIterator1, class _InputIterator2>
1142inline _LIBCPP_INLINE_VISIBILITY
1143pair<_InputIterator1, _InputIterator2>
1144mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1145 _InputIterator2 __first2, _InputIterator2 __last2)
1146{
1147 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1148 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
1149 return _VSTD::mismatch(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
1150}
1151#endif
1152
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001153// equal
1154
1155template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
1156inline _LIBCPP_INLINE_VISIBILITY
1157bool
1158equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _BinaryPredicate __pred)
1159{
1160 for (; __first1 != __last1; ++__first1, ++__first2)
1161 if (!__pred(*__first1, *__first2))
1162 return false;
1163 return true;
1164}
1165
1166template <class _InputIterator1, class _InputIterator2>
1167inline _LIBCPP_INLINE_VISIBILITY
1168bool
1169equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2)
1170{
1171 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1172 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001173 return _VSTD::equal(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001174}
1175
Marshall Clowb30abdd2013-05-09 21:14:23 +00001176#if _LIBCPP_STD_VER > 11
1177template <class _BinaryPredicate, class _InputIterator1, class _InputIterator2>
1178inline _LIBCPP_INLINE_VISIBILITY
1179bool
1180__equal(_InputIterator1 __first1, _InputIterator1 __last1,
1181 _InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred,
1182 input_iterator_tag, input_iterator_tag )
1183{
1184 for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
1185 if (!__pred(*__first1, *__first2))
1186 return false;
1187 return __first1 == __last1 && __first2 == __last2;
1188}
1189
1190template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
1191inline _LIBCPP_INLINE_VISIBILITY
1192bool
1193__equal(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
1194 _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
1195 random_access_iterator_tag, random_access_iterator_tag )
1196{
1197 if ( _VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2))
1198 return false;
1199 return _VSTD::equal<_RandomAccessIterator1, _RandomAccessIterator2,
1200 typename add_lvalue_reference<_BinaryPredicate>::type>
1201 (__first1, __last1, __first2, __pred );
1202}
1203
1204template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
1205inline _LIBCPP_INLINE_VISIBILITY
1206bool
1207equal(_InputIterator1 __first1, _InputIterator1 __last1,
1208 _InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred )
1209{
1210 return _VSTD::__equal<typename add_lvalue_reference<_BinaryPredicate>::type>
1211 (__first1, __last1, __first2, __last2, __pred,
1212 typename iterator_traits<_InputIterator1>::iterator_category(),
1213 typename iterator_traits<_InputIterator2>::iterator_category());
1214}
1215
1216template <class _InputIterator1, class _InputIterator2>
1217inline _LIBCPP_INLINE_VISIBILITY
1218bool
1219equal(_InputIterator1 __first1, _InputIterator1 __last1,
1220 _InputIterator2 __first2, _InputIterator2 __last2)
1221{
1222 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1223 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
1224 return _VSTD::__equal(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>(),
1225 typename iterator_traits<_InputIterator1>::iterator_category(),
1226 typename iterator_traits<_InputIterator2>::iterator_category());
1227}
1228#endif
1229
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001230// is_permutation
1231
1232template<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
1233bool
1234is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1235 _ForwardIterator2 __first2, _BinaryPredicate __pred)
1236{
1237 // shorten sequences as much as possible by lopping of any equal parts
1238 for (; __first1 != __last1; ++__first1, ++__first2)
1239 if (!__pred(*__first1, *__first2))
1240 goto __not_done;
1241 return true;
1242__not_done:
1243 // __first1 != __last1 && *__first1 != *__first2
1244 typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001245 _D1 __l1 = _VSTD::distance(__first1, __last1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001246 if (__l1 == _D1(1))
1247 return false;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001248 _ForwardIterator2 __last2 = _VSTD::next(__first2, __l1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001249 // For each element in [f1, l1) see if there are the same number of
1250 // equal elements in [f2, l2)
1251 for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i)
1252 {
1253 // Have we already counted the number of *__i in [f1, l1)?
1254 for (_ForwardIterator1 __j = __first1; __j != __i; ++__j)
1255 if (__pred(*__j, *__i))
1256 goto __next_iter;
1257 {
1258 // Count number of *__i in [f2, l2)
1259 _D1 __c2 = 0;
1260 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
1261 if (__pred(*__i, *__j))
1262 ++__c2;
1263 if (__c2 == 0)
1264 return false;
1265 // Count number of *__i in [__i, l1) (we can start with 1)
1266 _D1 __c1 = 1;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001267 for (_ForwardIterator1 __j = _VSTD::next(__i); __j != __last1; ++__j)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001268 if (__pred(*__i, *__j))
1269 ++__c1;
1270 if (__c1 != __c2)
1271 return false;
1272 }
1273__next_iter:;
1274 }
1275 return true;
1276}
1277
1278template<class _ForwardIterator1, class _ForwardIterator2>
1279inline _LIBCPP_INLINE_VISIBILITY
1280bool
1281is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1282 _ForwardIterator2 __first2)
1283{
1284 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1285 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001286 return _VSTD::is_permutation(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001287}
1288
Marshall Clowb30abdd2013-05-09 21:14:23 +00001289#if _LIBCPP_STD_VER > 11
1290template<class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
1291bool
1292__is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1293 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
1294 _BinaryPredicate __pred,
1295 forward_iterator_tag, forward_iterator_tag )
1296{
1297 // shorten sequences as much as possible by lopping of any equal parts
1298 for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
1299 if (!__pred(*__first1, *__first2))
1300 goto __not_done;
1301 return __first1 == __last1 && __first2 == __last2;
1302__not_done:
1303 // __first1 != __last1 && __first2 != __last2 && *__first1 != *__first2
1304 typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1;
1305 _D1 __l1 = _VSTD::distance(__first1, __last1);
1306
1307 typedef typename iterator_traits<_ForwardIterator2>::difference_type _D2;
Marshall Clow9f8f5242013-05-10 00:16:10 +00001308 _D2 __l2 = _VSTD::distance(__first2, __last2);
Marshall Clowb30abdd2013-05-09 21:14:23 +00001309 if (__l1 != __l2)
1310 return false;
1311
1312 // For each element in [f1, l1) see if there are the same number of
1313 // equal elements in [f2, l2)
1314 for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i)
1315 {
1316 // Have we already counted the number of *__i in [f1, l1)?
1317 for (_ForwardIterator1 __j = __first1; __j != __i; ++__j)
1318 if (__pred(*__j, *__i))
1319 goto __next_iter;
1320 {
1321 // Count number of *__i in [f2, l2)
1322 _D1 __c2 = 0;
1323 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
1324 if (__pred(*__i, *__j))
1325 ++__c2;
1326 if (__c2 == 0)
1327 return false;
1328 // Count number of *__i in [__i, l1) (we can start with 1)
1329 _D1 __c1 = 1;
1330 for (_ForwardIterator1 __j = _VSTD::next(__i); __j != __last1; ++__j)
1331 if (__pred(*__i, *__j))
1332 ++__c1;
1333 if (__c1 != __c2)
1334 return false;
1335 }
1336__next_iter:;
1337 }
1338 return true;
1339}
1340
1341template<class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
1342bool
1343__is_permutation(_RandomAccessIterator1 __first1, _RandomAccessIterator2 __last1,
1344 _RandomAccessIterator1 __first2, _RandomAccessIterator2 __last2,
1345 _BinaryPredicate __pred,
1346 random_access_iterator_tag, random_access_iterator_tag )
1347{
1348 if ( _VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2))
1349 return false;
1350 return _VSTD::is_permutation<_RandomAccessIterator1, _RandomAccessIterator2,
1351 typename add_lvalue_reference<_BinaryPredicate>::type>
1352 (__first1, __last1, __first2, __pred );
1353}
1354
1355template<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
1356inline _LIBCPP_INLINE_VISIBILITY
1357bool
1358is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1359 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
1360 _BinaryPredicate __pred )
1361{
1362 return _VSTD::__is_permutation<typename add_lvalue_reference<_BinaryPredicate>::type>
1363 (__first1, __last1, __first2, __last2, __pred,
1364 typename iterator_traits<_ForwardIterator1>::iterator_category(),
1365 typename iterator_traits<_ForwardIterator2>::iterator_category());
1366}
1367
1368template<class _ForwardIterator1, class _ForwardIterator2>
1369inline _LIBCPP_INLINE_VISIBILITY
1370bool
1371is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1372 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1373{
1374 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1375 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
1376 return _VSTD::__is_permutation(__first1, __last1, __first2, __last2,
1377 __equal_to<__v1, __v2>(),
1378 typename iterator_traits<_ForwardIterator1>::iterator_category(),
1379 typename iterator_traits<_ForwardIterator2>::iterator_category());
1380}
1381#endif
1382
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001383// search
1384
1385template <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
1386_ForwardIterator1
1387__search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1388 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred,
1389 forward_iterator_tag, forward_iterator_tag)
1390{
1391 if (__first2 == __last2)
1392 return __first1; // Everything matches an empty sequence
1393 while (true)
1394 {
1395 // Find first element in sequence 1 that matchs *__first2, with a mininum of loop checks
1396 while (true)
1397 {
1398 if (__first1 == __last1) // return __last1 if no element matches *__first2
1399 return __last1;
1400 if (__pred(*__first1, *__first2))
1401 break;
1402 ++__first1;
1403 }
1404 // *__first1 matches *__first2, now match elements after here
1405 _ForwardIterator1 __m1 = __first1;
1406 _ForwardIterator2 __m2 = __first2;
1407 while (true)
1408 {
1409 if (++__m2 == __last2) // If pattern exhausted, __first1 is the answer (works for 1 element pattern)
1410 return __first1;
1411 if (++__m1 == __last1) // Otherwise if source exhaused, pattern not found
1412 return __last1;
1413 if (!__pred(*__m1, *__m2)) // if there is a mismatch, restart with a new __first1
1414 {
1415 ++__first1;
1416 break;
1417 } // else there is a match, check next elements
1418 }
1419 }
1420}
1421
1422template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
1423_RandomAccessIterator1
1424__search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
1425 _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
1426 random_access_iterator_tag, random_access_iterator_tag)
1427{
1428 typedef typename std::iterator_traits<_RandomAccessIterator1>::difference_type _D1;
1429 typedef typename std::iterator_traits<_RandomAccessIterator2>::difference_type _D2;
1430 // Take advantage of knowing source and pattern lengths. Stop short when source is smaller than pattern
1431 _D2 __len2 = __last2 - __first2;
1432 if (__len2 == 0)
1433 return __first1;
1434 _D1 __len1 = __last1 - __first1;
1435 if (__len1 < __len2)
1436 return __last1;
1437 const _RandomAccessIterator1 __s = __last1 - (__len2 - 1); // Start of pattern match can't go beyond here
1438 while (true)
1439 {
1440#if !_LIBCPP_UNROLL_LOOPS
1441 while (true)
1442 {
1443 if (__first1 == __s)
1444 return __last1;
1445 if (__pred(*__first1, *__first2))
1446 break;
1447 ++__first1;
1448 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001449#else // !_LIBCPP_UNROLL_LOOPS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001450 for (_D1 __loop_unroll = (__s - __first1) / 4; __loop_unroll > 0; --__loop_unroll)
1451 {
1452 if (__pred(*__first1, *__first2))
1453 goto __phase2;
1454 if (__pred(*++__first1, *__first2))
1455 goto __phase2;
1456 if (__pred(*++__first1, *__first2))
1457 goto __phase2;
1458 if (__pred(*++__first1, *__first2))
1459 goto __phase2;
1460 ++__first1;
1461 }
1462 switch (__s - __first1)
1463 {
1464 case 3:
1465 if (__pred(*__first1, *__first2))
1466 break;
1467 ++__first1;
1468 case 2:
1469 if (__pred(*__first1, *__first2))
1470 break;
1471 ++__first1;
1472 case 1:
1473 if (__pred(*__first1, *__first2))
1474 break;
1475 case 0:
1476 return __last1;
1477 }
1478 __phase2:
Howard Hinnant324bb032010-08-22 00:02:43 +00001479#endif // !_LIBCPP_UNROLL_LOOPS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001480 _RandomAccessIterator1 __m1 = __first1;
1481 _RandomAccessIterator2 __m2 = __first2;
1482#if !_LIBCPP_UNROLL_LOOPS
1483 while (true)
1484 {
1485 if (++__m2 == __last2)
1486 return __first1;
1487 ++__m1; // no need to check range on __m1 because __s guarantees we have enough source
1488 if (!__pred(*__m1, *__m2))
1489 {
1490 ++__first1;
1491 break;
1492 }
1493 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001494#else // !_LIBCPP_UNROLL_LOOPS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001495 ++__m2;
1496 ++__m1;
1497 for (_D2 __loop_unroll = (__last2 - __m2) / 4; __loop_unroll > 0; --__loop_unroll)
1498 {
1499 if (!__pred(*__m1, *__m2))
1500 goto __continue;
1501 if (!__pred(*++__m1, *++__m2))
1502 goto __continue;
1503 if (!__pred(*++__m1, *++__m2))
1504 goto __continue;
1505 if (!__pred(*++__m1, *++__m2))
1506 goto __continue;
1507 ++__m1;
1508 ++__m2;
1509 }
1510 switch (__last2 - __m2)
1511 {
1512 case 3:
1513 if (!__pred(*__m1, *__m2))
1514 break;
1515 ++__m1;
1516 ++__m2;
1517 case 2:
1518 if (!__pred(*__m1, *__m2))
1519 break;
1520 ++__m1;
1521 ++__m2;
1522 case 1:
1523 if (!__pred(*__m1, *__m2))
1524 break;
1525 case 0:
1526 return __first1;
1527 }
1528 __continue:
1529 ++__first1;
Howard Hinnant324bb032010-08-22 00:02:43 +00001530#endif // !_LIBCPP_UNROLL_LOOPS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001531 }
1532}
1533
1534template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
1535inline _LIBCPP_INLINE_VISIBILITY
1536_ForwardIterator1
1537search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1538 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1539{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001540 return _VSTD::__search<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001541 (__first1, __last1, __first2, __last2, __pred,
1542 typename std::iterator_traits<_ForwardIterator1>::iterator_category(),
1543 typename std::iterator_traits<_ForwardIterator2>::iterator_category());
1544}
1545
1546template <class _ForwardIterator1, class _ForwardIterator2>
1547inline _LIBCPP_INLINE_VISIBILITY
1548_ForwardIterator1
1549search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1550 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1551{
1552 typedef typename std::iterator_traits<_ForwardIterator1>::value_type __v1;
1553 typedef typename std::iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001554 return _VSTD::search(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001555}
1556
1557// search_n
1558
1559template <class _BinaryPredicate, class _ForwardIterator, class _Size, class _Tp>
1560_ForwardIterator
1561__search_n(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnant78b68282011-10-22 20:59:45 +00001562 _Size __count, const _Tp& __value_, _BinaryPredicate __pred, forward_iterator_tag)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001563{
1564 if (__count <= 0)
1565 return __first;
1566 while (true)
1567 {
Howard Hinnant78b68282011-10-22 20:59:45 +00001568 // Find first element in sequence that matchs __value_, with a mininum of loop checks
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001569 while (true)
1570 {
Howard Hinnant78b68282011-10-22 20:59:45 +00001571 if (__first == __last) // return __last if no element matches __value_
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001572 return __last;
Howard Hinnant78b68282011-10-22 20:59:45 +00001573 if (__pred(*__first, __value_))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001574 break;
1575 ++__first;
1576 }
Howard Hinnant78b68282011-10-22 20:59:45 +00001577 // *__first matches __value_, now match elements after here
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001578 _ForwardIterator __m = __first;
1579 _Size __c(0);
1580 while (true)
1581 {
1582 if (++__c == __count) // If pattern exhausted, __first is the answer (works for 1 element pattern)
1583 return __first;
1584 if (++__m == __last) // Otherwise if source exhaused, pattern not found
1585 return __last;
Howard Hinnant78b68282011-10-22 20:59:45 +00001586 if (!__pred(*__m, __value_)) // if there is a mismatch, restart with a new __first
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001587 {
1588 __first = __m;
1589 ++__first;
1590 break;
1591 } // else there is a match, check next elements
1592 }
1593 }
1594}
1595
1596template <class _BinaryPredicate, class _RandomAccessIterator, class _Size, class _Tp>
1597_RandomAccessIterator
1598__search_n(_RandomAccessIterator __first, _RandomAccessIterator __last,
Howard Hinnant78b68282011-10-22 20:59:45 +00001599 _Size __count, const _Tp& __value_, _BinaryPredicate __pred, random_access_iterator_tag)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001600{
1601 if (__count <= 0)
1602 return __first;
1603 _Size __len = static_cast<_Size>(__last - __first);
1604 if (__len < __count)
1605 return __last;
1606 const _RandomAccessIterator __s = __last - (__count - 1); // Start of pattern match can't go beyond here
1607 while (true)
1608 {
Howard Hinnant78b68282011-10-22 20:59:45 +00001609 // Find first element in sequence that matchs __value_, with a mininum of loop checks
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001610 while (true)
1611 {
Howard Hinnant128f7bf2013-04-04 15:40:48 +00001612 if (__first >= __s) // return __last if no element matches __value_
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001613 return __last;
Howard Hinnant78b68282011-10-22 20:59:45 +00001614 if (__pred(*__first, __value_))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001615 break;
1616 ++__first;
1617 }
Howard Hinnant78b68282011-10-22 20:59:45 +00001618 // *__first matches __value_, now match elements after here
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001619 _RandomAccessIterator __m = __first;
1620 _Size __c(0);
1621 while (true)
1622 {
1623 if (++__c == __count) // If pattern exhausted, __first is the answer (works for 1 element pattern)
1624 return __first;
1625 ++__m; // no need to check range on __m because __s guarantees we have enough source
Howard Hinnant78b68282011-10-22 20:59:45 +00001626 if (!__pred(*__m, __value_)) // if there is a mismatch, restart with a new __first
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001627 {
1628 __first = __m;
1629 ++__first;
1630 break;
1631 } // else there is a match, check next elements
1632 }
1633 }
1634}
1635
1636template <class _ForwardIterator, class _Size, class _Tp, class _BinaryPredicate>
1637inline _LIBCPP_INLINE_VISIBILITY
1638_ForwardIterator
1639search_n(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnant78b68282011-10-22 20:59:45 +00001640 _Size __count, const _Tp& __value_, _BinaryPredicate __pred)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001641{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001642 return _VSTD::__search_n<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnant78b68282011-10-22 20:59:45 +00001643 (__first, __last, __count, __value_, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001644}
1645
1646template <class _ForwardIterator, class _Size, class _Tp>
1647inline _LIBCPP_INLINE_VISIBILITY
1648_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00001649search_n(_ForwardIterator __first, _ForwardIterator __last, _Size __count, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001650{
1651 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Howard Hinnant78b68282011-10-22 20:59:45 +00001652 return _VSTD::search_n(__first, __last, __count, __value_, __equal_to<__v, _Tp>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001653}
1654
1655// copy
1656
1657template <class _Iter>
1658struct __libcpp_is_trivial_iterator
1659{
1660 static const bool value = is_pointer<_Iter>::value;
1661};
1662
1663template <class _Iter>
1664struct __libcpp_is_trivial_iterator<move_iterator<_Iter> >
1665{
1666 static const bool value = is_pointer<_Iter>::value;
1667};
1668
1669template <class _Iter>
1670struct __libcpp_is_trivial_iterator<__wrap_iter<_Iter> >
1671{
1672 static const bool value = is_pointer<_Iter>::value;
1673};
1674
1675template <class _Iter>
1676inline _LIBCPP_INLINE_VISIBILITY
1677_Iter
1678__unwrap_iter(_Iter __i)
1679{
1680 return __i;
1681}
1682
1683template <class _Tp>
1684inline _LIBCPP_INLINE_VISIBILITY
1685typename enable_if
1686<
Howard Hinnant1468b662010-11-19 22:17:28 +00001687 is_trivially_copy_assignable<_Tp>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001688 _Tp*
1689>::type
1690__unwrap_iter(move_iterator<_Tp*> __i)
1691{
1692 return __i.base();
1693}
1694
Howard Hinnant499cea12013-08-23 17:37:05 +00001695#if _LIBCPP_DEBUG_LEVEL < 2
1696
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001697template <class _Tp>
1698inline _LIBCPP_INLINE_VISIBILITY
1699typename enable_if
1700<
Howard Hinnant1468b662010-11-19 22:17:28 +00001701 is_trivially_copy_assignable<_Tp>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001702 _Tp*
1703>::type
1704__unwrap_iter(__wrap_iter<_Tp*> __i)
1705{
1706 return __i.base();
1707}
1708
Howard Hinnant499cea12013-08-23 17:37:05 +00001709#endif // _LIBCPP_DEBUG_LEVEL < 2
1710
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001711template <class _InputIterator, class _OutputIterator>
1712inline _LIBCPP_INLINE_VISIBILITY
1713_OutputIterator
1714__copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1715{
1716 for (; __first != __last; ++__first, ++__result)
1717 *__result = *__first;
1718 return __result;
1719}
1720
1721template <class _Tp, class _Up>
1722inline _LIBCPP_INLINE_VISIBILITY
1723typename enable_if
1724<
1725 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnant1468b662010-11-19 22:17:28 +00001726 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001727 _Up*
1728>::type
1729__copy(_Tp* __first, _Tp* __last, _Up* __result)
1730{
1731 const size_t __n = static_cast<size_t>(__last - __first);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001732 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001733 return __result + __n;
1734}
1735
1736template <class _InputIterator, class _OutputIterator>
1737inline _LIBCPP_INLINE_VISIBILITY
1738_OutputIterator
1739copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1740{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001741 return _VSTD::__copy(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001742}
1743
1744// copy_backward
1745
Howard Hinnantb73568d2013-02-06 21:03:39 +00001746template <class _BidirectionalIterator, class _OutputIterator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001747inline _LIBCPP_INLINE_VISIBILITY
1748_OutputIterator
Howard Hinnantb73568d2013-02-06 21:03:39 +00001749__copy_backward(_BidirectionalIterator __first, _BidirectionalIterator __last, _OutputIterator __result)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001750{
1751 while (__first != __last)
1752 *--__result = *--__last;
1753 return __result;
1754}
1755
1756template <class _Tp, class _Up>
1757inline _LIBCPP_INLINE_VISIBILITY
1758typename enable_if
1759<
1760 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnant1468b662010-11-19 22:17:28 +00001761 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001762 _Up*
1763>::type
1764__copy_backward(_Tp* __first, _Tp* __last, _Up* __result)
1765{
1766 const size_t __n = static_cast<size_t>(__last - __first);
1767 __result -= __n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001768 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001769 return __result;
1770}
1771
1772template <class _BidirectionalIterator1, class _BidirectionalIterator2>
1773inline _LIBCPP_INLINE_VISIBILITY
1774_BidirectionalIterator2
1775copy_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
1776 _BidirectionalIterator2 __result)
1777{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001778 return _VSTD::__copy_backward(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001779}
1780
1781// copy_if
1782
1783template<class _InputIterator, class _OutputIterator, class _Predicate>
1784inline _LIBCPP_INLINE_VISIBILITY
1785_OutputIterator
1786copy_if(_InputIterator __first, _InputIterator __last,
1787 _OutputIterator __result, _Predicate __pred)
1788{
1789 for (; __first != __last; ++__first)
1790 {
1791 if (__pred(*__first))
1792 {
1793 *__result = *__first;
1794 ++__result;
1795 }
1796 }
1797 return __result;
1798}
1799
1800// copy_n
1801
1802template<class _InputIterator, class _Size, class _OutputIterator>
1803inline _LIBCPP_INLINE_VISIBILITY
1804typename enable_if
1805<
1806 __is_input_iterator<_InputIterator>::value &&
1807 !__is_random_access_iterator<_InputIterator>::value,
1808 _OutputIterator
1809>::type
1810copy_n(_InputIterator __first, _Size __n, _OutputIterator __result)
1811{
Howard Hinnant171869e2011-02-27 20:55:39 +00001812 if (__n > 0)
1813 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001814 *__result = *__first;
Howard Hinnant171869e2011-02-27 20:55:39 +00001815 ++__result;
1816 for (--__n; __n > 0; --__n)
1817 {
1818 ++__first;
1819 *__result = *__first;
1820 ++__result;
1821 }
1822 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001823 return __result;
1824}
1825
1826template<class _InputIterator, class _Size, class _OutputIterator>
1827inline _LIBCPP_INLINE_VISIBILITY
1828typename enable_if
1829<
1830 __is_random_access_iterator<_InputIterator>::value,
1831 _OutputIterator
1832>::type
1833copy_n(_InputIterator __first, _Size __n, _OutputIterator __result)
1834{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001835 return _VSTD::copy(__first, __first + __n, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001836}
1837
1838// move
1839
1840template <class _InputIterator, class _OutputIterator>
1841inline _LIBCPP_INLINE_VISIBILITY
1842_OutputIterator
1843__move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1844{
1845 for (; __first != __last; ++__first, ++__result)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001846 *__result = _VSTD::move(*__first);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001847 return __result;
1848}
1849
1850template <class _Tp, class _Up>
1851inline _LIBCPP_INLINE_VISIBILITY
1852typename enable_if
1853<
1854 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnant1468b662010-11-19 22:17:28 +00001855 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001856 _Up*
1857>::type
1858__move(_Tp* __first, _Tp* __last, _Up* __result)
1859{
1860 const size_t __n = static_cast<size_t>(__last - __first);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001861 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001862 return __result + __n;
1863}
1864
1865template <class _InputIterator, class _OutputIterator>
1866inline _LIBCPP_INLINE_VISIBILITY
1867_OutputIterator
1868move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1869{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001870 return _VSTD::__move(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001871}
1872
1873// move_backward
1874
1875template <class _InputIterator, class _OutputIterator>
1876inline _LIBCPP_INLINE_VISIBILITY
1877_OutputIterator
1878__move_backward(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1879{
1880 while (__first != __last)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001881 *--__result = _VSTD::move(*--__last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001882 return __result;
1883}
1884
1885template <class _Tp, class _Up>
1886inline _LIBCPP_INLINE_VISIBILITY
1887typename enable_if
1888<
1889 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnant1468b662010-11-19 22:17:28 +00001890 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001891 _Up*
1892>::type
1893__move_backward(_Tp* __first, _Tp* __last, _Up* __result)
1894{
1895 const size_t __n = static_cast<size_t>(__last - __first);
1896 __result -= __n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001897 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001898 return __result;
1899}
1900
1901template <class _BidirectionalIterator1, class _BidirectionalIterator2>
1902inline _LIBCPP_INLINE_VISIBILITY
1903_BidirectionalIterator2
1904move_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
1905 _BidirectionalIterator2 __result)
1906{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001907 return _VSTD::__move_backward(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001908}
1909
1910// iter_swap
1911
Howard Hinnante9b2c2d2011-05-27 15:04:19 +00001912// moved to <type_traits> for better swap / noexcept support
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001913
1914// transform
1915
1916template <class _InputIterator, class _OutputIterator, class _UnaryOperation>
1917inline _LIBCPP_INLINE_VISIBILITY
1918_OutputIterator
1919transform(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _UnaryOperation __op)
1920{
1921 for (; __first != __last; ++__first, ++__result)
1922 *__result = __op(*__first);
1923 return __result;
1924}
1925
1926template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _BinaryOperation>
1927inline _LIBCPP_INLINE_VISIBILITY
1928_OutputIterator
1929transform(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2,
1930 _OutputIterator __result, _BinaryOperation __binary_op)
1931{
1932 for (; __first1 != __last1; ++__first1, ++__first2, ++__result)
1933 *__result = __binary_op(*__first1, *__first2);
1934 return __result;
1935}
1936
1937// replace
1938
1939template <class _ForwardIterator, class _Tp>
1940inline _LIBCPP_INLINE_VISIBILITY
1941void
1942replace(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __old_value, const _Tp& __new_value)
1943{
1944 for (; __first != __last; ++__first)
1945 if (*__first == __old_value)
1946 *__first = __new_value;
1947}
1948
1949// replace_if
1950
1951template <class _ForwardIterator, class _Predicate, class _Tp>
1952inline _LIBCPP_INLINE_VISIBILITY
1953void
1954replace_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, const _Tp& __new_value)
1955{
1956 for (; __first != __last; ++__first)
1957 if (__pred(*__first))
1958 *__first = __new_value;
1959}
1960
1961// replace_copy
1962
1963template <class _InputIterator, class _OutputIterator, class _Tp>
1964inline _LIBCPP_INLINE_VISIBILITY
1965_OutputIterator
1966replace_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
1967 const _Tp& __old_value, const _Tp& __new_value)
1968{
1969 for (; __first != __last; ++__first, ++__result)
1970 if (*__first == __old_value)
1971 *__result = __new_value;
1972 else
1973 *__result = *__first;
1974 return __result;
1975}
1976
1977// replace_copy_if
1978
1979template <class _InputIterator, class _OutputIterator, class _Predicate, class _Tp>
1980inline _LIBCPP_INLINE_VISIBILITY
1981_OutputIterator
1982replace_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
1983 _Predicate __pred, const _Tp& __new_value)
1984{
1985 for (; __first != __last; ++__first, ++__result)
1986 if (__pred(*__first))
1987 *__result = __new_value;
1988 else
1989 *__result = *__first;
1990 return __result;
1991}
1992
1993// fill_n
1994
1995template <class _OutputIterator, class _Size, class _Tp>
1996inline _LIBCPP_INLINE_VISIBILITY
1997_OutputIterator
Howard Hinnant56dcf0b2013-08-01 17:29:28 +00001998__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001999{
2000 for (; __n > 0; ++__first, --__n)
Howard Hinnant78b68282011-10-22 20:59:45 +00002001 *__first = __value_;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002002 return __first;
2003}
2004
Howard Hinnant56dcf0b2013-08-01 17:29:28 +00002005template <class _Tp, class _Size, class _Up>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002006inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant56dcf0b2013-08-01 17:29:28 +00002007typename enable_if
2008<
2009 is_integral<_Tp>::value && sizeof(_Tp) == 1 &&
2010 !is_same<_Tp, bool>::value &&
2011 is_integral<_Up>::value && sizeof(_Up) == 1,
2012 _Tp*
2013>::type
2014__fill_n(_Tp* __first, _Size __n,_Up __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002015{
2016 if (__n > 0)
Howard Hinnant78b68282011-10-22 20:59:45 +00002017 _VSTD::memset(__first, (unsigned char)__value_, (size_t)(__n));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002018 return __first + __n;
2019}
2020
2021template <class _OutputIterator, class _Size, class _Tp>
2022inline _LIBCPP_INLINE_VISIBILITY
2023_OutputIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00002024fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002025{
Howard Hinnant56dcf0b2013-08-01 17:29:28 +00002026 return _VSTD::__fill_n(__first, __n, __value_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002027}
2028
2029// fill
2030
2031template <class _ForwardIterator, class _Tp>
2032inline _LIBCPP_INLINE_VISIBILITY
2033void
Howard Hinnant78b68282011-10-22 20:59:45 +00002034__fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, forward_iterator_tag)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002035{
2036 for (; __first != __last; ++__first)
Howard Hinnant78b68282011-10-22 20:59:45 +00002037 *__first = __value_;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002038}
2039
2040template <class _RandomAccessIterator, class _Tp>
2041inline _LIBCPP_INLINE_VISIBILITY
2042void
Howard Hinnant78b68282011-10-22 20:59:45 +00002043__fill(_RandomAccessIterator __first, _RandomAccessIterator __last, const _Tp& __value_, random_access_iterator_tag)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002044{
Howard Hinnant78b68282011-10-22 20:59:45 +00002045 _VSTD::fill_n(__first, __last - __first, __value_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002046}
2047
2048template <class _ForwardIterator, class _Tp>
2049inline _LIBCPP_INLINE_VISIBILITY
2050void
Howard Hinnant78b68282011-10-22 20:59:45 +00002051fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002052{
Howard Hinnant78b68282011-10-22 20:59:45 +00002053 _VSTD::__fill(__first, __last, __value_, typename iterator_traits<_ForwardIterator>::iterator_category());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002054}
2055
2056// generate
2057
2058template <class _ForwardIterator, class _Generator>
2059inline _LIBCPP_INLINE_VISIBILITY
2060void
2061generate(_ForwardIterator __first, _ForwardIterator __last, _Generator __gen)
2062{
2063 for (; __first != __last; ++__first)
2064 *__first = __gen();
2065}
2066
2067// generate_n
2068
2069template <class _OutputIterator, class _Size, class _Generator>
2070inline _LIBCPP_INLINE_VISIBILITY
2071_OutputIterator
2072generate_n(_OutputIterator __first, _Size __n, _Generator __gen)
2073{
2074 for (; __n > 0; ++__first, --__n)
2075 *__first = __gen();
2076 return __first;
2077}
2078
2079// remove
2080
2081template <class _ForwardIterator, class _Tp>
2082_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00002083remove(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002084{
Howard Hinnant78b68282011-10-22 20:59:45 +00002085 __first = _VSTD::find(__first, __last, __value_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002086 if (__first != __last)
2087 {
2088 _ForwardIterator __i = __first;
2089 while (++__i != __last)
2090 {
Howard Hinnant78b68282011-10-22 20:59:45 +00002091 if (!(*__i == __value_))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002092 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002093 *__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002094 ++__first;
2095 }
2096 }
2097 }
2098 return __first;
2099}
2100
2101// remove_if
2102
2103template <class _ForwardIterator, class _Predicate>
2104_ForwardIterator
2105remove_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
2106{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002107 __first = _VSTD::find_if<_ForwardIterator, typename add_lvalue_reference<_Predicate>::type>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002108 (__first, __last, __pred);
2109 if (__first != __last)
2110 {
2111 _ForwardIterator __i = __first;
2112 while (++__i != __last)
2113 {
2114 if (!__pred(*__i))
2115 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002116 *__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002117 ++__first;
2118 }
2119 }
2120 }
2121 return __first;
2122}
2123
2124// remove_copy
2125
2126template <class _InputIterator, class _OutputIterator, class _Tp>
2127inline _LIBCPP_INLINE_VISIBILITY
2128_OutputIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00002129remove_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002130{
2131 for (; __first != __last; ++__first)
2132 {
Howard Hinnant78b68282011-10-22 20:59:45 +00002133 if (!(*__first == __value_))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002134 {
2135 *__result = *__first;
2136 ++__result;
2137 }
2138 }
2139 return __result;
2140}
2141
2142// remove_copy_if
2143
2144template <class _InputIterator, class _OutputIterator, class _Predicate>
2145inline _LIBCPP_INLINE_VISIBILITY
2146_OutputIterator
2147remove_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Predicate __pred)
2148{
2149 for (; __first != __last; ++__first)
2150 {
2151 if (!__pred(*__first))
2152 {
2153 *__result = *__first;
2154 ++__result;
2155 }
2156 }
2157 return __result;
2158}
2159
2160// unique
2161
2162template <class _ForwardIterator, class _BinaryPredicate>
2163_ForwardIterator
2164unique(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred)
2165{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002166 __first = _VSTD::adjacent_find<_ForwardIterator, typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002167 (__first, __last, __pred);
2168 if (__first != __last)
2169 {
2170 // ... a a ? ...
2171 // f i
2172 _ForwardIterator __i = __first;
2173 for (++__i; ++__i != __last;)
2174 if (!__pred(*__first, *__i))
Howard Hinnant0949eed2011-06-30 21:18:19 +00002175 *++__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002176 ++__first;
2177 }
2178 return __first;
2179}
2180
2181template <class _ForwardIterator>
2182inline _LIBCPP_INLINE_VISIBILITY
2183_ForwardIterator
2184unique(_ForwardIterator __first, _ForwardIterator __last)
2185{
2186 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002187 return _VSTD::unique(__first, __last, __equal_to<__v>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002188}
2189
2190// unique_copy
2191
2192template <class _BinaryPredicate, class _InputIterator, class _OutputIterator>
2193_OutputIterator
2194__unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred,
2195 input_iterator_tag, output_iterator_tag)
2196{
2197 if (__first != __last)
2198 {
2199 typename iterator_traits<_InputIterator>::value_type __t(*__first);
2200 *__result = __t;
2201 ++__result;
2202 while (++__first != __last)
2203 {
2204 if (!__pred(__t, *__first))
2205 {
2206 __t = *__first;
2207 *__result = __t;
2208 ++__result;
2209 }
2210 }
2211 }
2212 return __result;
2213}
2214
2215template <class _BinaryPredicate, class _ForwardIterator, class _OutputIterator>
2216_OutputIterator
2217__unique_copy(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result, _BinaryPredicate __pred,
2218 forward_iterator_tag, output_iterator_tag)
2219{
2220 if (__first != __last)
2221 {
2222 _ForwardIterator __i = __first;
2223 *__result = *__i;
2224 ++__result;
2225 while (++__first != __last)
2226 {
2227 if (!__pred(*__i, *__first))
2228 {
2229 *__result = *__first;
2230 ++__result;
2231 __i = __first;
2232 }
2233 }
2234 }
2235 return __result;
2236}
2237
2238template <class _BinaryPredicate, class _InputIterator, class _ForwardIterator>
2239_ForwardIterator
2240__unique_copy(_InputIterator __first, _InputIterator __last, _ForwardIterator __result, _BinaryPredicate __pred,
2241 input_iterator_tag, forward_iterator_tag)
2242{
2243 if (__first != __last)
2244 {
2245 *__result = *__first;
2246 while (++__first != __last)
2247 if (!__pred(*__result, *__first))
2248 *++__result = *__first;
2249 ++__result;
2250 }
2251 return __result;
2252}
2253
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002254template <class _InputIterator, class _OutputIterator, class _BinaryPredicate>
2255inline _LIBCPP_INLINE_VISIBILITY
2256_OutputIterator
2257unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred)
2258{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002259 return _VSTD::__unique_copy<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002260 (__first, __last, __result, __pred,
2261 typename iterator_traits<_InputIterator>::iterator_category(),
2262 typename iterator_traits<_OutputIterator>::iterator_category());
2263}
2264
2265template <class _InputIterator, class _OutputIterator>
2266inline _LIBCPP_INLINE_VISIBILITY
2267_OutputIterator
2268unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
2269{
2270 typedef typename iterator_traits<_InputIterator>::value_type __v;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002271 return _VSTD::unique_copy(__first, __last, __result, __equal_to<__v>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002272}
2273
2274// reverse
2275
2276template <class _BidirectionalIterator>
2277inline _LIBCPP_INLINE_VISIBILITY
2278void
2279__reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirectional_iterator_tag)
2280{
2281 while (__first != __last)
2282 {
2283 if (__first == --__last)
2284 break;
2285 swap(*__first, *__last);
2286 ++__first;
2287 }
2288}
2289
2290template <class _RandomAccessIterator>
2291inline _LIBCPP_INLINE_VISIBILITY
2292void
2293__reverse(_RandomAccessIterator __first, _RandomAccessIterator __last, random_access_iterator_tag)
2294{
2295 if (__first != __last)
2296 for (; __first < --__last; ++__first)
2297 swap(*__first, *__last);
2298}
2299
2300template <class _BidirectionalIterator>
2301inline _LIBCPP_INLINE_VISIBILITY
2302void
2303reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
2304{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002305 _VSTD::__reverse(__first, __last, typename iterator_traits<_BidirectionalIterator>::iterator_category());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002306}
2307
2308// reverse_copy
2309
2310template <class _BidirectionalIterator, class _OutputIterator>
2311inline _LIBCPP_INLINE_VISIBILITY
2312_OutputIterator
2313reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last, _OutputIterator __result)
2314{
2315 for (; __first != __last; ++__result)
2316 *__result = *--__last;
2317 return __result;
2318}
2319
2320// rotate
2321
2322template <class _ForwardIterator>
2323_ForwardIterator
Howard Hinnant4b2f4202012-08-03 18:01:20 +00002324__rotate_left(_ForwardIterator __first, _ForwardIterator __last)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002325{
Howard Hinnant4b2f4202012-08-03 18:01:20 +00002326 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
2327 value_type __tmp = _VSTD::move(*__first);
2328 _ForwardIterator __lm1 = _VSTD::move(_VSTD::next(__first), __last, __first);
2329 *__lm1 = _VSTD::move(__tmp);
2330 return __lm1;
2331}
2332
2333template <class _BidirectionalIterator>
2334_BidirectionalIterator
2335__rotate_right(_BidirectionalIterator __first, _BidirectionalIterator __last)
2336{
2337 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
2338 _BidirectionalIterator __lm1 = _VSTD::prev(__last);
2339 value_type __tmp = _VSTD::move(*__lm1);
2340 _BidirectionalIterator __fp1 = _VSTD::move_backward(__first, __lm1, __last);
2341 *__first = _VSTD::move(__tmp);
2342 return __fp1;
2343}
2344
2345template <class _ForwardIterator>
2346_ForwardIterator
2347__rotate_forward(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last)
2348{
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002349 _ForwardIterator __i = __middle;
2350 while (true)
2351 {
2352 swap(*__first, *__i);
2353 ++__first;
2354 if (++__i == __last)
2355 break;
2356 if (__first == __middle)
2357 __middle = __i;
2358 }
2359 _ForwardIterator __r = __first;
2360 if (__first != __middle)
2361 {
2362 __i = __middle;
2363 while (true)
2364 {
2365 swap(*__first, *__i);
2366 ++__first;
2367 if (++__i == __last)
2368 {
2369 if (__first == __middle)
2370 break;
2371 __i = __middle;
2372 }
2373 else if (__first == __middle)
2374 __middle = __i;
2375 }
2376 }
2377 return __r;
2378}
2379
2380template<typename _Integral>
2381inline _LIBCPP_INLINE_VISIBILITY
2382_Integral
2383__gcd(_Integral __x, _Integral __y)
2384{
2385 do
2386 {
2387 _Integral __t = __x % __y;
2388 __x = __y;
2389 __y = __t;
2390 } while (__y);
2391 return __x;
2392}
2393
2394template<typename _RandomAccessIterator>
2395_RandomAccessIterator
Howard Hinnant4b2f4202012-08-03 18:01:20 +00002396__rotate_gcd(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002397{
2398 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
2399 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
Howard Hinnant324bb032010-08-22 00:02:43 +00002400
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002401 const difference_type __m1 = __middle - __first;
2402 const difference_type __m2 = __last - __middle;
2403 if (__m1 == __m2)
2404 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002405 _VSTD::swap_ranges(__first, __middle, __middle);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002406 return __middle;
2407 }
Howard Hinnant4b2f4202012-08-03 18:01:20 +00002408 const difference_type __g = _VSTD::__gcd(__m1, __m2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002409 for (_RandomAccessIterator __p = __first + __g; __p != __first;)
2410 {
Howard Hinnant4b2f4202012-08-03 18:01:20 +00002411 value_type __t(_VSTD::move(*--__p));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002412 _RandomAccessIterator __p1 = __p;
2413 _RandomAccessIterator __p2 = __p1 + __m1;
2414 do
2415 {
Howard Hinnant4b2f4202012-08-03 18:01:20 +00002416 *__p1 = _VSTD::move(*__p2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002417 __p1 = __p2;
2418 const difference_type __d = __last - __p2;
2419 if (__m1 < __d)
2420 __p2 += __m1;
2421 else
2422 __p2 = __first + (__m1 - __d);
2423 } while (__p2 != __p);
Howard Hinnant4b2f4202012-08-03 18:01:20 +00002424 *__p1 = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002425 }
2426 return __first + __m2;
2427}
2428
2429template <class _ForwardIterator>
2430inline _LIBCPP_INLINE_VISIBILITY
2431_ForwardIterator
Howard Hinnant4b2f4202012-08-03 18:01:20 +00002432__rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last,
2433 _VSTD::forward_iterator_tag)
2434{
2435 typedef typename _VSTD::iterator_traits<_ForwardIterator>::value_type value_type;
2436 if (_VSTD::is_trivially_move_assignable<value_type>::value)
2437 {
2438 if (_VSTD::next(__first) == __middle)
2439 return _VSTD::__rotate_left(__first, __last);
2440 }
2441 return _VSTD::__rotate_forward(__first, __middle, __last);
2442}
2443
2444template <class _BidirectionalIterator>
2445inline _LIBCPP_INLINE_VISIBILITY
2446_BidirectionalIterator
2447__rotate(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
2448 _VSTD::bidirectional_iterator_tag)
2449{
2450 typedef typename _VSTD::iterator_traits<_BidirectionalIterator>::value_type value_type;
2451 if (_VSTD::is_trivially_move_assignable<value_type>::value)
2452 {
2453 if (_VSTD::next(__first) == __middle)
2454 return _VSTD::__rotate_left(__first, __last);
2455 if (_VSTD::next(__middle) == __last)
2456 return _VSTD::__rotate_right(__first, __last);
2457 }
2458 return _VSTD::__rotate_forward(__first, __middle, __last);
2459}
2460
2461template <class _RandomAccessIterator>
2462inline _LIBCPP_INLINE_VISIBILITY
2463_RandomAccessIterator
2464__rotate(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
2465 _VSTD::random_access_iterator_tag)
2466{
2467 typedef typename _VSTD::iterator_traits<_RandomAccessIterator>::value_type value_type;
2468 if (_VSTD::is_trivially_move_assignable<value_type>::value)
2469 {
2470 if (_VSTD::next(__first) == __middle)
2471 return _VSTD::__rotate_left(__first, __last);
2472 if (_VSTD::next(__middle) == __last)
2473 return _VSTD::__rotate_right(__first, __last);
2474 return _VSTD::__rotate_gcd(__first, __middle, __last);
2475 }
2476 return _VSTD::__rotate_forward(__first, __middle, __last);
2477}
2478
2479template <class _ForwardIterator>
2480inline _LIBCPP_INLINE_VISIBILITY
2481_ForwardIterator
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002482rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last)
2483{
Howard Hinnant4b2f4202012-08-03 18:01:20 +00002484 if (__first == __middle)
2485 return __last;
2486 if (__middle == __last)
2487 return __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002488 return _VSTD::__rotate(__first, __middle, __last,
Howard Hinnant4b2f4202012-08-03 18:01:20 +00002489 typename _VSTD::iterator_traits<_ForwardIterator>::iterator_category());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002490}
2491
2492// rotate_copy
2493
2494template <class _ForwardIterator, class _OutputIterator>
2495inline _LIBCPP_INLINE_VISIBILITY
2496_OutputIterator
2497rotate_copy(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last, _OutputIterator __result)
2498{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002499 return _VSTD::copy(__first, __middle, _VSTD::copy(__middle, __last, __result));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002500}
2501
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002502// min_element
2503
2504template <class _ForwardIterator, class _Compare>
2505inline _LIBCPP_INLINE_VISIBILITY
2506_ForwardIterator
2507min_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
2508{
2509 if (__first != __last)
2510 {
2511 _ForwardIterator __i = __first;
2512 while (++__i != __last)
2513 if (__comp(*__i, *__first))
2514 __first = __i;
2515 }
2516 return __first;
2517}
2518
2519template <class _ForwardIterator>
2520inline _LIBCPP_INLINE_VISIBILITY
2521_ForwardIterator
2522min_element(_ForwardIterator __first, _ForwardIterator __last)
2523{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002524 return _VSTD::min_element(__first, __last,
Howard Hinnant98e5d972010-08-21 20:10:01 +00002525 __less<typename iterator_traits<_ForwardIterator>::value_type>());
2526}
2527
2528// min
2529
2530template <class _Tp, class _Compare>
2531inline _LIBCPP_INLINE_VISIBILITY
2532const _Tp&
2533min(const _Tp& __a, const _Tp& __b, _Compare __comp)
2534{
2535 return __comp(__b, __a) ? __b : __a;
2536}
2537
2538template <class _Tp>
2539inline _LIBCPP_INLINE_VISIBILITY
2540const _Tp&
2541min(const _Tp& __a, const _Tp& __b)
2542{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002543 return _VSTD::min(__a, __b, __less<_Tp>());
Howard Hinnant98e5d972010-08-21 20:10:01 +00002544}
2545
Howard Hinnante3e32912011-08-12 21:56:02 +00002546#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2547
Howard Hinnant98e5d972010-08-21 20:10:01 +00002548template<class _Tp, class _Compare>
2549inline _LIBCPP_INLINE_VISIBILITY
2550_Tp
2551min(initializer_list<_Tp> __t, _Compare __comp)
2552{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002553 return *_VSTD::min_element(__t.begin(), __t.end(), __comp);
Howard Hinnant98e5d972010-08-21 20:10:01 +00002554}
2555
2556template<class _Tp>
2557inline _LIBCPP_INLINE_VISIBILITY
2558_Tp
2559min(initializer_list<_Tp> __t)
2560{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002561 return *_VSTD::min_element(__t.begin(), __t.end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002562}
2563
Howard Hinnante3e32912011-08-12 21:56:02 +00002564#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2565
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002566// max_element
2567
2568template <class _ForwardIterator, class _Compare>
2569inline _LIBCPP_INLINE_VISIBILITY
2570_ForwardIterator
2571max_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
2572{
2573 if (__first != __last)
2574 {
2575 _ForwardIterator __i = __first;
2576 while (++__i != __last)
2577 if (__comp(*__first, *__i))
2578 __first = __i;
2579 }
2580 return __first;
2581}
2582
2583template <class _ForwardIterator>
2584inline _LIBCPP_INLINE_VISIBILITY
2585_ForwardIterator
2586max_element(_ForwardIterator __first, _ForwardIterator __last)
2587{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002588 return _VSTD::max_element(__first, __last,
Howard Hinnant98e5d972010-08-21 20:10:01 +00002589 __less<typename iterator_traits<_ForwardIterator>::value_type>());
2590}
2591
2592// max
2593
2594template <class _Tp, class _Compare>
2595inline _LIBCPP_INLINE_VISIBILITY
2596const _Tp&
2597max(const _Tp& __a, const _Tp& __b, _Compare __comp)
2598{
2599 return __comp(__a, __b) ? __b : __a;
2600}
2601
2602template <class _Tp>
2603inline _LIBCPP_INLINE_VISIBILITY
2604const _Tp&
2605max(const _Tp& __a, const _Tp& __b)
2606{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002607 return _VSTD::max(__a, __b, __less<_Tp>());
Howard Hinnant98e5d972010-08-21 20:10:01 +00002608}
2609
Howard Hinnante3e32912011-08-12 21:56:02 +00002610#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2611
Howard Hinnant98e5d972010-08-21 20:10:01 +00002612template<class _Tp, class _Compare>
2613inline _LIBCPP_INLINE_VISIBILITY
2614_Tp
2615max(initializer_list<_Tp> __t, _Compare __comp)
2616{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002617 return *_VSTD::max_element(__t.begin(), __t.end(), __comp);
Howard Hinnant98e5d972010-08-21 20:10:01 +00002618}
2619
2620template<class _Tp>
2621inline _LIBCPP_INLINE_VISIBILITY
2622_Tp
2623max(initializer_list<_Tp> __t)
2624{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002625 return *_VSTD::max_element(__t.begin(), __t.end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002626}
2627
Howard Hinnante3e32912011-08-12 21:56:02 +00002628#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2629
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002630// minmax_element
2631
2632template <class _ForwardIterator, class _Compare>
2633std::pair<_ForwardIterator, _ForwardIterator>
2634minmax_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
2635{
2636 std::pair<_ForwardIterator, _ForwardIterator> __result(__first, __first);
2637 if (__first != __last)
2638 {
2639 if (++__first != __last)
2640 {
2641 if (__comp(*__first, *__result.first))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002642 __result.first = __first;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002643 else
2644 __result.second = __first;
2645 while (++__first != __last)
2646 {
2647 _ForwardIterator __i = __first;
2648 if (++__first == __last)
2649 {
2650 if (__comp(*__i, *__result.first))
2651 __result.first = __i;
2652 else if (!__comp(*__i, *__result.second))
2653 __result.second = __i;
2654 break;
2655 }
2656 else
2657 {
2658 if (__comp(*__first, *__i))
2659 {
2660 if (__comp(*__first, *__result.first))
2661 __result.first = __first;
2662 if (!__comp(*__i, *__result.second))
2663 __result.second = __i;
2664 }
2665 else
2666 {
2667 if (__comp(*__i, *__result.first))
2668 __result.first = __i;
2669 if (!__comp(*__first, *__result.second))
2670 __result.second = __first;
2671 }
2672 }
2673 }
2674 }
2675 }
2676 return __result;
2677}
2678
2679template <class _ForwardIterator>
2680inline _LIBCPP_INLINE_VISIBILITY
2681std::pair<_ForwardIterator, _ForwardIterator>
2682minmax_element(_ForwardIterator __first, _ForwardIterator __last)
2683{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002684 return _VSTD::minmax_element(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002685}
2686
Howard Hinnant98e5d972010-08-21 20:10:01 +00002687// minmax
2688
2689template<class _Tp, class _Compare>
2690inline _LIBCPP_INLINE_VISIBILITY
2691pair<const _Tp&, const _Tp&>
2692minmax(const _Tp& __a, const _Tp& __b, _Compare __comp)
2693{
2694 return __comp(__b, __a) ? pair<const _Tp&, const _Tp&>(__b, __a) :
2695 pair<const _Tp&, const _Tp&>(__a, __b);
2696}
2697
2698template<class _Tp>
2699inline _LIBCPP_INLINE_VISIBILITY
2700pair<const _Tp&, const _Tp&>
2701minmax(const _Tp& __a, const _Tp& __b)
2702{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002703 return _VSTD::minmax(__a, __b, __less<_Tp>());
Howard Hinnant98e5d972010-08-21 20:10:01 +00002704}
2705
Howard Hinnante3e32912011-08-12 21:56:02 +00002706#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2707
Howard Hinnant98e5d972010-08-21 20:10:01 +00002708template<class _Tp>
2709inline _LIBCPP_INLINE_VISIBILITY
2710pair<_Tp, _Tp>
2711minmax(initializer_list<_Tp> __t)
2712{
2713 pair<const _Tp*, const _Tp*> __p =
Howard Hinnant0949eed2011-06-30 21:18:19 +00002714 _VSTD::minmax_element(__t.begin(), __t.end());
Howard Hinnant98e5d972010-08-21 20:10:01 +00002715 return pair<_Tp, _Tp>(*__p.first, *__p.second);
2716}
2717
2718template<class _Tp, class _Compare>
2719inline _LIBCPP_INLINE_VISIBILITY
2720pair<_Tp, _Tp>
2721minmax(initializer_list<_Tp> __t, _Compare __comp)
2722{
2723 pair<const _Tp*, const _Tp*> __p =
Howard Hinnant0949eed2011-06-30 21:18:19 +00002724 _VSTD::minmax_element(__t.begin(), __t.end(), __comp);
Howard Hinnant98e5d972010-08-21 20:10:01 +00002725 return pair<_Tp, _Tp>(*__p.first, *__p.second);
2726}
2727
Howard Hinnante3e32912011-08-12 21:56:02 +00002728#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2729
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002730// random_shuffle
2731
Howard Hinnantc3267212010-05-26 17:49:34 +00002732// __independent_bits_engine
2733
Howard Hinnant99968442011-11-29 18:15:50 +00002734template <unsigned long long _Xp, size_t _Rp>
Howard Hinnantc3267212010-05-26 17:49:34 +00002735struct __log2_imp
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002736{
Howard Hinnant99968442011-11-29 18:15:50 +00002737 static const size_t value = _Xp & ((unsigned long long)(1) << _Rp) ? _Rp
2738 : __log2_imp<_Xp, _Rp - 1>::value;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002739};
2740
Howard Hinnant99968442011-11-29 18:15:50 +00002741template <unsigned long long _Xp>
2742struct __log2_imp<_Xp, 0>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002743{
Howard Hinnantc3267212010-05-26 17:49:34 +00002744 static const size_t value = 0;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002745};
2746
Howard Hinnant99968442011-11-29 18:15:50 +00002747template <size_t _Rp>
2748struct __log2_imp<0, _Rp>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002749{
Howard Hinnant99968442011-11-29 18:15:50 +00002750 static const size_t value = _Rp + 1;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002751};
2752
Howard Hinnant99968442011-11-29 18:15:50 +00002753template <class _UI, _UI _Xp>
Howard Hinnantc3267212010-05-26 17:49:34 +00002754struct __log2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002755{
Howard Hinnant99968442011-11-29 18:15:50 +00002756 static const size_t value = __log2_imp<_Xp,
Howard Hinnantc3267212010-05-26 17:49:34 +00002757 sizeof(_UI) * __CHAR_BIT__ - 1>::value;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002758};
2759
Howard Hinnantc3267212010-05-26 17:49:34 +00002760template<class _Engine, class _UIntType>
2761class __independent_bits_engine
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002762{
Howard Hinnantc3267212010-05-26 17:49:34 +00002763public:
2764 // types
2765 typedef _UIntType result_type;
2766
2767private:
2768 typedef typename _Engine::result_type _Engine_result_type;
2769 typedef typename conditional
2770 <
2771 sizeof(_Engine_result_type) <= sizeof(result_type),
2772 result_type,
2773 _Engine_result_type
2774 >::type _Working_result_type;
2775
2776 _Engine& __e_;
2777 size_t __w_;
2778 size_t __w0_;
2779 size_t __n_;
2780 size_t __n0_;
2781 _Working_result_type __y0_;
2782 _Working_result_type __y1_;
2783 _Engine_result_type __mask0_;
2784 _Engine_result_type __mask1_;
2785
Howard Hinnant8efd3da2012-04-02 21:00:45 +00002786#ifdef _LIBCPP_HAS_NO_CONSTEXPR
Howard Hinnant99968442011-11-29 18:15:50 +00002787 static const _Working_result_type _Rp = _Engine::_Max - _Engine::_Min
Howard Hinnant8efd3da2012-04-02 21:00:45 +00002788 + _Working_result_type(1);
2789#else
2790 static _LIBCPP_CONSTEXPR const _Working_result_type _Rp = _Engine::max() - _Engine::min()
2791 + _Working_result_type(1);
2792#endif
2793 static _LIBCPP_CONSTEXPR const size_t __m = __log2<_Working_result_type, _Rp>::value;
2794 static _LIBCPP_CONSTEXPR const size_t _WDt = numeric_limits<_Working_result_type>::digits;
2795 static _LIBCPP_CONSTEXPR const size_t _EDt = numeric_limits<_Engine_result_type>::digits;
Howard Hinnantc3267212010-05-26 17:49:34 +00002796
2797public:
2798 // constructors and seeding functions
2799 __independent_bits_engine(_Engine& __e, size_t __w);
2800
2801 // generating functions
Howard Hinnant99968442011-11-29 18:15:50 +00002802 result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>());}
Howard Hinnantc3267212010-05-26 17:49:34 +00002803
2804private:
2805 result_type __eval(false_type);
2806 result_type __eval(true_type);
2807};
2808
2809template<class _Engine, class _UIntType>
2810__independent_bits_engine<_Engine, _UIntType>
2811 ::__independent_bits_engine(_Engine& __e, size_t __w)
2812 : __e_(__e),
2813 __w_(__w)
2814{
2815 __n_ = __w_ / __m + (__w_ % __m != 0);
2816 __w0_ = __w_ / __n_;
Howard Hinnant99968442011-11-29 18:15:50 +00002817 if (_Rp == 0)
2818 __y0_ = _Rp;
Howard Hinnantc3267212010-05-26 17:49:34 +00002819 else if (__w0_ < _WDt)
Howard Hinnant99968442011-11-29 18:15:50 +00002820 __y0_ = (_Rp >> __w0_) << __w0_;
Howard Hinnantc3267212010-05-26 17:49:34 +00002821 else
2822 __y0_ = 0;
Howard Hinnant99968442011-11-29 18:15:50 +00002823 if (_Rp - __y0_ > __y0_ / __n_)
Howard Hinnantc3267212010-05-26 17:49:34 +00002824 {
2825 ++__n_;
2826 __w0_ = __w_ / __n_;
2827 if (__w0_ < _WDt)
Howard Hinnant99968442011-11-29 18:15:50 +00002828 __y0_ = (_Rp >> __w0_) << __w0_;
Howard Hinnantc3267212010-05-26 17:49:34 +00002829 else
2830 __y0_ = 0;
2831 }
2832 __n0_ = __n_ - __w_ % __n_;
2833 if (__w0_ < _WDt - 1)
Howard Hinnant99968442011-11-29 18:15:50 +00002834 __y1_ = (_Rp >> (__w0_ + 1)) << (__w0_ + 1);
Howard Hinnantc3267212010-05-26 17:49:34 +00002835 else
2836 __y1_ = 0;
2837 __mask0_ = __w0_ > 0 ? _Engine_result_type(~0) >> (_EDt - __w0_) :
2838 _Engine_result_type(0);
2839 __mask1_ = __w0_ < _EDt - 1 ?
2840 _Engine_result_type(~0) >> (_EDt - (__w0_ + 1)) :
2841 _Engine_result_type(~0);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002842}
2843
Howard Hinnantc3267212010-05-26 17:49:34 +00002844template<class _Engine, class _UIntType>
2845inline
2846_UIntType
2847__independent_bits_engine<_Engine, _UIntType>::__eval(false_type)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002848{
Howard Hinnantc3267212010-05-26 17:49:34 +00002849 return static_cast<result_type>(__e_() & __mask0_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002850}
2851
Howard Hinnantc3267212010-05-26 17:49:34 +00002852template<class _Engine, class _UIntType>
2853_UIntType
2854__independent_bits_engine<_Engine, _UIntType>::__eval(true_type)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002855{
Howard Hinnant99968442011-11-29 18:15:50 +00002856 result_type _Sp = 0;
Howard Hinnantc3267212010-05-26 17:49:34 +00002857 for (size_t __k = 0; __k < __n0_; ++__k)
2858 {
2859 _Engine_result_type __u;
2860 do
2861 {
2862 __u = __e_() - _Engine::min();
2863 } while (__u >= __y0_);
Howard Hinnant8faa95f2011-10-27 16:12:10 +00002864 if (__w0_ < _WDt)
Howard Hinnant99968442011-11-29 18:15:50 +00002865 _Sp <<= __w0_;
Howard Hinnantc3267212010-05-26 17:49:34 +00002866 else
Howard Hinnant99968442011-11-29 18:15:50 +00002867 _Sp = 0;
2868 _Sp += __u & __mask0_;
Howard Hinnantc3267212010-05-26 17:49:34 +00002869 }
2870 for (size_t __k = __n0_; __k < __n_; ++__k)
2871 {
2872 _Engine_result_type __u;
2873 do
2874 {
2875 __u = __e_() - _Engine::min();
2876 } while (__u >= __y1_);
Howard Hinnant8faa95f2011-10-27 16:12:10 +00002877 if (__w0_ < _WDt - 1)
Howard Hinnant99968442011-11-29 18:15:50 +00002878 _Sp <<= __w0_ + 1;
Howard Hinnantc3267212010-05-26 17:49:34 +00002879 else
Howard Hinnant99968442011-11-29 18:15:50 +00002880 _Sp = 0;
2881 _Sp += __u & __mask1_;
Howard Hinnantc3267212010-05-26 17:49:34 +00002882 }
Howard Hinnant99968442011-11-29 18:15:50 +00002883 return _Sp;
Howard Hinnantc3267212010-05-26 17:49:34 +00002884}
2885
2886// uniform_int_distribution
2887
2888template<class _IntType = int>
2889class uniform_int_distribution
2890{
2891public:
2892 // types
2893 typedef _IntType result_type;
2894
2895 class param_type
2896 {
2897 result_type __a_;
2898 result_type __b_;
2899 public:
2900 typedef uniform_int_distribution distribution_type;
2901
2902 explicit param_type(result_type __a = 0,
2903 result_type __b = numeric_limits<result_type>::max())
2904 : __a_(__a), __b_(__b) {}
2905
2906 result_type a() const {return __a_;}
2907 result_type b() const {return __b_;}
2908
2909 friend bool operator==(const param_type& __x, const param_type& __y)
2910 {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;}
2911 friend bool operator!=(const param_type& __x, const param_type& __y)
2912 {return !(__x == __y);}
2913 };
2914
2915private:
2916 param_type __p_;
2917
2918public:
2919 // constructors and reset functions
2920 explicit uniform_int_distribution(result_type __a = 0,
2921 result_type __b = numeric_limits<result_type>::max())
2922 : __p_(param_type(__a, __b)) {}
2923 explicit uniform_int_distribution(const param_type& __p) : __p_(__p) {}
2924 void reset() {}
2925
2926 // generating functions
2927 template<class _URNG> result_type operator()(_URNG& __g)
2928 {return (*this)(__g, __p_);}
2929 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
2930
2931 // property functions
2932 result_type a() const {return __p_.a();}
2933 result_type b() const {return __p_.b();}
2934
2935 param_type param() const {return __p_;}
2936 void param(const param_type& __p) {__p_ = __p;}
2937
2938 result_type min() const {return a();}
2939 result_type max() const {return b();}
2940
2941 friend bool operator==(const uniform_int_distribution& __x,
2942 const uniform_int_distribution& __y)
2943 {return __x.__p_ == __y.__p_;}
2944 friend bool operator!=(const uniform_int_distribution& __x,
2945 const uniform_int_distribution& __y)
2946 {return !(__x == __y);}
2947};
2948
2949template<class _IntType>
2950template<class _URNG>
2951typename uniform_int_distribution<_IntType>::result_type
2952uniform_int_distribution<_IntType>::operator()(_URNG& __g, const param_type& __p)
2953{
2954 typedef typename conditional<sizeof(result_type) <= sizeof(uint32_t),
2955 uint32_t, uint64_t>::type _UIntType;
Howard Hinnant99968442011-11-29 18:15:50 +00002956 const _UIntType _Rp = __p.b() - __p.a() + _UIntType(1);
2957 if (_Rp == 1)
Howard Hinnantc3267212010-05-26 17:49:34 +00002958 return __p.a();
2959 const size_t _Dt = numeric_limits<_UIntType>::digits;
2960 typedef __independent_bits_engine<_URNG, _UIntType> _Eng;
Howard Hinnant99968442011-11-29 18:15:50 +00002961 if (_Rp == 0)
Howard Hinnantc3267212010-05-26 17:49:34 +00002962 return static_cast<result_type>(_Eng(__g, _Dt)());
Howard Hinnant99968442011-11-29 18:15:50 +00002963 size_t __w = _Dt - __clz(_Rp) - 1;
2964 if ((_Rp & (_UIntType(~0) >> (_Dt - __w))) != 0)
Howard Hinnantc3267212010-05-26 17:49:34 +00002965 ++__w;
2966 _Eng __e(__g, __w);
2967 _UIntType __u;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002968 do
Howard Hinnantc3267212010-05-26 17:49:34 +00002969 {
2970 __u = __e();
Howard Hinnant99968442011-11-29 18:15:50 +00002971 } while (__u >= _Rp);
Howard Hinnantc3267212010-05-26 17:49:34 +00002972 return static_cast<result_type>(__u + __p.a());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002973}
2974
Howard Hinnant0f678bd2013-08-12 18:38:34 +00002975class _LIBCPP_TYPE_VIS __rs_default;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002976
Howard Hinnant0f678bd2013-08-12 18:38:34 +00002977_LIBCPP_FUNC_VIS __rs_default __rs_get();
Howard Hinnantc3267212010-05-26 17:49:34 +00002978
Howard Hinnant0f678bd2013-08-12 18:38:34 +00002979class _LIBCPP_TYPE_VIS __rs_default
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002980{
Howard Hinnantc3267212010-05-26 17:49:34 +00002981 static unsigned __c_;
2982
2983 __rs_default();
2984public:
Marshall Clow5920cfc2013-02-07 22:12:02 +00002985 typedef uint_fast32_t result_type;
Howard Hinnantc3267212010-05-26 17:49:34 +00002986
2987 static const result_type _Min = 0;
2988 static const result_type _Max = 0xFFFFFFFF;
2989
2990 __rs_default(const __rs_default&);
2991 ~__rs_default();
2992
2993 result_type operator()();
2994
Howard Hinnant27b4fd32012-04-02 00:40:41 +00002995 static _LIBCPP_CONSTEXPR result_type min() {return _Min;}
2996 static _LIBCPP_CONSTEXPR result_type max() {return _Max;}
Howard Hinnantc3267212010-05-26 17:49:34 +00002997
Howard Hinnant0f678bd2013-08-12 18:38:34 +00002998 friend _LIBCPP_FUNC_VIS __rs_default __rs_get();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002999};
3000
Howard Hinnant0f678bd2013-08-12 18:38:34 +00003001_LIBCPP_FUNC_VIS __rs_default __rs_get();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003002
3003template <class _RandomAccessIterator>
3004void
3005random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
3006{
3007 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnant99968442011-11-29 18:15:50 +00003008 typedef uniform_int_distribution<ptrdiff_t> _Dp;
3009 typedef typename _Dp::param_type _Pp;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003010 difference_type __d = __last - __first;
3011 if (__d > 1)
3012 {
Howard Hinnant99968442011-11-29 18:15:50 +00003013 _Dp __uid;
Howard Hinnantc3267212010-05-26 17:49:34 +00003014 __rs_default __g = __rs_get();
3015 for (--__last, --__d; __first < __last; ++__first, --__d)
Howard Hinnant4e599482010-10-22 15:26:39 +00003016 {
Howard Hinnant99968442011-11-29 18:15:50 +00003017 difference_type __i = __uid(__g, _Pp(0, __d));
Howard Hinnant4e599482010-10-22 15:26:39 +00003018 if (__i != difference_type(0))
3019 swap(*__first, *(__first + __i));
3020 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003021 }
3022}
3023
3024template <class _RandomAccessIterator, class _RandomNumberGenerator>
3025void
3026random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
Howard Hinnant73d21a42010-09-04 23:28:19 +00003027#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003028 _RandomNumberGenerator&& __rand)
3029#else
3030 _RandomNumberGenerator& __rand)
3031#endif
3032{
3033 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
3034 difference_type __d = __last - __first;
3035 if (__d > 1)
3036 {
3037 for (--__last; __first < __last; ++__first, --__d)
Howard Hinnant4e599482010-10-22 15:26:39 +00003038 {
3039 difference_type __i = __rand(__d);
3040 swap(*__first, *(__first + __i));
3041 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003042 }
3043}
3044
Howard Hinnantc3267212010-05-26 17:49:34 +00003045template<class _RandomAccessIterator, class _UniformRandomNumberGenerator>
3046 void shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
Howard Hinnant278bf2d2010-11-18 01:47:02 +00003047#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
3048 _UniformRandomNumberGenerator&& __g)
3049#else
Howard Hinnantc3267212010-05-26 17:49:34 +00003050 _UniformRandomNumberGenerator& __g)
Howard Hinnant278bf2d2010-11-18 01:47:02 +00003051#endif
Howard Hinnantc3267212010-05-26 17:49:34 +00003052{
3053 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnant99968442011-11-29 18:15:50 +00003054 typedef uniform_int_distribution<ptrdiff_t> _Dp;
3055 typedef typename _Dp::param_type _Pp;
Howard Hinnantc3267212010-05-26 17:49:34 +00003056 difference_type __d = __last - __first;
3057 if (__d > 1)
3058 {
Howard Hinnant99968442011-11-29 18:15:50 +00003059 _Dp __uid;
Howard Hinnantc3267212010-05-26 17:49:34 +00003060 for (--__last, --__d; __first < __last; ++__first, --__d)
Howard Hinnant4e599482010-10-22 15:26:39 +00003061 {
Howard Hinnant99968442011-11-29 18:15:50 +00003062 difference_type __i = __uid(__g, _Pp(0, __d));
Howard Hinnant4e599482010-10-22 15:26:39 +00003063 if (__i != difference_type(0))
3064 swap(*__first, *(__first + __i));
3065 }
Howard Hinnantc3267212010-05-26 17:49:34 +00003066 }
3067}
3068
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003069template <class _InputIterator, class _Predicate>
3070bool
3071is_partitioned(_InputIterator __first, _InputIterator __last, _Predicate __pred)
3072{
3073 for (; __first != __last; ++__first)
3074 if (!__pred(*__first))
3075 break;
3076 for (; __first != __last; ++__first)
3077 if (__pred(*__first))
3078 return false;
3079 return true;
3080}
3081
3082// partition
3083
3084template <class _Predicate, class _ForwardIterator>
3085_ForwardIterator
3086__partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, forward_iterator_tag)
3087{
3088 while (true)
3089 {
3090 if (__first == __last)
3091 return __first;
3092 if (!__pred(*__first))
3093 break;
3094 ++__first;
3095 }
3096 for (_ForwardIterator __p = __first; ++__p != __last;)
3097 {
3098 if (__pred(*__p))
3099 {
3100 swap(*__first, *__p);
3101 ++__first;
3102 }
3103 }
3104 return __first;
3105}
3106
3107template <class _Predicate, class _BidirectionalIterator>
3108_BidirectionalIterator
3109__partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3110 bidirectional_iterator_tag)
3111{
3112 while (true)
3113 {
3114 while (true)
3115 {
3116 if (__first == __last)
3117 return __first;
3118 if (!__pred(*__first))
3119 break;
3120 ++__first;
3121 }
3122 do
3123 {
3124 if (__first == --__last)
3125 return __first;
3126 } while (!__pred(*__last));
3127 swap(*__first, *__last);
3128 ++__first;
3129 }
3130}
3131
3132template <class _ForwardIterator, class _Predicate>
3133inline _LIBCPP_INLINE_VISIBILITY
3134_ForwardIterator
3135partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
3136{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003137 return _VSTD::__partition<typename add_lvalue_reference<_Predicate>::type>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003138 (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
3139}
3140
3141// partition_copy
3142
3143template <class _InputIterator, class _OutputIterator1,
3144 class _OutputIterator2, class _Predicate>
3145pair<_OutputIterator1, _OutputIterator2>
3146partition_copy(_InputIterator __first, _InputIterator __last,
3147 _OutputIterator1 __out_true, _OutputIterator2 __out_false,
3148 _Predicate __pred)
3149{
3150 for (; __first != __last; ++__first)
3151 {
3152 if (__pred(*__first))
3153 {
3154 *__out_true = *__first;
3155 ++__out_true;
3156 }
3157 else
3158 {
3159 *__out_false = *__first;
3160 ++__out_false;
3161 }
3162 }
3163 return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false);
3164}
3165
3166// partition_point
3167
3168template<class _ForwardIterator, class _Predicate>
3169_ForwardIterator
3170partition_point(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
3171{
3172 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003173 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003174 while (__len != 0)
3175 {
3176 difference_type __l2 = __len / 2;
3177 _ForwardIterator __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003178 _VSTD::advance(__m, __l2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003179 if (__pred(*__m))
3180 {
3181 __first = ++__m;
3182 __len -= __l2 + 1;
3183 }
3184 else
3185 __len = __l2;
3186 }
3187 return __first;
3188}
3189
3190// stable_partition
3191
3192template <class _Predicate, class _ForwardIterator, class _Distance, class _Pair>
3193_ForwardIterator
3194__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
3195 _Distance __len, _Pair __p, forward_iterator_tag __fit)
3196{
3197 // *__first is known to be false
3198 // __len >= 1
3199 if (__len == 1)
3200 return __first;
3201 if (__len == 2)
3202 {
3203 _ForwardIterator __m = __first;
3204 if (__pred(*++__m))
3205 {
3206 swap(*__first, *__m);
3207 return __m;
3208 }
3209 return __first;
3210 }
3211 if (__len <= __p.second)
3212 { // The buffer is big enough to use
3213 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
3214 __destruct_n __d(0);
3215 unique_ptr<value_type, __destruct_n&> __h(__p.first, __d);
3216 // Move the falses into the temporary buffer, and the trues to the front of the line
3217 // Update __first to always point to the end of the trues
3218 value_type* __t = __p.first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003219 ::new(__t) value_type(_VSTD::move(*__first));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003220 __d.__incr((value_type*)0);
3221 ++__t;
3222 _ForwardIterator __i = __first;
3223 while (++__i != __last)
3224 {
3225 if (__pred(*__i))
3226 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003227 *__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003228 ++__first;
3229 }
3230 else
3231 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003232 ::new(__t) value_type(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003233 __d.__incr((value_type*)0);
3234 ++__t;
3235 }
3236 }
3237 // All trues now at start of range, all falses in buffer
3238 // Move falses back into range, but don't mess up __first which points to first false
3239 __i = __first;
3240 for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i)
Howard Hinnant0949eed2011-06-30 21:18:19 +00003241 *__i = _VSTD::move(*__t2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003242 // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer
3243 return __first;
3244 }
3245 // Else not enough buffer, do in place
3246 // __len >= 3
3247 _ForwardIterator __m = __first;
3248 _Distance __len2 = __len / 2; // __len2 >= 2
Howard Hinnant0949eed2011-06-30 21:18:19 +00003249 _VSTD::advance(__m, __len2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003250 // recurse on [__first, __m), *__first know to be false
3251 // F?????????????????
3252 // f m l
3253 typedef typename add_lvalue_reference<_Predicate>::type _PredRef;
3254 _ForwardIterator __first_false = __stable_partition<_PredRef>(__first, __m, __pred, __len2, __p, __fit);
3255 // TTTFFFFF??????????
3256 // f ff m l
3257 // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true
3258 _ForwardIterator __m1 = __m;
3259 _ForwardIterator __second_false = __last;
3260 _Distance __len_half = __len - __len2;
3261 while (__pred(*__m1))
3262 {
3263 if (++__m1 == __last)
3264 goto __second_half_done;
3265 --__len_half;
3266 }
3267 // TTTFFFFFTTTF??????
3268 // f ff m m1 l
3269 __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __fit);
3270__second_half_done:
3271 // TTTFFFFFTTTTTFFFFF
3272 // f ff m sf l
Howard Hinnant0949eed2011-06-30 21:18:19 +00003273 return _VSTD::rotate(__first_false, __m, __second_false);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003274 // TTTTTTTTFFFFFFFFFF
3275 // |
3276}
3277
3278struct __return_temporary_buffer
3279{
3280 template <class _Tp>
Howard Hinnant0949eed2011-06-30 21:18:19 +00003281 _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) const {_VSTD::return_temporary_buffer(__p);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003282};
3283
3284template <class _Predicate, class _ForwardIterator>
3285_ForwardIterator
3286__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
3287 forward_iterator_tag)
3288{
3289 const unsigned __alloc_limit = 3; // might want to make this a function of trivial assignment
3290 // Either prove all true and return __first or point to first false
3291 while (true)
3292 {
3293 if (__first == __last)
3294 return __first;
3295 if (!__pred(*__first))
3296 break;
3297 ++__first;
3298 }
3299 // We now have a reduced range [__first, __last)
3300 // *__first is known to be false
3301 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
3302 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003303 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003304 pair<value_type*, ptrdiff_t> __p(0, 0);
3305 unique_ptr<value_type, __return_temporary_buffer> __h;
3306 if (__len >= __alloc_limit)
3307 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003308 __p = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003309 __h.reset(__p.first);
3310 }
3311 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
3312 (__first, __last, __pred, __len, __p, forward_iterator_tag());
3313}
3314
3315template <class _Predicate, class _BidirectionalIterator, class _Distance, class _Pair>
3316_BidirectionalIterator
3317__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3318 _Distance __len, _Pair __p, bidirectional_iterator_tag __bit)
3319{
3320 // *__first is known to be false
3321 // *__last is known to be true
3322 // __len >= 2
3323 if (__len == 2)
3324 {
3325 swap(*__first, *__last);
3326 return __last;
3327 }
3328 if (__len == 3)
3329 {
3330 _BidirectionalIterator __m = __first;
3331 if (__pred(*++__m))
3332 {
3333 swap(*__first, *__m);
3334 swap(*__m, *__last);
3335 return __last;
3336 }
3337 swap(*__m, *__last);
3338 swap(*__first, *__m);
3339 return __m;
3340 }
3341 if (__len <= __p.second)
3342 { // The buffer is big enough to use
3343 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3344 __destruct_n __d(0);
3345 unique_ptr<value_type, __destruct_n&> __h(__p.first, __d);
3346 // Move the falses into the temporary buffer, and the trues to the front of the line
3347 // Update __first to always point to the end of the trues
3348 value_type* __t = __p.first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003349 ::new(__t) value_type(_VSTD::move(*__first));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003350 __d.__incr((value_type*)0);
3351 ++__t;
3352 _BidirectionalIterator __i = __first;
3353 while (++__i != __last)
3354 {
3355 if (__pred(*__i))
3356 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003357 *__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003358 ++__first;
3359 }
3360 else
3361 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003362 ::new(__t) value_type(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003363 __d.__incr((value_type*)0);
3364 ++__t;
3365 }
3366 }
3367 // move *__last, known to be true
Howard Hinnant0949eed2011-06-30 21:18:19 +00003368 *__first = _VSTD::move(*__i);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003369 __i = ++__first;
3370 // All trues now at start of range, all falses in buffer
3371 // Move falses back into range, but don't mess up __first which points to first false
3372 for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i)
Howard Hinnant0949eed2011-06-30 21:18:19 +00003373 *__i = _VSTD::move(*__t2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003374 // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer
3375 return __first;
3376 }
3377 // Else not enough buffer, do in place
3378 // __len >= 4
3379 _BidirectionalIterator __m = __first;
3380 _Distance __len2 = __len / 2; // __len2 >= 2
Howard Hinnant0949eed2011-06-30 21:18:19 +00003381 _VSTD::advance(__m, __len2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003382 // recurse on [__first, __m-1], except reduce __m-1 until *(__m-1) is true, *__first know to be false
3383 // F????????????????T
3384 // f m l
3385 _BidirectionalIterator __m1 = __m;
3386 _BidirectionalIterator __first_false = __first;
3387 _Distance __len_half = __len2;
3388 while (!__pred(*--__m1))
3389 {
3390 if (__m1 == __first)
3391 goto __first_half_done;
3392 --__len_half;
3393 }
3394 // F???TFFF?????????T
3395 // f m1 m l
3396 typedef typename add_lvalue_reference<_Predicate>::type _PredRef;
3397 __first_false = __stable_partition<_PredRef>(__first, __m1, __pred, __len_half, __p, __bit);
3398__first_half_done:
3399 // TTTFFFFF?????????T
3400 // f ff m l
3401 // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true
3402 __m1 = __m;
3403 _BidirectionalIterator __second_false = __last;
3404 ++__second_false;
3405 __len_half = __len - __len2;
3406 while (__pred(*__m1))
3407 {
3408 if (++__m1 == __last)
3409 goto __second_half_done;
3410 --__len_half;
3411 }
3412 // TTTFFFFFTTTF?????T
3413 // f ff m m1 l
3414 __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __bit);
3415__second_half_done:
3416 // TTTFFFFFTTTTTFFFFF
3417 // f ff m sf l
Howard Hinnant0949eed2011-06-30 21:18:19 +00003418 return _VSTD::rotate(__first_false, __m, __second_false);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003419 // TTTTTTTTFFFFFFFFFF
3420 // |
3421}
3422
3423template <class _Predicate, class _BidirectionalIterator>
3424_BidirectionalIterator
3425__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3426 bidirectional_iterator_tag)
3427{
3428 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
3429 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3430 const difference_type __alloc_limit = 4; // might want to make this a function of trivial assignment
3431 // Either prove all true and return __first or point to first false
3432 while (true)
3433 {
3434 if (__first == __last)
3435 return __first;
3436 if (!__pred(*__first))
3437 break;
3438 ++__first;
3439 }
3440 // __first points to first false, everything prior to __first is already set.
3441 // Either prove [__first, __last) is all false and return __first, or point __last to last true
3442 do
3443 {
3444 if (__first == --__last)
3445 return __first;
3446 } while (!__pred(*__last));
3447 // We now have a reduced range [__first, __last]
3448 // *__first is known to be false
3449 // *__last is known to be true
3450 // __len >= 2
Howard Hinnant0949eed2011-06-30 21:18:19 +00003451 difference_type __len = _VSTD::distance(__first, __last) + 1;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003452 pair<value_type*, ptrdiff_t> __p(0, 0);
3453 unique_ptr<value_type, __return_temporary_buffer> __h;
3454 if (__len >= __alloc_limit)
3455 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003456 __p = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003457 __h.reset(__p.first);
3458 }
3459 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
3460 (__first, __last, __pred, __len, __p, bidirectional_iterator_tag());
3461}
3462
3463template <class _ForwardIterator, class _Predicate>
3464inline _LIBCPP_INLINE_VISIBILITY
3465_ForwardIterator
3466stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
3467{
3468 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
3469 (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
3470}
3471
3472// is_sorted_until
3473
3474template <class _ForwardIterator, class _Compare>
3475_ForwardIterator
3476is_sorted_until(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
3477{
3478 if (__first != __last)
3479 {
3480 _ForwardIterator __i = __first;
3481 while (++__i != __last)
3482 {
3483 if (__comp(*__i, *__first))
3484 return __i;
3485 __first = __i;
3486 }
3487 }
3488 return __last;
3489}
3490
Howard Hinnant324bb032010-08-22 00:02:43 +00003491template<class _ForwardIterator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003492inline _LIBCPP_INLINE_VISIBILITY
3493_ForwardIterator
3494is_sorted_until(_ForwardIterator __first, _ForwardIterator __last)
3495{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003496 return _VSTD::is_sorted_until(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003497}
3498
3499// is_sorted
3500
3501template <class _ForwardIterator, class _Compare>
3502inline _LIBCPP_INLINE_VISIBILITY
3503bool
3504is_sorted(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
3505{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003506 return _VSTD::is_sorted_until(__first, __last, __comp) == __last;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003507}
3508
Howard Hinnant324bb032010-08-22 00:02:43 +00003509template<class _ForwardIterator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003510inline _LIBCPP_INLINE_VISIBILITY
3511bool
3512is_sorted(_ForwardIterator __first, _ForwardIterator __last)
3513{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003514 return _VSTD::is_sorted(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003515}
3516
3517// sort
3518
3519// stable, 2-3 compares, 0-2 swaps
3520
3521template <class _Compare, class _ForwardIterator>
3522unsigned
3523__sort3(_ForwardIterator __x, _ForwardIterator __y, _ForwardIterator __z, _Compare __c)
3524{
3525 unsigned __r = 0;
3526 if (!__c(*__y, *__x)) // if x <= y
3527 {
3528 if (!__c(*__z, *__y)) // if y <= z
3529 return __r; // x <= y && y <= z
3530 // x <= y && y > z
3531 swap(*__y, *__z); // x <= z && y < z
3532 __r = 1;
3533 if (__c(*__y, *__x)) // if x > y
3534 {
3535 swap(*__x, *__y); // x < y && y <= z
3536 __r = 2;
3537 }
3538 return __r; // x <= y && y < z
3539 }
3540 if (__c(*__z, *__y)) // x > y, if y > z
3541 {
3542 swap(*__x, *__z); // x < y && y < z
3543 __r = 1;
3544 return __r;
3545 }
3546 swap(*__x, *__y); // x > y && y <= z
3547 __r = 1; // x < y && x <= z
3548 if (__c(*__z, *__y)) // if y > z
3549 {
3550 swap(*__y, *__z); // x <= y && y < z
3551 __r = 2;
3552 }
3553 return __r;
3554} // x <= y && y <= z
3555
3556// stable, 3-6 compares, 0-5 swaps
3557
3558template <class _Compare, class _ForwardIterator>
3559unsigned
3560__sort4(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3,
3561 _ForwardIterator __x4, _Compare __c)
3562{
3563 unsigned __r = __sort3<_Compare>(__x1, __x2, __x3, __c);
3564 if (__c(*__x4, *__x3))
3565 {
3566 swap(*__x3, *__x4);
3567 ++__r;
3568 if (__c(*__x3, *__x2))
3569 {
3570 swap(*__x2, *__x3);
3571 ++__r;
3572 if (__c(*__x2, *__x1))
3573 {
3574 swap(*__x1, *__x2);
3575 ++__r;
3576 }
3577 }
3578 }
3579 return __r;
3580}
3581
3582// stable, 4-10 compares, 0-9 swaps
3583
3584template <class _Compare, class _ForwardIterator>
3585unsigned
3586__sort5(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3,
3587 _ForwardIterator __x4, _ForwardIterator __x5, _Compare __c)
3588{
3589 unsigned __r = __sort4<_Compare>(__x1, __x2, __x3, __x4, __c);
3590 if (__c(*__x5, *__x4))
3591 {
3592 swap(*__x4, *__x5);
3593 ++__r;
3594 if (__c(*__x4, *__x3))
3595 {
3596 swap(*__x3, *__x4);
3597 ++__r;
3598 if (__c(*__x3, *__x2))
3599 {
3600 swap(*__x2, *__x3);
3601 ++__r;
3602 if (__c(*__x2, *__x1))
3603 {
3604 swap(*__x1, *__x2);
3605 ++__r;
3606 }
3607 }
3608 }
3609 }
3610 return __r;
3611}
3612
3613// Assumes size > 0
3614template <class _Compare, class _BirdirectionalIterator>
3615void
3616__selection_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp)
3617{
3618 _BirdirectionalIterator __lm1 = __last;
3619 for (--__lm1; __first != __lm1; ++__first)
3620 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003621 _BirdirectionalIterator __i = _VSTD::min_element<_BirdirectionalIterator,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003622 typename add_lvalue_reference<_Compare>::type>
3623 (__first, __last, __comp);
3624 if (__i != __first)
3625 swap(*__first, *__i);
3626 }
3627}
3628
3629template <class _Compare, class _BirdirectionalIterator>
3630void
3631__insertion_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp)
3632{
3633 typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type;
3634 if (__first != __last)
3635 {
3636 _BirdirectionalIterator __i = __first;
3637 for (++__i; __i != __last; ++__i)
3638 {
3639 _BirdirectionalIterator __j = __i;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003640 value_type __t(_VSTD::move(*__j));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003641 for (_BirdirectionalIterator __k = __i; __k != __first && __comp(__t, *--__k); --__j)
Howard Hinnant0949eed2011-06-30 21:18:19 +00003642 *__j = _VSTD::move(*__k);
3643 *__j = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003644 }
3645 }
3646}
3647
3648template <class _Compare, class _RandomAccessIterator>
3649void
3650__insertion_sort_3(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3651{
3652 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3653 _RandomAccessIterator __j = __first+2;
3654 __sort3<_Compare>(__first, __first+1, __j, __comp);
3655 for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
3656 {
3657 if (__comp(*__i, *__j))
3658 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003659 value_type __t(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003660 _RandomAccessIterator __k = __j;
3661 __j = __i;
3662 do
3663 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003664 *__j = _VSTD::move(*__k);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003665 __j = __k;
3666 } while (__j != __first && __comp(__t, *--__k));
Howard Hinnant0949eed2011-06-30 21:18:19 +00003667 *__j = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003668 }
3669 __j = __i;
3670 }
3671}
3672
3673template <class _Compare, class _RandomAccessIterator>
3674bool
3675__insertion_sort_incomplete(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3676{
3677 switch (__last - __first)
3678 {
3679 case 0:
3680 case 1:
3681 return true;
3682 case 2:
3683 if (__comp(*--__last, *__first))
3684 swap(*__first, *__last);
3685 return true;
3686 case 3:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003687 _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003688 return true;
3689 case 4:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003690 _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003691 return true;
3692 case 5:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003693 _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003694 return true;
3695 }
3696 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3697 _RandomAccessIterator __j = __first+2;
3698 __sort3<_Compare>(__first, __first+1, __j, __comp);
3699 const unsigned __limit = 8;
3700 unsigned __count = 0;
3701 for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
3702 {
3703 if (__comp(*__i, *__j))
3704 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003705 value_type __t(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003706 _RandomAccessIterator __k = __j;
3707 __j = __i;
3708 do
3709 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003710 *__j = _VSTD::move(*__k);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003711 __j = __k;
3712 } while (__j != __first && __comp(__t, *--__k));
Howard Hinnant0949eed2011-06-30 21:18:19 +00003713 *__j = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003714 if (++__count == __limit)
3715 return ++__i == __last;
3716 }
3717 __j = __i;
3718 }
3719 return true;
3720}
3721
3722template <class _Compare, class _BirdirectionalIterator>
3723void
3724__insertion_sort_move(_BirdirectionalIterator __first1, _BirdirectionalIterator __last1,
3725 typename iterator_traits<_BirdirectionalIterator>::value_type* __first2, _Compare __comp)
3726{
3727 typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type;
3728 if (__first1 != __last1)
3729 {
3730 __destruct_n __d(0);
3731 unique_ptr<value_type, __destruct_n&> __h(__first2, __d);
3732 value_type* __last2 = __first2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003733 ::new(__last2) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003734 __d.__incr((value_type*)0);
3735 for (++__last2; ++__first1 != __last1; ++__last2)
3736 {
3737 value_type* __j2 = __last2;
3738 value_type* __i2 = __j2;
3739 if (__comp(*__first1, *--__i2))
3740 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003741 ::new(__j2) value_type(_VSTD::move(*__i2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003742 __d.__incr((value_type*)0);
3743 for (--__j2; __i2 != __first2 && __comp(*__first1, *--__i2); --__j2)
Howard Hinnant0949eed2011-06-30 21:18:19 +00003744 *__j2 = _VSTD::move(*__i2);
3745 *__j2 = _VSTD::move(*__first1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003746 }
3747 else
3748 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003749 ::new(__j2) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003750 __d.__incr((value_type*)0);
3751 }
3752 }
3753 __h.release();
3754 }
3755}
3756
3757template <class _Compare, class _RandomAccessIterator>
3758void
3759__sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3760{
3761 // _Compare is known to be a reference type
3762 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
3763 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
Howard Hinnant1468b662010-11-19 22:17:28 +00003764 const difference_type __limit = is_trivially_copy_constructible<value_type>::value &&
3765 is_trivially_copy_assignable<value_type>::value ? 30 : 6;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003766 while (true)
3767 {
3768 __restart:
3769 difference_type __len = __last - __first;
3770 switch (__len)
3771 {
3772 case 0:
3773 case 1:
3774 return;
3775 case 2:
3776 if (__comp(*--__last, *__first))
3777 swap(*__first, *__last);
3778 return;
3779 case 3:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003780 _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003781 return;
3782 case 4:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003783 _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003784 return;
3785 case 5:
Howard Hinnant0949eed2011-06-30 21:18:19 +00003786 _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003787 return;
3788 }
3789 if (__len <= __limit)
3790 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003791 _VSTD::__insertion_sort_3<_Compare>(__first, __last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003792 return;
3793 }
3794 // __len > 5
3795 _RandomAccessIterator __m = __first;
3796 _RandomAccessIterator __lm1 = __last;
3797 --__lm1;
3798 unsigned __n_swaps;
3799 {
3800 difference_type __delta;
3801 if (__len >= 1000)
3802 {
3803 __delta = __len/2;
3804 __m += __delta;
3805 __delta /= 2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003806 __n_swaps = _VSTD::__sort5<_Compare>(__first, __first + __delta, __m, __m+__delta, __lm1, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003807 }
3808 else
3809 {
3810 __delta = __len/2;
3811 __m += __delta;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003812 __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, __lm1, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003813 }
3814 }
3815 // *__m is median
3816 // partition [__first, __m) < *__m and *__m <= [__m, __last)
3817 // (this inhibits tossing elements equivalent to __m around unnecessarily)
3818 _RandomAccessIterator __i = __first;
3819 _RandomAccessIterator __j = __lm1;
3820 // j points beyond range to be tested, *__m is known to be <= *__lm1
3821 // The search going up is known to be guarded but the search coming down isn't.
3822 // Prime the downward search with a guard.
3823 if (!__comp(*__i, *__m)) // if *__first == *__m
3824 {
3825 // *__first == *__m, *__first doesn't go in first part
3826 // manually guard downward moving __j against __i
3827 while (true)
3828 {
3829 if (__i == --__j)
3830 {
3831 // *__first == *__m, *__m <= all other elements
3832 // Parition instead into [__first, __i) == *__first and *__first < [__i, __last)
3833 ++__i; // __first + 1
3834 __j = __last;
3835 if (!__comp(*__first, *--__j)) // we need a guard if *__first == *(__last-1)
3836 {
3837 while (true)
3838 {
3839 if (__i == __j)
3840 return; // [__first, __last) all equivalent elements
3841 if (__comp(*__first, *__i))
3842 {
3843 swap(*__i, *__j);
3844 ++__n_swaps;
3845 ++__i;
3846 break;
3847 }
3848 ++__i;
3849 }
3850 }
3851 // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1
3852 if (__i == __j)
3853 return;
3854 while (true)
3855 {
3856 while (!__comp(*__first, *__i))
3857 ++__i;
3858 while (__comp(*__first, *--__j))
3859 ;
3860 if (__i >= __j)
3861 break;
3862 swap(*__i, *__j);
3863 ++__n_swaps;
3864 ++__i;
3865 }
3866 // [__first, __i) == *__first and *__first < [__i, __last)
3867 // The first part is sorted, sort the secod part
Howard Hinnant0949eed2011-06-30 21:18:19 +00003868 // _VSTD::__sort<_Compare>(__i, __last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003869 __first = __i;
3870 goto __restart;
3871 }
3872 if (__comp(*__j, *__m))
3873 {
3874 swap(*__i, *__j);
3875 ++__n_swaps;
3876 break; // found guard for downward moving __j, now use unguarded partition
3877 }
3878 }
3879 }
3880 // It is known that *__i < *__m
3881 ++__i;
3882 // j points beyond range to be tested, *__m is known to be <= *__lm1
3883 // if not yet partitioned...
3884 if (__i < __j)
3885 {
3886 // known that *(__i - 1) < *__m
3887 // known that __i <= __m
3888 while (true)
3889 {
3890 // __m still guards upward moving __i
3891 while (__comp(*__i, *__m))
3892 ++__i;
3893 // It is now known that a guard exists for downward moving __j
3894 while (!__comp(*--__j, *__m))
3895 ;
3896 if (__i > __j)
3897 break;
3898 swap(*__i, *__j);
3899 ++__n_swaps;
3900 // It is known that __m != __j
3901 // If __m just moved, follow it
3902 if (__m == __i)
3903 __m = __j;
3904 ++__i;
3905 }
3906 }
3907 // [__first, __i) < *__m and *__m <= [__i, __last)
3908 if (__i != __m && __comp(*__m, *__i))
3909 {
3910 swap(*__i, *__m);
3911 ++__n_swaps;
3912 }
3913 // [__first, __i) < *__i and *__i <= [__i+1, __last)
3914 // If we were given a perfect partition, see if insertion sort is quick...
3915 if (__n_swaps == 0)
3916 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003917 bool __fs = _VSTD::__insertion_sort_incomplete<_Compare>(__first, __i, __comp);
3918 if (_VSTD::__insertion_sort_incomplete<_Compare>(__i+1, __last, __comp))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003919 {
3920 if (__fs)
3921 return;
3922 __last = __i;
3923 continue;
3924 }
3925 else
3926 {
3927 if (__fs)
3928 {
3929 __first = ++__i;
3930 continue;
3931 }
3932 }
3933 }
3934 // sort smaller range with recursive call and larger with tail recursion elimination
3935 if (__i - __first < __last - __i)
3936 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003937 _VSTD::__sort<_Compare>(__first, __i, __comp);
3938 // _VSTD::__sort<_Compare>(__i+1, __last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003939 __first = ++__i;
3940 }
3941 else
3942 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003943 _VSTD::__sort<_Compare>(__i+1, __last, __comp);
3944 // _VSTD::__sort<_Compare>(__first, __i, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003945 __last = __i;
3946 }
3947 }
3948}
3949
3950// This forwarder keeps the top call and the recursive calls using the same instantiation, forcing a reference _Compare
3951template <class _RandomAccessIterator, class _Compare>
3952inline _LIBCPP_INLINE_VISIBILITY
3953void
3954sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3955{
Howard Hinnant5e571422013-08-23 20:10:18 +00003956#ifdef _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003957 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3958 __debug_less<_Compare> __c(__comp);
3959 __sort<_Comp_ref>(__first, __last, __c);
Howard Hinnant5e571422013-08-23 20:10:18 +00003960#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003961 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3962 __sort<_Comp_ref>(__first, __last, __comp);
Howard Hinnant5e571422013-08-23 20:10:18 +00003963#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003964}
3965
3966template <class _RandomAccessIterator>
3967inline _LIBCPP_INLINE_VISIBILITY
3968void
3969sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
3970{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003971 _VSTD::sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003972}
3973
3974template <class _Tp>
3975inline _LIBCPP_INLINE_VISIBILITY
3976void
3977sort(_Tp** __first, _Tp** __last)
3978{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003979 _VSTD::sort((size_t*)__first, (size_t*)__last, __less<size_t>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003980}
3981
3982template <class _Tp>
3983inline _LIBCPP_INLINE_VISIBILITY
3984void
3985sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last)
3986{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003987 _VSTD::sort(__first.base(), __last.base());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003988}
3989
Howard Hinnant7a563db2011-09-14 18:33:51 +00003990template <class _Tp, class _Compare>
3991inline _LIBCPP_INLINE_VISIBILITY
3992void
3993sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last, _Compare __comp)
3994{
3995 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3996 _VSTD::sort<_Tp*, _Comp_ref>(__first.base(), __last.base(), __comp);
3997}
3998
Howard Hinnante9df0a52013-08-01 18:17:34 +00003999#ifdef _LIBCPP_MSVC
Howard Hinnant78b68282011-10-22 20:59:45 +00004000#pragma warning( push )
4001#pragma warning( disable: 4231)
Howard Hinnante9df0a52013-08-01 18:17:34 +00004002#endif // _LIBCPP_MSVC
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004003_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<char>&, char*>(char*, char*, __less<char>&))
4004_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&))
4005_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&))
4006_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&))
4007_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<short>&, short*>(short*, short*, __less<short>&))
4008_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&))
4009_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<int>&, int*>(int*, int*, __less<int>&))
4010_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&))
4011_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<long>&, long*>(long*, long*, __less<long>&))
4012_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&))
4013_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<long long>&, long long*>(long long*, long long*, __less<long long>&))
4014_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned long long>&))
4015_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<float>&, float*>(float*, float*, __less<float>&))
4016_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<double>&, double*>(double*, double*, __less<double>&))
4017_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<long double>&, long double*>(long double*, long double*, __less<long double>&))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004018
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004019_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<char>&, char*>(char*, char*, __less<char>&))
4020_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&))
4021_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&))
4022_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&))
4023_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<short>&, short*>(short*, short*, __less<short>&))
4024_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&))
4025_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<int>&, int*>(int*, int*, __less<int>&))
4026_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&))
4027_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<long>&, long*>(long*, long*, __less<long>&))
4028_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&))
4029_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<long long>&, long long*>(long long*, long long*, __less<long long>&))
4030_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned long long>&))
4031_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<float>&, float*>(float*, float*, __less<float>&))
4032_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<double>&, double*>(double*, double*, __less<double>&))
4033_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<long double>&, long double*>(long double*, long double*, __less<long double>&))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004034
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004035_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS unsigned __sort5<__less<long double>&, long double*>(long double*, long double*, long double*, long double*, long double*, __less<long double>&))
Howard Hinnante9df0a52013-08-01 18:17:34 +00004036#ifdef _LIBCPP_MSVC
Howard Hinnant78b68282011-10-22 20:59:45 +00004037#pragma warning( pop )
Howard Hinnante9df0a52013-08-01 18:17:34 +00004038#endif // _LIBCPP_MSVC
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004039
4040// lower_bound
4041
4042template <class _Compare, class _ForwardIterator, class _Tp>
4043_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00004044__lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004045{
4046 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004047 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004048 while (__len != 0)
4049 {
4050 difference_type __l2 = __len / 2;
4051 _ForwardIterator __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004052 _VSTD::advance(__m, __l2);
Howard Hinnant78b68282011-10-22 20:59:45 +00004053 if (__comp(*__m, __value_))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004054 {
4055 __first = ++__m;
4056 __len -= __l2 + 1;
4057 }
4058 else
4059 __len = __l2;
4060 }
4061 return __first;
4062}
4063
4064template <class _ForwardIterator, class _Tp, class _Compare>
4065inline _LIBCPP_INLINE_VISIBILITY
4066_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00004067lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004068{
Howard Hinnant5e571422013-08-23 20:10:18 +00004069#ifdef _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004070 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4071 __debug_less<_Compare> __c(__comp);
Howard Hinnant78b68282011-10-22 20:59:45 +00004072 return __lower_bound<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant5e571422013-08-23 20:10:18 +00004073#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004074 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnant78b68282011-10-22 20:59:45 +00004075 return __lower_bound<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant5e571422013-08-23 20:10:18 +00004076#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004077}
4078
4079template <class _ForwardIterator, class _Tp>
4080inline _LIBCPP_INLINE_VISIBILITY
4081_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00004082lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004083{
Howard Hinnant78b68282011-10-22 20:59:45 +00004084 return _VSTD::lower_bound(__first, __last, __value_,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004085 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
4086}
4087
4088// upper_bound
4089
4090template <class _Compare, class _ForwardIterator, class _Tp>
4091_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00004092__upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004093{
4094 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004095 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004096 while (__len != 0)
4097 {
4098 difference_type __l2 = __len / 2;
4099 _ForwardIterator __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004100 _VSTD::advance(__m, __l2);
Howard Hinnant78b68282011-10-22 20:59:45 +00004101 if (__comp(__value_, *__m))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004102 __len = __l2;
4103 else
4104 {
4105 __first = ++__m;
4106 __len -= __l2 + 1;
4107 }
4108 }
4109 return __first;
4110}
4111
4112template <class _ForwardIterator, class _Tp, class _Compare>
4113inline _LIBCPP_INLINE_VISIBILITY
4114_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00004115upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004116{
Howard Hinnant5e571422013-08-23 20:10:18 +00004117#ifdef _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004118 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4119 __debug_less<_Compare> __c(__comp);
Howard Hinnant78b68282011-10-22 20:59:45 +00004120 return __upper_bound<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant5e571422013-08-23 20:10:18 +00004121#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004122 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnant78b68282011-10-22 20:59:45 +00004123 return __upper_bound<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant5e571422013-08-23 20:10:18 +00004124#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004125}
4126
4127template <class _ForwardIterator, class _Tp>
4128inline _LIBCPP_INLINE_VISIBILITY
4129_ForwardIterator
Howard Hinnant78b68282011-10-22 20:59:45 +00004130upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004131{
Howard Hinnant78b68282011-10-22 20:59:45 +00004132 return _VSTD::upper_bound(__first, __last, __value_,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004133 __less<_Tp, typename iterator_traits<_ForwardIterator>::value_type>());
4134}
4135
4136// equal_range
4137
4138template <class _Compare, class _ForwardIterator, class _Tp>
4139pair<_ForwardIterator, _ForwardIterator>
Howard Hinnant78b68282011-10-22 20:59:45 +00004140__equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004141{
4142 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004143 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004144 while (__len != 0)
4145 {
4146 difference_type __l2 = __len / 2;
4147 _ForwardIterator __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004148 _VSTD::advance(__m, __l2);
Howard Hinnant78b68282011-10-22 20:59:45 +00004149 if (__comp(*__m, __value_))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004150 {
4151 __first = ++__m;
4152 __len -= __l2 + 1;
4153 }
Howard Hinnant78b68282011-10-22 20:59:45 +00004154 else if (__comp(__value_, *__m))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004155 {
4156 __last = __m;
4157 __len = __l2;
4158 }
4159 else
4160 {
4161 _ForwardIterator __mp1 = __m;
4162 return pair<_ForwardIterator, _ForwardIterator>
4163 (
Howard Hinnant78b68282011-10-22 20:59:45 +00004164 __lower_bound<_Compare>(__first, __m, __value_, __comp),
4165 __upper_bound<_Compare>(++__mp1, __last, __value_, __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004166 );
4167 }
4168 }
4169 return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
4170}
4171
4172template <class _ForwardIterator, class _Tp, class _Compare>
4173inline _LIBCPP_INLINE_VISIBILITY
4174pair<_ForwardIterator, _ForwardIterator>
Howard Hinnant78b68282011-10-22 20:59:45 +00004175equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004176{
Howard Hinnant5e571422013-08-23 20:10:18 +00004177#ifdef _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004178 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4179 __debug_less<_Compare> __c(__comp);
Howard Hinnant78b68282011-10-22 20:59:45 +00004180 return __equal_range<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant5e571422013-08-23 20:10:18 +00004181#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004182 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnant78b68282011-10-22 20:59:45 +00004183 return __equal_range<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant5e571422013-08-23 20:10:18 +00004184#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004185}
4186
4187template <class _ForwardIterator, class _Tp>
4188inline _LIBCPP_INLINE_VISIBILITY
4189pair<_ForwardIterator, _ForwardIterator>
Howard Hinnant78b68282011-10-22 20:59:45 +00004190equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004191{
Howard Hinnant78b68282011-10-22 20:59:45 +00004192 return _VSTD::equal_range(__first, __last, __value_,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004193 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
4194}
4195
4196// binary_search
4197
4198template <class _Compare, class _ForwardIterator, class _Tp>
4199inline _LIBCPP_INLINE_VISIBILITY
4200bool
Howard Hinnant78b68282011-10-22 20:59:45 +00004201__binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004202{
Howard Hinnant78b68282011-10-22 20:59:45 +00004203 __first = __lower_bound<_Compare>(__first, __last, __value_, __comp);
4204 return __first != __last && !__comp(__value_, *__first);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004205}
4206
4207template <class _ForwardIterator, class _Tp, class _Compare>
4208inline _LIBCPP_INLINE_VISIBILITY
4209bool
Howard Hinnant78b68282011-10-22 20:59:45 +00004210binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004211{
Howard Hinnant5e571422013-08-23 20:10:18 +00004212#ifdef _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004213 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4214 __debug_less<_Compare> __c(__comp);
Howard Hinnant78b68282011-10-22 20:59:45 +00004215 return __binary_search<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant5e571422013-08-23 20:10:18 +00004216#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004217 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnant78b68282011-10-22 20:59:45 +00004218 return __binary_search<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant5e571422013-08-23 20:10:18 +00004219#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004220}
4221
4222template <class _ForwardIterator, class _Tp>
4223inline _LIBCPP_INLINE_VISIBILITY
4224bool
Howard Hinnant78b68282011-10-22 20:59:45 +00004225binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004226{
Howard Hinnant78b68282011-10-22 20:59:45 +00004227 return _VSTD::binary_search(__first, __last, __value_,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004228 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
4229}
4230
4231// merge
4232
4233template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4234_OutputIterator
4235__merge(_InputIterator1 __first1, _InputIterator1 __last1,
4236 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4237{
4238 for (; __first1 != __last1; ++__result)
4239 {
4240 if (__first2 == __last2)
Howard Hinnant0949eed2011-06-30 21:18:19 +00004241 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004242 if (__comp(*__first2, *__first1))
4243 {
4244 *__result = *__first2;
4245 ++__first2;
4246 }
4247 else
4248 {
4249 *__result = *__first1;
4250 ++__first1;
4251 }
4252 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00004253 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004254}
4255
4256template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
4257inline _LIBCPP_INLINE_VISIBILITY
4258_OutputIterator
4259merge(_InputIterator1 __first1, _InputIterator1 __last1,
4260 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4261{
Howard Hinnant5e571422013-08-23 20:10:18 +00004262#ifdef _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004263 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4264 __debug_less<_Compare> __c(__comp);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004265 return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant5e571422013-08-23 20:10:18 +00004266#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004267 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004268 return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant5e571422013-08-23 20:10:18 +00004269#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004270}
4271
4272template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
4273inline _LIBCPP_INLINE_VISIBILITY
4274_OutputIterator
4275merge(_InputIterator1 __first1, _InputIterator1 __last1,
4276 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
4277{
4278 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
4279 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
4280 return merge(__first1, __last1, __first2, __last2, __result, __less<__v1, __v2>());
4281}
4282
4283// inplace_merge
4284
4285template <class _Compare, class _BidirectionalIterator>
4286void
4287__buffered_inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4288 _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1,
4289 typename iterator_traits<_BidirectionalIterator>::difference_type __len2,
4290 typename iterator_traits<_BidirectionalIterator>::value_type* __buff)
4291{
4292 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
4293 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
4294 typedef typename iterator_traits<_BidirectionalIterator>::pointer pointer;
4295 __destruct_n __d(0);
4296 unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
4297 if (__len1 <= __len2)
4298 {
4299 value_type* __p = __buff;
4300 for (_BidirectionalIterator __i = __first; __i != __middle; __d.__incr((value_type*)0), ++__i, ++__p)
Howard Hinnant0949eed2011-06-30 21:18:19 +00004301 ::new(__p) value_type(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004302 __merge<_Compare>(move_iterator<value_type*>(__buff),
4303 move_iterator<value_type*>(__p),
4304 move_iterator<_BidirectionalIterator>(__middle),
4305 move_iterator<_BidirectionalIterator>(__last),
4306 __first, __comp);
4307 }
4308 else
4309 {
4310 value_type* __p = __buff;
4311 for (_BidirectionalIterator __i = __middle; __i != __last; __d.__incr((value_type*)0), ++__i, ++__p)
Howard Hinnant0949eed2011-06-30 21:18:19 +00004312 ::new(__p) value_type(_VSTD::move(*__i));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004313 typedef reverse_iterator<_BidirectionalIterator> _RBi;
4314 typedef reverse_iterator<value_type*> _Rv;
4315 __merge(move_iterator<_RBi>(_RBi(__middle)), move_iterator<_RBi>(_RBi(__first)),
4316 move_iterator<_Rv>(_Rv(__p)), move_iterator<_Rv>(_Rv(__buff)),
4317 _RBi(__last), __negate<_Compare>(__comp));
4318 }
4319}
4320
4321template <class _Compare, class _BidirectionalIterator>
4322void
4323__inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4324 _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1,
4325 typename iterator_traits<_BidirectionalIterator>::difference_type __len2,
4326 typename iterator_traits<_BidirectionalIterator>::value_type* __buff, ptrdiff_t __buff_size)
4327{
4328 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
4329 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
4330 while (true)
4331 {
4332 // if __middle == __last, we're done
4333 if (__len2 == 0)
4334 return;
4335 // shrink [__first, __middle) as much as possible (with no moves), returning if it shrinks to 0
4336 for (; true; ++__first, --__len1)
4337 {
4338 if (__len1 == 0)
4339 return;
4340 if (__comp(*__middle, *__first))
4341 break;
4342 }
4343 if (__len1 <= __buff_size || __len2 <= __buff_size)
4344 {
4345 __buffered_inplace_merge<_Compare>(__first, __middle, __last, __comp, __len1, __len2, __buff);
4346 return;
4347 }
4348 // __first < __middle < __last
4349 // *__first > *__middle
4350 // partition [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last) such that
4351 // all elements in:
4352 // [__first, __m1) <= [__middle, __m2)
4353 // [__middle, __m2) < [__m1, __middle)
4354 // [__m1, __middle) <= [__m2, __last)
4355 // and __m1 or __m2 is in the middle of its range
4356 _BidirectionalIterator __m1; // "median" of [__first, __middle)
4357 _BidirectionalIterator __m2; // "median" of [__middle, __last)
4358 difference_type __len11; // distance(__first, __m1)
4359 difference_type __len21; // distance(__middle, __m2)
4360 // binary search smaller range
4361 if (__len1 < __len2)
4362 { // __len >= 1, __len2 >= 2
4363 __len21 = __len2 / 2;
4364 __m2 = __middle;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004365 _VSTD::advance(__m2, __len21);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004366 __m1 = __upper_bound<_Compare>(__first, __middle, *__m2, __comp);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004367 __len11 = _VSTD::distance(__first, __m1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004368 }
4369 else
4370 {
4371 if (__len1 == 1)
4372 { // __len1 >= __len2 && __len2 > 0, therefore __len2 == 1
4373 // It is known *__first > *__middle
4374 swap(*__first, *__middle);
4375 return;
4376 }
4377 // __len1 >= 2, __len2 >= 1
4378 __len11 = __len1 / 2;
4379 __m1 = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004380 _VSTD::advance(__m1, __len11);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004381 __m2 = __lower_bound<_Compare>(__middle, __last, *__m1, __comp);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004382 __len21 = _VSTD::distance(__middle, __m2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004383 }
4384 difference_type __len12 = __len1 - __len11; // distance(__m1, __middle)
4385 difference_type __len22 = __len2 - __len21; // distance(__m2, __last)
4386 // [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last)
4387 // swap middle two partitions
Howard Hinnant0949eed2011-06-30 21:18:19 +00004388 __middle = _VSTD::rotate(__m1, __middle, __m2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004389 // __len12 and __len21 now have swapped meanings
4390 // merge smaller range with recurisve call and larger with tail recursion elimination
4391 if (__len11 + __len21 < __len12 + __len22)
4392 {
4393 __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size);
4394// __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size);
4395 __first = __middle;
4396 __middle = __m2;
4397 __len1 = __len12;
4398 __len2 = __len22;
4399 }
4400 else
4401 {
4402 __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size);
4403// __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size);
4404 __last = __middle;
4405 __middle = __m1;
4406 __len1 = __len11;
4407 __len2 = __len21;
4408 }
4409 }
4410}
4411
4412template <class _Tp>
4413struct __inplace_merge_switch
4414{
Howard Hinnant1468b662010-11-19 22:17:28 +00004415 static const unsigned value = is_trivially_copy_assignable<_Tp>::value;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004416};
4417
4418template <class _BidirectionalIterator, class _Compare>
4419inline _LIBCPP_INLINE_VISIBILITY
4420void
4421inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4422 _Compare __comp)
4423{
4424 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
4425 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004426 difference_type __len1 = _VSTD::distance(__first, __middle);
4427 difference_type __len2 = _VSTD::distance(__middle, __last);
4428 difference_type __buf_size = _VSTD::min(__len1, __len2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004429 pair<value_type*, ptrdiff_t> __buf(0, 0);
4430 unique_ptr<value_type, __return_temporary_buffer> __h;
4431 if (__inplace_merge_switch<value_type>::value && __buf_size > 8)
4432 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004433 __buf = _VSTD::get_temporary_buffer<value_type>(__buf_size);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004434 __h.reset(__buf.first);
4435 }
Howard Hinnant5e571422013-08-23 20:10:18 +00004436#ifdef _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004437 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4438 __debug_less<_Compare> __c(__comp);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004439 return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __c, __len1, __len2,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004440 __buf.first, __buf.second);
Howard Hinnant5e571422013-08-23 20:10:18 +00004441#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004442 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004443 return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __comp, __len1, __len2,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004444 __buf.first, __buf.second);
Howard Hinnant5e571422013-08-23 20:10:18 +00004445#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004446}
4447
4448template <class _BidirectionalIterator>
4449inline _LIBCPP_INLINE_VISIBILITY
4450void
4451inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last)
4452{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004453 _VSTD::inplace_merge(__first, __middle, __last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004454 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
4455}
4456
4457// stable_sort
4458
4459template <class _Compare, class _InputIterator1, class _InputIterator2>
4460void
4461__merge_move_construct(_InputIterator1 __first1, _InputIterator1 __last1,
4462 _InputIterator2 __first2, _InputIterator2 __last2,
4463 typename iterator_traits<_InputIterator1>::value_type* __result, _Compare __comp)
4464{
4465 typedef typename iterator_traits<_InputIterator1>::value_type value_type;
4466 __destruct_n __d(0);
4467 unique_ptr<value_type, __destruct_n&> __h(__result, __d);
4468 for (; true; ++__result)
4469 {
4470 if (__first1 == __last1)
4471 {
4472 for (; __first2 != __last2; ++__first2, ++__result, __d.__incr((value_type*)0))
Howard Hinnant0949eed2011-06-30 21:18:19 +00004473 ::new (__result) value_type(_VSTD::move(*__first2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004474 __h.release();
4475 return;
4476 }
4477 if (__first2 == __last2)
4478 {
4479 for (; __first1 != __last1; ++__first1, ++__result, __d.__incr((value_type*)0))
Howard Hinnant0949eed2011-06-30 21:18:19 +00004480 ::new (__result) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004481 __h.release();
4482 return;
4483 }
4484 if (__comp(*__first2, *__first1))
4485 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004486 ::new (__result) value_type(_VSTD::move(*__first2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004487 __d.__incr((value_type*)0);
4488 ++__first2;
4489 }
4490 else
4491 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004492 ::new (__result) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004493 __d.__incr((value_type*)0);
4494 ++__first1;
4495 }
4496 }
4497}
4498
4499template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4500void
4501__merge_move_assign(_InputIterator1 __first1, _InputIterator1 __last1,
4502 _InputIterator2 __first2, _InputIterator2 __last2,
4503 _OutputIterator __result, _Compare __comp)
4504{
4505 for (; __first1 != __last1; ++__result)
4506 {
4507 if (__first2 == __last2)
4508 {
4509 for (; __first1 != __last1; ++__first1, ++__result)
Howard Hinnant0949eed2011-06-30 21:18:19 +00004510 *__result = _VSTD::move(*__first1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004511 return;
4512 }
4513 if (__comp(*__first2, *__first1))
4514 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004515 *__result = _VSTD::move(*__first2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004516 ++__first2;
4517 }
4518 else
4519 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004520 *__result = _VSTD::move(*__first1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004521 ++__first1;
4522 }
4523 }
4524 for (; __first2 != __last2; ++__first2, ++__result)
Howard Hinnant0949eed2011-06-30 21:18:19 +00004525 *__result = _VSTD::move(*__first2);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004526}
4527
4528template <class _Compare, class _RandomAccessIterator>
4529void
4530__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4531 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4532 typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size);
4533
4534template <class _Compare, class _RandomAccessIterator>
4535void
4536__stable_sort_move(_RandomAccessIterator __first1, _RandomAccessIterator __last1, _Compare __comp,
4537 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4538 typename iterator_traits<_RandomAccessIterator>::value_type* __first2)
4539{
4540 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4541 switch (__len)
4542 {
4543 case 0:
4544 return;
4545 case 1:
Howard Hinnant0949eed2011-06-30 21:18:19 +00004546 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004547 return;
4548 case 2:
4549 __destruct_n __d(0);
4550 unique_ptr<value_type, __destruct_n&> __h2(__first2, __d);
4551 if (__comp(*--__last1, *__first1))
4552 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004553 ::new(__first2) value_type(_VSTD::move(*__last1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004554 __d.__incr((value_type*)0);
4555 ++__first2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004556 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004557 }
4558 else
4559 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004560 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004561 __d.__incr((value_type*)0);
4562 ++__first2;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004563 ::new(__first2) value_type(_VSTD::move(*__last1));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004564 }
4565 __h2.release();
4566 return;
4567 }
4568 if (__len <= 8)
4569 {
4570 __insertion_sort_move<_Compare>(__first1, __last1, __first2, __comp);
4571 return;
4572 }
4573 typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2;
4574 _RandomAccessIterator __m = __first1 + __l2;
4575 __stable_sort<_Compare>(__first1, __m, __comp, __l2, __first2, __l2);
4576 __stable_sort<_Compare>(__m, __last1, __comp, __len - __l2, __first2 + __l2, __len - __l2);
4577 __merge_move_construct<_Compare>(__first1, __m, __m, __last1, __first2, __comp);
4578}
4579
4580template <class _Tp>
4581struct __stable_sort_switch
4582{
Howard Hinnant1468b662010-11-19 22:17:28 +00004583 static const unsigned value = 128*is_trivially_copy_assignable<_Tp>::value;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004584};
4585
4586template <class _Compare, class _RandomAccessIterator>
4587void
4588__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4589 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4590 typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size)
4591{
4592 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4593 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4594 switch (__len)
4595 {
4596 case 0:
4597 case 1:
4598 return;
4599 case 2:
4600 if (__comp(*--__last, *__first))
4601 swap(*__first, *__last);
4602 return;
4603 }
4604 if (__len <= static_cast<difference_type>(__stable_sort_switch<value_type>::value))
4605 {
4606 __insertion_sort<_Compare>(__first, __last, __comp);
4607 return;
4608 }
4609 typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2;
4610 _RandomAccessIterator __m = __first + __l2;
4611 if (__len <= __buff_size)
4612 {
4613 __destruct_n __d(0);
4614 unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
4615 __stable_sort_move<_Compare>(__first, __m, __comp, __l2, __buff);
4616 __d.__set(__l2, (value_type*)0);
4617 __stable_sort_move<_Compare>(__m, __last, __comp, __len - __l2, __buff + __l2);
4618 __d.__set(__len, (value_type*)0);
4619 __merge_move_assign<_Compare>(__buff, __buff + __l2, __buff + __l2, __buff + __len, __first, __comp);
4620// __merge<_Compare>(move_iterator<value_type*>(__buff),
4621// move_iterator<value_type*>(__buff + __l2),
4622// move_iterator<_RandomAccessIterator>(__buff + __l2),
4623// move_iterator<_RandomAccessIterator>(__buff + __len),
4624// __first, __comp);
4625 return;
4626 }
4627 __stable_sort<_Compare>(__first, __m, __comp, __l2, __buff, __buff_size);
4628 __stable_sort<_Compare>(__m, __last, __comp, __len - __l2, __buff, __buff_size);
4629 __inplace_merge<_Compare>(__first, __m, __last, __comp, __l2, __len - __l2, __buff, __buff_size);
4630}
4631
4632template <class _RandomAccessIterator, class _Compare>
4633inline _LIBCPP_INLINE_VISIBILITY
4634void
4635stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4636{
4637 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4638 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4639 difference_type __len = __last - __first;
4640 pair<value_type*, ptrdiff_t> __buf(0, 0);
4641 unique_ptr<value_type, __return_temporary_buffer> __h;
4642 if (__len > static_cast<difference_type>(__stable_sort_switch<value_type>::value))
4643 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004644 __buf = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004645 __h.reset(__buf.first);
4646 }
Howard Hinnant5e571422013-08-23 20:10:18 +00004647#ifdef _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004648 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4649 __debug_less<_Compare> __c(__comp);
4650 __stable_sort<_Comp_ref>(__first, __last, __c, __len, __buf.first, __buf.second);
Howard Hinnant5e571422013-08-23 20:10:18 +00004651#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004652 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4653 __stable_sort<_Comp_ref>(__first, __last, __comp, __len, __buf.first, __buf.second);
Howard Hinnant5e571422013-08-23 20:10:18 +00004654#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004655}
4656
4657template <class _RandomAccessIterator>
4658inline _LIBCPP_INLINE_VISIBILITY
4659void
4660stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
4661{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004662 _VSTD::stable_sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004663}
4664
4665// is_heap_until
4666
4667template <class _RandomAccessIterator, class _Compare>
4668_RandomAccessIterator
4669is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4670{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004671 typedef typename _VSTD::iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004672 difference_type __len = __last - __first;
4673 difference_type __p = 0;
4674 difference_type __c = 1;
4675 _RandomAccessIterator __pp = __first;
4676 while (__c < __len)
4677 {
4678 _RandomAccessIterator __cp = __first + __c;
4679 if (__comp(*__pp, *__cp))
4680 return __cp;
4681 ++__c;
4682 ++__cp;
4683 if (__c == __len)
4684 return __last;
4685 if (__comp(*__pp, *__cp))
4686 return __cp;
4687 ++__p;
4688 ++__pp;
4689 __c = 2 * __p + 1;
4690 }
4691 return __last;
4692}
4693
Howard Hinnant324bb032010-08-22 00:02:43 +00004694template<class _RandomAccessIterator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004695inline _LIBCPP_INLINE_VISIBILITY
4696_RandomAccessIterator
4697is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last)
4698{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004699 return _VSTD::is_heap_until(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004700}
4701
4702// is_heap
4703
4704template <class _RandomAccessIterator, class _Compare>
4705inline _LIBCPP_INLINE_VISIBILITY
4706bool
4707is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4708{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004709 return _VSTD::is_heap_until(__first, __last, __comp) == __last;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004710}
4711
Howard Hinnant324bb032010-08-22 00:02:43 +00004712template<class _RandomAccessIterator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004713inline _LIBCPP_INLINE_VISIBILITY
4714bool
4715is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4716{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004717 return _VSTD::is_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004718}
4719
4720// push_heap
4721
4722template <class _Compare, class _RandomAccessIterator>
4723void
4724__push_heap_front(_RandomAccessIterator __first, _RandomAccessIterator, _Compare __comp,
4725 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
4726{
4727 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4728 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4729 if (__len > 1)
4730 {
4731 difference_type __p = 0;
4732 _RandomAccessIterator __pp = __first;
4733 difference_type __c = 2;
4734 _RandomAccessIterator __cp = __first + __c;
4735 if (__c == __len || __comp(*__cp, *(__cp - 1)))
4736 {
4737 --__c;
4738 --__cp;
4739 }
4740 if (__comp(*__pp, *__cp))
4741 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004742 value_type __t(_VSTD::move(*__pp));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004743 do
4744 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004745 *__pp = _VSTD::move(*__cp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004746 __pp = __cp;
4747 __p = __c;
4748 __c = (__p + 1) * 2;
4749 if (__c > __len)
4750 break;
4751 __cp = __first + __c;
4752 if (__c == __len || __comp(*__cp, *(__cp - 1)))
4753 {
4754 --__c;
4755 --__cp;
4756 }
4757 } while (__comp(__t, *__cp));
Howard Hinnant0949eed2011-06-30 21:18:19 +00004758 *__pp = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004759 }
4760 }
4761}
4762
4763template <class _Compare, class _RandomAccessIterator>
4764void
4765__push_heap_back(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4766 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
4767{
4768 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4769 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4770 if (__len > 1)
4771 {
4772 __len = (__len - 2) / 2;
4773 _RandomAccessIterator __ptr = __first + __len;
4774 if (__comp(*__ptr, *--__last))
4775 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004776 value_type __t(_VSTD::move(*__last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004777 do
4778 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004779 *__last = _VSTD::move(*__ptr);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004780 __last = __ptr;
4781 if (__len == 0)
4782 break;
4783 __len = (__len - 1) / 2;
4784 __ptr = __first + __len;
4785 } while (__comp(*__ptr, __t));
Howard Hinnant0949eed2011-06-30 21:18:19 +00004786 *__last = _VSTD::move(__t);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004787 }
4788 }
4789}
4790
4791template <class _RandomAccessIterator, class _Compare>
4792inline _LIBCPP_INLINE_VISIBILITY
4793void
4794push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4795{
Howard Hinnant5e571422013-08-23 20:10:18 +00004796#ifdef _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004797 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4798 __debug_less<_Compare> __c(__comp);
4799 __push_heap_back<_Comp_ref>(__first, __last, __c, __last - __first);
Howard Hinnant5e571422013-08-23 20:10:18 +00004800#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004801 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4802 __push_heap_back<_Comp_ref>(__first, __last, __comp, __last - __first);
Howard Hinnant5e571422013-08-23 20:10:18 +00004803#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004804}
4805
4806template <class _RandomAccessIterator>
4807inline _LIBCPP_INLINE_VISIBILITY
4808void
4809push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4810{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004811 _VSTD::push_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004812}
4813
4814// pop_heap
4815
4816template <class _Compare, class _RandomAccessIterator>
4817inline _LIBCPP_INLINE_VISIBILITY
4818void
4819__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4820 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
4821{
4822 if (__len > 1)
4823 {
4824 swap(*__first, *--__last);
4825 __push_heap_front<_Compare>(__first, __last, __comp, __len-1);
4826 }
4827}
4828
4829template <class _RandomAccessIterator, class _Compare>
4830inline _LIBCPP_INLINE_VISIBILITY
4831void
4832pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4833{
Howard Hinnant5e571422013-08-23 20:10:18 +00004834#ifdef _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004835 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4836 __debug_less<_Compare> __c(__comp);
4837 __pop_heap<_Comp_ref>(__first, __last, __c, __last - __first);
Howard Hinnant5e571422013-08-23 20:10:18 +00004838#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004839 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4840 __pop_heap<_Comp_ref>(__first, __last, __comp, __last - __first);
Howard Hinnant5e571422013-08-23 20:10:18 +00004841#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004842}
4843
4844template <class _RandomAccessIterator>
4845inline _LIBCPP_INLINE_VISIBILITY
4846void
4847pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4848{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004849 _VSTD::pop_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004850}
4851
4852// make_heap
4853
4854template <class _Compare, class _RandomAccessIterator>
4855void
4856__make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4857{
4858 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4859 difference_type __n = __last - __first;
4860 if (__n > 1)
4861 {
4862 __last = __first;
4863 ++__last;
4864 for (difference_type __i = 1; __i < __n;)
4865 __push_heap_back<_Compare>(__first, ++__last, __comp, ++__i);
4866 }
4867}
4868
4869template <class _RandomAccessIterator, class _Compare>
4870inline _LIBCPP_INLINE_VISIBILITY
4871void
4872make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4873{
Howard Hinnant5e571422013-08-23 20:10:18 +00004874#ifdef _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004875 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4876 __debug_less<_Compare> __c(__comp);
4877 __make_heap<_Comp_ref>(__first, __last, __c);
Howard Hinnant5e571422013-08-23 20:10:18 +00004878#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004879 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4880 __make_heap<_Comp_ref>(__first, __last, __comp);
Howard Hinnant5e571422013-08-23 20:10:18 +00004881#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004882}
4883
4884template <class _RandomAccessIterator>
4885inline _LIBCPP_INLINE_VISIBILITY
4886void
4887make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4888{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004889 _VSTD::make_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004890}
4891
4892// sort_heap
4893
4894template <class _Compare, class _RandomAccessIterator>
4895void
4896__sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4897{
4898 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4899 for (difference_type __n = __last - __first; __n > 1; --__last, --__n)
4900 __pop_heap<_Compare>(__first, __last, __comp, __n);
4901}
4902
4903template <class _RandomAccessIterator, class _Compare>
4904inline _LIBCPP_INLINE_VISIBILITY
4905void
4906sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4907{
Howard Hinnant5e571422013-08-23 20:10:18 +00004908#ifdef _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004909 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4910 __debug_less<_Compare> __c(__comp);
4911 __sort_heap<_Comp_ref>(__first, __last, __c);
Howard Hinnant5e571422013-08-23 20:10:18 +00004912#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004913 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4914 __sort_heap<_Comp_ref>(__first, __last, __comp);
Howard Hinnant5e571422013-08-23 20:10:18 +00004915#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004916}
4917
4918template <class _RandomAccessIterator>
4919inline _LIBCPP_INLINE_VISIBILITY
4920void
4921sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4922{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004923 _VSTD::sort_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004924}
4925
4926// partial_sort
4927
4928template <class _Compare, class _RandomAccessIterator>
4929void
4930__partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
4931 _Compare __comp)
4932{
4933 __make_heap<_Compare>(__first, __middle, __comp);
4934 typename iterator_traits<_RandomAccessIterator>::difference_type __len = __middle - __first;
4935 for (_RandomAccessIterator __i = __middle; __i != __last; ++__i)
4936 {
4937 if (__comp(*__i, *__first))
4938 {
4939 swap(*__i, *__first);
4940 __push_heap_front<_Compare>(__first, __middle, __comp, __len);
4941 }
4942 }
4943 __sort_heap<_Compare>(__first, __middle, __comp);
4944}
4945
4946template <class _RandomAccessIterator, class _Compare>
4947inline _LIBCPP_INLINE_VISIBILITY
4948void
4949partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
4950 _Compare __comp)
4951{
Howard Hinnant5e571422013-08-23 20:10:18 +00004952#ifdef _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004953 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4954 __debug_less<_Compare> __c(__comp);
4955 __partial_sort<_Comp_ref>(__first, __middle, __last, __c);
Howard Hinnant5e571422013-08-23 20:10:18 +00004956#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004957 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4958 __partial_sort<_Comp_ref>(__first, __middle, __last, __comp);
Howard Hinnant5e571422013-08-23 20:10:18 +00004959#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004960}
4961
4962template <class _RandomAccessIterator>
4963inline _LIBCPP_INLINE_VISIBILITY
4964void
4965partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last)
4966{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004967 _VSTD::partial_sort(__first, __middle, __last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004968 __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4969}
4970
4971// partial_sort_copy
4972
4973template <class _Compare, class _InputIterator, class _RandomAccessIterator>
4974_RandomAccessIterator
4975__partial_sort_copy(_InputIterator __first, _InputIterator __last,
4976 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp)
4977{
4978 _RandomAccessIterator __r = __result_first;
4979 if (__r != __result_last)
4980 {
4981 typename iterator_traits<_RandomAccessIterator>::difference_type __len = 0;
4982 for (; __first != __last && __r != __result_last; ++__first, ++__r, ++__len)
4983 *__r = *__first;
4984 __make_heap<_Compare>(__result_first, __r, __comp);
4985 for (; __first != __last; ++__first)
4986 if (__comp(*__first, *__result_first))
4987 {
4988 *__result_first = *__first;
4989 __push_heap_front<_Compare>(__result_first, __r, __comp, __len);
4990 }
4991 __sort_heap<_Compare>(__result_first, __r, __comp);
4992 }
4993 return __r;
4994}
4995
4996template <class _InputIterator, class _RandomAccessIterator, class _Compare>
4997inline _LIBCPP_INLINE_VISIBILITY
4998_RandomAccessIterator
4999partial_sort_copy(_InputIterator __first, _InputIterator __last,
5000 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp)
5001{
Howard Hinnant5e571422013-08-23 20:10:18 +00005002#ifdef _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005003 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5004 __debug_less<_Compare> __c(__comp);
5005 return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __c);
Howard Hinnant5e571422013-08-23 20:10:18 +00005006#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005007 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5008 return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __comp);
Howard Hinnant5e571422013-08-23 20:10:18 +00005009#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005010}
5011
5012template <class _InputIterator, class _RandomAccessIterator>
5013inline _LIBCPP_INLINE_VISIBILITY
5014_RandomAccessIterator
5015partial_sort_copy(_InputIterator __first, _InputIterator __last,
5016 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last)
5017{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005018 return _VSTD::partial_sort_copy(__first, __last, __result_first, __result_last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005019 __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
5020}
5021
5022// nth_element
5023
5024template <class _Compare, class _RandomAccessIterator>
5025void
5026__nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
5027{
5028 // _Compare is known to be a reference type
5029 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
5030 const difference_type __limit = 7;
5031 while (true)
5032 {
5033 __restart:
Howard Hinnant8292d742011-12-29 17:45:35 +00005034 if (__nth == __last)
5035 return;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005036 difference_type __len = __last - __first;
5037 switch (__len)
5038 {
5039 case 0:
5040 case 1:
5041 return;
5042 case 2:
5043 if (__comp(*--__last, *__first))
5044 swap(*__first, *__last);
5045 return;
5046 case 3:
5047 {
5048 _RandomAccessIterator __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005049 _VSTD::__sort3<_Compare>(__first, ++__m, --__last, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005050 return;
5051 }
5052 }
5053 if (__len <= __limit)
5054 {
5055 __selection_sort<_Compare>(__first, __last, __comp);
5056 return;
5057 }
5058 // __len > __limit >= 3
5059 _RandomAccessIterator __m = __first + __len/2;
5060 _RandomAccessIterator __lm1 = __last;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005061 unsigned __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, --__lm1, __comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005062 // *__m is median
5063 // partition [__first, __m) < *__m and *__m <= [__m, __last)
5064 // (this inhibits tossing elements equivalent to __m around unnecessarily)
5065 _RandomAccessIterator __i = __first;
5066 _RandomAccessIterator __j = __lm1;
5067 // j points beyond range to be tested, *__lm1 is known to be <= *__m
5068 // The search going up is known to be guarded but the search coming down isn't.
5069 // Prime the downward search with a guard.
5070 if (!__comp(*__i, *__m)) // if *__first == *__m
5071 {
5072 // *__first == *__m, *__first doesn't go in first part
5073 // manually guard downward moving __j against __i
5074 while (true)
5075 {
5076 if (__i == --__j)
5077 {
5078 // *__first == *__m, *__m <= all other elements
5079 // Parition instead into [__first, __i) == *__first and *__first < [__i, __last)
5080 ++__i; // __first + 1
5081 __j = __last;
5082 if (!__comp(*__first, *--__j)) // we need a guard if *__first == *(__last-1)
5083 {
5084 while (true)
5085 {
5086 if (__i == __j)
5087 return; // [__first, __last) all equivalent elements
5088 if (__comp(*__first, *__i))
5089 {
5090 swap(*__i, *__j);
5091 ++__n_swaps;
5092 ++__i;
5093 break;
5094 }
5095 ++__i;
5096 }
5097 }
5098 // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1
5099 if (__i == __j)
5100 return;
5101 while (true)
5102 {
5103 while (!__comp(*__first, *__i))
5104 ++__i;
5105 while (__comp(*__first, *--__j))
5106 ;
5107 if (__i >= __j)
5108 break;
5109 swap(*__i, *__j);
5110 ++__n_swaps;
5111 ++__i;
5112 }
5113 // [__first, __i) == *__first and *__first < [__i, __last)
5114 // The first part is sorted,
5115 if (__nth < __i)
5116 return;
5117 // __nth_element the secod part
5118 // __nth_element<_Compare>(__i, __nth, __last, __comp);
5119 __first = __i;
5120 goto __restart;
5121 }
5122 if (__comp(*__j, *__m))
5123 {
5124 swap(*__i, *__j);
5125 ++__n_swaps;
5126 break; // found guard for downward moving __j, now use unguarded partition
5127 }
5128 }
5129 }
5130 ++__i;
5131 // j points beyond range to be tested, *__lm1 is known to be <= *__m
5132 // if not yet partitioned...
5133 if (__i < __j)
5134 {
5135 // known that *(__i - 1) < *__m
5136 while (true)
5137 {
5138 // __m still guards upward moving __i
5139 while (__comp(*__i, *__m))
5140 ++__i;
5141 // It is now known that a guard exists for downward moving __j
5142 while (!__comp(*--__j, *__m))
5143 ;
5144 if (__i >= __j)
5145 break;
5146 swap(*__i, *__j);
5147 ++__n_swaps;
5148 // It is known that __m != __j
5149 // If __m just moved, follow it
5150 if (__m == __i)
5151 __m = __j;
5152 ++__i;
5153 }
5154 }
5155 // [__first, __i) < *__m and *__m <= [__i, __last)
5156 if (__i != __m && __comp(*__m, *__i))
5157 {
5158 swap(*__i, *__m);
5159 ++__n_swaps;
5160 }
5161 // [__first, __i) < *__i and *__i <= [__i+1, __last)
5162 if (__nth == __i)
5163 return;
5164 if (__n_swaps == 0)
5165 {
5166 // We were given a perfectly partitioned sequence. Coincidence?
5167 if (__nth < __i)
5168 {
5169 // Check for [__first, __i) already sorted
5170 __j = __m = __first;
5171 while (++__j != __i)
5172 {
5173 if (__comp(*__j, *__m))
5174 // not yet sorted, so sort
5175 goto not_sorted;
5176 __m = __j;
5177 }
5178 // [__first, __i) sorted
5179 return;
5180 }
5181 else
5182 {
5183 // Check for [__i, __last) already sorted
5184 __j = __m = __i;
5185 while (++__j != __last)
5186 {
5187 if (__comp(*__j, *__m))
5188 // not yet sorted, so sort
5189 goto not_sorted;
5190 __m = __j;
5191 }
5192 // [__i, __last) sorted
5193 return;
5194 }
5195 }
5196not_sorted:
5197 // __nth_element on range containing __nth
5198 if (__nth < __i)
5199 {
5200 // __nth_element<_Compare>(__first, __nth, __i, __comp);
5201 __last = __i;
5202 }
5203 else
5204 {
5205 // __nth_element<_Compare>(__i+1, __nth, __last, __comp);
5206 __first = ++__i;
5207 }
5208 }
5209}
5210
5211template <class _RandomAccessIterator, class _Compare>
5212inline _LIBCPP_INLINE_VISIBILITY
5213void
5214nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
5215{
Howard Hinnant5e571422013-08-23 20:10:18 +00005216#ifdef _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005217 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5218 __debug_less<_Compare> __c(__comp);
5219 __nth_element<_Comp_ref>(__first, __nth, __last, __c);
Howard Hinnant5e571422013-08-23 20:10:18 +00005220#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005221 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5222 __nth_element<_Comp_ref>(__first, __nth, __last, __comp);
Howard Hinnant5e571422013-08-23 20:10:18 +00005223#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005224}
5225
5226template <class _RandomAccessIterator>
5227inline _LIBCPP_INLINE_VISIBILITY
5228void
5229nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last)
5230{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005231 _VSTD::nth_element(__first, __nth, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005232}
5233
5234// includes
5235
5236template <class _Compare, class _InputIterator1, class _InputIterator2>
5237bool
5238__includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
5239 _Compare __comp)
5240{
5241 for (; __first2 != __last2; ++__first1)
5242 {
5243 if (__first1 == __last1 || __comp(*__first2, *__first1))
5244 return false;
5245 if (!__comp(*__first1, *__first2))
5246 ++__first2;
5247 }
5248 return true;
5249}
5250
5251template <class _InputIterator1, class _InputIterator2, class _Compare>
5252inline _LIBCPP_INLINE_VISIBILITY
5253bool
5254includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
5255 _Compare __comp)
5256{
Howard Hinnant5e571422013-08-23 20:10:18 +00005257#ifdef _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005258 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5259 __debug_less<_Compare> __c(__comp);
5260 return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __c);
Howard Hinnant5e571422013-08-23 20:10:18 +00005261#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005262 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5263 return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
Howard Hinnant5e571422013-08-23 20:10:18 +00005264#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005265}
5266
5267template <class _InputIterator1, class _InputIterator2>
5268inline _LIBCPP_INLINE_VISIBILITY
5269bool
5270includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2)
5271{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005272 return _VSTD::includes(__first1, __last1, __first2, __last2,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005273 __less<typename iterator_traits<_InputIterator1>::value_type,
5274 typename iterator_traits<_InputIterator2>::value_type>());
5275}
5276
5277// set_union
5278
5279template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5280_OutputIterator
5281__set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5282 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5283{
5284 for (; __first1 != __last1; ++__result)
5285 {
5286 if (__first2 == __last2)
Howard Hinnant0949eed2011-06-30 21:18:19 +00005287 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005288 if (__comp(*__first2, *__first1))
5289 {
5290 *__result = *__first2;
5291 ++__first2;
5292 }
5293 else
5294 {
5295 *__result = *__first1;
5296 if (!__comp(*__first1, *__first2))
5297 ++__first2;
5298 ++__first1;
5299 }
5300 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00005301 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005302}
5303
5304template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5305inline _LIBCPP_INLINE_VISIBILITY
5306_OutputIterator
5307set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5308 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5309{
Howard Hinnant5e571422013-08-23 20:10:18 +00005310#ifdef _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005311 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5312 __debug_less<_Compare> __c(__comp);
5313 return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant5e571422013-08-23 20:10:18 +00005314#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005315 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5316 return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant5e571422013-08-23 20:10:18 +00005317#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005318}
5319
5320template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5321inline _LIBCPP_INLINE_VISIBILITY
5322_OutputIterator
5323set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5324 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5325{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005326 return _VSTD::set_union(__first1, __last1, __first2, __last2, __result,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005327 __less<typename iterator_traits<_InputIterator1>::value_type,
5328 typename iterator_traits<_InputIterator2>::value_type>());
5329}
5330
5331// set_intersection
5332
5333template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5334_OutputIterator
5335__set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5336 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5337{
5338 while (__first1 != __last1 && __first2 != __last2)
5339 {
5340 if (__comp(*__first1, *__first2))
5341 ++__first1;
5342 else
5343 {
5344 if (!__comp(*__first2, *__first1))
5345 {
5346 *__result = *__first1;
5347 ++__result;
5348 ++__first1;
5349 }
5350 ++__first2;
5351 }
5352 }
5353 return __result;
5354}
5355
5356template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5357inline _LIBCPP_INLINE_VISIBILITY
5358_OutputIterator
5359set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5360 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5361{
Howard Hinnant5e571422013-08-23 20:10:18 +00005362#ifdef _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005363 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5364 __debug_less<_Compare> __c(__comp);
5365 return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant5e571422013-08-23 20:10:18 +00005366#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005367 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5368 return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant5e571422013-08-23 20:10:18 +00005369#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005370}
5371
5372template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5373inline _LIBCPP_INLINE_VISIBILITY
5374_OutputIterator
5375set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5376 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5377{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005378 return _VSTD::set_intersection(__first1, __last1, __first2, __last2, __result,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005379 __less<typename iterator_traits<_InputIterator1>::value_type,
5380 typename iterator_traits<_InputIterator2>::value_type>());
5381}
5382
5383// set_difference
5384
5385template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5386_OutputIterator
5387__set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5388 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5389{
5390 while (__first1 != __last1)
5391 {
5392 if (__first2 == __last2)
Howard Hinnant0949eed2011-06-30 21:18:19 +00005393 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005394 if (__comp(*__first1, *__first2))
5395 {
5396 *__result = *__first1;
5397 ++__result;
5398 ++__first1;
5399 }
5400 else
5401 {
5402 if (!__comp(*__first2, *__first1))
5403 ++__first1;
5404 ++__first2;
5405 }
5406 }
5407 return __result;
5408}
5409
5410template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5411inline _LIBCPP_INLINE_VISIBILITY
5412_OutputIterator
5413set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5414 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5415{
Howard Hinnant5e571422013-08-23 20:10:18 +00005416#ifdef _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005417 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5418 __debug_less<_Compare> __c(__comp);
5419 return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant5e571422013-08-23 20:10:18 +00005420#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005421 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5422 return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant5e571422013-08-23 20:10:18 +00005423#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005424}
5425
5426template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5427inline _LIBCPP_INLINE_VISIBILITY
5428_OutputIterator
5429set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5430 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5431{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005432 return _VSTD::set_difference(__first1, __last1, __first2, __last2, __result,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005433 __less<typename iterator_traits<_InputIterator1>::value_type,
5434 typename iterator_traits<_InputIterator2>::value_type>());
5435}
5436
5437// set_symmetric_difference
5438
5439template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5440_OutputIterator
5441__set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5442 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5443{
5444 while (__first1 != __last1)
5445 {
5446 if (__first2 == __last2)
Howard Hinnant0949eed2011-06-30 21:18:19 +00005447 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005448 if (__comp(*__first1, *__first2))
5449 {
5450 *__result = *__first1;
5451 ++__result;
5452 ++__first1;
5453 }
5454 else
5455 {
5456 if (__comp(*__first2, *__first1))
5457 {
5458 *__result = *__first2;
5459 ++__result;
5460 }
5461 else
5462 ++__first1;
5463 ++__first2;
5464 }
5465 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00005466 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005467}
5468
5469template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5470inline _LIBCPP_INLINE_VISIBILITY
5471_OutputIterator
5472set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5473 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5474{
Howard Hinnant5e571422013-08-23 20:10:18 +00005475#ifdef _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005476 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5477 __debug_less<_Compare> __c(__comp);
5478 return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant5e571422013-08-23 20:10:18 +00005479#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005480 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5481 return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant5e571422013-08-23 20:10:18 +00005482#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005483}
5484
5485template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5486inline _LIBCPP_INLINE_VISIBILITY
5487_OutputIterator
5488set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5489 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5490{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005491 return _VSTD::set_symmetric_difference(__first1, __last1, __first2, __last2, __result,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005492 __less<typename iterator_traits<_InputIterator1>::value_type,
5493 typename iterator_traits<_InputIterator2>::value_type>());
5494}
5495
5496// lexicographical_compare
5497
5498template <class _Compare, class _InputIterator1, class _InputIterator2>
5499bool
5500__lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5501 _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
5502{
5503 for (; __first2 != __last2; ++__first1, ++__first2)
5504 {
5505 if (__first1 == __last1 || __comp(*__first1, *__first2))
5506 return true;
5507 if (__comp(*__first2, *__first1))
5508 return false;
5509 }
5510 return false;
5511}
5512
5513template <class _InputIterator1, class _InputIterator2, class _Compare>
5514inline _LIBCPP_INLINE_VISIBILITY
5515bool
5516lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5517 _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
5518{
Howard Hinnant5e571422013-08-23 20:10:18 +00005519#ifdef _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005520 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5521 __debug_less<_Compare> __c(__comp);
5522 return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __c);
Howard Hinnant5e571422013-08-23 20:10:18 +00005523#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005524 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5525 return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
Howard Hinnant5e571422013-08-23 20:10:18 +00005526#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005527}
5528
5529template <class _InputIterator1, class _InputIterator2>
5530inline _LIBCPP_INLINE_VISIBILITY
5531bool
5532lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5533 _InputIterator2 __first2, _InputIterator2 __last2)
5534{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005535 return _VSTD::lexicographical_compare(__first1, __last1, __first2, __last2,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005536 __less<typename iterator_traits<_InputIterator1>::value_type,
5537 typename iterator_traits<_InputIterator2>::value_type>());
5538}
5539
5540// next_permutation
5541
5542template <class _Compare, class _BidirectionalIterator>
5543bool
5544__next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5545{
5546 _BidirectionalIterator __i = __last;
5547 if (__first == __last || __first == --__i)
5548 return false;
5549 while (true)
5550 {
5551 _BidirectionalIterator __ip1 = __i;
5552 if (__comp(*--__i, *__ip1))
5553 {
5554 _BidirectionalIterator __j = __last;
5555 while (!__comp(*__i, *--__j))
5556 ;
5557 swap(*__i, *__j);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005558 _VSTD::reverse(__ip1, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005559 return true;
5560 }
5561 if (__i == __first)
5562 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00005563 _VSTD::reverse(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005564 return false;
5565 }
5566 }
5567}
5568
5569template <class _BidirectionalIterator, class _Compare>
5570inline _LIBCPP_INLINE_VISIBILITY
5571bool
5572next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5573{
Howard Hinnant5e571422013-08-23 20:10:18 +00005574#ifdef _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005575 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5576 __debug_less<_Compare> __c(__comp);
5577 return __next_permutation<_Comp_ref>(__first, __last, __c);
Howard Hinnant5e571422013-08-23 20:10:18 +00005578#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005579 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5580 return __next_permutation<_Comp_ref>(__first, __last, __comp);
Howard Hinnant5e571422013-08-23 20:10:18 +00005581#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005582}
5583
5584template <class _BidirectionalIterator>
5585inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant324bb032010-08-22 00:02:43 +00005586bool
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005587next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
5588{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005589 return _VSTD::next_permutation(__first, __last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005590 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
5591}
5592
5593// prev_permutation
5594
5595template <class _Compare, class _BidirectionalIterator>
5596bool
5597__prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5598{
5599 _BidirectionalIterator __i = __last;
5600 if (__first == __last || __first == --__i)
5601 return false;
5602 while (true)
5603 {
5604 _BidirectionalIterator __ip1 = __i;
5605 if (__comp(*__ip1, *--__i))
5606 {
5607 _BidirectionalIterator __j = __last;
5608 while (!__comp(*--__j, *__i))
5609 ;
5610 swap(*__i, *__j);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005611 _VSTD::reverse(__ip1, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005612 return true;
5613 }
5614 if (__i == __first)
5615 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00005616 _VSTD::reverse(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005617 return false;
5618 }
5619 }
5620}
5621
5622template <class _BidirectionalIterator, class _Compare>
5623inline _LIBCPP_INLINE_VISIBILITY
5624bool
5625prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5626{
Howard Hinnant5e571422013-08-23 20:10:18 +00005627#ifdef _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005628 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5629 __debug_less<_Compare> __c(__comp);
5630 return __prev_permutation<_Comp_ref>(__first, __last, __c);
Howard Hinnant5e571422013-08-23 20:10:18 +00005631#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005632 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5633 return __prev_permutation<_Comp_ref>(__first, __last, __comp);
Howard Hinnant5e571422013-08-23 20:10:18 +00005634#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005635}
5636
5637template <class _BidirectionalIterator>
5638inline _LIBCPP_INLINE_VISIBILITY
5639bool
5640prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
5641{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005642 return _VSTD::prev_permutation(__first, __last,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005643 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
5644}
5645
5646template <class _Tp>
5647inline _LIBCPP_INLINE_VISIBILITY
5648typename enable_if
5649<
5650 is_integral<_Tp>::value,
5651 _Tp
5652>::type
5653__rotate_left(_Tp __t, _Tp __n = 1)
5654{
5655 const unsigned __bits = static_cast<unsigned>(sizeof(_Tp) * __CHAR_BIT__ - 1);
5656 __n &= __bits;
5657 return static_cast<_Tp>((__t << __n) | (static_cast<typename make_unsigned<_Tp>::type>(__t) >> (__bits - __n)));
5658}
5659
5660template <class _Tp>
5661inline _LIBCPP_INLINE_VISIBILITY
5662typename enable_if
5663<
5664 is_integral<_Tp>::value,
5665 _Tp
5666>::type
5667__rotate_right(_Tp __t, _Tp __n = 1)
5668{
5669 const unsigned __bits = static_cast<unsigned>(sizeof(_Tp) * __CHAR_BIT__ - 1);
5670 __n &= __bits;
5671 return static_cast<_Tp>((__t << (__bits - __n)) | (static_cast<typename make_unsigned<_Tp>::type>(__t) >> __n));
5672}
5673
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005674_LIBCPP_END_NAMESPACE_STD
5675
5676#endif // _LIBCPP_ALGORITHM