blob: b750616f0e84b008067980747e3e7f4e60486e7b [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001// -*- C++ -*-
2//===-------------------------- algorithm ---------------------------------===//
3//
Howard Hinnantc566dc32010-05-11 21:36:01 +00004// The LLVM Compiler Infrastructure
Howard Hinnantc51e1022010-05-11 19:42:16 +00005//
Howard Hinnantee11c312010-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 Hinnantc51e1022010-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>
Marshall Clowd607fdb2018-01-15 17:20:36 +000023 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000024 all_of(InputIterator first, InputIterator last, Predicate pred);
25
26template <class InputIterator, class Predicate>
Marshall Clowd607fdb2018-01-15 17:20:36 +000027 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000028 any_of(InputIterator first, InputIterator last, Predicate pred);
29
30template <class InputIterator, class Predicate>
Marshall Clowd607fdb2018-01-15 17:20:36 +000031 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000032 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
Marshall Clowde0169c2017-05-25 02:29:54 +000038template<class InputIterator, class Size, class Function>
39 InputIterator for_each_n(InputIterator first, Size n, Function f); // C++17
40
Howard Hinnantc51e1022010-05-11 19:42:16 +000041template <class InputIterator, class T>
Marshall Clowee0161e2018-01-15 19:26:05 +000042 constexpr InputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000043 find(InputIterator first, InputIterator last, const T& value);
44
45template <class InputIterator, class Predicate>
Marshall Clowee0161e2018-01-15 19:26:05 +000046 constexpr InputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000047 find_if(InputIterator first, InputIterator last, Predicate pred);
48
49template<class InputIterator, class Predicate>
Marshall Clowee0161e2018-01-15 19:26:05 +000050 InputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000051 find_if_not(InputIterator first, InputIterator last, Predicate pred);
52
53template <class ForwardIterator1, class ForwardIterator2>
Marshall Clowee0161e2018-01-15 19:26:05 +000054 ForwardIterator1 // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000055 find_end(ForwardIterator1 first1, ForwardIterator1 last1,
56 ForwardIterator2 first2, ForwardIterator2 last2);
57
58template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
Marshall Clowee0161e2018-01-15 19:26:05 +000059 ForwardIterator1 // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000060 find_end(ForwardIterator1 first1, ForwardIterator1 last1,
61 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
62
63template <class ForwardIterator1, class ForwardIterator2>
Marshall Clowee0161e2018-01-15 19:26:05 +000064 constexpr ForwardIterator1 // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000065 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
66 ForwardIterator2 first2, ForwardIterator2 last2);
67
68template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
Marshall Clowee0161e2018-01-15 19:26:05 +000069 constexpr ForwardIterator1 // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000070 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
71 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
72
73template <class ForwardIterator>
Marshall Clowee0161e2018-01-15 19:26:05 +000074 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000075 adjacent_find(ForwardIterator first, ForwardIterator last);
76
77template <class ForwardIterator, class BinaryPredicate>
Marshall Clowee0161e2018-01-15 19:26:05 +000078 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000079 adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
80
81template <class InputIterator, class T>
Marshall Clow3c0558f2018-01-15 19:40:34 +000082 constexpr typename iterator_traits<InputIterator>::difference_type // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000083 count(InputIterator first, InputIterator last, const T& value);
84
85template <class InputIterator, class Predicate>
Marshall Clow3c0558f2018-01-15 19:40:34 +000086 constexpr typename iterator_traits<InputIterator>::difference_type // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000087 count_if(InputIterator first, InputIterator last, Predicate pred);
88
89template <class InputIterator1, class InputIterator2>
Marshall Clow30bf3022018-01-16 02:04:10 +000090 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000091 mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
92
Marshall Clow96b42b22013-05-09 21:14:23 +000093template <class InputIterator1, class InputIterator2>
Marshall Clow30bf3022018-01-16 02:04:10 +000094 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20
Aditya Kumar3a0179a2016-08-25 11:52:38 +000095 mismatch(InputIterator1 first1, InputIterator1 last1,
Marshall Clow96b42b22013-05-09 21:14:23 +000096 InputIterator2 first2, InputIterator2 last2); // **C++14**
97
Howard Hinnantc51e1022010-05-11 19:42:16 +000098template <class InputIterator1, class InputIterator2, class BinaryPredicate>
Marshall Clow30bf3022018-01-16 02:04:10 +000099 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000100 mismatch(InputIterator1 first1, InputIterator1 last1,
101 InputIterator2 first2, BinaryPredicate pred);
102
Marshall Clow96b42b22013-05-09 21:14:23 +0000103template <class InputIterator1, class InputIterator2, class BinaryPredicate>
Marshall Clow30bf3022018-01-16 02:04:10 +0000104 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20
Marshall Clow96b42b22013-05-09 21:14:23 +0000105 mismatch(InputIterator1 first1, InputIterator1 last1,
106 InputIterator2 first2, InputIterator2 last2,
107 BinaryPredicate pred); // **C++14**
108
Howard Hinnantc51e1022010-05-11 19:42:16 +0000109template <class InputIterator1, class InputIterator2>
Marshall Clow30bf3022018-01-16 02:04:10 +0000110 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000111 equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
112
Marshall Clow96b42b22013-05-09 21:14:23 +0000113template <class InputIterator1, class InputIterator2>
Marshall Clow30bf3022018-01-16 02:04:10 +0000114 constexpr bool // constexpr in C++20
Aditya Kumar3a0179a2016-08-25 11:52:38 +0000115 equal(InputIterator1 first1, InputIterator1 last1,
Marshall Clow96b42b22013-05-09 21:14:23 +0000116 InputIterator2 first2, InputIterator2 last2); // **C++14**
117
Howard Hinnantc51e1022010-05-11 19:42:16 +0000118template <class InputIterator1, class InputIterator2, class BinaryPredicate>
Marshall Clow30bf3022018-01-16 02:04:10 +0000119 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000120 equal(InputIterator1 first1, InputIterator1 last1,
121 InputIterator2 first2, BinaryPredicate pred);
122
Marshall Clow96b42b22013-05-09 21:14:23 +0000123template <class InputIterator1, class InputIterator2, class BinaryPredicate>
Marshall Clow30bf3022018-01-16 02:04:10 +0000124 constexpr bool // constexpr in C++20
Marshall Clow96b42b22013-05-09 21:14:23 +0000125 equal(InputIterator1 first1, InputIterator1 last1,
126 InputIterator2 first2, InputIterator2 last2,
127 BinaryPredicate pred); // **C++14**
128
Howard Hinnantc51e1022010-05-11 19:42:16 +0000129template<class ForwardIterator1, class ForwardIterator2>
Marshall Clow96d050a2018-01-15 16:16:32 +0000130 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000131 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
132 ForwardIterator2 first2);
133
Marshall Clow96b42b22013-05-09 21:14:23 +0000134template<class ForwardIterator1, class ForwardIterator2>
Marshall Clow96d050a2018-01-15 16:16:32 +0000135 constexpr bool // constexpr in C++20
Marshall Clow96b42b22013-05-09 21:14:23 +0000136 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
137 ForwardIterator2 first2, ForwardIterator2 last2); // **C++14**
138
Howard Hinnantc51e1022010-05-11 19:42:16 +0000139template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
Marshall Clow96d050a2018-01-15 16:16:32 +0000140 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000141 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
142 ForwardIterator2 first2, BinaryPredicate pred);
143
Marshall Clow96b42b22013-05-09 21:14:23 +0000144template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
Marshall Clow96d050a2018-01-15 16:16:32 +0000145 constexpr bool // constexpr in C++20
Marshall Clow96b42b22013-05-09 21:14:23 +0000146 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
147 ForwardIterator2 first2, ForwardIterator2 last2,
148 BinaryPredicate pred); // **C++14**
149
Howard Hinnantc51e1022010-05-11 19:42:16 +0000150template <class ForwardIterator1, class ForwardIterator2>
Marshall Clow323fc5b2018-01-16 15:48:27 +0000151 constexpr ForwardIterator1 // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000152 search(ForwardIterator1 first1, ForwardIterator1 last1,
153 ForwardIterator2 first2, ForwardIterator2 last2);
154
155template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
Marshall Clow323fc5b2018-01-16 15:48:27 +0000156 constexpr ForwardIterator1 // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000157 search(ForwardIterator1 first1, ForwardIterator1 last1,
158 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
159
160template <class ForwardIterator, class Size, class T>
Marshall Clow323fc5b2018-01-16 15:48:27 +0000161 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000162 search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value);
163
164template <class ForwardIterator, class Size, class T, class BinaryPredicate>
Marshall Clow323fc5b2018-01-16 15:48:27 +0000165 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000166 search_n(ForwardIterator first, ForwardIterator last,
167 Size count, const T& value, BinaryPredicate pred);
168
169template <class InputIterator, class OutputIterator>
170 OutputIterator
171 copy(InputIterator first, InputIterator last, OutputIterator result);
172
173template<class InputIterator, class OutputIterator, class Predicate>
174 OutputIterator
175 copy_if(InputIterator first, InputIterator last,
176 OutputIterator result, Predicate pred);
177
178template<class InputIterator, class Size, class OutputIterator>
179 OutputIterator
180 copy_n(InputIterator first, Size n, OutputIterator result);
181
182template <class BidirectionalIterator1, class BidirectionalIterator2>
183 BidirectionalIterator2
184 copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last,
185 BidirectionalIterator2 result);
186
187template <class ForwardIterator1, class ForwardIterator2>
188 ForwardIterator2
189 swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2);
190
191template <class ForwardIterator1, class ForwardIterator2>
192 void
193 iter_swap(ForwardIterator1 a, ForwardIterator2 b);
194
195template <class InputIterator, class OutputIterator, class UnaryOperation>
Marshall Clow31427c62018-01-19 17:45:39 +0000196 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000197 transform(InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op);
198
199template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation>
Marshall Clow31427c62018-01-19 17:45:39 +0000200 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000201 transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2,
202 OutputIterator result, BinaryOperation binary_op);
203
204template <class ForwardIterator, class T>
Marshall Clow01bbbd22018-01-19 18:07:29 +0000205 constexpr void // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000206 replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value);
207
208template <class ForwardIterator, class Predicate, class T>
Marshall Clow01bbbd22018-01-19 18:07:29 +0000209 constexpr void // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000210 replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value);
211
212template <class InputIterator, class OutputIterator, class T>
Marshall Clow01bbbd22018-01-19 18:07:29 +0000213 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000214 replace_copy(InputIterator first, InputIterator last, OutputIterator result,
215 const T& old_value, const T& new_value);
216
217template <class InputIterator, class OutputIterator, class Predicate, class T>
Marshall Clow01bbbd22018-01-19 18:07:29 +0000218 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000219 replace_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value);
220
221template <class ForwardIterator, class T>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +0000222 constexpr void // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000223 fill(ForwardIterator first, ForwardIterator last, const T& value);
224
225template <class OutputIterator, class Size, class T>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +0000226 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000227 fill_n(OutputIterator first, Size n, const T& value);
228
229template <class ForwardIterator, class Generator>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +0000230 constexpr void // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000231 generate(ForwardIterator first, ForwardIterator last, Generator gen);
232
233template <class OutputIterator, class Size, class Generator>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +0000234 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000235 generate_n(OutputIterator first, Size n, Generator gen);
236
237template <class ForwardIterator, class T>
238 ForwardIterator
239 remove(ForwardIterator first, ForwardIterator last, const T& value);
240
241template <class ForwardIterator, class Predicate>
242 ForwardIterator
243 remove_if(ForwardIterator first, ForwardIterator last, Predicate pred);
244
245template <class InputIterator, class OutputIterator, class T>
246 OutputIterator
247 remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value);
248
249template <class InputIterator, class OutputIterator, class Predicate>
250 OutputIterator
251 remove_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred);
252
253template <class ForwardIterator>
254 ForwardIterator
255 unique(ForwardIterator first, ForwardIterator last);
256
257template <class ForwardIterator, class BinaryPredicate>
258 ForwardIterator
259 unique(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
260
261template <class InputIterator, class OutputIterator>
262 OutputIterator
263 unique_copy(InputIterator first, InputIterator last, OutputIterator result);
264
265template <class InputIterator, class OutputIterator, class BinaryPredicate>
266 OutputIterator
267 unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate pred);
268
269template <class BidirectionalIterator>
270 void
271 reverse(BidirectionalIterator first, BidirectionalIterator last);
272
273template <class BidirectionalIterator, class OutputIterator>
274 OutputIterator
275 reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result);
276
277template <class ForwardIterator>
278 ForwardIterator
279 rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last);
280
281template <class ForwardIterator, class OutputIterator>
282 OutputIterator
283 rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result);
284
285template <class RandomAccessIterator>
286 void
Marshall Clowfac06e52017-03-23 13:43:37 +0000287 random_shuffle(RandomAccessIterator first, RandomAccessIterator last); // deprecated in C++14, removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000288
289template <class RandomAccessIterator, class RandomNumberGenerator>
290 void
Marshall Clow83f35392014-03-03 06:14:19 +0000291 random_shuffle(RandomAccessIterator first, RandomAccessIterator last,
Marshall Clowfac06e52017-03-23 13:43:37 +0000292 RandomNumberGenerator& rand); // deprecated in C++14, removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000293
Eric Fiselier1208fcd2016-08-28 22:14:37 +0000294template<class PopulationIterator, class SampleIterator,
295 class Distance, class UniformRandomBitGenerator>
296 SampleIterator sample(PopulationIterator first, PopulationIterator last,
297 SampleIterator out, Distance n,
298 UniformRandomBitGenerator&& g); // C++17
299
Howard Hinnant578ac0f2010-05-26 17:49:34 +0000300template<class RandomAccessIterator, class UniformRandomNumberGenerator>
301 void shuffle(RandomAccessIterator first, RandomAccessIterator last,
Howard Hinnanta5e71782010-11-18 01:47:02 +0000302 UniformRandomNumberGenerator&& g);
Howard Hinnant578ac0f2010-05-26 17:49:34 +0000303
Howard Hinnantc51e1022010-05-11 19:42:16 +0000304template <class InputIterator, class Predicate>
Marshall Clow96d050a2018-01-15 16:16:32 +0000305 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000306 is_partitioned(InputIterator first, InputIterator last, Predicate pred);
307
308template <class ForwardIterator, class Predicate>
309 ForwardIterator
310 partition(ForwardIterator first, ForwardIterator last, Predicate pred);
311
312template <class InputIterator, class OutputIterator1,
313 class OutputIterator2, class Predicate>
314 pair<OutputIterator1, OutputIterator2>
315 partition_copy(InputIterator first, InputIterator last,
316 OutputIterator1 out_true, OutputIterator2 out_false,
317 Predicate pred);
318
319template <class ForwardIterator, class Predicate>
320 ForwardIterator
321 stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred);
322
323template<class ForwardIterator, class Predicate>
Marshall Clowe00916c2018-01-16 02:34:41 +0000324 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000325 partition_point(ForwardIterator first, ForwardIterator last, Predicate pred);
326
327template <class ForwardIterator>
Marshall Clow96d050a2018-01-15 16:16:32 +0000328 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000329 is_sorted(ForwardIterator first, ForwardIterator last);
330
331template <class ForwardIterator, class Compare>
332 bool
333 is_sorted(ForwardIterator first, ForwardIterator last, Compare comp);
334
335template<class ForwardIterator>
Marshall Clow3c0558f2018-01-15 19:40:34 +0000336 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000337 is_sorted_until(ForwardIterator first, ForwardIterator last);
338
339template <class ForwardIterator, class Compare>
Marshall Clow3c0558f2018-01-15 19:40:34 +0000340 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000341 is_sorted_until(ForwardIterator first, ForwardIterator last, Compare comp);
342
343template <class RandomAccessIterator>
344 void
345 sort(RandomAccessIterator first, RandomAccessIterator last);
346
347template <class RandomAccessIterator, class Compare>
348 void
349 sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
350
351template <class RandomAccessIterator>
352 void
353 stable_sort(RandomAccessIterator first, RandomAccessIterator last);
354
355template <class RandomAccessIterator, class Compare>
356 void
357 stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
358
359template <class RandomAccessIterator>
360 void
361 partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last);
362
363template <class RandomAccessIterator, class Compare>
364 void
365 partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp);
366
367template <class InputIterator, class RandomAccessIterator>
368 RandomAccessIterator
369 partial_sort_copy(InputIterator first, InputIterator last,
370 RandomAccessIterator result_first, RandomAccessIterator result_last);
371
372template <class InputIterator, class RandomAccessIterator, class Compare>
373 RandomAccessIterator
374 partial_sort_copy(InputIterator first, InputIterator last,
375 RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp);
376
377template <class RandomAccessIterator>
378 void
379 nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last);
380
381template <class RandomAccessIterator, class Compare>
382 void
383 nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp);
384
385template <class ForwardIterator, class T>
Marshall Clowe00916c2018-01-16 02:34:41 +0000386 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000387 lower_bound(ForwardIterator first, ForwardIterator last, const T& value);
388
389template <class ForwardIterator, class T, class Compare>
Marshall Clowe00916c2018-01-16 02:34:41 +0000390 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000391 lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
392
393template <class ForwardIterator, class T>
Marshall Clowe00916c2018-01-16 02:34:41 +0000394 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000395 upper_bound(ForwardIterator first, ForwardIterator last, const T& value);
396
397template <class ForwardIterator, class T, class Compare>
Marshall Clowe00916c2018-01-16 02:34:41 +0000398 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000399 upper_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
400
401template <class ForwardIterator, class T>
Marshall Clowe00916c2018-01-16 02:34:41 +0000402 constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000403 equal_range(ForwardIterator first, ForwardIterator last, const T& value);
404
405template <class ForwardIterator, class T, class Compare>
Marshall Clowe00916c2018-01-16 02:34:41 +0000406 constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000407 equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
408
409template <class ForwardIterator, class T>
Marshall Clowe00916c2018-01-16 02:34:41 +0000410 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000411 binary_search(ForwardIterator first, ForwardIterator last, const T& value);
412
413template <class ForwardIterator, class T, class Compare>
Marshall Clowe00916c2018-01-16 02:34:41 +0000414 bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000415 binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
416
417template <class InputIterator1, class InputIterator2, class OutputIterator>
418 OutputIterator
419 merge(InputIterator1 first1, InputIterator1 last1,
420 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
421
422template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
423 OutputIterator
424 merge(InputIterator1 first1, InputIterator1 last1,
425 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
426
427template <class BidirectionalIterator>
428 void
429 inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last);
430
431template <class BidirectionalIterator, class Compare>
432 void
433 inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp);
434
435template <class InputIterator1, class InputIterator2>
436 bool
437 includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
438
439template <class InputIterator1, class InputIterator2, class Compare>
440 bool
441 includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp);
442
443template <class InputIterator1, class InputIterator2, class OutputIterator>
444 OutputIterator
445 set_union(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_union(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_intersection(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_intersection(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_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_difference(InputIterator1 first1, InputIterator1 last1,
471 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
472
473template <class InputIterator1, class InputIterator2, class OutputIterator>
474 OutputIterator
475 set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
476 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
477
478template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
479 OutputIterator
480 set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
481 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
482
483template <class RandomAccessIterator>
484 void
485 push_heap(RandomAccessIterator first, RandomAccessIterator last);
486
487template <class RandomAccessIterator, class Compare>
488 void
489 push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
490
491template <class RandomAccessIterator>
492 void
493 pop_heap(RandomAccessIterator first, RandomAccessIterator last);
494
495template <class RandomAccessIterator, class Compare>
496 void
497 pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
498
499template <class RandomAccessIterator>
500 void
501 make_heap(RandomAccessIterator first, RandomAccessIterator last);
502
503template <class RandomAccessIterator, class Compare>
504 void
505 make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
506
507template <class RandomAccessIterator>
508 void
509 sort_heap(RandomAccessIterator first, RandomAccessIterator last);
510
511template <class RandomAccessIterator, class Compare>
512 void
513 sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
514
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000515template <class RandomAccessIterator>
Marshall Clow96d050a2018-01-15 16:16:32 +0000516 constexpr bool // constexpr in C++20
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000517 is_heap(RandomAccessIterator first, RandomAccessiterator last);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000518
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000519template <class RandomAccessIterator, class Compare>
Marshall Clow96d050a2018-01-15 16:16:32 +0000520 constexpr bool // constexpr in C++20
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000521 is_heap(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000522
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000523template <class RandomAccessIterator>
Marshall Clow96d050a2018-01-15 16:16:32 +0000524 constexpr RandomAccessIterator // constexpr in C++20
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000525 is_heap_until(RandomAccessIterator first, RandomAccessiterator last);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000526
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000527template <class RandomAccessIterator, class Compare>
Marshall Clow96d050a2018-01-15 16:16:32 +0000528 constexpr RandomAccessIterator // constexpr in C++20
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000529 is_heap_until(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000530
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000531template <class ForwardIterator>
532 ForwardIterator
Marshall Clow9e173072015-05-10 13:53:31 +0000533 min_element(ForwardIterator first, ForwardIterator last); // constexpr in C++14
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000534
535template <class ForwardIterator, class Compare>
536 ForwardIterator
Marshall Clow9e173072015-05-10 13:53:31 +0000537 min_element(ForwardIterator first, ForwardIterator last, Compare comp); // constexpr in C++14
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000538
Howard Hinnantc51e1022010-05-11 19:42:16 +0000539template <class T>
540 const T&
Marshall Clowe9dca072014-02-19 16:51:35 +0000541 min(const T& a, const T& b); // constexpr in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000542
543template <class T, class Compare>
544 const T&
Marshall Clowe9dca072014-02-19 16:51:35 +0000545 min(const T& a, const T& b, Compare comp); // constexpr in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000546
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000547template<class T>
548 T
Marshall Clowe9dca072014-02-19 16:51:35 +0000549 min(initializer_list<T> t); // constexpr in C++14
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000550
551template<class T, class Compare>
552 T
Marshall Clowe9dca072014-02-19 16:51:35 +0000553 min(initializer_list<T> t, Compare comp); // constexpr in C++14
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000554
Marshall Clow3e18d0e2016-03-07 22:43:49 +0000555template<class T>
556 constexpr const T& clamp( const T& v, const T& lo, const T& hi ); // C++17
557
558template<class T, class Compare>
559 constexpr const T& clamp( const T& v, const T& lo, const T& hi, Compare comp ); // C++17
560
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000561template <class ForwardIterator>
562 ForwardIterator
Marshall Clow9e173072015-05-10 13:53:31 +0000563 max_element(ForwardIterator first, ForwardIterator last); // constexpr in C++14
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000564
565template <class ForwardIterator, class Compare>
566 ForwardIterator
Marshall Clow9e173072015-05-10 13:53:31 +0000567 max_element(ForwardIterator first, ForwardIterator last, Compare comp); // constexpr in C++14
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000568
Howard Hinnantc51e1022010-05-11 19:42:16 +0000569template <class T>
570 const T&
Marshall Clowe9dca072014-02-19 16:51:35 +0000571 max(const T& a, const T& b); // constexpr in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000572
573template <class T, class Compare>
574 const T&
Marshall Clowe9dca072014-02-19 16:51:35 +0000575 max(const T& a, const T& b, Compare comp); // constexpr in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000576
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000577template<class T>
578 T
Marshall Clowe9dca072014-02-19 16:51:35 +0000579 max(initializer_list<T> t); // constexpr in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000580
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000581template<class T, class Compare>
582 T
Marshall Clowe9dca072014-02-19 16:51:35 +0000583 max(initializer_list<T> t, Compare comp); // constexpr in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000584
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000585template<class ForwardIterator>
586 pair<ForwardIterator, ForwardIterator>
Marshall Clow9e173072015-05-10 13:53:31 +0000587 minmax_element(ForwardIterator first, ForwardIterator last); // constexpr in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000588
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000589template<class ForwardIterator, class Compare>
590 pair<ForwardIterator, ForwardIterator>
Marshall Clow9e173072015-05-10 13:53:31 +0000591 minmax_element(ForwardIterator first, ForwardIterator last, Compare comp); // constexpr in C++14
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000592
593template<class T>
594 pair<const T&, const T&>
Marshall Clowe9dca072014-02-19 16:51:35 +0000595 minmax(const T& a, const T& b); // constexpr in C++14
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000596
597template<class T, class Compare>
598 pair<const T&, const T&>
Marshall Clowe9dca072014-02-19 16:51:35 +0000599 minmax(const T& a, const T& b, Compare comp); // constexpr in C++14
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000600
601template<class T>
602 pair<T, T>
Marshall Clowe9dca072014-02-19 16:51:35 +0000603 minmax(initializer_list<T> t); // constexpr in C++14
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000604
605template<class T, class Compare>
606 pair<T, T>
Marshall Clowe9dca072014-02-19 16:51:35 +0000607 minmax(initializer_list<T> t, Compare comp); // constexpr in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000608
609template <class InputIterator1, class InputIterator2>
610 bool
611 lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
612
613template <class InputIterator1, class InputIterator2, class Compare>
614 bool
615 lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
616 InputIterator2 first2, InputIterator2 last2, Compare comp);
617
618template <class BidirectionalIterator>
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000619 bool
Howard Hinnantc51e1022010-05-11 19:42:16 +0000620 next_permutation(BidirectionalIterator first, BidirectionalIterator last);
621
622template <class BidirectionalIterator, class Compare>
623 bool
624 next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
625
626template <class BidirectionalIterator>
627 bool
628 prev_permutation(BidirectionalIterator first, BidirectionalIterator last);
629
630template <class BidirectionalIterator, class Compare>
631 bool
632 prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
633
634} // std
635
636*/
637
638#include <__config>
639#include <initializer_list>
640#include <type_traits>
641#include <cstring>
Eric Fiselier6bfed252016-04-21 23:38:59 +0000642#include <utility> // needed to provide swap_ranges.
Howard Hinnantc51e1022010-05-11 19:42:16 +0000643#include <memory>
Marshall Clowa40686b2018-01-08 19:18:00 +0000644#include <functional>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000645#include <iterator>
Howard Hinnant60e5cf42012-07-26 17:09:09 +0000646#include <cstddef>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000647
Howard Hinnantea382952013-08-14 18:00:20 +0000648#if defined(__IBMCPP__)
649#include "support/ibm/support.h"
650#endif
Eric Fiselier4a984f02017-05-10 20:57:45 +0000651#if defined(_LIBCPP_COMPILER_MSVC)
Eric Fiselier31b7f852017-05-10 21:30:04 +0000652#include <intrin.h>
Howard Hinnant8ad70912013-09-17 01:34:47 +0000653#endif
Howard Hinnantea382952013-08-14 18:00:20 +0000654
Eric Fiselier14b6de92014-08-10 23:53:08 +0000655#include <__debug>
656
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000657#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000658#pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000659#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000660
Eric Fiselierf4433a32017-05-31 22:07:49 +0000661_LIBCPP_PUSH_MACROS
662#include <__undef_macros>
663
664
Howard Hinnantc51e1022010-05-11 19:42:16 +0000665_LIBCPP_BEGIN_NAMESPACE_STD
666
Marshall Clowe9dca072014-02-19 16:51:35 +0000667// I'd like to replace these with _VSTD::equal_to<void>, but can't because:
668// * That only works with C++14 and later, and
669// * We haven't included <functional> here.
Howard Hinnantc51e1022010-05-11 19:42:16 +0000670template <class _T1, class _T2 = _T1>
671struct __equal_to
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 __equal_to<_T1, _T1>
681{
Marshall Clowe9dca072014-02-19 16:51:35 +0000682 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
683 bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000684};
685
686template <class _T1>
687struct __equal_to<const _T1, _T1>
688{
Marshall Clowe9dca072014-02-19 16:51:35 +0000689 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
690 bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000691};
692
693template <class _T1>
694struct __equal_to<_T1, const _T1>
695{
Marshall Clowe9dca072014-02-19 16:51:35 +0000696 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
697 bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000698};
699
700template <class _T1, class _T2 = _T1>
701struct __less
702{
Aditya Kumar3a0179a2016-08-25 11:52:38 +0000703 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Marshall Clowe9dca072014-02-19 16:51:35 +0000704 bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
705
706 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
707 bool operator()(const _T1& __x, const _T2& __y) const {return __x < __y;}
708
709 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
710 bool operator()(const _T2& __x, const _T1& __y) const {return __x < __y;}
711
712 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
713 bool operator()(const _T2& __x, const _T2& __y) const {return __x < __y;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000714};
715
716template <class _T1>
717struct __less<_T1, _T1>
718{
Marshall Clowe9dca072014-02-19 16:51:35 +0000719 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
720 bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000721};
722
723template <class _T1>
724struct __less<const _T1, _T1>
725{
Marshall Clowe9dca072014-02-19 16:51:35 +0000726 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
727 bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000728};
729
730template <class _T1>
731struct __less<_T1, const _T1>
732{
Marshall Clowe9dca072014-02-19 16:51:35 +0000733 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
734 bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000735};
736
737template <class _Predicate>
Marshall Clow738d1042017-08-28 23:16:13 +0000738class __invert // invert the sense of a comparison
Howard Hinnantc51e1022010-05-11 19:42:16 +0000739{
740private:
741 _Predicate __p_;
742public:
Marshall Clow738d1042017-08-28 23:16:13 +0000743 _LIBCPP_INLINE_VISIBILITY __invert() {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000744
745 _LIBCPP_INLINE_VISIBILITY
Marshall Clow738d1042017-08-28 23:16:13 +0000746 explicit __invert(_Predicate __p) : __p_(__p) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000747
748 template <class _T1>
749 _LIBCPP_INLINE_VISIBILITY
750 bool operator()(const _T1& __x) {return !__p_(__x);}
751
752 template <class _T1, class _T2>
753 _LIBCPP_INLINE_VISIBILITY
Marshall Clow738d1042017-08-28 23:16:13 +0000754 bool operator()(const _T1& __x, const _T2& __y) {return __p_(__y, __x);}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000755};
756
Howard Hinnant6148a9b2013-08-23 20:10:18 +0000757#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000758
759template <class _Compare>
760struct __debug_less
761{
762 _Compare __comp_;
763 __debug_less(_Compare& __c) : __comp_(__c) {}
Eric Fiselier32adec82016-07-19 23:27:18 +0000764
Howard Hinnantc51e1022010-05-11 19:42:16 +0000765 template <class _Tp, class _Up>
766 bool operator()(const _Tp& __x, const _Up& __y)
767 {
768 bool __r = __comp_(__x, __y);
769 if (__r)
Eric Fiselier32adec82016-07-19 23:27:18 +0000770 __do_compare_assert(0, __y, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000771 return __r;
772 }
Eric Fiselier32adec82016-07-19 23:27:18 +0000773
774 template <class _LHS, class _RHS>
775 inline _LIBCPP_INLINE_VISIBILITY
776 decltype((void)_VSTD::declval<_Compare&>()(
777 _VSTD::declval<_LHS const&>(), _VSTD::declval<_RHS const&>()))
778 __do_compare_assert(int, _LHS const& __l, _RHS const& __r) {
779 _LIBCPP_ASSERT(!__comp_(__l, __r),
780 "Comparator does not induce a strict weak ordering");
781 }
782
783 template <class _LHS, class _RHS>
784 inline _LIBCPP_INLINE_VISIBILITY
785 void __do_compare_assert(long, _LHS const&, _RHS const&) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000786};
787
Howard Hinnant6148a9b2013-08-23 20:10:18 +0000788#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000789
Howard Hinnant7eaf1742010-05-27 20:06:01 +0000790// Precondition: __x != 0
Howard Hinnant28b24882011-12-01 20:21:04 +0000791inline _LIBCPP_INLINE_VISIBILITY
Eric Fiselier31b7f852017-05-10 21:30:04 +0000792unsigned __ctz(unsigned __x) {
793#ifndef _LIBCPP_COMPILER_MSVC
Howard Hinnant28b24882011-12-01 20:21:04 +0000794 return static_cast<unsigned>(__builtin_ctz(__x));
Eric Fiselier31b7f852017-05-10 21:30:04 +0000795#else
796 static_assert(sizeof(unsigned) == sizeof(unsigned long), "");
797 static_assert(sizeof(unsigned long) == 4, "");
798 unsigned long where;
799 // Search from LSB to MSB for first set bit.
800 // Returns zero if no set bit is found.
Shoaib Meenai71de3542017-12-05 17:46:23 +0000801 if (_BitScanForward(&where, __x))
Eric Fiselier31b7f852017-05-10 21:30:04 +0000802 return where;
803 return 32;
804#endif
Howard Hinnant28b24882011-12-01 20:21:04 +0000805}
806
807inline _LIBCPP_INLINE_VISIBILITY
Eric Fiselier31b7f852017-05-10 21:30:04 +0000808unsigned long __ctz(unsigned long __x) {
809#ifndef _LIBCPP_COMPILER_MSVC
Howard Hinnant28b24882011-12-01 20:21:04 +0000810 return static_cast<unsigned long>(__builtin_ctzl(__x));
Eric Fiselier31b7f852017-05-10 21:30:04 +0000811#else
812 static_assert(sizeof(unsigned long) == sizeof(unsigned), "");
813 return __ctz(static_cast<unsigned>(__x));
814#endif
Howard Hinnant28b24882011-12-01 20:21:04 +0000815}
816
817inline _LIBCPP_INLINE_VISIBILITY
Eric Fiselier31b7f852017-05-10 21:30:04 +0000818unsigned long long __ctz(unsigned long long __x) {
819#ifndef _LIBCPP_COMPILER_MSVC
Howard Hinnant28b24882011-12-01 20:21:04 +0000820 return static_cast<unsigned long long>(__builtin_ctzll(__x));
Eric Fiselier31b7f852017-05-10 21:30:04 +0000821#else
822 unsigned long where;
823// Search from LSB to MSB for first set bit.
824// Returns zero if no set bit is found.
825#if defined(_LIBCPP_HAS_BITSCAN64)
826 (defined(_M_AMD64) || defined(__x86_64__))
Shoaib Meenai71de3542017-12-05 17:46:23 +0000827 if (_BitScanForward64(&where, __x))
Eric Fiselier31b7f852017-05-10 21:30:04 +0000828 return static_cast<int>(where);
829#else
830 // Win32 doesn't have _BitScanForward64 so emulate it with two 32 bit calls.
831 // Scan the Low Word.
Shoaib Meenai71de3542017-12-05 17:46:23 +0000832 if (_BitScanForward(&where, static_cast<unsigned long>(__x)))
Eric Fiselier31b7f852017-05-10 21:30:04 +0000833 return where;
834 // Scan the High Word.
Shoaib Meenai71de3542017-12-05 17:46:23 +0000835 if (_BitScanForward(&where, static_cast<unsigned long>(__x >> 32)))
Eric Fiselier31b7f852017-05-10 21:30:04 +0000836 return where + 32; // Create a bit offset from the LSB.
837#endif
838 return 64;
839#endif // _LIBCPP_COMPILER_MSVC
Howard Hinnant28b24882011-12-01 20:21:04 +0000840}
Howard Hinnant7eaf1742010-05-27 20:06:01 +0000841
842// Precondition: __x != 0
Howard Hinnant28b24882011-12-01 20:21:04 +0000843inline _LIBCPP_INLINE_VISIBILITY
Eric Fiselier31b7f852017-05-10 21:30:04 +0000844unsigned __clz(unsigned __x) {
845#ifndef _LIBCPP_COMPILER_MSVC
Howard Hinnant28b24882011-12-01 20:21:04 +0000846 return static_cast<unsigned>(__builtin_clz(__x));
Eric Fiselier31b7f852017-05-10 21:30:04 +0000847#else
848 static_assert(sizeof(unsigned) == sizeof(unsigned long), "");
849 static_assert(sizeof(unsigned long) == 4, "");
850 unsigned long where;
851 // Search from LSB to MSB for first set bit.
852 // Returns zero if no set bit is found.
Shoaib Meenai71de3542017-12-05 17:46:23 +0000853 if (_BitScanReverse(&where, __x))
Eric Fiselier31b7f852017-05-10 21:30:04 +0000854 return 31 - where;
855 return 32; // Undefined Behavior.
856#endif
Howard Hinnant28b24882011-12-01 20:21:04 +0000857}
858
859inline _LIBCPP_INLINE_VISIBILITY
Eric Fiselier31b7f852017-05-10 21:30:04 +0000860unsigned long __clz(unsigned long __x) {
861#ifndef _LIBCPP_COMPILER_MSVC
Howard Hinnant28b24882011-12-01 20:21:04 +0000862 return static_cast<unsigned long>(__builtin_clzl (__x));
Eric Fiselier31b7f852017-05-10 21:30:04 +0000863#else
864 static_assert(sizeof(unsigned) == sizeof(unsigned long), "");
865 return __clz(static_cast<unsigned>(__x));
866#endif
Howard Hinnant28b24882011-12-01 20:21:04 +0000867}
868
869inline _LIBCPP_INLINE_VISIBILITY
Eric Fiselier31b7f852017-05-10 21:30:04 +0000870unsigned long long __clz(unsigned long long __x) {
871#ifndef _LIBCPP_COMPILER_MSVC
Howard Hinnant28b24882011-12-01 20:21:04 +0000872 return static_cast<unsigned long long>(__builtin_clzll(__x));
Eric Fiselier31b7f852017-05-10 21:30:04 +0000873#else
874 unsigned long where;
875// BitScanReverse scans from MSB to LSB for first set bit.
876// Returns 0 if no set bit is found.
877#if defined(_LIBCPP_HAS_BITSCAN64)
Shoaib Meenai71de3542017-12-05 17:46:23 +0000878 if (_BitScanReverse64(&where, __x))
Eric Fiselier31b7f852017-05-10 21:30:04 +0000879 return static_cast<int>(63 - where);
880#else
881 // Scan the high 32 bits.
Shoaib Meenai71de3542017-12-05 17:46:23 +0000882 if (_BitScanReverse(&where, static_cast<unsigned long>(__x >> 32)))
Eric Fiselier31b7f852017-05-10 21:30:04 +0000883 return 63 - (where + 32); // Create a bit offset from the MSB.
884 // Scan the low 32 bits.
Shoaib Meenai71de3542017-12-05 17:46:23 +0000885 if (_BitScanReverse(&where, static_cast<unsigned long>(__x)))
Eric Fiselier31b7f852017-05-10 21:30:04 +0000886 return 63 - where;
887#endif
888 return 64; // Undefined Behavior.
889#endif // _LIBCPP_COMPILER_MSVC
Howard Hinnant28b24882011-12-01 20:21:04 +0000890}
Howard Hinnant7eaf1742010-05-27 20:06:01 +0000891
Eric Fiselier31b7f852017-05-10 21:30:04 +0000892inline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned __x) {
893#ifndef _LIBCPP_COMPILER_MSVC
894 return __builtin_popcount (__x);
895#else
896 static_assert(sizeof(unsigned) == 4, "");
897 return __popcnt(__x);
898#endif
899}
900
901inline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned long __x) {
902#ifndef _LIBCPP_COMPILER_MSVC
903 return __builtin_popcountl (__x);
904#else
905 static_assert(sizeof(unsigned long) == 4, "");
906 return __popcnt(__x);
907#endif
908}
909
910inline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned long long __x) {
911#ifndef _LIBCPP_COMPILER_MSVC
912 return __builtin_popcountll(__x);
913#else
914 static_assert(sizeof(unsigned long long) == 8, "");
915 return __popcnt64(__x);
916#endif
917}
Howard Hinnant7eaf1742010-05-27 20:06:01 +0000918
Howard Hinnantc51e1022010-05-11 19:42:16 +0000919// all_of
920
921template <class _InputIterator, class _Predicate>
Marshall Clowd607fdb2018-01-15 17:20:36 +0000922inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000923bool
924all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
925{
926 for (; __first != __last; ++__first)
927 if (!__pred(*__first))
928 return false;
929 return true;
930}
931
932// any_of
933
934template <class _InputIterator, class _Predicate>
Marshall Clowd607fdb2018-01-15 17:20:36 +0000935inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000936bool
937any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
938{
939 for (; __first != __last; ++__first)
940 if (__pred(*__first))
941 return true;
942 return false;
943}
944
945// none_of
946
947template <class _InputIterator, class _Predicate>
Marshall Clowd607fdb2018-01-15 17:20:36 +0000948inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000949bool
950none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
951{
952 for (; __first != __last; ++__first)
953 if (__pred(*__first))
954 return false;
955 return true;
956}
957
958// for_each
959
960template <class _InputIterator, class _Function>
961inline _LIBCPP_INLINE_VISIBILITY
962_Function
963for_each(_InputIterator __first, _InputIterator __last, _Function __f)
964{
965 for (; __first != __last; ++__first)
966 __f(*__first);
Marshall Clow78dbe462016-11-14 18:22:19 +0000967 return __f;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000968}
969
Marshall Clowc588fd62017-05-25 13:40:57 +0000970#if _LIBCPP_STD_VER > 14
Marshall Clowde0169c2017-05-25 02:29:54 +0000971// for_each_n
972
973template <class _InputIterator, class _Size, class _Function>
974inline _LIBCPP_INLINE_VISIBILITY
975_InputIterator
976for_each_n(_InputIterator __first, _Size __orig_n, _Function __f)
977{
978 typedef decltype(__convert_to_integral(__orig_n)) _IntegralSize;
979 _IntegralSize __n = __orig_n;
980 while (__n > 0)
981 {
982 __f(*__first);
983 ++__first;
984 --__n;
985 }
986 return __first;
987}
Marshall Clowc588fd62017-05-25 13:40:57 +0000988#endif
Marshall Clowde0169c2017-05-25 02:29:54 +0000989
Howard Hinnantc51e1022010-05-11 19:42:16 +0000990// find
991
992template <class _InputIterator, class _Tp>
Marshall Clow96d050a2018-01-15 16:16:32 +0000993inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000994_InputIterator
Howard Hinnantbf074022011-10-22 20:59:45 +0000995find(_InputIterator __first, _InputIterator __last, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000996{
997 for (; __first != __last; ++__first)
Howard Hinnantbf074022011-10-22 20:59:45 +0000998 if (*__first == __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000999 break;
1000 return __first;
1001}
1002
1003// find_if
1004
1005template <class _InputIterator, class _Predicate>
Marshall Clow96d050a2018-01-15 16:16:32 +00001006inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001007_InputIterator
1008find_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
1009{
1010 for (; __first != __last; ++__first)
1011 if (__pred(*__first))
1012 break;
1013 return __first;
1014}
1015
1016// find_if_not
1017
1018template<class _InputIterator, class _Predicate>
Marshall Clowee0161e2018-01-15 19:26:05 +00001019inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001020_InputIterator
1021find_if_not(_InputIterator __first, _InputIterator __last, _Predicate __pred)
1022{
1023 for (; __first != __last; ++__first)
1024 if (!__pred(*__first))
1025 break;
1026 return __first;
1027}
1028
1029// find_end
1030
1031template <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
Marshall Clowee0161e2018-01-15 19:26:05 +00001032_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator1
Howard Hinnantc51e1022010-05-11 19:42:16 +00001033__find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1034 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred,
1035 forward_iterator_tag, forward_iterator_tag)
1036{
1037 // modeled after search algorithm
1038 _ForwardIterator1 __r = __last1; // __last1 is the "default" answer
1039 if (__first2 == __last2)
1040 return __r;
1041 while (true)
1042 {
1043 while (true)
1044 {
1045 if (__first1 == __last1) // if source exhausted return last correct answer
1046 return __r; // (or __last1 if never found)
1047 if (__pred(*__first1, *__first2))
1048 break;
1049 ++__first1;
1050 }
1051 // *__first1 matches *__first2, now match elements after here
1052 _ForwardIterator1 __m1 = __first1;
1053 _ForwardIterator2 __m2 = __first2;
1054 while (true)
1055 {
1056 if (++__m2 == __last2)
1057 { // Pattern exhaused, record answer and search for another one
1058 __r = __first1;
1059 ++__first1;
1060 break;
1061 }
1062 if (++__m1 == __last1) // Source exhausted, return last answer
1063 return __r;
1064 if (!__pred(*__m1, *__m2)) // mismatch, restart with a new __first
1065 {
1066 ++__first1;
1067 break;
1068 } // else there is a match, check next elements
1069 }
1070 }
1071}
1072
1073template <class _BinaryPredicate, class _BidirectionalIterator1, class _BidirectionalIterator2>
Marshall Clowee0161e2018-01-15 19:26:05 +00001074_LIBCPP_CONSTEXPR_AFTER_CXX17 _BidirectionalIterator1
Howard Hinnantc51e1022010-05-11 19:42:16 +00001075__find_end(_BidirectionalIterator1 __first1, _BidirectionalIterator1 __last1,
1076 _BidirectionalIterator2 __first2, _BidirectionalIterator2 __last2, _BinaryPredicate __pred,
1077 bidirectional_iterator_tag, bidirectional_iterator_tag)
1078{
1079 // modeled after search algorithm (in reverse)
1080 if (__first2 == __last2)
1081 return __last1; // Everything matches an empty sequence
1082 _BidirectionalIterator1 __l1 = __last1;
1083 _BidirectionalIterator2 __l2 = __last2;
1084 --__l2;
1085 while (true)
1086 {
1087 // Find last element in sequence 1 that matchs *(__last2-1), with a mininum of loop checks
1088 while (true)
1089 {
1090 if (__first1 == __l1) // return __last1 if no element matches *__first2
1091 return __last1;
1092 if (__pred(*--__l1, *__l2))
1093 break;
1094 }
1095 // *__l1 matches *__l2, now match elements before here
1096 _BidirectionalIterator1 __m1 = __l1;
1097 _BidirectionalIterator2 __m2 = __l2;
1098 while (true)
1099 {
1100 if (__m2 == __first2) // If pattern exhausted, __m1 is the answer (works for 1 element pattern)
1101 return __m1;
1102 if (__m1 == __first1) // Otherwise if source exhaused, pattern not found
1103 return __last1;
1104 if (!__pred(*--__m1, *--__m2)) // if there is a mismatch, restart with a new __l1
1105 {
1106 break;
1107 } // else there is a match, check next elements
1108 }
1109 }
1110}
1111
1112template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
Marshall Clowedfd25a2014-06-10 18:51:55 +00001113_LIBCPP_CONSTEXPR_AFTER_CXX11 _RandomAccessIterator1
Howard Hinnantc51e1022010-05-11 19:42:16 +00001114__find_end(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
1115 _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
1116 random_access_iterator_tag, random_access_iterator_tag)
1117{
1118 // Take advantage of knowing source and pattern lengths. Stop short when source is smaller than pattern
1119 typename iterator_traits<_RandomAccessIterator2>::difference_type __len2 = __last2 - __first2;
1120 if (__len2 == 0)
1121 return __last1;
1122 typename iterator_traits<_RandomAccessIterator1>::difference_type __len1 = __last1 - __first1;
1123 if (__len1 < __len2)
1124 return __last1;
1125 const _RandomAccessIterator1 __s = __first1 + (__len2 - 1); // End of pattern match can't go before here
1126 _RandomAccessIterator1 __l1 = __last1;
1127 _RandomAccessIterator2 __l2 = __last2;
1128 --__l2;
1129 while (true)
1130 {
1131 while (true)
1132 {
1133 if (__s == __l1)
1134 return __last1;
1135 if (__pred(*--__l1, *__l2))
1136 break;
1137 }
1138 _RandomAccessIterator1 __m1 = __l1;
1139 _RandomAccessIterator2 __m2 = __l2;
1140 while (true)
1141 {
1142 if (__m2 == __first2)
1143 return __m1;
1144 // no need to check range on __m1 because __s guarantees we have enough source
1145 if (!__pred(*--__m1, *--__m2))
1146 {
1147 break;
1148 }
1149 }
1150 }
1151}
1152
1153template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Marshall Clowee0161e2018-01-15 19:26:05 +00001154inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001155_ForwardIterator1
1156find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1157 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1158{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001159 return _VSTD::__find_end<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001160 (__first1, __last1, __first2, __last2, __pred,
1161 typename iterator_traits<_ForwardIterator1>::iterator_category(),
1162 typename iterator_traits<_ForwardIterator2>::iterator_category());
1163}
1164
1165template <class _ForwardIterator1, class _ForwardIterator2>
Marshall Clowee0161e2018-01-15 19:26:05 +00001166inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001167_ForwardIterator1
1168find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1169 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1170{
1171 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1172 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001173 return _VSTD::find_end(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001174}
1175
1176// find_first_of
1177
1178template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Marshall Clowedfd25a2014-06-10 18:51:55 +00001179_LIBCPP_CONSTEXPR_AFTER_CXX11 _ForwardIterator1
1180__find_first_of_ce(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001181 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1182{
1183 for (; __first1 != __last1; ++__first1)
1184 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
1185 if (__pred(*__first1, *__j))
1186 return __first1;
1187 return __last1;
1188}
1189
Marshall Clowedfd25a2014-06-10 18:51:55 +00001190
1191template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Marshall Clowee0161e2018-01-15 19:26:05 +00001192inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clowedfd25a2014-06-10 18:51:55 +00001193_ForwardIterator1
1194find_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1195 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1196{
1197 return _VSTD::__find_first_of_ce(__first1, __last1, __first2, __last2, __pred);
1198}
1199
Howard Hinnantc51e1022010-05-11 19:42:16 +00001200template <class _ForwardIterator1, class _ForwardIterator2>
Marshall Clowee0161e2018-01-15 19:26:05 +00001201inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001202_ForwardIterator1
1203find_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1204 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1205{
1206 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1207 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Marshall Clowedfd25a2014-06-10 18:51:55 +00001208 return _VSTD::__find_first_of_ce(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001209}
1210
1211// adjacent_find
1212
1213template <class _ForwardIterator, class _BinaryPredicate>
Marshall Clowee0161e2018-01-15 19:26:05 +00001214inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001215_ForwardIterator
1216adjacent_find(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred)
1217{
1218 if (__first != __last)
1219 {
1220 _ForwardIterator __i = __first;
1221 while (++__i != __last)
1222 {
1223 if (__pred(*__first, *__i))
1224 return __first;
1225 __first = __i;
1226 }
1227 }
1228 return __last;
1229}
1230
1231template <class _ForwardIterator>
Marshall Clowee0161e2018-01-15 19:26:05 +00001232inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001233_ForwardIterator
1234adjacent_find(_ForwardIterator __first, _ForwardIterator __last)
1235{
1236 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001237 return _VSTD::adjacent_find(__first, __last, __equal_to<__v>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001238}
1239
1240// count
1241
1242template <class _InputIterator, class _Tp>
Marshall Clow3c0558f2018-01-15 19:40:34 +00001243inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001244typename iterator_traits<_InputIterator>::difference_type
Howard Hinnantbf074022011-10-22 20:59:45 +00001245count(_InputIterator __first, _InputIterator __last, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001246{
1247 typename iterator_traits<_InputIterator>::difference_type __r(0);
1248 for (; __first != __last; ++__first)
Howard Hinnantbf074022011-10-22 20:59:45 +00001249 if (*__first == __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001250 ++__r;
1251 return __r;
1252}
1253
1254// count_if
1255
1256template <class _InputIterator, class _Predicate>
Marshall Clow3c0558f2018-01-15 19:40:34 +00001257inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001258typename iterator_traits<_InputIterator>::difference_type
1259count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
1260{
1261 typename iterator_traits<_InputIterator>::difference_type __r(0);
1262 for (; __first != __last; ++__first)
1263 if (__pred(*__first))
1264 ++__r;
1265 return __r;
1266}
1267
1268// mismatch
1269
1270template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
Marshall Clow30bf3022018-01-16 02:04:10 +00001271inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001272pair<_InputIterator1, _InputIterator2>
1273mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1274 _InputIterator2 __first2, _BinaryPredicate __pred)
1275{
Marshall Clow2932e512014-09-16 20:40:05 +00001276 for (; __first1 != __last1; ++__first1, (void) ++__first2)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001277 if (!__pred(*__first1, *__first2))
1278 break;
1279 return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
1280}
1281
1282template <class _InputIterator1, class _InputIterator2>
Marshall Clow30bf3022018-01-16 02:04:10 +00001283inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001284pair<_InputIterator1, _InputIterator2>
1285mismatch(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2)
1286{
1287 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1288 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001289 return _VSTD::mismatch(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001290}
1291
Marshall Clow96b42b22013-05-09 21:14:23 +00001292#if _LIBCPP_STD_VER > 11
1293template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
Marshall Clow30bf3022018-01-16 02:04:10 +00001294inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow96b42b22013-05-09 21:14:23 +00001295pair<_InputIterator1, _InputIterator2>
1296mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1297 _InputIterator2 __first2, _InputIterator2 __last2,
1298 _BinaryPredicate __pred)
1299{
Marshall Clow2932e512014-09-16 20:40:05 +00001300 for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void) ++__first2)
Marshall Clow96b42b22013-05-09 21:14:23 +00001301 if (!__pred(*__first1, *__first2))
1302 break;
1303 return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
1304}
1305
1306template <class _InputIterator1, class _InputIterator2>
Marshall Clow30bf3022018-01-16 02:04:10 +00001307inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow96b42b22013-05-09 21:14:23 +00001308pair<_InputIterator1, _InputIterator2>
1309mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1310 _InputIterator2 __first2, _InputIterator2 __last2)
1311{
1312 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1313 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
1314 return _VSTD::mismatch(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
1315}
1316#endif
1317
Howard Hinnantc51e1022010-05-11 19:42:16 +00001318// equal
1319
1320template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
Marshall Clow30bf3022018-01-16 02:04:10 +00001321inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001322bool
1323equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _BinaryPredicate __pred)
1324{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00001325 for (; __first1 != __last1; ++__first1, (void) ++__first2)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001326 if (!__pred(*__first1, *__first2))
1327 return false;
1328 return true;
1329}
1330
1331template <class _InputIterator1, class _InputIterator2>
Marshall Clow30bf3022018-01-16 02:04:10 +00001332inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001333bool
1334equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2)
1335{
1336 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1337 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001338 return _VSTD::equal(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001339}
1340
Marshall Clow96b42b22013-05-09 21:14:23 +00001341#if _LIBCPP_STD_VER > 11
1342template <class _BinaryPredicate, class _InputIterator1, class _InputIterator2>
Marshall Clow30bf3022018-01-16 02:04:10 +00001343inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow96b42b22013-05-09 21:14:23 +00001344bool
Aditya Kumar3a0179a2016-08-25 11:52:38 +00001345__equal(_InputIterator1 __first1, _InputIterator1 __last1,
Marshall Clow96b42b22013-05-09 21:14:23 +00001346 _InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred,
1347 input_iterator_tag, input_iterator_tag )
1348{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00001349 for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void) ++__first2)
Marshall Clow96b42b22013-05-09 21:14:23 +00001350 if (!__pred(*__first1, *__first2))
1351 return false;
1352 return __first1 == __last1 && __first2 == __last2;
1353}
1354
1355template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
Marshall Clow30bf3022018-01-16 02:04:10 +00001356inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow96b42b22013-05-09 21:14:23 +00001357bool
Aditya Kumar3a0179a2016-08-25 11:52:38 +00001358__equal(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
1359 _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
Marshall Clow96b42b22013-05-09 21:14:23 +00001360 random_access_iterator_tag, random_access_iterator_tag )
1361{
1362 if ( _VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2))
1363 return false;
1364 return _VSTD::equal<_RandomAccessIterator1, _RandomAccessIterator2,
1365 typename add_lvalue_reference<_BinaryPredicate>::type>
1366 (__first1, __last1, __first2, __pred );
1367}
1368
1369template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
Marshall Clow30bf3022018-01-16 02:04:10 +00001370inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow96b42b22013-05-09 21:14:23 +00001371bool
Aditya Kumar3a0179a2016-08-25 11:52:38 +00001372equal(_InputIterator1 __first1, _InputIterator1 __last1,
Marshall Clow96b42b22013-05-09 21:14:23 +00001373 _InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred )
1374{
1375 return _VSTD::__equal<typename add_lvalue_reference<_BinaryPredicate>::type>
Aditya Kumar3a0179a2016-08-25 11:52:38 +00001376 (__first1, __last1, __first2, __last2, __pred,
Marshall Clow96b42b22013-05-09 21:14:23 +00001377 typename iterator_traits<_InputIterator1>::iterator_category(),
1378 typename iterator_traits<_InputIterator2>::iterator_category());
1379}
1380
1381template <class _InputIterator1, class _InputIterator2>
Marshall Clow30bf3022018-01-16 02:04:10 +00001382inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow96b42b22013-05-09 21:14:23 +00001383bool
Aditya Kumar3a0179a2016-08-25 11:52:38 +00001384equal(_InputIterator1 __first1, _InputIterator1 __last1,
Marshall Clow96b42b22013-05-09 21:14:23 +00001385 _InputIterator2 __first2, _InputIterator2 __last2)
1386{
1387 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1388 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
1389 return _VSTD::__equal(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>(),
1390 typename iterator_traits<_InputIterator1>::iterator_category(),
1391 typename iterator_traits<_InputIterator2>::iterator_category());
1392}
1393#endif
1394
Howard Hinnantc51e1022010-05-11 19:42:16 +00001395// is_permutation
1396
1397template<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Marshall Clow96d050a2018-01-15 16:16:32 +00001398_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Howard Hinnantc51e1022010-05-11 19:42:16 +00001399is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1400 _ForwardIterator2 __first2, _BinaryPredicate __pred)
1401{
Marshall Clow96d050a2018-01-15 16:16:32 +00001402// shorten sequences as much as possible by lopping of any equal prefix
Eric Fiseliera09a3b42014-10-27 19:28:20 +00001403 for (; __first1 != __last1; ++__first1, (void) ++__first2)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001404 if (!__pred(*__first1, *__first2))
Marshall Clow96d050a2018-01-15 16:16:32 +00001405 break;
1406 if (__first1 == __last1)
1407 return true;
1408
1409// __first1 != __last1 && *__first1 != *__first2
Howard Hinnantc51e1022010-05-11 19:42:16 +00001410 typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001411 _D1 __l1 = _VSTD::distance(__first1, __last1);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001412 if (__l1 == _D1(1))
1413 return false;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001414 _ForwardIterator2 __last2 = _VSTD::next(__first2, __l1);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001415 // For each element in [f1, l1) see if there are the same number of
1416 // equal elements in [f2, l2)
1417 for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i)
1418 {
Marshall Clow96d050a2018-01-15 16:16:32 +00001419 // Have we already counted the number of *__i in [f1, l1)?
1420 if (find(__first1, __i, *__i) == __i) {
Howard Hinnantc51e1022010-05-11 19:42:16 +00001421 // Count number of *__i in [f2, l2)
1422 _D1 __c2 = 0;
1423 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
1424 if (__pred(*__i, *__j))
1425 ++__c2;
1426 if (__c2 == 0)
1427 return false;
1428 // Count number of *__i in [__i, l1) (we can start with 1)
1429 _D1 __c1 = 1;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001430 for (_ForwardIterator1 __j = _VSTD::next(__i); __j != __last1; ++__j)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001431 if (__pred(*__i, *__j))
1432 ++__c1;
1433 if (__c1 != __c2)
1434 return false;
1435 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001436 }
1437 return true;
1438}
1439
1440template<class _ForwardIterator1, class _ForwardIterator2>
Marshall Clow96d050a2018-01-15 16:16:32 +00001441inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001442bool
1443is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1444 _ForwardIterator2 __first2)
1445{
1446 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1447 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001448 return _VSTD::is_permutation(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001449}
1450
Marshall Clow96b42b22013-05-09 21:14:23 +00001451#if _LIBCPP_STD_VER > 11
1452template<class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
Marshall Clow96d050a2018-01-15 16:16:32 +00001453_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Marshall Clow96b42b22013-05-09 21:14:23 +00001454__is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
Aditya Kumar3a0179a2016-08-25 11:52:38 +00001455 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
Marshall Clow96b42b22013-05-09 21:14:23 +00001456 _BinaryPredicate __pred,
1457 forward_iterator_tag, forward_iterator_tag )
1458{
Marshall Clow96d050a2018-01-15 16:16:32 +00001459// shorten sequences as much as possible by lopping of any equal prefix
Eric Fiselier14673892014-10-27 20:26:25 +00001460 for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void) ++__first2)
Marshall Clow96b42b22013-05-09 21:14:23 +00001461 if (!__pred(*__first1, *__first2))
Marshall Clow96d050a2018-01-15 16:16:32 +00001462 break;
1463 if (__first1 == __last1)
Marshall Clow01bbbd22018-01-19 18:07:29 +00001464 return __first2 == __last2;
Marshall Clow96d050a2018-01-15 16:16:32 +00001465 else if (__first2 == __last2)
Marshall Clow01bbbd22018-01-19 18:07:29 +00001466 return false;
Marshall Clow96d050a2018-01-15 16:16:32 +00001467
Marshall Clow96b42b22013-05-09 21:14:23 +00001468 typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1;
1469 _D1 __l1 = _VSTD::distance(__first1, __last1);
1470
1471 typedef typename iterator_traits<_ForwardIterator2>::difference_type _D2;
Marshall Clow42b967c2013-05-10 00:16:10 +00001472 _D2 __l2 = _VSTD::distance(__first2, __last2);
Marshall Clow96b42b22013-05-09 21:14:23 +00001473 if (__l1 != __l2)
1474 return false;
1475
1476 // For each element in [f1, l1) see if there are the same number of
1477 // equal elements in [f2, l2)
1478 for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i)
1479 {
Marshall Clow96d050a2018-01-15 16:16:32 +00001480 // Have we already counted the number of *__i in [f1, l1)?
1481 if (find(__first1, __i, *__i) == __i) {
Marshall Clow96b42b22013-05-09 21:14:23 +00001482 // Count number of *__i in [f2, l2)
1483 _D1 __c2 = 0;
1484 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
1485 if (__pred(*__i, *__j))
1486 ++__c2;
1487 if (__c2 == 0)
1488 return false;
1489 // Count number of *__i in [__i, l1) (we can start with 1)
1490 _D1 __c1 = 1;
1491 for (_ForwardIterator1 __j = _VSTD::next(__i); __j != __last1; ++__j)
1492 if (__pred(*__i, *__j))
1493 ++__c1;
1494 if (__c1 != __c2)
1495 return false;
1496 }
Marshall Clow96b42b22013-05-09 21:14:23 +00001497 }
1498 return true;
1499}
1500
1501template<class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
Marshall Clow96d050a2018-01-15 16:16:32 +00001502_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Marshall Clow96b42b22013-05-09 21:14:23 +00001503__is_permutation(_RandomAccessIterator1 __first1, _RandomAccessIterator2 __last1,
Aditya Kumar3a0179a2016-08-25 11:52:38 +00001504 _RandomAccessIterator1 __first2, _RandomAccessIterator2 __last2,
Marshall Clow96b42b22013-05-09 21:14:23 +00001505 _BinaryPredicate __pred,
1506 random_access_iterator_tag, random_access_iterator_tag )
1507{
1508 if ( _VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2))
1509 return false;
1510 return _VSTD::is_permutation<_RandomAccessIterator1, _RandomAccessIterator2,
1511 typename add_lvalue_reference<_BinaryPredicate>::type>
1512 (__first1, __last1, __first2, __pred );
1513}
1514
1515template<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Marshall Clow96d050a2018-01-15 16:16:32 +00001516inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow96b42b22013-05-09 21:14:23 +00001517bool
1518is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1519 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
1520 _BinaryPredicate __pred )
1521{
1522 return _VSTD::__is_permutation<typename add_lvalue_reference<_BinaryPredicate>::type>
1523 (__first1, __last1, __first2, __last2, __pred,
1524 typename iterator_traits<_ForwardIterator1>::iterator_category(),
1525 typename iterator_traits<_ForwardIterator2>::iterator_category());
1526}
1527
1528template<class _ForwardIterator1, class _ForwardIterator2>
Marshall Clow96d050a2018-01-15 16:16:32 +00001529inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow96b42b22013-05-09 21:14:23 +00001530bool
1531is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1532 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1533{
1534 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1535 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
1536 return _VSTD::__is_permutation(__first1, __last1, __first2, __last2,
1537 __equal_to<__v1, __v2>(),
1538 typename iterator_traits<_ForwardIterator1>::iterator_category(),
1539 typename iterator_traits<_ForwardIterator2>::iterator_category());
1540}
1541#endif
1542
Howard Hinnantc51e1022010-05-11 19:42:16 +00001543// search
Marshall Clowa40686b2018-01-08 19:18:00 +00001544// __search is in <functional>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001545
1546template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Marshall Clow323fc5b2018-01-16 15:48:27 +00001547inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001548_ForwardIterator1
1549search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1550 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1551{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001552 return _VSTD::__search<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001553 (__first1, __last1, __first2, __last2, __pred,
Marshall Clowaf8be6c2016-03-08 15:12:52 +00001554 typename iterator_traits<_ForwardIterator1>::iterator_category(),
1555 typename iterator_traits<_ForwardIterator2>::iterator_category())
1556 .first;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001557}
1558
1559template <class _ForwardIterator1, class _ForwardIterator2>
Marshall Clow323fc5b2018-01-16 15:48:27 +00001560inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001561_ForwardIterator1
1562search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1563 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1564{
Marshall Clowaf8be6c2016-03-08 15:12:52 +00001565 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1566 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001567 return _VSTD::search(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001568}
1569
Marshall Clowa40686b2018-01-08 19:18:00 +00001570
1571#if _LIBCPP_STD_VER > 14
1572template <class _ForwardIterator, class _Searcher>
Marshall Clow323fc5b2018-01-16 15:48:27 +00001573_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clowa40686b2018-01-08 19:18:00 +00001574_ForwardIterator search(_ForwardIterator __f, _ForwardIterator __l, const _Searcher &__s)
1575{ return __s(__f, __l).first; }
1576#endif
1577
Howard Hinnantc51e1022010-05-11 19:42:16 +00001578// search_n
1579
1580template <class _BinaryPredicate, class _ForwardIterator, class _Size, class _Tp>
Marshall Clow323fc5b2018-01-16 15:48:27 +00001581_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00001582__search_n(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnantbf074022011-10-22 20:59:45 +00001583 _Size __count, const _Tp& __value_, _BinaryPredicate __pred, forward_iterator_tag)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001584{
1585 if (__count <= 0)
1586 return __first;
1587 while (true)
1588 {
Howard Hinnantbf074022011-10-22 20:59:45 +00001589 // Find first element in sequence that matchs __value_, with a mininum of loop checks
Howard Hinnantc51e1022010-05-11 19:42:16 +00001590 while (true)
1591 {
Howard Hinnantbf074022011-10-22 20:59:45 +00001592 if (__first == __last) // return __last if no element matches __value_
Howard Hinnantc51e1022010-05-11 19:42:16 +00001593 return __last;
Howard Hinnantbf074022011-10-22 20:59:45 +00001594 if (__pred(*__first, __value_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001595 break;
1596 ++__first;
1597 }
Howard Hinnantbf074022011-10-22 20:59:45 +00001598 // *__first matches __value_, now match elements after here
Howard Hinnantc51e1022010-05-11 19:42:16 +00001599 _ForwardIterator __m = __first;
1600 _Size __c(0);
1601 while (true)
1602 {
1603 if (++__c == __count) // If pattern exhausted, __first is the answer (works for 1 element pattern)
1604 return __first;
1605 if (++__m == __last) // Otherwise if source exhaused, pattern not found
1606 return __last;
Howard Hinnantbf074022011-10-22 20:59:45 +00001607 if (!__pred(*__m, __value_)) // if there is a mismatch, restart with a new __first
Howard Hinnantc51e1022010-05-11 19:42:16 +00001608 {
1609 __first = __m;
1610 ++__first;
1611 break;
1612 } // else there is a match, check next elements
1613 }
1614 }
1615}
1616
1617template <class _BinaryPredicate, class _RandomAccessIterator, class _Size, class _Tp>
Marshall Clow323fc5b2018-01-16 15:48:27 +00001618_LIBCPP_CONSTEXPR_AFTER_CXX17 _RandomAccessIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00001619__search_n(_RandomAccessIterator __first, _RandomAccessIterator __last,
Howard Hinnantbf074022011-10-22 20:59:45 +00001620 _Size __count, const _Tp& __value_, _BinaryPredicate __pred, random_access_iterator_tag)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001621{
1622 if (__count <= 0)
1623 return __first;
1624 _Size __len = static_cast<_Size>(__last - __first);
1625 if (__len < __count)
1626 return __last;
1627 const _RandomAccessIterator __s = __last - (__count - 1); // Start of pattern match can't go beyond here
1628 while (true)
1629 {
Howard Hinnantbf074022011-10-22 20:59:45 +00001630 // Find first element in sequence that matchs __value_, with a mininum of loop checks
Howard Hinnantc51e1022010-05-11 19:42:16 +00001631 while (true)
1632 {
Howard Hinnantbede4c32013-04-04 15:40:48 +00001633 if (__first >= __s) // return __last if no element matches __value_
Howard Hinnantc51e1022010-05-11 19:42:16 +00001634 return __last;
Howard Hinnantbf074022011-10-22 20:59:45 +00001635 if (__pred(*__first, __value_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001636 break;
1637 ++__first;
1638 }
Howard Hinnantbf074022011-10-22 20:59:45 +00001639 // *__first matches __value_, now match elements after here
Howard Hinnantc51e1022010-05-11 19:42:16 +00001640 _RandomAccessIterator __m = __first;
1641 _Size __c(0);
1642 while (true)
1643 {
1644 if (++__c == __count) // If pattern exhausted, __first is the answer (works for 1 element pattern)
1645 return __first;
1646 ++__m; // no need to check range on __m because __s guarantees we have enough source
Howard Hinnantbf074022011-10-22 20:59:45 +00001647 if (!__pred(*__m, __value_)) // if there is a mismatch, restart with a new __first
Howard Hinnantc51e1022010-05-11 19:42:16 +00001648 {
1649 __first = __m;
1650 ++__first;
1651 break;
1652 } // else there is a match, check next elements
1653 }
1654 }
1655}
1656
1657template <class _ForwardIterator, class _Size, class _Tp, class _BinaryPredicate>
Marshall Clow323fc5b2018-01-16 15:48:27 +00001658inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001659_ForwardIterator
1660search_n(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnantbf074022011-10-22 20:59:45 +00001661 _Size __count, const _Tp& __value_, _BinaryPredicate __pred)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001662{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001663 return _VSTD::__search_n<typename add_lvalue_reference<_BinaryPredicate>::type>
Eric Fiselier97ec07d2015-02-10 16:46:42 +00001664 (__first, __last, __convert_to_integral(__count), __value_, __pred,
1665 typename iterator_traits<_ForwardIterator>::iterator_category());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001666}
1667
1668template <class _ForwardIterator, class _Size, class _Tp>
Marshall Clow323fc5b2018-01-16 15:48:27 +00001669inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001670_ForwardIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00001671search_n(_ForwardIterator __first, _ForwardIterator __last, _Size __count, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001672{
1673 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Eric Fiselier97ec07d2015-02-10 16:46:42 +00001674 return _VSTD::search_n(__first, __last, __convert_to_integral(__count),
1675 __value_, __equal_to<__v, _Tp>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001676}
1677
1678// copy
Howard Hinnantc51e1022010-05-11 19:42:16 +00001679template <class _Iter>
1680inline _LIBCPP_INLINE_VISIBILITY
1681_Iter
1682__unwrap_iter(_Iter __i)
1683{
1684 return __i;
1685}
1686
1687template <class _Tp>
Marshall Clow88880de2017-05-25 14:20:26 +00001688inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001689typename enable_if
1690<
Howard Hinnanta9a897e2010-11-19 22:17:28 +00001691 is_trivially_copy_assignable<_Tp>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001692 _Tp*
1693>::type
1694__unwrap_iter(move_iterator<_Tp*> __i)
1695{
1696 return __i.base();
1697}
1698
Howard Hinnant8ea98242013-08-23 17:37:05 +00001699#if _LIBCPP_DEBUG_LEVEL < 2
1700
Howard Hinnantc51e1022010-05-11 19:42:16 +00001701template <class _Tp>
Marshall Clow88880de2017-05-25 14:20:26 +00001702inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001703typename enable_if
1704<
Howard Hinnanta9a897e2010-11-19 22:17:28 +00001705 is_trivially_copy_assignable<_Tp>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001706 _Tp*
1707>::type
1708__unwrap_iter(__wrap_iter<_Tp*> __i)
1709{
1710 return __i.base();
1711}
1712
Eric Fiselier38badb82016-12-28 05:35:32 +00001713#else
1714
1715template <class _Tp>
Marshall Clow88880de2017-05-25 14:20:26 +00001716inline _LIBCPP_INLINE_VISIBILITY
Eric Fiselier38badb82016-12-28 05:35:32 +00001717typename enable_if
1718<
1719 is_trivially_copy_assignable<_Tp>::value,
1720 __wrap_iter<_Tp*>
1721>::type
1722__unwrap_iter(__wrap_iter<_Tp*> __i)
1723{
1724 return __i;
1725}
1726
Howard Hinnant8ea98242013-08-23 17:37:05 +00001727#endif // _LIBCPP_DEBUG_LEVEL < 2
1728
Howard Hinnantc51e1022010-05-11 19:42:16 +00001729template <class _InputIterator, class _OutputIterator>
1730inline _LIBCPP_INLINE_VISIBILITY
1731_OutputIterator
1732__copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1733{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00001734 for (; __first != __last; ++__first, (void) ++__result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001735 *__result = *__first;
1736 return __result;
1737}
1738
1739template <class _Tp, class _Up>
1740inline _LIBCPP_INLINE_VISIBILITY
1741typename enable_if
1742<
1743 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnanta9a897e2010-11-19 22:17:28 +00001744 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001745 _Up*
1746>::type
1747__copy(_Tp* __first, _Tp* __last, _Up* __result)
1748{
1749 const size_t __n = static_cast<size_t>(__last - __first);
Marshall Clowc3ef9622015-06-02 13:52:16 +00001750 if (__n > 0)
1751 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001752 return __result + __n;
1753}
1754
1755template <class _InputIterator, class _OutputIterator>
1756inline _LIBCPP_INLINE_VISIBILITY
1757_OutputIterator
1758copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1759{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001760 return _VSTD::__copy(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001761}
1762
1763// copy_backward
1764
Howard Hinnant7f229bc2013-02-06 21:03:39 +00001765template <class _BidirectionalIterator, class _OutputIterator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001766inline _LIBCPP_INLINE_VISIBILITY
1767_OutputIterator
Howard Hinnant7f229bc2013-02-06 21:03:39 +00001768__copy_backward(_BidirectionalIterator __first, _BidirectionalIterator __last, _OutputIterator __result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001769{
1770 while (__first != __last)
1771 *--__result = *--__last;
1772 return __result;
1773}
1774
1775template <class _Tp, class _Up>
1776inline _LIBCPP_INLINE_VISIBILITY
1777typename enable_if
1778<
1779 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnanta9a897e2010-11-19 22:17:28 +00001780 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001781 _Up*
1782>::type
1783__copy_backward(_Tp* __first, _Tp* __last, _Up* __result)
1784{
1785 const size_t __n = static_cast<size_t>(__last - __first);
Marshall Clowc3ef9622015-06-02 13:52:16 +00001786 if (__n > 0)
1787 {
1788 __result -= __n;
1789 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
1790 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001791 return __result;
1792}
1793
1794template <class _BidirectionalIterator1, class _BidirectionalIterator2>
1795inline _LIBCPP_INLINE_VISIBILITY
1796_BidirectionalIterator2
1797copy_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
1798 _BidirectionalIterator2 __result)
1799{
Eric Fiselier6003c772016-12-23 23:37:52 +00001800 return _VSTD::__copy_backward(__unwrap_iter(__first),
1801 __unwrap_iter(__last),
1802 __unwrap_iter(__result));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001803}
1804
1805// copy_if
1806
1807template<class _InputIterator, class _OutputIterator, class _Predicate>
1808inline _LIBCPP_INLINE_VISIBILITY
1809_OutputIterator
1810copy_if(_InputIterator __first, _InputIterator __last,
1811 _OutputIterator __result, _Predicate __pred)
1812{
1813 for (; __first != __last; ++__first)
1814 {
1815 if (__pred(*__first))
1816 {
1817 *__result = *__first;
1818 ++__result;
1819 }
1820 }
1821 return __result;
1822}
1823
1824// copy_n
1825
1826template<class _InputIterator, class _Size, class _OutputIterator>
1827inline _LIBCPP_INLINE_VISIBILITY
1828typename enable_if
1829<
1830 __is_input_iterator<_InputIterator>::value &&
1831 !__is_random_access_iterator<_InputIterator>::value,
1832 _OutputIterator
1833>::type
Eric Fiselier97ec07d2015-02-10 16:46:42 +00001834copy_n(_InputIterator __first, _Size __orig_n, _OutputIterator __result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001835{
Eric Fiselier97ec07d2015-02-10 16:46:42 +00001836 typedef decltype(__convert_to_integral(__orig_n)) _IntegralSize;
1837 _IntegralSize __n = __orig_n;
Howard Hinnantcbc5dc02011-02-27 20:55:39 +00001838 if (__n > 0)
1839 {
Howard Hinnantc51e1022010-05-11 19:42:16 +00001840 *__result = *__first;
Howard Hinnantcbc5dc02011-02-27 20:55:39 +00001841 ++__result;
1842 for (--__n; __n > 0; --__n)
1843 {
1844 ++__first;
1845 *__result = *__first;
1846 ++__result;
1847 }
1848 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001849 return __result;
1850}
1851
1852template<class _InputIterator, class _Size, class _OutputIterator>
1853inline _LIBCPP_INLINE_VISIBILITY
1854typename enable_if
1855<
1856 __is_random_access_iterator<_InputIterator>::value,
1857 _OutputIterator
1858>::type
Eric Fiselier97ec07d2015-02-10 16:46:42 +00001859copy_n(_InputIterator __first, _Size __orig_n, _OutputIterator __result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001860{
Eric Fiselier97ec07d2015-02-10 16:46:42 +00001861 typedef decltype(__convert_to_integral(__orig_n)) _IntegralSize;
1862 _IntegralSize __n = __orig_n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001863 return _VSTD::copy(__first, __first + __n, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001864}
1865
1866// move
1867
1868template <class _InputIterator, class _OutputIterator>
1869inline _LIBCPP_INLINE_VISIBILITY
1870_OutputIterator
1871__move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1872{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00001873 for (; __first != __last; ++__first, (void) ++__result)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001874 *__result = _VSTD::move(*__first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001875 return __result;
1876}
1877
1878template <class _Tp, class _Up>
1879inline _LIBCPP_INLINE_VISIBILITY
1880typename enable_if
1881<
1882 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnanta9a897e2010-11-19 22:17:28 +00001883 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001884 _Up*
1885>::type
1886__move(_Tp* __first, _Tp* __last, _Up* __result)
1887{
1888 const size_t __n = static_cast<size_t>(__last - __first);
Marshall Clowc3ef9622015-06-02 13:52:16 +00001889 if (__n > 0)
1890 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001891 return __result + __n;
1892}
1893
1894template <class _InputIterator, class _OutputIterator>
1895inline _LIBCPP_INLINE_VISIBILITY
1896_OutputIterator
1897move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1898{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001899 return _VSTD::__move(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001900}
1901
1902// move_backward
1903
1904template <class _InputIterator, class _OutputIterator>
1905inline _LIBCPP_INLINE_VISIBILITY
1906_OutputIterator
1907__move_backward(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1908{
1909 while (__first != __last)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001910 *--__result = _VSTD::move(*--__last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001911 return __result;
1912}
1913
1914template <class _Tp, class _Up>
1915inline _LIBCPP_INLINE_VISIBILITY
1916typename enable_if
1917<
1918 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnanta9a897e2010-11-19 22:17:28 +00001919 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001920 _Up*
1921>::type
1922__move_backward(_Tp* __first, _Tp* __last, _Up* __result)
1923{
1924 const size_t __n = static_cast<size_t>(__last - __first);
Marshall Clowc3ef9622015-06-02 13:52:16 +00001925 if (__n > 0)
1926 {
1927 __result -= __n;
1928 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
1929 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001930 return __result;
1931}
1932
1933template <class _BidirectionalIterator1, class _BidirectionalIterator2>
1934inline _LIBCPP_INLINE_VISIBILITY
1935_BidirectionalIterator2
1936move_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
1937 _BidirectionalIterator2 __result)
1938{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001939 return _VSTD::__move_backward(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001940}
1941
1942// iter_swap
1943
Howard Hinnantdbfd4b42011-05-27 15:04:19 +00001944// moved to <type_traits> for better swap / noexcept support
Howard Hinnantc51e1022010-05-11 19:42:16 +00001945
1946// transform
1947
1948template <class _InputIterator, class _OutputIterator, class _UnaryOperation>
Marshall Clow31427c62018-01-19 17:45:39 +00001949inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001950_OutputIterator
1951transform(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _UnaryOperation __op)
1952{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00001953 for (; __first != __last; ++__first, (void) ++__result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001954 *__result = __op(*__first);
1955 return __result;
1956}
1957
1958template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _BinaryOperation>
Marshall Clow31427c62018-01-19 17:45:39 +00001959inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001960_OutputIterator
1961transform(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2,
1962 _OutputIterator __result, _BinaryOperation __binary_op)
1963{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00001964 for (; __first1 != __last1; ++__first1, (void) ++__first2, ++__result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001965 *__result = __binary_op(*__first1, *__first2);
1966 return __result;
1967}
1968
1969// replace
1970
1971template <class _ForwardIterator, class _Tp>
Marshall Clow01bbbd22018-01-19 18:07:29 +00001972inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001973void
1974replace(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __old_value, const _Tp& __new_value)
1975{
1976 for (; __first != __last; ++__first)
1977 if (*__first == __old_value)
1978 *__first = __new_value;
1979}
1980
1981// replace_if
1982
1983template <class _ForwardIterator, class _Predicate, class _Tp>
Marshall Clow01bbbd22018-01-19 18:07:29 +00001984inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001985void
1986replace_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, const _Tp& __new_value)
1987{
1988 for (; __first != __last; ++__first)
1989 if (__pred(*__first))
1990 *__first = __new_value;
1991}
1992
1993// replace_copy
1994
1995template <class _InputIterator, class _OutputIterator, class _Tp>
Marshall Clow01bbbd22018-01-19 18:07:29 +00001996inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001997_OutputIterator
1998replace_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
1999 const _Tp& __old_value, const _Tp& __new_value)
2000{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00002001 for (; __first != __last; ++__first, (void) ++__result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002002 if (*__first == __old_value)
2003 *__result = __new_value;
2004 else
2005 *__result = *__first;
2006 return __result;
2007}
2008
2009// replace_copy_if
2010
2011template <class _InputIterator, class _OutputIterator, class _Predicate, class _Tp>
Marshall Clow01bbbd22018-01-19 18:07:29 +00002012inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002013_OutputIterator
2014replace_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
2015 _Predicate __pred, const _Tp& __new_value)
2016{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00002017 for (; __first != __last; ++__first, (void) ++__result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002018 if (__pred(*__first))
2019 *__result = __new_value;
2020 else
2021 *__result = *__first;
2022 return __result;
2023}
2024
2025// fill_n
2026
2027template <class _OutputIterator, class _Size, class _Tp>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002028inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002029_OutputIterator
Howard Hinnant0ad1c122013-08-01 17:29:28 +00002030__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002031{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00002032 for (; __n > 0; ++__first, (void) --__n)
Howard Hinnantbf074022011-10-22 20:59:45 +00002033 *__first = __value_;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002034 return __first;
2035}
2036
Howard Hinnantc51e1022010-05-11 19:42:16 +00002037template <class _OutputIterator, class _Size, class _Tp>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002038inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002039_OutputIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00002040fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002041{
Eric Fiselier97ec07d2015-02-10 16:46:42 +00002042 return _VSTD::__fill_n(__first, __convert_to_integral(__n), __value_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002043}
2044
2045// fill
2046
2047template <class _ForwardIterator, class _Tp>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002048inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002049void
Howard Hinnantbf074022011-10-22 20:59:45 +00002050__fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, forward_iterator_tag)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002051{
2052 for (; __first != __last; ++__first)
Howard Hinnantbf074022011-10-22 20:59:45 +00002053 *__first = __value_;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002054}
2055
2056template <class _RandomAccessIterator, class _Tp>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002057inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002058void
Howard Hinnantbf074022011-10-22 20:59:45 +00002059__fill(_RandomAccessIterator __first, _RandomAccessIterator __last, const _Tp& __value_, random_access_iterator_tag)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002060{
Howard Hinnantbf074022011-10-22 20:59:45 +00002061 _VSTD::fill_n(__first, __last - __first, __value_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002062}
2063
2064template <class _ForwardIterator, class _Tp>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002065inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002066void
Howard Hinnantbf074022011-10-22 20:59:45 +00002067fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002068{
Howard Hinnantbf074022011-10-22 20:59:45 +00002069 _VSTD::__fill(__first, __last, __value_, typename iterator_traits<_ForwardIterator>::iterator_category());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002070}
2071
2072// generate
2073
2074template <class _ForwardIterator, class _Generator>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002075inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002076void
2077generate(_ForwardIterator __first, _ForwardIterator __last, _Generator __gen)
2078{
2079 for (; __first != __last; ++__first)
2080 *__first = __gen();
2081}
2082
2083// generate_n
2084
2085template <class _OutputIterator, class _Size, class _Generator>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002086inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002087_OutputIterator
Eric Fiselier97ec07d2015-02-10 16:46:42 +00002088generate_n(_OutputIterator __first, _Size __orig_n, _Generator __gen)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002089{
Eric Fiselier97ec07d2015-02-10 16:46:42 +00002090 typedef decltype(__convert_to_integral(__orig_n)) _IntegralSize;
2091 _IntegralSize __n = __orig_n;
Eric Fiseliera09a3b42014-10-27 19:28:20 +00002092 for (; __n > 0; ++__first, (void) --__n)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002093 *__first = __gen();
2094 return __first;
2095}
2096
2097// remove
2098
2099template <class _ForwardIterator, class _Tp>
2100_ForwardIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00002101remove(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002102{
Howard Hinnantbf074022011-10-22 20:59:45 +00002103 __first = _VSTD::find(__first, __last, __value_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002104 if (__first != __last)
2105 {
2106 _ForwardIterator __i = __first;
2107 while (++__i != __last)
2108 {
Howard Hinnantbf074022011-10-22 20:59:45 +00002109 if (!(*__i == __value_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002110 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002111 *__first = _VSTD::move(*__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002112 ++__first;
2113 }
2114 }
2115 }
2116 return __first;
2117}
2118
2119// remove_if
2120
2121template <class _ForwardIterator, class _Predicate>
2122_ForwardIterator
2123remove_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
2124{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002125 __first = _VSTD::find_if<_ForwardIterator, typename add_lvalue_reference<_Predicate>::type>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002126 (__first, __last, __pred);
2127 if (__first != __last)
2128 {
2129 _ForwardIterator __i = __first;
2130 while (++__i != __last)
2131 {
2132 if (!__pred(*__i))
2133 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002134 *__first = _VSTD::move(*__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002135 ++__first;
2136 }
2137 }
2138 }
2139 return __first;
2140}
2141
2142// remove_copy
2143
2144template <class _InputIterator, class _OutputIterator, class _Tp>
2145inline _LIBCPP_INLINE_VISIBILITY
2146_OutputIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00002147remove_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002148{
2149 for (; __first != __last; ++__first)
2150 {
Howard Hinnantbf074022011-10-22 20:59:45 +00002151 if (!(*__first == __value_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002152 {
2153 *__result = *__first;
2154 ++__result;
2155 }
2156 }
2157 return __result;
2158}
2159
2160// remove_copy_if
2161
2162template <class _InputIterator, class _OutputIterator, class _Predicate>
2163inline _LIBCPP_INLINE_VISIBILITY
2164_OutputIterator
2165remove_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Predicate __pred)
2166{
2167 for (; __first != __last; ++__first)
2168 {
2169 if (!__pred(*__first))
2170 {
2171 *__result = *__first;
2172 ++__result;
2173 }
2174 }
2175 return __result;
2176}
2177
2178// unique
2179
2180template <class _ForwardIterator, class _BinaryPredicate>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002181_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00002182unique(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred)
2183{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002184 __first = _VSTD::adjacent_find<_ForwardIterator, typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002185 (__first, __last, __pred);
2186 if (__first != __last)
2187 {
2188 // ... a a ? ...
2189 // f i
2190 _ForwardIterator __i = __first;
2191 for (++__i; ++__i != __last;)
2192 if (!__pred(*__first, *__i))
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002193 *++__first = _VSTD::move(*__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002194 ++__first;
2195 }
2196 return __first;
2197}
2198
2199template <class _ForwardIterator>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002200inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002201_ForwardIterator
2202unique(_ForwardIterator __first, _ForwardIterator __last)
2203{
2204 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002205 return _VSTD::unique(__first, __last, __equal_to<__v>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002206}
2207
2208// unique_copy
2209
2210template <class _BinaryPredicate, class _InputIterator, class _OutputIterator>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002211_LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00002212__unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred,
2213 input_iterator_tag, output_iterator_tag)
2214{
2215 if (__first != __last)
2216 {
2217 typename iterator_traits<_InputIterator>::value_type __t(*__first);
2218 *__result = __t;
2219 ++__result;
2220 while (++__first != __last)
2221 {
2222 if (!__pred(__t, *__first))
2223 {
2224 __t = *__first;
2225 *__result = __t;
2226 ++__result;
2227 }
2228 }
2229 }
2230 return __result;
2231}
2232
2233template <class _BinaryPredicate, class _ForwardIterator, class _OutputIterator>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002234_LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00002235__unique_copy(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result, _BinaryPredicate __pred,
2236 forward_iterator_tag, output_iterator_tag)
2237{
2238 if (__first != __last)
2239 {
2240 _ForwardIterator __i = __first;
2241 *__result = *__i;
2242 ++__result;
2243 while (++__first != __last)
2244 {
2245 if (!__pred(*__i, *__first))
2246 {
2247 *__result = *__first;
2248 ++__result;
2249 __i = __first;
2250 }
2251 }
2252 }
2253 return __result;
2254}
2255
2256template <class _BinaryPredicate, class _InputIterator, class _ForwardIterator>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002257_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00002258__unique_copy(_InputIterator __first, _InputIterator __last, _ForwardIterator __result, _BinaryPredicate __pred,
2259 input_iterator_tag, forward_iterator_tag)
2260{
2261 if (__first != __last)
2262 {
2263 *__result = *__first;
2264 while (++__first != __last)
2265 if (!__pred(*__result, *__first))
2266 *++__result = *__first;
2267 ++__result;
2268 }
2269 return __result;
2270}
2271
Howard Hinnantc51e1022010-05-11 19:42:16 +00002272template <class _InputIterator, class _OutputIterator, class _BinaryPredicate>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002273inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002274_OutputIterator
2275unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred)
2276{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002277 return _VSTD::__unique_copy<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002278 (__first, __last, __result, __pred,
2279 typename iterator_traits<_InputIterator>::iterator_category(),
2280 typename iterator_traits<_OutputIterator>::iterator_category());
2281}
2282
2283template <class _InputIterator, class _OutputIterator>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002284inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002285_OutputIterator
2286unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
2287{
2288 typedef typename iterator_traits<_InputIterator>::value_type __v;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002289 return _VSTD::unique_copy(__first, __last, __result, __equal_to<__v>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002290}
2291
2292// reverse
2293
2294template <class _BidirectionalIterator>
2295inline _LIBCPP_INLINE_VISIBILITY
2296void
2297__reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirectional_iterator_tag)
2298{
2299 while (__first != __last)
2300 {
2301 if (__first == --__last)
2302 break;
Marshall Clow2ad71042015-11-02 21:34:25 +00002303 _VSTD::iter_swap(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002304 ++__first;
2305 }
2306}
2307
2308template <class _RandomAccessIterator>
2309inline _LIBCPP_INLINE_VISIBILITY
2310void
2311__reverse(_RandomAccessIterator __first, _RandomAccessIterator __last, random_access_iterator_tag)
2312{
2313 if (__first != __last)
2314 for (; __first < --__last; ++__first)
Marshall Clow2ad71042015-11-02 21:34:25 +00002315 _VSTD::iter_swap(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002316}
2317
2318template <class _BidirectionalIterator>
2319inline _LIBCPP_INLINE_VISIBILITY
2320void
2321reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
2322{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002323 _VSTD::__reverse(__first, __last, typename iterator_traits<_BidirectionalIterator>::iterator_category());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002324}
2325
2326// reverse_copy
2327
2328template <class _BidirectionalIterator, class _OutputIterator>
2329inline _LIBCPP_INLINE_VISIBILITY
2330_OutputIterator
2331reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last, _OutputIterator __result)
2332{
2333 for (; __first != __last; ++__result)
2334 *__result = *--__last;
2335 return __result;
2336}
2337
2338// rotate
2339
2340template <class _ForwardIterator>
2341_ForwardIterator
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002342__rotate_left(_ForwardIterator __first, _ForwardIterator __last)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002343{
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002344 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
2345 value_type __tmp = _VSTD::move(*__first);
2346 _ForwardIterator __lm1 = _VSTD::move(_VSTD::next(__first), __last, __first);
2347 *__lm1 = _VSTD::move(__tmp);
2348 return __lm1;
2349}
2350
2351template <class _BidirectionalIterator>
2352_BidirectionalIterator
2353__rotate_right(_BidirectionalIterator __first, _BidirectionalIterator __last)
2354{
2355 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
2356 _BidirectionalIterator __lm1 = _VSTD::prev(__last);
2357 value_type __tmp = _VSTD::move(*__lm1);
2358 _BidirectionalIterator __fp1 = _VSTD::move_backward(__first, __lm1, __last);
2359 *__first = _VSTD::move(__tmp);
2360 return __fp1;
2361}
2362
2363template <class _ForwardIterator>
2364_ForwardIterator
2365__rotate_forward(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last)
2366{
Howard Hinnantc51e1022010-05-11 19:42:16 +00002367 _ForwardIterator __i = __middle;
2368 while (true)
2369 {
2370 swap(*__first, *__i);
2371 ++__first;
2372 if (++__i == __last)
2373 break;
2374 if (__first == __middle)
2375 __middle = __i;
2376 }
2377 _ForwardIterator __r = __first;
2378 if (__first != __middle)
2379 {
2380 __i = __middle;
2381 while (true)
2382 {
2383 swap(*__first, *__i);
2384 ++__first;
2385 if (++__i == __last)
2386 {
2387 if (__first == __middle)
2388 break;
2389 __i = __middle;
2390 }
2391 else if (__first == __middle)
2392 __middle = __i;
2393 }
2394 }
2395 return __r;
2396}
2397
2398template<typename _Integral>
2399inline _LIBCPP_INLINE_VISIBILITY
2400_Integral
Marshall Clowb8bfc2c2016-07-26 14:29:45 +00002401__algo_gcd(_Integral __x, _Integral __y)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002402{
2403 do
2404 {
2405 _Integral __t = __x % __y;
2406 __x = __y;
2407 __y = __t;
2408 } while (__y);
2409 return __x;
2410}
2411
2412template<typename _RandomAccessIterator>
2413_RandomAccessIterator
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002414__rotate_gcd(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002415{
2416 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
2417 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002418
Howard Hinnantc51e1022010-05-11 19:42:16 +00002419 const difference_type __m1 = __middle - __first;
2420 const difference_type __m2 = __last - __middle;
2421 if (__m1 == __m2)
2422 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002423 _VSTD::swap_ranges(__first, __middle, __middle);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002424 return __middle;
2425 }
Marshall Clowb8bfc2c2016-07-26 14:29:45 +00002426 const difference_type __g = _VSTD::__algo_gcd(__m1, __m2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002427 for (_RandomAccessIterator __p = __first + __g; __p != __first;)
2428 {
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002429 value_type __t(_VSTD::move(*--__p));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002430 _RandomAccessIterator __p1 = __p;
2431 _RandomAccessIterator __p2 = __p1 + __m1;
2432 do
2433 {
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002434 *__p1 = _VSTD::move(*__p2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002435 __p1 = __p2;
2436 const difference_type __d = __last - __p2;
2437 if (__m1 < __d)
2438 __p2 += __m1;
2439 else
2440 __p2 = __first + (__m1 - __d);
2441 } while (__p2 != __p);
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002442 *__p1 = _VSTD::move(__t);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002443 }
2444 return __first + __m2;
2445}
2446
2447template <class _ForwardIterator>
2448inline _LIBCPP_INLINE_VISIBILITY
2449_ForwardIterator
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002450__rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last,
2451 _VSTD::forward_iterator_tag)
2452{
2453 typedef typename _VSTD::iterator_traits<_ForwardIterator>::value_type value_type;
2454 if (_VSTD::is_trivially_move_assignable<value_type>::value)
2455 {
2456 if (_VSTD::next(__first) == __middle)
2457 return _VSTD::__rotate_left(__first, __last);
2458 }
2459 return _VSTD::__rotate_forward(__first, __middle, __last);
2460}
2461
2462template <class _BidirectionalIterator>
2463inline _LIBCPP_INLINE_VISIBILITY
2464_BidirectionalIterator
2465__rotate(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
2466 _VSTD::bidirectional_iterator_tag)
2467{
2468 typedef typename _VSTD::iterator_traits<_BidirectionalIterator>::value_type value_type;
2469 if (_VSTD::is_trivially_move_assignable<value_type>::value)
2470 {
2471 if (_VSTD::next(__first) == __middle)
2472 return _VSTD::__rotate_left(__first, __last);
2473 if (_VSTD::next(__middle) == __last)
2474 return _VSTD::__rotate_right(__first, __last);
2475 }
2476 return _VSTD::__rotate_forward(__first, __middle, __last);
2477}
2478
2479template <class _RandomAccessIterator>
2480inline _LIBCPP_INLINE_VISIBILITY
2481_RandomAccessIterator
2482__rotate(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
2483 _VSTD::random_access_iterator_tag)
2484{
2485 typedef typename _VSTD::iterator_traits<_RandomAccessIterator>::value_type value_type;
2486 if (_VSTD::is_trivially_move_assignable<value_type>::value)
2487 {
2488 if (_VSTD::next(__first) == __middle)
2489 return _VSTD::__rotate_left(__first, __last);
2490 if (_VSTD::next(__middle) == __last)
2491 return _VSTD::__rotate_right(__first, __last);
2492 return _VSTD::__rotate_gcd(__first, __middle, __last);
2493 }
2494 return _VSTD::__rotate_forward(__first, __middle, __last);
2495}
2496
2497template <class _ForwardIterator>
2498inline _LIBCPP_INLINE_VISIBILITY
2499_ForwardIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00002500rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last)
2501{
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002502 if (__first == __middle)
2503 return __last;
2504 if (__middle == __last)
2505 return __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002506 return _VSTD::__rotate(__first, __middle, __last,
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002507 typename _VSTD::iterator_traits<_ForwardIterator>::iterator_category());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002508}
2509
2510// rotate_copy
2511
2512template <class _ForwardIterator, class _OutputIterator>
2513inline _LIBCPP_INLINE_VISIBILITY
2514_OutputIterator
2515rotate_copy(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last, _OutputIterator __result)
2516{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002517 return _VSTD::copy(__first, __middle, _VSTD::copy(__middle, __last, __result));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002518}
2519
Howard Hinnantc51e1022010-05-11 19:42:16 +00002520// min_element
2521
2522template <class _ForwardIterator, class _Compare>
Marshall Clowe9dca072014-02-19 16:51:35 +00002523inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantc51e1022010-05-11 19:42:16 +00002524_ForwardIterator
Marshall Clow9e173072015-05-10 13:53:31 +00002525min_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002526{
2527 if (__first != __last)
2528 {
2529 _ForwardIterator __i = __first;
2530 while (++__i != __last)
2531 if (__comp(*__i, *__first))
2532 __first = __i;
2533 }
2534 return __first;
2535}
2536
2537template <class _ForwardIterator>
Marshall Clow9e173072015-05-10 13:53:31 +00002538inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantc51e1022010-05-11 19:42:16 +00002539_ForwardIterator
2540min_element(_ForwardIterator __first, _ForwardIterator __last)
2541{
Marshall Clow9e173072015-05-10 13:53:31 +00002542 return _VSTD::min_element(__first, __last,
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002543 __less<typename iterator_traits<_ForwardIterator>::value_type>());
2544}
2545
2546// min
2547
2548template <class _Tp, class _Compare>
Marshall Clowe9dca072014-02-19 16:51:35 +00002549inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002550const _Tp&
2551min(const _Tp& __a, const _Tp& __b, _Compare __comp)
2552{
2553 return __comp(__b, __a) ? __b : __a;
2554}
2555
2556template <class _Tp>
Marshall Clowe9dca072014-02-19 16:51:35 +00002557inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002558const _Tp&
2559min(const _Tp& __a, const _Tp& __b)
2560{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002561 return _VSTD::min(__a, __b, __less<_Tp>());
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002562}
2563
Eric Fiselier93dd1372017-04-18 23:26:47 +00002564#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002565
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002566template<class _Tp, class _Compare>
Marshall Clowe9dca072014-02-19 16:51:35 +00002567inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002568_Tp
2569min(initializer_list<_Tp> __t, _Compare __comp)
2570{
Marshall Clow9e173072015-05-10 13:53:31 +00002571 return *_VSTD::min_element(__t.begin(), __t.end(), __comp);
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002572}
2573
2574template<class _Tp>
Marshall Clowe9dca072014-02-19 16:51:35 +00002575inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002576_Tp
2577min(initializer_list<_Tp> __t)
2578{
Marshall Clow9e173072015-05-10 13:53:31 +00002579 return *_VSTD::min_element(__t.begin(), __t.end(), __less<_Tp>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002580}
2581
Eric Fiselier93dd1372017-04-18 23:26:47 +00002582#endif // _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002583
Howard Hinnantc51e1022010-05-11 19:42:16 +00002584// max_element
2585
2586template <class _ForwardIterator, class _Compare>
Marshall Clowe9dca072014-02-19 16:51:35 +00002587inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantc51e1022010-05-11 19:42:16 +00002588_ForwardIterator
Marshall Clow9e173072015-05-10 13:53:31 +00002589max_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002590{
2591 if (__first != __last)
2592 {
2593 _ForwardIterator __i = __first;
2594 while (++__i != __last)
2595 if (__comp(*__first, *__i))
2596 __first = __i;
2597 }
2598 return __first;
2599}
2600
Marshall Clowe9dca072014-02-19 16:51:35 +00002601
Howard Hinnantc51e1022010-05-11 19:42:16 +00002602template <class _ForwardIterator>
Marshall Clow9e173072015-05-10 13:53:31 +00002603inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantc51e1022010-05-11 19:42:16 +00002604_ForwardIterator
2605max_element(_ForwardIterator __first, _ForwardIterator __last)
2606{
Marshall Clow9e173072015-05-10 13:53:31 +00002607 return _VSTD::max_element(__first, __last,
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002608 __less<typename iterator_traits<_ForwardIterator>::value_type>());
2609}
2610
2611// max
2612
2613template <class _Tp, class _Compare>
Marshall Clowe9dca072014-02-19 16:51:35 +00002614inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002615const _Tp&
2616max(const _Tp& __a, const _Tp& __b, _Compare __comp)
2617{
2618 return __comp(__a, __b) ? __b : __a;
2619}
2620
2621template <class _Tp>
Marshall Clowe9dca072014-02-19 16:51:35 +00002622inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002623const _Tp&
2624max(const _Tp& __a, const _Tp& __b)
2625{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002626 return _VSTD::max(__a, __b, __less<_Tp>());
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002627}
2628
Eric Fiselier93dd1372017-04-18 23:26:47 +00002629#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002630
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002631template<class _Tp, class _Compare>
Marshall Clowe9dca072014-02-19 16:51:35 +00002632inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002633_Tp
2634max(initializer_list<_Tp> __t, _Compare __comp)
2635{
Marshall Clow9e173072015-05-10 13:53:31 +00002636 return *_VSTD::max_element(__t.begin(), __t.end(), __comp);
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002637}
2638
2639template<class _Tp>
Marshall Clowe9dca072014-02-19 16:51:35 +00002640inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002641_Tp
2642max(initializer_list<_Tp> __t)
2643{
Marshall Clow9e173072015-05-10 13:53:31 +00002644 return *_VSTD::max_element(__t.begin(), __t.end(), __less<_Tp>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002645}
2646
Eric Fiselier93dd1372017-04-18 23:26:47 +00002647#endif // _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002648
Marshall Clow3e18d0e2016-03-07 22:43:49 +00002649#if _LIBCPP_STD_VER > 14
2650// clamp
2651template<class _Tp, class _Compare>
2652inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
2653const _Tp&
2654clamp(const _Tp& __v, const _Tp& __lo, const _Tp& __hi, _Compare __comp)
2655{
2656 _LIBCPP_ASSERT(!__comp(__hi, __lo), "Bad bounds passed to std::clamp");
2657 return __comp(__v, __lo) ? __lo : __comp(__hi, __v) ? __hi : __v;
2658
2659}
2660
2661template<class _Tp>
2662inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
2663const _Tp&
2664clamp(const _Tp& __v, const _Tp& __lo, const _Tp& __hi)
2665{
2666 return _VSTD::clamp(__v, __lo, __hi, __less<_Tp>());
2667}
2668#endif
2669
Howard Hinnantc51e1022010-05-11 19:42:16 +00002670// minmax_element
2671
2672template <class _ForwardIterator, class _Compare>
Marshall Clow9e173072015-05-10 13:53:31 +00002673_LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantc51e1022010-05-11 19:42:16 +00002674std::pair<_ForwardIterator, _ForwardIterator>
2675minmax_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
2676{
2677 std::pair<_ForwardIterator, _ForwardIterator> __result(__first, __first);
2678 if (__first != __last)
2679 {
2680 if (++__first != __last)
2681 {
2682 if (__comp(*__first, *__result.first))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002683 __result.first = __first;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002684 else
2685 __result.second = __first;
2686 while (++__first != __last)
2687 {
2688 _ForwardIterator __i = __first;
2689 if (++__first == __last)
2690 {
2691 if (__comp(*__i, *__result.first))
2692 __result.first = __i;
2693 else if (!__comp(*__i, *__result.second))
2694 __result.second = __i;
2695 break;
2696 }
2697 else
2698 {
2699 if (__comp(*__first, *__i))
2700 {
2701 if (__comp(*__first, *__result.first))
2702 __result.first = __first;
2703 if (!__comp(*__i, *__result.second))
2704 __result.second = __i;
2705 }
2706 else
2707 {
2708 if (__comp(*__i, *__result.first))
2709 __result.first = __i;
2710 if (!__comp(*__first, *__result.second))
2711 __result.second = __first;
2712 }
2713 }
2714 }
2715 }
2716 }
2717 return __result;
2718}
2719
2720template <class _ForwardIterator>
Marshall Clow9e173072015-05-10 13:53:31 +00002721inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantc51e1022010-05-11 19:42:16 +00002722std::pair<_ForwardIterator, _ForwardIterator>
2723minmax_element(_ForwardIterator __first, _ForwardIterator __last)
2724{
Marshall Clowe9dca072014-02-19 16:51:35 +00002725 return _VSTD::minmax_element(__first, __last,
2726 __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002727}
2728
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002729// minmax
2730
2731template<class _Tp, class _Compare>
Marshall Clowe9dca072014-02-19 16:51:35 +00002732inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002733pair<const _Tp&, const _Tp&>
2734minmax(const _Tp& __a, const _Tp& __b, _Compare __comp)
2735{
2736 return __comp(__b, __a) ? pair<const _Tp&, const _Tp&>(__b, __a) :
2737 pair<const _Tp&, const _Tp&>(__a, __b);
2738}
2739
2740template<class _Tp>
Marshall Clowe9dca072014-02-19 16:51:35 +00002741inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002742pair<const _Tp&, const _Tp&>
2743minmax(const _Tp& __a, const _Tp& __b)
2744{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002745 return _VSTD::minmax(__a, __b, __less<_Tp>());
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002746}
2747
Eric Fiselier93dd1372017-04-18 23:26:47 +00002748#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002749
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002750template<class _Tp, class _Compare>
Marshall Clowe9dca072014-02-19 16:51:35 +00002751inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002752pair<_Tp, _Tp>
2753minmax(initializer_list<_Tp> __t, _Compare __comp)
2754{
Marshall Clowe9dca072014-02-19 16:51:35 +00002755 typedef typename initializer_list<_Tp>::const_iterator _Iter;
2756 _Iter __first = __t.begin();
2757 _Iter __last = __t.end();
Marshall Clow447713a2015-02-11 15:41:34 +00002758 std::pair<_Tp, _Tp> __result(*__first, *__first);
Marshall Clowe9dca072014-02-19 16:51:35 +00002759
2760 ++__first;
2761 if (__t.size() % 2 == 0)
2762 {
2763 if (__comp(*__first, __result.first))
2764 __result.first = *__first;
2765 else
2766 __result.second = *__first;
2767 ++__first;
2768 }
Aditya Kumar3a0179a2016-08-25 11:52:38 +00002769
Marshall Clowe9dca072014-02-19 16:51:35 +00002770 while (__first != __last)
2771 {
2772 _Tp __prev = *__first++;
Marshall Clow447713a2015-02-11 15:41:34 +00002773 if (__comp(*__first, __prev)) {
2774 if ( __comp(*__first, __result.first)) __result.first = *__first;
2775 if (!__comp(__prev, __result.second)) __result.second = __prev;
Marshall Clowe9dca072014-02-19 16:51:35 +00002776 }
2777 else {
Marshall Clow447713a2015-02-11 15:41:34 +00002778 if ( __comp(__prev, __result.first)) __result.first = __prev;
2779 if (!__comp(*__first, __result.second)) __result.second = *__first;
Marshall Clowe9dca072014-02-19 16:51:35 +00002780 }
Aditya Kumar3a0179a2016-08-25 11:52:38 +00002781
Marshall Clowe9dca072014-02-19 16:51:35 +00002782 __first++;
2783 }
2784 return __result;
2785}
2786
2787template<class _Tp>
2788inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
2789pair<_Tp, _Tp>
2790minmax(initializer_list<_Tp> __t)
2791{
2792 return _VSTD::minmax(__t, __less<_Tp>());
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002793}
2794
Eric Fiselier93dd1372017-04-18 23:26:47 +00002795#endif // _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002796
Howard Hinnantc51e1022010-05-11 19:42:16 +00002797// random_shuffle
2798
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002799// __independent_bits_engine
2800
Howard Hinnantc834c512011-11-29 18:15:50 +00002801template <unsigned long long _Xp, size_t _Rp>
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002802struct __log2_imp
Howard Hinnantc51e1022010-05-11 19:42:16 +00002803{
Howard Hinnantc834c512011-11-29 18:15:50 +00002804 static const size_t value = _Xp & ((unsigned long long)(1) << _Rp) ? _Rp
2805 : __log2_imp<_Xp, _Rp - 1>::value;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002806};
2807
Howard Hinnantc834c512011-11-29 18:15:50 +00002808template <unsigned long long _Xp>
2809struct __log2_imp<_Xp, 0>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002810{
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002811 static const size_t value = 0;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002812};
2813
Howard Hinnantc834c512011-11-29 18:15:50 +00002814template <size_t _Rp>
2815struct __log2_imp<0, _Rp>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002816{
Howard Hinnantc834c512011-11-29 18:15:50 +00002817 static const size_t value = _Rp + 1;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002818};
2819
Eric Fiselier4638fca2017-05-31 21:20:18 +00002820template <class _UIntType, _UIntType _Xp>
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002821struct __log2
Howard Hinnantc51e1022010-05-11 19:42:16 +00002822{
Howard Hinnantc834c512011-11-29 18:15:50 +00002823 static const size_t value = __log2_imp<_Xp,
Eric Fiselier4638fca2017-05-31 21:20:18 +00002824 sizeof(_UIntType) * __CHAR_BIT__ - 1>::value;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002825};
2826
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002827template<class _Engine, class _UIntType>
2828class __independent_bits_engine
Howard Hinnantc51e1022010-05-11 19:42:16 +00002829{
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002830public:
2831 // types
2832 typedef _UIntType result_type;
2833
2834private:
2835 typedef typename _Engine::result_type _Engine_result_type;
2836 typedef typename conditional
2837 <
2838 sizeof(_Engine_result_type) <= sizeof(result_type),
2839 result_type,
2840 _Engine_result_type
2841 >::type _Working_result_type;
2842
2843 _Engine& __e_;
2844 size_t __w_;
2845 size_t __w0_;
2846 size_t __n_;
2847 size_t __n0_;
2848 _Working_result_type __y0_;
2849 _Working_result_type __y1_;
2850 _Engine_result_type __mask0_;
2851 _Engine_result_type __mask1_;
2852
Eric Fiselier93dd1372017-04-18 23:26:47 +00002853#ifdef _LIBCPP_CXX03_LANG
Howard Hinnantc834c512011-11-29 18:15:50 +00002854 static const _Working_result_type _Rp = _Engine::_Max - _Engine::_Min
Howard Hinnant5a646852012-04-02 21:00:45 +00002855 + _Working_result_type(1);
2856#else
2857 static _LIBCPP_CONSTEXPR const _Working_result_type _Rp = _Engine::max() - _Engine::min()
2858 + _Working_result_type(1);
2859#endif
2860 static _LIBCPP_CONSTEXPR const size_t __m = __log2<_Working_result_type, _Rp>::value;
2861 static _LIBCPP_CONSTEXPR const size_t _WDt = numeric_limits<_Working_result_type>::digits;
2862 static _LIBCPP_CONSTEXPR const size_t _EDt = numeric_limits<_Engine_result_type>::digits;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002863
2864public:
2865 // constructors and seeding functions
2866 __independent_bits_engine(_Engine& __e, size_t __w);
2867
2868 // generating functions
Howard Hinnantc834c512011-11-29 18:15:50 +00002869 result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>());}
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002870
2871private:
Marshall Clowfe778582017-09-20 19:38:43 +00002872 result_type __eval(false_type);
2873 result_type __eval(true_type);
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002874};
2875
2876template<class _Engine, class _UIntType>
2877__independent_bits_engine<_Engine, _UIntType>
2878 ::__independent_bits_engine(_Engine& __e, size_t __w)
2879 : __e_(__e),
2880 __w_(__w)
2881{
2882 __n_ = __w_ / __m + (__w_ % __m != 0);
2883 __w0_ = __w_ / __n_;
Howard Hinnantc834c512011-11-29 18:15:50 +00002884 if (_Rp == 0)
2885 __y0_ = _Rp;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002886 else if (__w0_ < _WDt)
Howard Hinnantc834c512011-11-29 18:15:50 +00002887 __y0_ = (_Rp >> __w0_) << __w0_;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002888 else
2889 __y0_ = 0;
Howard Hinnantc834c512011-11-29 18:15:50 +00002890 if (_Rp - __y0_ > __y0_ / __n_)
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002891 {
2892 ++__n_;
2893 __w0_ = __w_ / __n_;
2894 if (__w0_ < _WDt)
Howard Hinnantc834c512011-11-29 18:15:50 +00002895 __y0_ = (_Rp >> __w0_) << __w0_;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002896 else
2897 __y0_ = 0;
2898 }
2899 __n0_ = __n_ - __w_ % __n_;
2900 if (__w0_ < _WDt - 1)
Howard Hinnantc834c512011-11-29 18:15:50 +00002901 __y1_ = (_Rp >> (__w0_ + 1)) << (__w0_ + 1);
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002902 else
2903 __y1_ = 0;
2904 __mask0_ = __w0_ > 0 ? _Engine_result_type(~0) >> (_EDt - __w0_) :
2905 _Engine_result_type(0);
2906 __mask1_ = __w0_ < _EDt - 1 ?
2907 _Engine_result_type(~0) >> (_EDt - (__w0_ + 1)) :
2908 _Engine_result_type(~0);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002909}
2910
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002911template<class _Engine, class _UIntType>
2912inline
2913_UIntType
Marshall Clowfe778582017-09-20 19:38:43 +00002914__independent_bits_engine<_Engine, _UIntType>::__eval(false_type)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002915{
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002916 return static_cast<result_type>(__e_() & __mask0_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002917}
2918
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002919template<class _Engine, class _UIntType>
2920_UIntType
Marshall Clowfe778582017-09-20 19:38:43 +00002921__independent_bits_engine<_Engine, _UIntType>::__eval(true_type)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002922{
Marshall Clowafc48592017-09-20 17:34:11 +00002923 const size_t _WRt = numeric_limits<result_type>::digits;
Howard Hinnantc834c512011-11-29 18:15:50 +00002924 result_type _Sp = 0;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002925 for (size_t __k = 0; __k < __n0_; ++__k)
2926 {
2927 _Engine_result_type __u;
2928 do
2929 {
2930 __u = __e_() - _Engine::min();
2931 } while (__u >= __y0_);
Marshall Clowafc48592017-09-20 17:34:11 +00002932 if (__w0_ < _WRt)
Howard Hinnantc834c512011-11-29 18:15:50 +00002933 _Sp <<= __w0_;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002934 else
Howard Hinnantc834c512011-11-29 18:15:50 +00002935 _Sp = 0;
2936 _Sp += __u & __mask0_;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002937 }
2938 for (size_t __k = __n0_; __k < __n_; ++__k)
2939 {
2940 _Engine_result_type __u;
2941 do
2942 {
2943 __u = __e_() - _Engine::min();
2944 } while (__u >= __y1_);
Marshall Clowafc48592017-09-20 17:34:11 +00002945 if (__w0_ < _WRt - 1)
Howard Hinnantc834c512011-11-29 18:15:50 +00002946 _Sp <<= __w0_ + 1;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002947 else
Howard Hinnantc834c512011-11-29 18:15:50 +00002948 _Sp = 0;
2949 _Sp += __u & __mask1_;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002950 }
Howard Hinnantc834c512011-11-29 18:15:50 +00002951 return _Sp;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002952}
2953
2954// uniform_int_distribution
2955
2956template<class _IntType = int>
2957class uniform_int_distribution
2958{
2959public:
2960 // types
2961 typedef _IntType result_type;
2962
2963 class param_type
2964 {
2965 result_type __a_;
2966 result_type __b_;
2967 public:
2968 typedef uniform_int_distribution distribution_type;
2969
2970 explicit param_type(result_type __a = 0,
2971 result_type __b = numeric_limits<result_type>::max())
2972 : __a_(__a), __b_(__b) {}
2973
2974 result_type a() const {return __a_;}
2975 result_type b() const {return __b_;}
2976
2977 friend bool operator==(const param_type& __x, const param_type& __y)
2978 {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;}
2979 friend bool operator!=(const param_type& __x, const param_type& __y)
2980 {return !(__x == __y);}
2981 };
2982
2983private:
2984 param_type __p_;
2985
2986public:
2987 // constructors and reset functions
2988 explicit uniform_int_distribution(result_type __a = 0,
2989 result_type __b = numeric_limits<result_type>::max())
2990 : __p_(param_type(__a, __b)) {}
2991 explicit uniform_int_distribution(const param_type& __p) : __p_(__p) {}
2992 void reset() {}
2993
2994 // generating functions
2995 template<class _URNG> result_type operator()(_URNG& __g)
2996 {return (*this)(__g, __p_);}
2997 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
2998
2999 // property functions
3000 result_type a() const {return __p_.a();}
3001 result_type b() const {return __p_.b();}
3002
3003 param_type param() const {return __p_;}
3004 void param(const param_type& __p) {__p_ = __p;}
3005
3006 result_type min() const {return a();}
3007 result_type max() const {return b();}
3008
3009 friend bool operator==(const uniform_int_distribution& __x,
3010 const uniform_int_distribution& __y)
3011 {return __x.__p_ == __y.__p_;}
3012 friend bool operator!=(const uniform_int_distribution& __x,
3013 const uniform_int_distribution& __y)
3014 {return !(__x == __y);}
3015};
3016
3017template<class _IntType>
3018template<class _URNG>
3019typename uniform_int_distribution<_IntType>::result_type
3020uniform_int_distribution<_IntType>::operator()(_URNG& __g, const param_type& __p)
3021{
3022 typedef typename conditional<sizeof(result_type) <= sizeof(uint32_t),
3023 uint32_t, uint64_t>::type _UIntType;
Howard Hinnantc834c512011-11-29 18:15:50 +00003024 const _UIntType _Rp = __p.b() - __p.a() + _UIntType(1);
3025 if (_Rp == 1)
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003026 return __p.a();
3027 const size_t _Dt = numeric_limits<_UIntType>::digits;
3028 typedef __independent_bits_engine<_URNG, _UIntType> _Eng;
Howard Hinnantc834c512011-11-29 18:15:50 +00003029 if (_Rp == 0)
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003030 return static_cast<result_type>(_Eng(__g, _Dt)());
Howard Hinnantc834c512011-11-29 18:15:50 +00003031 size_t __w = _Dt - __clz(_Rp) - 1;
Marshall Clow40aada52015-07-30 18:26:34 +00003032 if ((_Rp & (std::numeric_limits<_UIntType>::max() >> (_Dt - __w))) != 0)
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003033 ++__w;
3034 _Eng __e(__g, __w);
3035 _UIntType __u;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003036 do
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003037 {
3038 __u = __e();
Howard Hinnantc834c512011-11-29 18:15:50 +00003039 } while (__u >= _Rp);
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003040 return static_cast<result_type>(__u + __p.a());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003041}
3042
Eric Fiselierf5fb27c2017-04-03 23:23:44 +00003043#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_RANDOM_SHUFFLE) \
3044 || defined(_LIBCPP_BUILDING_LIBRARY)
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00003045class _LIBCPP_TYPE_VIS __rs_default;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003046
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00003047_LIBCPP_FUNC_VIS __rs_default __rs_get();
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003048
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00003049class _LIBCPP_TYPE_VIS __rs_default
Howard Hinnantc51e1022010-05-11 19:42:16 +00003050{
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003051 static unsigned __c_;
3052
3053 __rs_default();
3054public:
Marshall Clow9903c5b2013-02-07 22:12:02 +00003055 typedef uint_fast32_t result_type;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003056
3057 static const result_type _Min = 0;
3058 static const result_type _Max = 0xFFFFFFFF;
3059
3060 __rs_default(const __rs_default&);
3061 ~__rs_default();
3062
3063 result_type operator()();
3064
Howard Hinnant664183b2012-04-02 00:40:41 +00003065 static _LIBCPP_CONSTEXPR result_type min() {return _Min;}
3066 static _LIBCPP_CONSTEXPR result_type max() {return _Max;}
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003067
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00003068 friend _LIBCPP_FUNC_VIS __rs_default __rs_get();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003069};
3070
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00003071_LIBCPP_FUNC_VIS __rs_default __rs_get();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003072
3073template <class _RandomAccessIterator>
3074void
3075random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
3076{
3077 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnantc834c512011-11-29 18:15:50 +00003078 typedef uniform_int_distribution<ptrdiff_t> _Dp;
3079 typedef typename _Dp::param_type _Pp;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003080 difference_type __d = __last - __first;
3081 if (__d > 1)
3082 {
Howard Hinnantc834c512011-11-29 18:15:50 +00003083 _Dp __uid;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003084 __rs_default __g = __rs_get();
3085 for (--__last, --__d; __first < __last; ++__first, --__d)
Howard Hinnantc9bc02c2010-10-22 15:26:39 +00003086 {
Howard Hinnantc834c512011-11-29 18:15:50 +00003087 difference_type __i = __uid(__g, _Pp(0, __d));
Howard Hinnantc9bc02c2010-10-22 15:26:39 +00003088 if (__i != difference_type(0))
3089 swap(*__first, *(__first + __i));
3090 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00003091 }
3092}
3093
3094template <class _RandomAccessIterator, class _RandomNumberGenerator>
3095void
3096random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
Eric Fiselier93dd1372017-04-18 23:26:47 +00003097#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003098 _RandomNumberGenerator&& __rand)
3099#else
3100 _RandomNumberGenerator& __rand)
3101#endif
3102{
3103 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
3104 difference_type __d = __last - __first;
3105 if (__d > 1)
3106 {
3107 for (--__last; __first < __last; ++__first, --__d)
Howard Hinnantc9bc02c2010-10-22 15:26:39 +00003108 {
3109 difference_type __i = __rand(__d);
3110 swap(*__first, *(__first + __i));
3111 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00003112 }
3113}
Marshall Clowfac06e52017-03-23 13:43:37 +00003114#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00003115
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003116template <class _PopulationIterator, class _SampleIterator, class _Distance,
3117 class _UniformRandomNumberGenerator>
3118_LIBCPP_INLINE_VISIBILITY
3119_SampleIterator __sample(_PopulationIterator __first,
Alexander Richardsonc9637642017-11-14 11:14:25 +00003120 _PopulationIterator __last, _SampleIterator __output_iter,
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003121 _Distance __n,
3122 _UniformRandomNumberGenerator & __g,
3123 input_iterator_tag) {
3124
3125 _Distance __k = 0;
3126 for (; __first != __last && __k < __n; ++__first, (void)++__k)
Alexander Richardsonc9637642017-11-14 11:14:25 +00003127 __output_iter[__k] = *__first;
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003128 _Distance __sz = __k;
3129 for (; __first != __last; ++__first, (void)++__k) {
3130 _Distance __r = _VSTD::uniform_int_distribution<_Distance>(0, __k)(__g);
3131 if (__r < __sz)
Alexander Richardsonc9637642017-11-14 11:14:25 +00003132 __output_iter[__r] = *__first;
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003133 }
Alexander Richardsonc9637642017-11-14 11:14:25 +00003134 return __output_iter + _VSTD::min(__n, __k);
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003135}
3136
3137template <class _PopulationIterator, class _SampleIterator, class _Distance,
3138 class _UniformRandomNumberGenerator>
3139_LIBCPP_INLINE_VISIBILITY
3140_SampleIterator __sample(_PopulationIterator __first,
Alexander Richardsonc9637642017-11-14 11:14:25 +00003141 _PopulationIterator __last, _SampleIterator __output_iter,
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003142 _Distance __n,
3143 _UniformRandomNumberGenerator& __g,
3144 forward_iterator_tag) {
3145 _Distance __unsampled_sz = _VSTD::distance(__first, __last);
3146 for (__n = _VSTD::min(__n, __unsampled_sz); __n != 0; ++__first) {
3147 _Distance __r =
3148 _VSTD::uniform_int_distribution<_Distance>(0, --__unsampled_sz)(__g);
3149 if (__r < __n) {
Alexander Richardsonc9637642017-11-14 11:14:25 +00003150 *__output_iter++ = *__first;
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003151 --__n;
3152 }
3153 }
Alexander Richardsonc9637642017-11-14 11:14:25 +00003154 return __output_iter;
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003155}
3156
3157template <class _PopulationIterator, class _SampleIterator, class _Distance,
3158 class _UniformRandomNumberGenerator>
3159_LIBCPP_INLINE_VISIBILITY
3160_SampleIterator __sample(_PopulationIterator __first,
Alexander Richardsonc9637642017-11-14 11:14:25 +00003161 _PopulationIterator __last, _SampleIterator __output_iter,
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003162 _Distance __n, _UniformRandomNumberGenerator& __g) {
3163 typedef typename iterator_traits<_PopulationIterator>::iterator_category
3164 _PopCategory;
3165 typedef typename iterator_traits<_PopulationIterator>::difference_type
3166 _Difference;
3167 static_assert(__is_forward_iterator<_PopulationIterator>::value ||
3168 __is_random_access_iterator<_SampleIterator>::value,
3169 "SampleIterator must meet the requirements of RandomAccessIterator");
3170 typedef typename common_type<_Distance, _Difference>::type _CommonType;
3171 _LIBCPP_ASSERT(__n >= 0, "N must be a positive number.");
3172 return _VSTD::__sample(
Alexander Richardsonc9637642017-11-14 11:14:25 +00003173 __first, __last, __output_iter, _CommonType(__n),
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003174 __g, _PopCategory());
3175}
3176
3177#if _LIBCPP_STD_VER > 14
3178template <class _PopulationIterator, class _SampleIterator, class _Distance,
3179 class _UniformRandomNumberGenerator>
3180inline _LIBCPP_INLINE_VISIBILITY
3181_SampleIterator sample(_PopulationIterator __first,
Alexander Richardsonc9637642017-11-14 11:14:25 +00003182 _PopulationIterator __last, _SampleIterator __output_iter,
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003183 _Distance __n, _UniformRandomNumberGenerator&& __g) {
Alexander Richardsonc9637642017-11-14 11:14:25 +00003184 return _VSTD::__sample(__first, __last, __output_iter, __n, __g);
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003185}
3186#endif // _LIBCPP_STD_VER > 14
3187
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003188template<class _RandomAccessIterator, class _UniformRandomNumberGenerator>
3189 void shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
Eric Fiselier93dd1372017-04-18 23:26:47 +00003190#ifndef _LIBCPP_CXX03_LANG
Howard Hinnanta5e71782010-11-18 01:47:02 +00003191 _UniformRandomNumberGenerator&& __g)
3192#else
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003193 _UniformRandomNumberGenerator& __g)
Howard Hinnanta5e71782010-11-18 01:47:02 +00003194#endif
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003195{
3196 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnantc834c512011-11-29 18:15:50 +00003197 typedef uniform_int_distribution<ptrdiff_t> _Dp;
3198 typedef typename _Dp::param_type _Pp;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003199 difference_type __d = __last - __first;
3200 if (__d > 1)
3201 {
Howard Hinnantc834c512011-11-29 18:15:50 +00003202 _Dp __uid;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003203 for (--__last, --__d; __first < __last; ++__first, --__d)
Howard Hinnantc9bc02c2010-10-22 15:26:39 +00003204 {
Howard Hinnantc834c512011-11-29 18:15:50 +00003205 difference_type __i = __uid(__g, _Pp(0, __d));
Howard Hinnantc9bc02c2010-10-22 15:26:39 +00003206 if (__i != difference_type(0))
3207 swap(*__first, *(__first + __i));
3208 }
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003209 }
3210}
3211
Howard Hinnantc51e1022010-05-11 19:42:16 +00003212template <class _InputIterator, class _Predicate>
Marshall Clow96d050a2018-01-15 16:16:32 +00003213_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Howard Hinnantc51e1022010-05-11 19:42:16 +00003214is_partitioned(_InputIterator __first, _InputIterator __last, _Predicate __pred)
3215{
3216 for (; __first != __last; ++__first)
3217 if (!__pred(*__first))
3218 break;
Marshall Clow3562ed72015-02-02 18:16:35 +00003219 if ( __first == __last )
3220 return true;
3221 ++__first;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003222 for (; __first != __last; ++__first)
3223 if (__pred(*__first))
3224 return false;
3225 return true;
3226}
3227
3228// partition
3229
3230template <class _Predicate, class _ForwardIterator>
3231_ForwardIterator
3232__partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, forward_iterator_tag)
3233{
3234 while (true)
3235 {
3236 if (__first == __last)
3237 return __first;
3238 if (!__pred(*__first))
3239 break;
3240 ++__first;
3241 }
3242 for (_ForwardIterator __p = __first; ++__p != __last;)
3243 {
3244 if (__pred(*__p))
3245 {
3246 swap(*__first, *__p);
3247 ++__first;
3248 }
3249 }
3250 return __first;
3251}
3252
3253template <class _Predicate, class _BidirectionalIterator>
3254_BidirectionalIterator
3255__partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3256 bidirectional_iterator_tag)
3257{
3258 while (true)
3259 {
3260 while (true)
3261 {
3262 if (__first == __last)
3263 return __first;
3264 if (!__pred(*__first))
3265 break;
3266 ++__first;
3267 }
3268 do
3269 {
3270 if (__first == --__last)
3271 return __first;
3272 } while (!__pred(*__last));
3273 swap(*__first, *__last);
3274 ++__first;
3275 }
3276}
3277
3278template <class _ForwardIterator, class _Predicate>
3279inline _LIBCPP_INLINE_VISIBILITY
3280_ForwardIterator
3281partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
3282{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003283 return _VSTD::__partition<typename add_lvalue_reference<_Predicate>::type>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003284 (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
3285}
3286
3287// partition_copy
3288
3289template <class _InputIterator, class _OutputIterator1,
3290 class _OutputIterator2, class _Predicate>
3291pair<_OutputIterator1, _OutputIterator2>
3292partition_copy(_InputIterator __first, _InputIterator __last,
3293 _OutputIterator1 __out_true, _OutputIterator2 __out_false,
3294 _Predicate __pred)
3295{
3296 for (; __first != __last; ++__first)
3297 {
3298 if (__pred(*__first))
3299 {
3300 *__out_true = *__first;
3301 ++__out_true;
3302 }
3303 else
3304 {
3305 *__out_false = *__first;
3306 ++__out_false;
3307 }
3308 }
3309 return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false);
3310}
3311
3312// partition_point
3313
3314template<class _ForwardIterator, class _Predicate>
Marshall Clowcb3c8262018-01-15 17:53:34 +00003315_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00003316partition_point(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
3317{
3318 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003319 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003320 while (__len != 0)
3321 {
3322 difference_type __l2 = __len / 2;
3323 _ForwardIterator __m = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003324 _VSTD::advance(__m, __l2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003325 if (__pred(*__m))
3326 {
3327 __first = ++__m;
3328 __len -= __l2 + 1;
3329 }
3330 else
3331 __len = __l2;
3332 }
3333 return __first;
3334}
3335
3336// stable_partition
3337
3338template <class _Predicate, class _ForwardIterator, class _Distance, class _Pair>
3339_ForwardIterator
3340__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
3341 _Distance __len, _Pair __p, forward_iterator_tag __fit)
3342{
3343 // *__first is known to be false
3344 // __len >= 1
3345 if (__len == 1)
3346 return __first;
3347 if (__len == 2)
3348 {
3349 _ForwardIterator __m = __first;
3350 if (__pred(*++__m))
3351 {
3352 swap(*__first, *__m);
3353 return __m;
3354 }
3355 return __first;
3356 }
3357 if (__len <= __p.second)
3358 { // The buffer is big enough to use
3359 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
3360 __destruct_n __d(0);
3361 unique_ptr<value_type, __destruct_n&> __h(__p.first, __d);
3362 // Move the falses into the temporary buffer, and the trues to the front of the line
3363 // Update __first to always point to the end of the trues
3364 value_type* __t = __p.first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003365 ::new(__t) value_type(_VSTD::move(*__first));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003366 __d.__incr((value_type*)0);
3367 ++__t;
3368 _ForwardIterator __i = __first;
3369 while (++__i != __last)
3370 {
3371 if (__pred(*__i))
3372 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003373 *__first = _VSTD::move(*__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003374 ++__first;
3375 }
3376 else
3377 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003378 ::new(__t) value_type(_VSTD::move(*__i));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003379 __d.__incr((value_type*)0);
3380 ++__t;
3381 }
3382 }
3383 // All trues now at start of range, all falses in buffer
3384 // Move falses back into range, but don't mess up __first which points to first false
3385 __i = __first;
3386 for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003387 *__i = _VSTD::move(*__t2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003388 // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer
3389 return __first;
3390 }
3391 // Else not enough buffer, do in place
3392 // __len >= 3
3393 _ForwardIterator __m = __first;
3394 _Distance __len2 = __len / 2; // __len2 >= 2
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003395 _VSTD::advance(__m, __len2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003396 // recurse on [__first, __m), *__first know to be false
3397 // F?????????????????
3398 // f m l
3399 typedef typename add_lvalue_reference<_Predicate>::type _PredRef;
3400 _ForwardIterator __first_false = __stable_partition<_PredRef>(__first, __m, __pred, __len2, __p, __fit);
3401 // TTTFFFFF??????????
3402 // f ff m l
3403 // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true
3404 _ForwardIterator __m1 = __m;
3405 _ForwardIterator __second_false = __last;
3406 _Distance __len_half = __len - __len2;
3407 while (__pred(*__m1))
3408 {
3409 if (++__m1 == __last)
3410 goto __second_half_done;
3411 --__len_half;
3412 }
3413 // TTTFFFFFTTTF??????
3414 // f ff m m1 l
3415 __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __fit);
3416__second_half_done:
3417 // TTTFFFFFTTTTTFFFFF
3418 // f ff m sf l
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003419 return _VSTD::rotate(__first_false, __m, __second_false);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003420 // TTTTTTTTFFFFFFFFFF
3421 // |
3422}
3423
3424struct __return_temporary_buffer
3425{
3426 template <class _Tp>
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003427 _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) const {_VSTD::return_temporary_buffer(__p);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00003428};
3429
3430template <class _Predicate, class _ForwardIterator>
3431_ForwardIterator
3432__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
3433 forward_iterator_tag)
3434{
3435 const unsigned __alloc_limit = 3; // might want to make this a function of trivial assignment
3436 // Either prove all true and return __first or point to first false
3437 while (true)
3438 {
3439 if (__first == __last)
3440 return __first;
3441 if (!__pred(*__first))
3442 break;
3443 ++__first;
3444 }
3445 // We now have a reduced range [__first, __last)
3446 // *__first is known to be false
3447 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
3448 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003449 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003450 pair<value_type*, ptrdiff_t> __p(0, 0);
3451 unique_ptr<value_type, __return_temporary_buffer> __h;
3452 if (__len >= __alloc_limit)
3453 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003454 __p = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003455 __h.reset(__p.first);
3456 }
3457 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
3458 (__first, __last, __pred, __len, __p, forward_iterator_tag());
3459}
3460
3461template <class _Predicate, class _BidirectionalIterator, class _Distance, class _Pair>
3462_BidirectionalIterator
3463__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3464 _Distance __len, _Pair __p, bidirectional_iterator_tag __bit)
3465{
3466 // *__first is known to be false
3467 // *__last is known to be true
3468 // __len >= 2
3469 if (__len == 2)
3470 {
3471 swap(*__first, *__last);
3472 return __last;
3473 }
3474 if (__len == 3)
3475 {
3476 _BidirectionalIterator __m = __first;
3477 if (__pred(*++__m))
3478 {
3479 swap(*__first, *__m);
3480 swap(*__m, *__last);
3481 return __last;
3482 }
3483 swap(*__m, *__last);
3484 swap(*__first, *__m);
3485 return __m;
3486 }
3487 if (__len <= __p.second)
3488 { // The buffer is big enough to use
3489 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3490 __destruct_n __d(0);
3491 unique_ptr<value_type, __destruct_n&> __h(__p.first, __d);
3492 // Move the falses into the temporary buffer, and the trues to the front of the line
3493 // Update __first to always point to the end of the trues
3494 value_type* __t = __p.first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003495 ::new(__t) value_type(_VSTD::move(*__first));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003496 __d.__incr((value_type*)0);
3497 ++__t;
3498 _BidirectionalIterator __i = __first;
3499 while (++__i != __last)
3500 {
3501 if (__pred(*__i))
3502 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003503 *__first = _VSTD::move(*__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003504 ++__first;
3505 }
3506 else
3507 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003508 ::new(__t) value_type(_VSTD::move(*__i));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003509 __d.__incr((value_type*)0);
3510 ++__t;
3511 }
3512 }
3513 // move *__last, known to be true
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003514 *__first = _VSTD::move(*__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003515 __i = ++__first;
3516 // All trues now at start of range, all falses in buffer
3517 // Move falses back into range, but don't mess up __first which points to first false
3518 for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003519 *__i = _VSTD::move(*__t2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003520 // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer
3521 return __first;
3522 }
3523 // Else not enough buffer, do in place
3524 // __len >= 4
3525 _BidirectionalIterator __m = __first;
3526 _Distance __len2 = __len / 2; // __len2 >= 2
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003527 _VSTD::advance(__m, __len2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003528 // recurse on [__first, __m-1], except reduce __m-1 until *(__m-1) is true, *__first know to be false
3529 // F????????????????T
3530 // f m l
3531 _BidirectionalIterator __m1 = __m;
3532 _BidirectionalIterator __first_false = __first;
3533 _Distance __len_half = __len2;
3534 while (!__pred(*--__m1))
3535 {
3536 if (__m1 == __first)
3537 goto __first_half_done;
3538 --__len_half;
3539 }
3540 // F???TFFF?????????T
3541 // f m1 m l
3542 typedef typename add_lvalue_reference<_Predicate>::type _PredRef;
3543 __first_false = __stable_partition<_PredRef>(__first, __m1, __pred, __len_half, __p, __bit);
3544__first_half_done:
3545 // TTTFFFFF?????????T
3546 // f ff m l
3547 // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true
3548 __m1 = __m;
3549 _BidirectionalIterator __second_false = __last;
3550 ++__second_false;
3551 __len_half = __len - __len2;
3552 while (__pred(*__m1))
3553 {
3554 if (++__m1 == __last)
3555 goto __second_half_done;
3556 --__len_half;
3557 }
3558 // TTTFFFFFTTTF?????T
3559 // f ff m m1 l
3560 __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __bit);
3561__second_half_done:
3562 // TTTFFFFFTTTTTFFFFF
3563 // f ff m sf l
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003564 return _VSTD::rotate(__first_false, __m, __second_false);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003565 // TTTTTTTTFFFFFFFFFF
3566 // |
3567}
3568
3569template <class _Predicate, class _BidirectionalIterator>
3570_BidirectionalIterator
3571__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3572 bidirectional_iterator_tag)
3573{
3574 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
3575 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3576 const difference_type __alloc_limit = 4; // might want to make this a function of trivial assignment
3577 // Either prove all true and return __first or point to first false
3578 while (true)
3579 {
3580 if (__first == __last)
3581 return __first;
3582 if (!__pred(*__first))
3583 break;
3584 ++__first;
3585 }
3586 // __first points to first false, everything prior to __first is already set.
3587 // Either prove [__first, __last) is all false and return __first, or point __last to last true
3588 do
3589 {
3590 if (__first == --__last)
3591 return __first;
3592 } while (!__pred(*__last));
3593 // We now have a reduced range [__first, __last]
3594 // *__first is known to be false
3595 // *__last is known to be true
3596 // __len >= 2
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003597 difference_type __len = _VSTD::distance(__first, __last) + 1;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003598 pair<value_type*, ptrdiff_t> __p(0, 0);
3599 unique_ptr<value_type, __return_temporary_buffer> __h;
3600 if (__len >= __alloc_limit)
3601 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003602 __p = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003603 __h.reset(__p.first);
3604 }
3605 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
3606 (__first, __last, __pred, __len, __p, bidirectional_iterator_tag());
3607}
3608
3609template <class _ForwardIterator, class _Predicate>
3610inline _LIBCPP_INLINE_VISIBILITY
3611_ForwardIterator
3612stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
3613{
3614 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
3615 (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
3616}
3617
3618// is_sorted_until
3619
3620template <class _ForwardIterator, class _Compare>
Marshall Clow96d050a2018-01-15 16:16:32 +00003621_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00003622is_sorted_until(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
3623{
3624 if (__first != __last)
3625 {
3626 _ForwardIterator __i = __first;
3627 while (++__i != __last)
3628 {
3629 if (__comp(*__i, *__first))
3630 return __i;
3631 __first = __i;
3632 }
3633 }
3634 return __last;
3635}
3636
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003637template<class _ForwardIterator>
Marshall Clow96d050a2018-01-15 16:16:32 +00003638inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00003639_ForwardIterator
3640is_sorted_until(_ForwardIterator __first, _ForwardIterator __last)
3641{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003642 return _VSTD::is_sorted_until(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003643}
3644
3645// is_sorted
3646
3647template <class _ForwardIterator, class _Compare>
Marshall Clow96d050a2018-01-15 16:16:32 +00003648inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00003649bool
3650is_sorted(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
3651{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003652 return _VSTD::is_sorted_until(__first, __last, __comp) == __last;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003653}
3654
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003655template<class _ForwardIterator>
Marshall Clow96d050a2018-01-15 16:16:32 +00003656inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00003657bool
3658is_sorted(_ForwardIterator __first, _ForwardIterator __last)
3659{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003660 return _VSTD::is_sorted(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003661}
3662
3663// sort
3664
3665// stable, 2-3 compares, 0-2 swaps
3666
3667template <class _Compare, class _ForwardIterator>
3668unsigned
3669__sort3(_ForwardIterator __x, _ForwardIterator __y, _ForwardIterator __z, _Compare __c)
3670{
3671 unsigned __r = 0;
3672 if (!__c(*__y, *__x)) // if x <= y
3673 {
3674 if (!__c(*__z, *__y)) // if y <= z
3675 return __r; // x <= y && y <= z
3676 // x <= y && y > z
3677 swap(*__y, *__z); // x <= z && y < z
3678 __r = 1;
3679 if (__c(*__y, *__x)) // if x > y
3680 {
3681 swap(*__x, *__y); // x < y && y <= z
3682 __r = 2;
3683 }
3684 return __r; // x <= y && y < z
3685 }
3686 if (__c(*__z, *__y)) // x > y, if y > z
3687 {
3688 swap(*__x, *__z); // x < y && y < z
3689 __r = 1;
3690 return __r;
3691 }
3692 swap(*__x, *__y); // x > y && y <= z
3693 __r = 1; // x < y && x <= z
3694 if (__c(*__z, *__y)) // if y > z
3695 {
3696 swap(*__y, *__z); // x <= y && y < z
3697 __r = 2;
3698 }
3699 return __r;
3700} // x <= y && y <= z
3701
3702// stable, 3-6 compares, 0-5 swaps
3703
3704template <class _Compare, class _ForwardIterator>
3705unsigned
3706__sort4(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3,
3707 _ForwardIterator __x4, _Compare __c)
3708{
3709 unsigned __r = __sort3<_Compare>(__x1, __x2, __x3, __c);
3710 if (__c(*__x4, *__x3))
3711 {
3712 swap(*__x3, *__x4);
3713 ++__r;
3714 if (__c(*__x3, *__x2))
3715 {
3716 swap(*__x2, *__x3);
3717 ++__r;
3718 if (__c(*__x2, *__x1))
3719 {
3720 swap(*__x1, *__x2);
3721 ++__r;
3722 }
3723 }
3724 }
3725 return __r;
3726}
3727
3728// stable, 4-10 compares, 0-9 swaps
3729
3730template <class _Compare, class _ForwardIterator>
3731unsigned
3732__sort5(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3,
3733 _ForwardIterator __x4, _ForwardIterator __x5, _Compare __c)
3734{
3735 unsigned __r = __sort4<_Compare>(__x1, __x2, __x3, __x4, __c);
3736 if (__c(*__x5, *__x4))
3737 {
3738 swap(*__x4, *__x5);
3739 ++__r;
3740 if (__c(*__x4, *__x3))
3741 {
3742 swap(*__x3, *__x4);
3743 ++__r;
3744 if (__c(*__x3, *__x2))
3745 {
3746 swap(*__x2, *__x3);
3747 ++__r;
3748 if (__c(*__x2, *__x1))
3749 {
3750 swap(*__x1, *__x2);
3751 ++__r;
3752 }
3753 }
3754 }
3755 }
3756 return __r;
3757}
3758
3759// Assumes size > 0
3760template <class _Compare, class _BirdirectionalIterator>
3761void
3762__selection_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp)
3763{
3764 _BirdirectionalIterator __lm1 = __last;
3765 for (--__lm1; __first != __lm1; ++__first)
3766 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003767 _BirdirectionalIterator __i = _VSTD::min_element<_BirdirectionalIterator,
Howard Hinnantc51e1022010-05-11 19:42:16 +00003768 typename add_lvalue_reference<_Compare>::type>
3769 (__first, __last, __comp);
3770 if (__i != __first)
3771 swap(*__first, *__i);
3772 }
3773}
3774
3775template <class _Compare, class _BirdirectionalIterator>
3776void
3777__insertion_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp)
3778{
3779 typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type;
3780 if (__first != __last)
3781 {
3782 _BirdirectionalIterator __i = __first;
3783 for (++__i; __i != __last; ++__i)
3784 {
3785 _BirdirectionalIterator __j = __i;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003786 value_type __t(_VSTD::move(*__j));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003787 for (_BirdirectionalIterator __k = __i; __k != __first && __comp(__t, *--__k); --__j)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003788 *__j = _VSTD::move(*__k);
3789 *__j = _VSTD::move(__t);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003790 }
3791 }
3792}
3793
3794template <class _Compare, class _RandomAccessIterator>
3795void
3796__insertion_sort_3(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3797{
3798 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3799 _RandomAccessIterator __j = __first+2;
3800 __sort3<_Compare>(__first, __first+1, __j, __comp);
3801 for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
3802 {
3803 if (__comp(*__i, *__j))
3804 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003805 value_type __t(_VSTD::move(*__i));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003806 _RandomAccessIterator __k = __j;
3807 __j = __i;
3808 do
3809 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003810 *__j = _VSTD::move(*__k);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003811 __j = __k;
3812 } while (__j != __first && __comp(__t, *--__k));
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003813 *__j = _VSTD::move(__t);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003814 }
3815 __j = __i;
3816 }
3817}
3818
3819template <class _Compare, class _RandomAccessIterator>
3820bool
3821__insertion_sort_incomplete(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3822{
3823 switch (__last - __first)
3824 {
3825 case 0:
3826 case 1:
3827 return true;
3828 case 2:
3829 if (__comp(*--__last, *__first))
3830 swap(*__first, *__last);
3831 return true;
3832 case 3:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003833 _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003834 return true;
3835 case 4:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003836 _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003837 return true;
3838 case 5:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003839 _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003840 return true;
3841 }
3842 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3843 _RandomAccessIterator __j = __first+2;
3844 __sort3<_Compare>(__first, __first+1, __j, __comp);
3845 const unsigned __limit = 8;
3846 unsigned __count = 0;
3847 for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
3848 {
3849 if (__comp(*__i, *__j))
3850 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003851 value_type __t(_VSTD::move(*__i));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003852 _RandomAccessIterator __k = __j;
3853 __j = __i;
3854 do
3855 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003856 *__j = _VSTD::move(*__k);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003857 __j = __k;
3858 } while (__j != __first && __comp(__t, *--__k));
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003859 *__j = _VSTD::move(__t);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003860 if (++__count == __limit)
3861 return ++__i == __last;
3862 }
3863 __j = __i;
3864 }
3865 return true;
3866}
3867
3868template <class _Compare, class _BirdirectionalIterator>
3869void
3870__insertion_sort_move(_BirdirectionalIterator __first1, _BirdirectionalIterator __last1,
3871 typename iterator_traits<_BirdirectionalIterator>::value_type* __first2, _Compare __comp)
3872{
3873 typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type;
3874 if (__first1 != __last1)
3875 {
3876 __destruct_n __d(0);
3877 unique_ptr<value_type, __destruct_n&> __h(__first2, __d);
3878 value_type* __last2 = __first2;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003879 ::new(__last2) value_type(_VSTD::move(*__first1));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003880 __d.__incr((value_type*)0);
3881 for (++__last2; ++__first1 != __last1; ++__last2)
3882 {
3883 value_type* __j2 = __last2;
3884 value_type* __i2 = __j2;
3885 if (__comp(*__first1, *--__i2))
3886 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003887 ::new(__j2) value_type(_VSTD::move(*__i2));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003888 __d.__incr((value_type*)0);
3889 for (--__j2; __i2 != __first2 && __comp(*__first1, *--__i2); --__j2)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003890 *__j2 = _VSTD::move(*__i2);
3891 *__j2 = _VSTD::move(*__first1);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003892 }
3893 else
3894 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003895 ::new(__j2) value_type(_VSTD::move(*__first1));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003896 __d.__incr((value_type*)0);
3897 }
3898 }
3899 __h.release();
3900 }
3901}
3902
3903template <class _Compare, class _RandomAccessIterator>
3904void
3905__sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3906{
3907 // _Compare is known to be a reference type
3908 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
3909 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
Howard Hinnanta9a897e2010-11-19 22:17:28 +00003910 const difference_type __limit = is_trivially_copy_constructible<value_type>::value &&
3911 is_trivially_copy_assignable<value_type>::value ? 30 : 6;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003912 while (true)
3913 {
3914 __restart:
3915 difference_type __len = __last - __first;
3916 switch (__len)
3917 {
3918 case 0:
3919 case 1:
3920 return;
3921 case 2:
3922 if (__comp(*--__last, *__first))
3923 swap(*__first, *__last);
3924 return;
3925 case 3:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003926 _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003927 return;
3928 case 4:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003929 _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003930 return;
3931 case 5:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003932 _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003933 return;
3934 }
3935 if (__len <= __limit)
3936 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003937 _VSTD::__insertion_sort_3<_Compare>(__first, __last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003938 return;
3939 }
3940 // __len > 5
3941 _RandomAccessIterator __m = __first;
3942 _RandomAccessIterator __lm1 = __last;
3943 --__lm1;
3944 unsigned __n_swaps;
3945 {
3946 difference_type __delta;
3947 if (__len >= 1000)
3948 {
3949 __delta = __len/2;
3950 __m += __delta;
3951 __delta /= 2;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003952 __n_swaps = _VSTD::__sort5<_Compare>(__first, __first + __delta, __m, __m+__delta, __lm1, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003953 }
3954 else
3955 {
3956 __delta = __len/2;
3957 __m += __delta;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003958 __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, __lm1, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003959 }
3960 }
3961 // *__m is median
3962 // partition [__first, __m) < *__m and *__m <= [__m, __last)
3963 // (this inhibits tossing elements equivalent to __m around unnecessarily)
3964 _RandomAccessIterator __i = __first;
3965 _RandomAccessIterator __j = __lm1;
3966 // j points beyond range to be tested, *__m is known to be <= *__lm1
3967 // The search going up is known to be guarded but the search coming down isn't.
3968 // Prime the downward search with a guard.
3969 if (!__comp(*__i, *__m)) // if *__first == *__m
3970 {
3971 // *__first == *__m, *__first doesn't go in first part
3972 // manually guard downward moving __j against __i
3973 while (true)
3974 {
3975 if (__i == --__j)
3976 {
3977 // *__first == *__m, *__m <= all other elements
3978 // Parition instead into [__first, __i) == *__first and *__first < [__i, __last)
3979 ++__i; // __first + 1
3980 __j = __last;
3981 if (!__comp(*__first, *--__j)) // we need a guard if *__first == *(__last-1)
3982 {
3983 while (true)
3984 {
3985 if (__i == __j)
3986 return; // [__first, __last) all equivalent elements
3987 if (__comp(*__first, *__i))
3988 {
3989 swap(*__i, *__j);
3990 ++__n_swaps;
3991 ++__i;
3992 break;
3993 }
3994 ++__i;
3995 }
3996 }
3997 // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1
3998 if (__i == __j)
3999 return;
4000 while (true)
4001 {
4002 while (!__comp(*__first, *__i))
4003 ++__i;
4004 while (__comp(*__first, *--__j))
4005 ;
4006 if (__i >= __j)
4007 break;
4008 swap(*__i, *__j);
4009 ++__n_swaps;
4010 ++__i;
4011 }
4012 // [__first, __i) == *__first and *__first < [__i, __last)
4013 // The first part is sorted, sort the secod part
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004014 // _VSTD::__sort<_Compare>(__i, __last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004015 __first = __i;
4016 goto __restart;
4017 }
4018 if (__comp(*__j, *__m))
4019 {
4020 swap(*__i, *__j);
4021 ++__n_swaps;
4022 break; // found guard for downward moving __j, now use unguarded partition
4023 }
4024 }
4025 }
4026 // It is known that *__i < *__m
4027 ++__i;
4028 // j points beyond range to be tested, *__m is known to be <= *__lm1
4029 // if not yet partitioned...
4030 if (__i < __j)
4031 {
4032 // known that *(__i - 1) < *__m
4033 // known that __i <= __m
4034 while (true)
4035 {
4036 // __m still guards upward moving __i
4037 while (__comp(*__i, *__m))
4038 ++__i;
4039 // It is now known that a guard exists for downward moving __j
4040 while (!__comp(*--__j, *__m))
4041 ;
4042 if (__i > __j)
4043 break;
4044 swap(*__i, *__j);
4045 ++__n_swaps;
4046 // It is known that __m != __j
4047 // If __m just moved, follow it
4048 if (__m == __i)
4049 __m = __j;
4050 ++__i;
4051 }
4052 }
4053 // [__first, __i) < *__m and *__m <= [__i, __last)
4054 if (__i != __m && __comp(*__m, *__i))
4055 {
4056 swap(*__i, *__m);
4057 ++__n_swaps;
4058 }
4059 // [__first, __i) < *__i and *__i <= [__i+1, __last)
4060 // If we were given a perfect partition, see if insertion sort is quick...
4061 if (__n_swaps == 0)
4062 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004063 bool __fs = _VSTD::__insertion_sort_incomplete<_Compare>(__first, __i, __comp);
4064 if (_VSTD::__insertion_sort_incomplete<_Compare>(__i+1, __last, __comp))
Howard Hinnantc51e1022010-05-11 19:42:16 +00004065 {
4066 if (__fs)
4067 return;
4068 __last = __i;
4069 continue;
4070 }
4071 else
4072 {
4073 if (__fs)
4074 {
4075 __first = ++__i;
4076 continue;
4077 }
4078 }
4079 }
4080 // sort smaller range with recursive call and larger with tail recursion elimination
4081 if (__i - __first < __last - __i)
4082 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004083 _VSTD::__sort<_Compare>(__first, __i, __comp);
4084 // _VSTD::__sort<_Compare>(__i+1, __last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004085 __first = ++__i;
4086 }
4087 else
4088 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004089 _VSTD::__sort<_Compare>(__i+1, __last, __comp);
4090 // _VSTD::__sort<_Compare>(__first, __i, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004091 __last = __i;
4092 }
4093 }
4094}
4095
4096// This forwarder keeps the top call and the recursive calls using the same instantiation, forcing a reference _Compare
4097template <class _RandomAccessIterator, class _Compare>
4098inline _LIBCPP_INLINE_VISIBILITY
4099void
4100sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4101{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004102#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004103 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4104 __debug_less<_Compare> __c(__comp);
4105 __sort<_Comp_ref>(__first, __last, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004106#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004107 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4108 __sort<_Comp_ref>(__first, __last, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004109#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004110}
4111
4112template <class _RandomAccessIterator>
4113inline _LIBCPP_INLINE_VISIBILITY
4114void
4115sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
4116{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004117 _VSTD::sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004118}
4119
4120template <class _Tp>
4121inline _LIBCPP_INLINE_VISIBILITY
4122void
4123sort(_Tp** __first, _Tp** __last)
4124{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004125 _VSTD::sort((size_t*)__first, (size_t*)__last, __less<size_t>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004126}
4127
4128template <class _Tp>
4129inline _LIBCPP_INLINE_VISIBILITY
4130void
4131sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last)
4132{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004133 _VSTD::sort(__first.base(), __last.base());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004134}
4135
Howard Hinnant27e0e772011-09-14 18:33:51 +00004136template <class _Tp, class _Compare>
4137inline _LIBCPP_INLINE_VISIBILITY
4138void
4139sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last, _Compare __comp)
4140{
4141 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4142 _VSTD::sort<_Tp*, _Comp_ref>(__first.base(), __last.base(), __comp);
4143}
4144
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00004145_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<char>&, char*>(char*, char*, __less<char>&))
4146_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&))
4147_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&))
4148_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&))
4149_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<short>&, short*>(short*, short*, __less<short>&))
4150_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&))
4151_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<int>&, int*>(int*, int*, __less<int>&))
4152_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&))
4153_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<long>&, long*>(long*, long*, __less<long>&))
4154_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&))
4155_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<long long>&, long long*>(long long*, long long*, __less<long long>&))
4156_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>&))
4157_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<float>&, float*>(float*, float*, __less<float>&))
4158_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<double>&, double*>(double*, double*, __less<double>&))
4159_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<long double>&, long double*>(long double*, long double*, __less<long double>&))
Howard Hinnantc51e1022010-05-11 19:42:16 +00004160
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00004161_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<char>&, char*>(char*, char*, __less<char>&))
4162_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&))
4163_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&))
4164_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&))
4165_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<short>&, short*>(short*, short*, __less<short>&))
4166_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&))
4167_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<int>&, int*>(int*, int*, __less<int>&))
4168_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&))
4169_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<long>&, long*>(long*, long*, __less<long>&))
4170_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&))
4171_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<long long>&, long long*>(long long*, long long*, __less<long long>&))
4172_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>&))
4173_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<float>&, float*>(float*, float*, __less<float>&))
4174_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<double>&, double*>(double*, double*, __less<double>&))
4175_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<long double>&, long double*>(long double*, long double*, __less<long double>&))
Howard Hinnantc51e1022010-05-11 19:42:16 +00004176
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00004177_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 Hinnantc51e1022010-05-11 19:42:16 +00004178
4179// lower_bound
4180
4181template <class _Compare, class _ForwardIterator, class _Tp>
Marshall Clowe00916c2018-01-16 02:34:41 +00004182_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00004183__lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004184{
4185 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004186 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004187 while (__len != 0)
4188 {
4189 difference_type __l2 = __len / 2;
4190 _ForwardIterator __m = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004191 _VSTD::advance(__m, __l2);
Howard Hinnantbf074022011-10-22 20:59:45 +00004192 if (__comp(*__m, __value_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00004193 {
4194 __first = ++__m;
4195 __len -= __l2 + 1;
4196 }
4197 else
4198 __len = __l2;
4199 }
4200 return __first;
4201}
4202
4203template <class _ForwardIterator, class _Tp, class _Compare>
Marshall Clowe00916c2018-01-16 02:34:41 +00004204inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004205_ForwardIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00004206lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004207{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004208#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004209 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4210 __debug_less<_Compare> __c(__comp);
Howard Hinnantbf074022011-10-22 20:59:45 +00004211 return __lower_bound<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004212#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004213 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnantbf074022011-10-22 20:59:45 +00004214 return __lower_bound<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004215#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004216}
4217
4218template <class _ForwardIterator, class _Tp>
Marshall Clowe00916c2018-01-16 02:34:41 +00004219inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004220_ForwardIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00004221lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004222{
Howard Hinnantbf074022011-10-22 20:59:45 +00004223 return _VSTD::lower_bound(__first, __last, __value_,
Howard Hinnantc51e1022010-05-11 19:42:16 +00004224 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
4225}
4226
4227// upper_bound
4228
4229template <class _Compare, class _ForwardIterator, class _Tp>
Marshall Clowe00916c2018-01-16 02:34:41 +00004230_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00004231__upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004232{
4233 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004234 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004235 while (__len != 0)
4236 {
4237 difference_type __l2 = __len / 2;
4238 _ForwardIterator __m = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004239 _VSTD::advance(__m, __l2);
Howard Hinnantbf074022011-10-22 20:59:45 +00004240 if (__comp(__value_, *__m))
Howard Hinnantc51e1022010-05-11 19:42:16 +00004241 __len = __l2;
4242 else
4243 {
4244 __first = ++__m;
4245 __len -= __l2 + 1;
4246 }
4247 }
4248 return __first;
4249}
4250
4251template <class _ForwardIterator, class _Tp, class _Compare>
Marshall Clowe00916c2018-01-16 02:34:41 +00004252inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004253_ForwardIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00004254upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004255{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004256#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004257 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4258 __debug_less<_Compare> __c(__comp);
Howard Hinnantbf074022011-10-22 20:59:45 +00004259 return __upper_bound<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004260#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004261 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnantbf074022011-10-22 20:59:45 +00004262 return __upper_bound<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004263#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004264}
4265
4266template <class _ForwardIterator, class _Tp>
Marshall Clowe00916c2018-01-16 02:34:41 +00004267inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004268_ForwardIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00004269upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004270{
Howard Hinnantbf074022011-10-22 20:59:45 +00004271 return _VSTD::upper_bound(__first, __last, __value_,
Howard Hinnantc51e1022010-05-11 19:42:16 +00004272 __less<_Tp, typename iterator_traits<_ForwardIterator>::value_type>());
4273}
4274
4275// equal_range
4276
4277template <class _Compare, class _ForwardIterator, class _Tp>
Marshall Clowe00916c2018-01-16 02:34:41 +00004278_LIBCPP_CONSTEXPR_AFTER_CXX17 pair<_ForwardIterator, _ForwardIterator>
Howard Hinnantbf074022011-10-22 20:59:45 +00004279__equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004280{
4281 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004282 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004283 while (__len != 0)
4284 {
4285 difference_type __l2 = __len / 2;
4286 _ForwardIterator __m = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004287 _VSTD::advance(__m, __l2);
Howard Hinnantbf074022011-10-22 20:59:45 +00004288 if (__comp(*__m, __value_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00004289 {
4290 __first = ++__m;
4291 __len -= __l2 + 1;
4292 }
Howard Hinnantbf074022011-10-22 20:59:45 +00004293 else if (__comp(__value_, *__m))
Howard Hinnantc51e1022010-05-11 19:42:16 +00004294 {
4295 __last = __m;
4296 __len = __l2;
4297 }
4298 else
4299 {
4300 _ForwardIterator __mp1 = __m;
4301 return pair<_ForwardIterator, _ForwardIterator>
4302 (
Howard Hinnantbf074022011-10-22 20:59:45 +00004303 __lower_bound<_Compare>(__first, __m, __value_, __comp),
4304 __upper_bound<_Compare>(++__mp1, __last, __value_, __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004305 );
4306 }
4307 }
4308 return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
4309}
4310
4311template <class _ForwardIterator, class _Tp, class _Compare>
Marshall Clowe00916c2018-01-16 02:34:41 +00004312inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004313pair<_ForwardIterator, _ForwardIterator>
Howard Hinnantbf074022011-10-22 20:59:45 +00004314equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004315{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004316#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004317 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4318 __debug_less<_Compare> __c(__comp);
Howard Hinnantbf074022011-10-22 20:59:45 +00004319 return __equal_range<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004320#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004321 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnantbf074022011-10-22 20:59:45 +00004322 return __equal_range<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004323#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004324}
4325
4326template <class _ForwardIterator, class _Tp>
Marshall Clowe00916c2018-01-16 02:34:41 +00004327inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004328pair<_ForwardIterator, _ForwardIterator>
Howard Hinnantbf074022011-10-22 20:59:45 +00004329equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004330{
Howard Hinnantbf074022011-10-22 20:59:45 +00004331 return _VSTD::equal_range(__first, __last, __value_,
Howard Hinnantc51e1022010-05-11 19:42:16 +00004332 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
4333}
4334
4335// binary_search
4336
4337template <class _Compare, class _ForwardIterator, class _Tp>
Marshall Clowe00916c2018-01-16 02:34:41 +00004338inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004339bool
Howard Hinnantbf074022011-10-22 20:59:45 +00004340__binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004341{
Howard Hinnantbf074022011-10-22 20:59:45 +00004342 __first = __lower_bound<_Compare>(__first, __last, __value_, __comp);
4343 return __first != __last && !__comp(__value_, *__first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004344}
4345
4346template <class _ForwardIterator, class _Tp, class _Compare>
Marshall Clowe00916c2018-01-16 02:34:41 +00004347inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004348bool
Howard Hinnantbf074022011-10-22 20:59:45 +00004349binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004350{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004351#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004352 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4353 __debug_less<_Compare> __c(__comp);
Howard Hinnantbf074022011-10-22 20:59:45 +00004354 return __binary_search<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004355#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004356 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnantbf074022011-10-22 20:59:45 +00004357 return __binary_search<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004358#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004359}
4360
4361template <class _ForwardIterator, class _Tp>
Marshall Clowe00916c2018-01-16 02:34:41 +00004362inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004363bool
Howard Hinnantbf074022011-10-22 20:59:45 +00004364binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004365{
Howard Hinnantbf074022011-10-22 20:59:45 +00004366 return _VSTD::binary_search(__first, __last, __value_,
Howard Hinnantc51e1022010-05-11 19:42:16 +00004367 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
4368}
4369
4370// merge
4371
4372template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4373_OutputIterator
4374__merge(_InputIterator1 __first1, _InputIterator1 __last1,
4375 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4376{
4377 for (; __first1 != __last1; ++__result)
4378 {
4379 if (__first2 == __last2)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004380 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004381 if (__comp(*__first2, *__first1))
4382 {
4383 *__result = *__first2;
4384 ++__first2;
4385 }
4386 else
4387 {
4388 *__result = *__first1;
4389 ++__first1;
4390 }
4391 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004392 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004393}
4394
4395template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
4396inline _LIBCPP_INLINE_VISIBILITY
4397_OutputIterator
4398merge(_InputIterator1 __first1, _InputIterator1 __last1,
4399 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4400{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004401#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004402 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4403 __debug_less<_Compare> __c(__comp);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004404 return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004405#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004406 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004407 return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004408#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004409}
4410
4411template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
4412inline _LIBCPP_INLINE_VISIBILITY
4413_OutputIterator
4414merge(_InputIterator1 __first1, _InputIterator1 __last1,
4415 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
4416{
4417 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
4418 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
4419 return merge(__first1, __last1, __first2, __last2, __result, __less<__v1, __v2>());
4420}
4421
4422// inplace_merge
4423
Marshall Clow1bc51102015-07-29 16:25:45 +00004424template <class _Compare, class _InputIterator1, class _InputIterator2,
4425 class _OutputIterator>
4426void __half_inplace_merge(_InputIterator1 __first1, _InputIterator1 __last1,
4427 _InputIterator2 __first2, _InputIterator2 __last2,
4428 _OutputIterator __result, _Compare __comp)
4429{
4430 for (; __first1 != __last1; ++__result)
4431 {
4432 if (__first2 == __last2)
4433 {
4434 _VSTD::move(__first1, __last1, __result);
4435 return;
4436 }
4437
4438 if (__comp(*__first2, *__first1))
4439 {
4440 *__result = _VSTD::move(*__first2);
4441 ++__first2;
4442 }
4443 else
4444 {
4445 *__result = _VSTD::move(*__first1);
4446 ++__first1;
4447 }
4448 }
4449 // __first2 through __last2 are already in the right spot.
4450}
4451
Howard Hinnantc51e1022010-05-11 19:42:16 +00004452template <class _Compare, class _BidirectionalIterator>
4453void
4454__buffered_inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4455 _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1,
4456 typename iterator_traits<_BidirectionalIterator>::difference_type __len2,
4457 typename iterator_traits<_BidirectionalIterator>::value_type* __buff)
4458{
4459 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00004460 __destruct_n __d(0);
4461 unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
4462 if (__len1 <= __len2)
4463 {
4464 value_type* __p = __buff;
Eric Fiseliera09a3b42014-10-27 19:28:20 +00004465 for (_BidirectionalIterator __i = __first; __i != __middle; __d.__incr((value_type*)0), (void) ++__i, ++__p)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004466 ::new(__p) value_type(_VSTD::move(*__i));
Marshall Clow1bc51102015-07-29 16:25:45 +00004467 __half_inplace_merge(__buff, __p, __middle, __last, __first, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004468 }
4469 else
4470 {
4471 value_type* __p = __buff;
Eric Fiseliera09a3b42014-10-27 19:28:20 +00004472 for (_BidirectionalIterator __i = __middle; __i != __last; __d.__incr((value_type*)0), (void) ++__i, ++__p)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004473 ::new(__p) value_type(_VSTD::move(*__i));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004474 typedef reverse_iterator<_BidirectionalIterator> _RBi;
4475 typedef reverse_iterator<value_type*> _Rv;
Aditya Kumar3a0179a2016-08-25 11:52:38 +00004476 __half_inplace_merge(_Rv(__p), _Rv(__buff),
Marshall Clow1bc51102015-07-29 16:25:45 +00004477 _RBi(__middle), _RBi(__first),
Marshall Clow738d1042017-08-28 23:16:13 +00004478 _RBi(__last), __invert<_Compare>(__comp));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004479 }
4480}
4481
4482template <class _Compare, class _BidirectionalIterator>
4483void
4484__inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4485 _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1,
4486 typename iterator_traits<_BidirectionalIterator>::difference_type __len2,
4487 typename iterator_traits<_BidirectionalIterator>::value_type* __buff, ptrdiff_t __buff_size)
4488{
Howard Hinnantc51e1022010-05-11 19:42:16 +00004489 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
4490 while (true)
4491 {
4492 // if __middle == __last, we're done
4493 if (__len2 == 0)
4494 return;
Marshall Clow8eff8232015-02-02 16:44:11 +00004495 if (__len1 <= __buff_size || __len2 <= __buff_size)
4496 return __buffered_inplace_merge<_Compare>
4497 (__first, __middle, __last, __comp, __len1, __len2, __buff);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004498 // shrink [__first, __middle) as much as possible (with no moves), returning if it shrinks to 0
Eric Fiseliera09a3b42014-10-27 19:28:20 +00004499 for (; true; ++__first, (void) --__len1)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004500 {
4501 if (__len1 == 0)
4502 return;
4503 if (__comp(*__middle, *__first))
4504 break;
4505 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00004506 // __first < __middle < __last
4507 // *__first > *__middle
4508 // partition [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last) such that
4509 // all elements in:
4510 // [__first, __m1) <= [__middle, __m2)
4511 // [__middle, __m2) < [__m1, __middle)
4512 // [__m1, __middle) <= [__m2, __last)
4513 // and __m1 or __m2 is in the middle of its range
4514 _BidirectionalIterator __m1; // "median" of [__first, __middle)
4515 _BidirectionalIterator __m2; // "median" of [__middle, __last)
4516 difference_type __len11; // distance(__first, __m1)
4517 difference_type __len21; // distance(__middle, __m2)
4518 // binary search smaller range
4519 if (__len1 < __len2)
4520 { // __len >= 1, __len2 >= 2
4521 __len21 = __len2 / 2;
4522 __m2 = __middle;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004523 _VSTD::advance(__m2, __len21);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004524 __m1 = __upper_bound<_Compare>(__first, __middle, *__m2, __comp);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004525 __len11 = _VSTD::distance(__first, __m1);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004526 }
4527 else
4528 {
4529 if (__len1 == 1)
4530 { // __len1 >= __len2 && __len2 > 0, therefore __len2 == 1
4531 // It is known *__first > *__middle
4532 swap(*__first, *__middle);
4533 return;
4534 }
4535 // __len1 >= 2, __len2 >= 1
4536 __len11 = __len1 / 2;
4537 __m1 = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004538 _VSTD::advance(__m1, __len11);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004539 __m2 = __lower_bound<_Compare>(__middle, __last, *__m1, __comp);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004540 __len21 = _VSTD::distance(__middle, __m2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004541 }
4542 difference_type __len12 = __len1 - __len11; // distance(__m1, __middle)
4543 difference_type __len22 = __len2 - __len21; // distance(__m2, __last)
4544 // [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last)
4545 // swap middle two partitions
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004546 __middle = _VSTD::rotate(__m1, __middle, __m2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004547 // __len12 and __len21 now have swapped meanings
4548 // merge smaller range with recurisve call and larger with tail recursion elimination
4549 if (__len11 + __len21 < __len12 + __len22)
4550 {
4551 __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size);
4552// __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size);
4553 __first = __middle;
4554 __middle = __m2;
4555 __len1 = __len12;
4556 __len2 = __len22;
4557 }
4558 else
4559 {
4560 __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size);
4561// __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size);
4562 __last = __middle;
4563 __middle = __m1;
4564 __len1 = __len11;
4565 __len2 = __len21;
4566 }
4567 }
4568}
4569
Howard Hinnantc51e1022010-05-11 19:42:16 +00004570template <class _BidirectionalIterator, class _Compare>
4571inline _LIBCPP_INLINE_VISIBILITY
4572void
4573inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4574 _Compare __comp)
4575{
4576 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
4577 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004578 difference_type __len1 = _VSTD::distance(__first, __middle);
4579 difference_type __len2 = _VSTD::distance(__middle, __last);
4580 difference_type __buf_size = _VSTD::min(__len1, __len2);
Marshall Clow488f19f2015-02-02 17:35:53 +00004581 pair<value_type*, ptrdiff_t> __buf = _VSTD::get_temporary_buffer<value_type>(__buf_size);
4582 unique_ptr<value_type, __return_temporary_buffer> __h(__buf.first);
4583
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004584#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004585 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4586 __debug_less<_Compare> __c(__comp);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004587 return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __c, __len1, __len2,
Howard Hinnantc51e1022010-05-11 19:42:16 +00004588 __buf.first, __buf.second);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004589#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004590 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004591 return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __comp, __len1, __len2,
Howard Hinnantc51e1022010-05-11 19:42:16 +00004592 __buf.first, __buf.second);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004593#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004594}
4595
4596template <class _BidirectionalIterator>
4597inline _LIBCPP_INLINE_VISIBILITY
4598void
4599inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last)
4600{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004601 _VSTD::inplace_merge(__first, __middle, __last,
Howard Hinnantc51e1022010-05-11 19:42:16 +00004602 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
4603}
4604
4605// stable_sort
4606
4607template <class _Compare, class _InputIterator1, class _InputIterator2>
4608void
4609__merge_move_construct(_InputIterator1 __first1, _InputIterator1 __last1,
4610 _InputIterator2 __first2, _InputIterator2 __last2,
4611 typename iterator_traits<_InputIterator1>::value_type* __result, _Compare __comp)
4612{
4613 typedef typename iterator_traits<_InputIterator1>::value_type value_type;
4614 __destruct_n __d(0);
4615 unique_ptr<value_type, __destruct_n&> __h(__result, __d);
4616 for (; true; ++__result)
4617 {
4618 if (__first1 == __last1)
4619 {
4620 for (; __first2 != __last2; ++__first2, ++__result, __d.__incr((value_type*)0))
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004621 ::new (__result) value_type(_VSTD::move(*__first2));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004622 __h.release();
4623 return;
4624 }
4625 if (__first2 == __last2)
4626 {
4627 for (; __first1 != __last1; ++__first1, ++__result, __d.__incr((value_type*)0))
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004628 ::new (__result) value_type(_VSTD::move(*__first1));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004629 __h.release();
4630 return;
4631 }
4632 if (__comp(*__first2, *__first1))
4633 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004634 ::new (__result) value_type(_VSTD::move(*__first2));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004635 __d.__incr((value_type*)0);
4636 ++__first2;
4637 }
4638 else
4639 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004640 ::new (__result) value_type(_VSTD::move(*__first1));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004641 __d.__incr((value_type*)0);
4642 ++__first1;
4643 }
4644 }
4645}
4646
4647template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4648void
4649__merge_move_assign(_InputIterator1 __first1, _InputIterator1 __last1,
4650 _InputIterator2 __first2, _InputIterator2 __last2,
4651 _OutputIterator __result, _Compare __comp)
4652{
4653 for (; __first1 != __last1; ++__result)
4654 {
4655 if (__first2 == __last2)
4656 {
4657 for (; __first1 != __last1; ++__first1, ++__result)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004658 *__result = _VSTD::move(*__first1);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004659 return;
4660 }
4661 if (__comp(*__first2, *__first1))
4662 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004663 *__result = _VSTD::move(*__first2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004664 ++__first2;
4665 }
4666 else
4667 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004668 *__result = _VSTD::move(*__first1);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004669 ++__first1;
4670 }
4671 }
4672 for (; __first2 != __last2; ++__first2, ++__result)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004673 *__result = _VSTD::move(*__first2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004674}
4675
4676template <class _Compare, class _RandomAccessIterator>
4677void
4678__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4679 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4680 typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size);
4681
4682template <class _Compare, class _RandomAccessIterator>
4683void
4684__stable_sort_move(_RandomAccessIterator __first1, _RandomAccessIterator __last1, _Compare __comp,
4685 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4686 typename iterator_traits<_RandomAccessIterator>::value_type* __first2)
4687{
4688 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4689 switch (__len)
4690 {
4691 case 0:
4692 return;
4693 case 1:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004694 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004695 return;
4696 case 2:
4697 __destruct_n __d(0);
4698 unique_ptr<value_type, __destruct_n&> __h2(__first2, __d);
4699 if (__comp(*--__last1, *__first1))
4700 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004701 ::new(__first2) value_type(_VSTD::move(*__last1));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004702 __d.__incr((value_type*)0);
4703 ++__first2;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004704 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004705 }
4706 else
4707 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004708 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004709 __d.__incr((value_type*)0);
4710 ++__first2;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004711 ::new(__first2) value_type(_VSTD::move(*__last1));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004712 }
4713 __h2.release();
4714 return;
4715 }
4716 if (__len <= 8)
4717 {
4718 __insertion_sort_move<_Compare>(__first1, __last1, __first2, __comp);
4719 return;
4720 }
4721 typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2;
4722 _RandomAccessIterator __m = __first1 + __l2;
4723 __stable_sort<_Compare>(__first1, __m, __comp, __l2, __first2, __l2);
4724 __stable_sort<_Compare>(__m, __last1, __comp, __len - __l2, __first2 + __l2, __len - __l2);
4725 __merge_move_construct<_Compare>(__first1, __m, __m, __last1, __first2, __comp);
4726}
4727
4728template <class _Tp>
4729struct __stable_sort_switch
4730{
Howard Hinnanta9a897e2010-11-19 22:17:28 +00004731 static const unsigned value = 128*is_trivially_copy_assignable<_Tp>::value;
Howard Hinnantc51e1022010-05-11 19:42:16 +00004732};
4733
4734template <class _Compare, class _RandomAccessIterator>
4735void
4736__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4737 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4738 typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size)
4739{
4740 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4741 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4742 switch (__len)
4743 {
4744 case 0:
4745 case 1:
4746 return;
4747 case 2:
4748 if (__comp(*--__last, *__first))
4749 swap(*__first, *__last);
4750 return;
4751 }
4752 if (__len <= static_cast<difference_type>(__stable_sort_switch<value_type>::value))
4753 {
4754 __insertion_sort<_Compare>(__first, __last, __comp);
4755 return;
4756 }
4757 typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2;
4758 _RandomAccessIterator __m = __first + __l2;
4759 if (__len <= __buff_size)
4760 {
4761 __destruct_n __d(0);
4762 unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
4763 __stable_sort_move<_Compare>(__first, __m, __comp, __l2, __buff);
4764 __d.__set(__l2, (value_type*)0);
4765 __stable_sort_move<_Compare>(__m, __last, __comp, __len - __l2, __buff + __l2);
4766 __d.__set(__len, (value_type*)0);
4767 __merge_move_assign<_Compare>(__buff, __buff + __l2, __buff + __l2, __buff + __len, __first, __comp);
4768// __merge<_Compare>(move_iterator<value_type*>(__buff),
4769// move_iterator<value_type*>(__buff + __l2),
4770// move_iterator<_RandomAccessIterator>(__buff + __l2),
4771// move_iterator<_RandomAccessIterator>(__buff + __len),
4772// __first, __comp);
4773 return;
4774 }
4775 __stable_sort<_Compare>(__first, __m, __comp, __l2, __buff, __buff_size);
4776 __stable_sort<_Compare>(__m, __last, __comp, __len - __l2, __buff, __buff_size);
4777 __inplace_merge<_Compare>(__first, __m, __last, __comp, __l2, __len - __l2, __buff, __buff_size);
4778}
4779
4780template <class _RandomAccessIterator, class _Compare>
4781inline _LIBCPP_INLINE_VISIBILITY
4782void
4783stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4784{
4785 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4786 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4787 difference_type __len = __last - __first;
4788 pair<value_type*, ptrdiff_t> __buf(0, 0);
4789 unique_ptr<value_type, __return_temporary_buffer> __h;
4790 if (__len > static_cast<difference_type>(__stable_sort_switch<value_type>::value))
4791 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004792 __buf = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004793 __h.reset(__buf.first);
4794 }
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004795#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004796 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4797 __debug_less<_Compare> __c(__comp);
4798 __stable_sort<_Comp_ref>(__first, __last, __c, __len, __buf.first, __buf.second);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004799#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004800 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4801 __stable_sort<_Comp_ref>(__first, __last, __comp, __len, __buf.first, __buf.second);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004802#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004803}
4804
4805template <class _RandomAccessIterator>
4806inline _LIBCPP_INLINE_VISIBILITY
4807void
4808stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
4809{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004810 _VSTD::stable_sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004811}
4812
4813// is_heap_until
4814
4815template <class _RandomAccessIterator, class _Compare>
Marshall Clow96d050a2018-01-15 16:16:32 +00004816_LIBCPP_CONSTEXPR_AFTER_CXX17 _RandomAccessIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00004817is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4818{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004819 typedef typename _VSTD::iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00004820 difference_type __len = __last - __first;
4821 difference_type __p = 0;
4822 difference_type __c = 1;
4823 _RandomAccessIterator __pp = __first;
4824 while (__c < __len)
4825 {
4826 _RandomAccessIterator __cp = __first + __c;
4827 if (__comp(*__pp, *__cp))
4828 return __cp;
4829 ++__c;
4830 ++__cp;
4831 if (__c == __len)
4832 return __last;
4833 if (__comp(*__pp, *__cp))
4834 return __cp;
4835 ++__p;
4836 ++__pp;
4837 __c = 2 * __p + 1;
4838 }
4839 return __last;
4840}
4841
Howard Hinnant3b6579a2010-08-22 00:02:43 +00004842template<class _RandomAccessIterator>
Marshall Clow96d050a2018-01-15 16:16:32 +00004843inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004844_RandomAccessIterator
4845is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last)
4846{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004847 return _VSTD::is_heap_until(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004848}
4849
4850// is_heap
4851
4852template <class _RandomAccessIterator, class _Compare>
Marshall Clow96d050a2018-01-15 16:16:32 +00004853inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004854bool
4855is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4856{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004857 return _VSTD::is_heap_until(__first, __last, __comp) == __last;
Howard Hinnantc51e1022010-05-11 19:42:16 +00004858}
4859
Howard Hinnant3b6579a2010-08-22 00:02:43 +00004860template<class _RandomAccessIterator>
Marshall Clow96d050a2018-01-15 16:16:32 +00004861inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004862bool
4863is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4864{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004865 return _VSTD::is_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004866}
4867
4868// push_heap
4869
4870template <class _Compare, class _RandomAccessIterator>
4871void
David Majnemer4468d562014-07-22 06:07:09 +00004872__sift_up(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4873 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004874{
Howard Hinnantc51e1022010-05-11 19:42:16 +00004875 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4876 if (__len > 1)
4877 {
4878 __len = (__len - 2) / 2;
4879 _RandomAccessIterator __ptr = __first + __len;
4880 if (__comp(*__ptr, *--__last))
4881 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004882 value_type __t(_VSTD::move(*__last));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004883 do
4884 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004885 *__last = _VSTD::move(*__ptr);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004886 __last = __ptr;
4887 if (__len == 0)
4888 break;
4889 __len = (__len - 1) / 2;
4890 __ptr = __first + __len;
4891 } while (__comp(*__ptr, __t));
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004892 *__last = _VSTD::move(__t);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004893 }
4894 }
4895}
4896
4897template <class _RandomAccessIterator, class _Compare>
4898inline _LIBCPP_INLINE_VISIBILITY
4899void
4900push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4901{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004902#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004903 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4904 __debug_less<_Compare> __c(__comp);
David Majnemer4468d562014-07-22 06:07:09 +00004905 __sift_up<_Comp_ref>(__first, __last, __c, __last - __first);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004906#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004907 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
David Majnemer4468d562014-07-22 06:07:09 +00004908 __sift_up<_Comp_ref>(__first, __last, __comp, __last - __first);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004909#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004910}
4911
4912template <class _RandomAccessIterator>
4913inline _LIBCPP_INLINE_VISIBILITY
4914void
4915push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4916{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004917 _VSTD::push_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004918}
4919
4920// pop_heap
4921
4922template <class _Compare, class _RandomAccessIterator>
David Majnemer4468d562014-07-22 06:07:09 +00004923void
Eric Fiselier6003c772016-12-23 23:37:52 +00004924__sift_down(_RandomAccessIterator __first, _RandomAccessIterator /*__last*/,
4925 _Compare __comp,
David Majnemer4468d562014-07-22 06:07:09 +00004926 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4927 _RandomAccessIterator __start)
4928{
4929 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4930 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4931 // left-child of __start is at 2 * __start + 1
4932 // right-child of __start is at 2 * __start + 2
4933 difference_type __child = __start - __first;
4934
4935 if (__len < 2 || (__len - 2) / 2 < __child)
4936 return;
4937
4938 __child = 2 * __child + 1;
4939 _RandomAccessIterator __child_i = __first + __child;
4940
4941 if ((__child + 1) < __len && __comp(*__child_i, *(__child_i + 1))) {
4942 // right-child exists and is greater than left-child
4943 ++__child_i;
4944 ++__child;
4945 }
4946
4947 // check if we are in heap-order
4948 if (__comp(*__child_i, *__start))
4949 // we are, __start is larger than it's largest child
4950 return;
4951
4952 value_type __top(_VSTD::move(*__start));
4953 do
4954 {
4955 // we are not in heap-order, swap the parent with it's largest child
4956 *__start = _VSTD::move(*__child_i);
4957 __start = __child_i;
4958
4959 if ((__len - 2) / 2 < __child)
4960 break;
4961
4962 // recompute the child based off of the updated parent
4963 __child = 2 * __child + 1;
4964 __child_i = __first + __child;
4965
4966 if ((__child + 1) < __len && __comp(*__child_i, *(__child_i + 1))) {
4967 // right-child exists and is greater than left-child
4968 ++__child_i;
4969 ++__child;
4970 }
4971
4972 // check if we are in heap-order
4973 } while (!__comp(*__child_i, __top));
4974 *__start = _VSTD::move(__top);
4975}
4976
4977template <class _Compare, class _RandomAccessIterator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00004978inline _LIBCPP_INLINE_VISIBILITY
4979void
4980__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4981 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
4982{
4983 if (__len > 1)
4984 {
4985 swap(*__first, *--__last);
David Majnemer4468d562014-07-22 06:07:09 +00004986 __sift_down<_Compare>(__first, __last, __comp, __len - 1, __first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004987 }
4988}
4989
4990template <class _RandomAccessIterator, class _Compare>
4991inline _LIBCPP_INLINE_VISIBILITY
4992void
4993pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4994{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004995#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004996 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4997 __debug_less<_Compare> __c(__comp);
4998 __pop_heap<_Comp_ref>(__first, __last, __c, __last - __first);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004999#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005000 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5001 __pop_heap<_Comp_ref>(__first, __last, __comp, __last - __first);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005002#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005003}
5004
5005template <class _RandomAccessIterator>
5006inline _LIBCPP_INLINE_VISIBILITY
5007void
5008pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
5009{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005010 _VSTD::pop_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00005011}
5012
5013// make_heap
5014
5015template <class _Compare, class _RandomAccessIterator>
5016void
5017__make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
5018{
5019 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
5020 difference_type __n = __last - __first;
5021 if (__n > 1)
5022 {
David Majnemer4468d562014-07-22 06:07:09 +00005023 // start from the first parent, there is no need to consider children
5024 for (difference_type __start = (__n - 2) / 2; __start >= 0; --__start)
5025 {
5026 __sift_down<_Compare>(__first, __last, __comp, __n, __first + __start);
5027 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00005028 }
5029}
5030
5031template <class _RandomAccessIterator, class _Compare>
5032inline _LIBCPP_INLINE_VISIBILITY
5033void
5034make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
5035{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005036#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005037 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5038 __debug_less<_Compare> __c(__comp);
5039 __make_heap<_Comp_ref>(__first, __last, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005040#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005041 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5042 __make_heap<_Comp_ref>(__first, __last, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005043#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005044}
5045
5046template <class _RandomAccessIterator>
5047inline _LIBCPP_INLINE_VISIBILITY
5048void
5049make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
5050{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005051 _VSTD::make_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00005052}
5053
5054// sort_heap
5055
5056template <class _Compare, class _RandomAccessIterator>
5057void
5058__sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
5059{
5060 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
5061 for (difference_type __n = __last - __first; __n > 1; --__last, --__n)
5062 __pop_heap<_Compare>(__first, __last, __comp, __n);
5063}
5064
5065template <class _RandomAccessIterator, class _Compare>
5066inline _LIBCPP_INLINE_VISIBILITY
5067void
5068sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
5069{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005070#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005071 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5072 __debug_less<_Compare> __c(__comp);
5073 __sort_heap<_Comp_ref>(__first, __last, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005074#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005075 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5076 __sort_heap<_Comp_ref>(__first, __last, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005077#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005078}
5079
5080template <class _RandomAccessIterator>
5081inline _LIBCPP_INLINE_VISIBILITY
5082void
5083sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
5084{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005085 _VSTD::sort_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00005086}
5087
5088// partial_sort
5089
5090template <class _Compare, class _RandomAccessIterator>
5091void
5092__partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
5093 _Compare __comp)
5094{
5095 __make_heap<_Compare>(__first, __middle, __comp);
5096 typename iterator_traits<_RandomAccessIterator>::difference_type __len = __middle - __first;
5097 for (_RandomAccessIterator __i = __middle; __i != __last; ++__i)
5098 {
5099 if (__comp(*__i, *__first))
5100 {
5101 swap(*__i, *__first);
David Majnemer4468d562014-07-22 06:07:09 +00005102 __sift_down<_Compare>(__first, __middle, __comp, __len, __first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005103 }
5104 }
5105 __sort_heap<_Compare>(__first, __middle, __comp);
5106}
5107
5108template <class _RandomAccessIterator, class _Compare>
5109inline _LIBCPP_INLINE_VISIBILITY
5110void
5111partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
5112 _Compare __comp)
5113{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005114#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005115 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5116 __debug_less<_Compare> __c(__comp);
5117 __partial_sort<_Comp_ref>(__first, __middle, __last, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005118#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005119 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5120 __partial_sort<_Comp_ref>(__first, __middle, __last, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005121#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005122}
5123
5124template <class _RandomAccessIterator>
5125inline _LIBCPP_INLINE_VISIBILITY
5126void
5127partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last)
5128{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005129 _VSTD::partial_sort(__first, __middle, __last,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005130 __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
5131}
5132
5133// partial_sort_copy
5134
5135template <class _Compare, class _InputIterator, class _RandomAccessIterator>
5136_RandomAccessIterator
5137__partial_sort_copy(_InputIterator __first, _InputIterator __last,
5138 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp)
5139{
5140 _RandomAccessIterator __r = __result_first;
5141 if (__r != __result_last)
5142 {
Eric Fiseliera09a3b42014-10-27 19:28:20 +00005143 for (; __first != __last && __r != __result_last; (void) ++__first, ++__r)
Howard Hinnantc51e1022010-05-11 19:42:16 +00005144 *__r = *__first;
5145 __make_heap<_Compare>(__result_first, __r, __comp);
David Majnemer4468d562014-07-22 06:07:09 +00005146 typename iterator_traits<_RandomAccessIterator>::difference_type __len = __r - __result_first;
Howard Hinnantc51e1022010-05-11 19:42:16 +00005147 for (; __first != __last; ++__first)
5148 if (__comp(*__first, *__result_first))
5149 {
5150 *__result_first = *__first;
David Majnemer4468d562014-07-22 06:07:09 +00005151 __sift_down<_Compare>(__result_first, __r, __comp, __len, __result_first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005152 }
5153 __sort_heap<_Compare>(__result_first, __r, __comp);
5154 }
5155 return __r;
5156}
5157
5158template <class _InputIterator, class _RandomAccessIterator, class _Compare>
5159inline _LIBCPP_INLINE_VISIBILITY
5160_RandomAccessIterator
5161partial_sort_copy(_InputIterator __first, _InputIterator __last,
5162 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp)
5163{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005164#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005165 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5166 __debug_less<_Compare> __c(__comp);
5167 return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005168#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005169 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5170 return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005171#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005172}
5173
5174template <class _InputIterator, class _RandomAccessIterator>
5175inline _LIBCPP_INLINE_VISIBILITY
5176_RandomAccessIterator
5177partial_sort_copy(_InputIterator __first, _InputIterator __last,
5178 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last)
5179{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005180 return _VSTD::partial_sort_copy(__first, __last, __result_first, __result_last,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005181 __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
5182}
5183
5184// nth_element
5185
5186template <class _Compare, class _RandomAccessIterator>
5187void
5188__nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
5189{
5190 // _Compare is known to be a reference type
5191 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
5192 const difference_type __limit = 7;
5193 while (true)
5194 {
5195 __restart:
Howard Hinnant2fa038c2011-12-29 17:45:35 +00005196 if (__nth == __last)
5197 return;
Howard Hinnantc51e1022010-05-11 19:42:16 +00005198 difference_type __len = __last - __first;
5199 switch (__len)
5200 {
5201 case 0:
5202 case 1:
5203 return;
5204 case 2:
5205 if (__comp(*--__last, *__first))
5206 swap(*__first, *__last);
5207 return;
5208 case 3:
5209 {
5210 _RandomAccessIterator __m = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005211 _VSTD::__sort3<_Compare>(__first, ++__m, --__last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005212 return;
5213 }
5214 }
5215 if (__len <= __limit)
5216 {
5217 __selection_sort<_Compare>(__first, __last, __comp);
5218 return;
5219 }
5220 // __len > __limit >= 3
5221 _RandomAccessIterator __m = __first + __len/2;
5222 _RandomAccessIterator __lm1 = __last;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005223 unsigned __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, --__lm1, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005224 // *__m is median
5225 // partition [__first, __m) < *__m and *__m <= [__m, __last)
5226 // (this inhibits tossing elements equivalent to __m around unnecessarily)
5227 _RandomAccessIterator __i = __first;
5228 _RandomAccessIterator __j = __lm1;
5229 // j points beyond range to be tested, *__lm1 is known to be <= *__m
5230 // The search going up is known to be guarded but the search coming down isn't.
5231 // Prime the downward search with a guard.
5232 if (!__comp(*__i, *__m)) // if *__first == *__m
5233 {
5234 // *__first == *__m, *__first doesn't go in first part
5235 // manually guard downward moving __j against __i
5236 while (true)
5237 {
5238 if (__i == --__j)
5239 {
5240 // *__first == *__m, *__m <= all other elements
5241 // Parition instead into [__first, __i) == *__first and *__first < [__i, __last)
5242 ++__i; // __first + 1
5243 __j = __last;
5244 if (!__comp(*__first, *--__j)) // we need a guard if *__first == *(__last-1)
5245 {
5246 while (true)
5247 {
5248 if (__i == __j)
5249 return; // [__first, __last) all equivalent elements
5250 if (__comp(*__first, *__i))
5251 {
5252 swap(*__i, *__j);
5253 ++__n_swaps;
5254 ++__i;
5255 break;
5256 }
5257 ++__i;
5258 }
5259 }
5260 // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1
5261 if (__i == __j)
5262 return;
5263 while (true)
5264 {
5265 while (!__comp(*__first, *__i))
5266 ++__i;
5267 while (__comp(*__first, *--__j))
5268 ;
5269 if (__i >= __j)
5270 break;
5271 swap(*__i, *__j);
5272 ++__n_swaps;
5273 ++__i;
5274 }
5275 // [__first, __i) == *__first and *__first < [__i, __last)
5276 // The first part is sorted,
5277 if (__nth < __i)
5278 return;
5279 // __nth_element the secod part
5280 // __nth_element<_Compare>(__i, __nth, __last, __comp);
5281 __first = __i;
5282 goto __restart;
5283 }
5284 if (__comp(*__j, *__m))
5285 {
5286 swap(*__i, *__j);
5287 ++__n_swaps;
5288 break; // found guard for downward moving __j, now use unguarded partition
5289 }
5290 }
5291 }
5292 ++__i;
5293 // j points beyond range to be tested, *__lm1 is known to be <= *__m
5294 // if not yet partitioned...
5295 if (__i < __j)
5296 {
5297 // known that *(__i - 1) < *__m
5298 while (true)
5299 {
5300 // __m still guards upward moving __i
5301 while (__comp(*__i, *__m))
5302 ++__i;
5303 // It is now known that a guard exists for downward moving __j
5304 while (!__comp(*--__j, *__m))
5305 ;
5306 if (__i >= __j)
5307 break;
5308 swap(*__i, *__j);
5309 ++__n_swaps;
5310 // It is known that __m != __j
5311 // If __m just moved, follow it
5312 if (__m == __i)
5313 __m = __j;
5314 ++__i;
5315 }
5316 }
5317 // [__first, __i) < *__m and *__m <= [__i, __last)
5318 if (__i != __m && __comp(*__m, *__i))
5319 {
5320 swap(*__i, *__m);
5321 ++__n_swaps;
5322 }
5323 // [__first, __i) < *__i and *__i <= [__i+1, __last)
5324 if (__nth == __i)
5325 return;
5326 if (__n_swaps == 0)
5327 {
5328 // We were given a perfectly partitioned sequence. Coincidence?
5329 if (__nth < __i)
5330 {
5331 // Check for [__first, __i) already sorted
5332 __j = __m = __first;
5333 while (++__j != __i)
5334 {
5335 if (__comp(*__j, *__m))
5336 // not yet sorted, so sort
5337 goto not_sorted;
5338 __m = __j;
5339 }
5340 // [__first, __i) sorted
5341 return;
5342 }
5343 else
5344 {
5345 // Check for [__i, __last) already sorted
5346 __j = __m = __i;
5347 while (++__j != __last)
5348 {
5349 if (__comp(*__j, *__m))
5350 // not yet sorted, so sort
5351 goto not_sorted;
5352 __m = __j;
5353 }
5354 // [__i, __last) sorted
5355 return;
5356 }
5357 }
5358not_sorted:
5359 // __nth_element on range containing __nth
5360 if (__nth < __i)
5361 {
5362 // __nth_element<_Compare>(__first, __nth, __i, __comp);
5363 __last = __i;
5364 }
5365 else
5366 {
5367 // __nth_element<_Compare>(__i+1, __nth, __last, __comp);
5368 __first = ++__i;
5369 }
5370 }
5371}
5372
5373template <class _RandomAccessIterator, class _Compare>
5374inline _LIBCPP_INLINE_VISIBILITY
5375void
5376nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
5377{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005378#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005379 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5380 __debug_less<_Compare> __c(__comp);
5381 __nth_element<_Comp_ref>(__first, __nth, __last, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005382#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005383 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5384 __nth_element<_Comp_ref>(__first, __nth, __last, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005385#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005386}
5387
5388template <class _RandomAccessIterator>
5389inline _LIBCPP_INLINE_VISIBILITY
5390void
5391nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last)
5392{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005393 _VSTD::nth_element(__first, __nth, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00005394}
5395
5396// includes
5397
5398template <class _Compare, class _InputIterator1, class _InputIterator2>
5399bool
5400__includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
5401 _Compare __comp)
5402{
5403 for (; __first2 != __last2; ++__first1)
5404 {
5405 if (__first1 == __last1 || __comp(*__first2, *__first1))
5406 return false;
5407 if (!__comp(*__first1, *__first2))
5408 ++__first2;
5409 }
5410 return true;
5411}
5412
5413template <class _InputIterator1, class _InputIterator2, class _Compare>
5414inline _LIBCPP_INLINE_VISIBILITY
5415bool
5416includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
5417 _Compare __comp)
5418{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005419#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005420 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5421 __debug_less<_Compare> __c(__comp);
5422 return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005423#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005424 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5425 return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005426#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005427}
5428
5429template <class _InputIterator1, class _InputIterator2>
5430inline _LIBCPP_INLINE_VISIBILITY
5431bool
5432includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2)
5433{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005434 return _VSTD::includes(__first1, __last1, __first2, __last2,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005435 __less<typename iterator_traits<_InputIterator1>::value_type,
5436 typename iterator_traits<_InputIterator2>::value_type>());
5437}
5438
5439// set_union
5440
5441template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5442_OutputIterator
5443__set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5444 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5445{
5446 for (; __first1 != __last1; ++__result)
5447 {
5448 if (__first2 == __last2)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005449 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005450 if (__comp(*__first2, *__first1))
5451 {
5452 *__result = *__first2;
5453 ++__first2;
5454 }
5455 else
5456 {
Howard Hinnantc51e1022010-05-11 19:42:16 +00005457 if (!__comp(*__first1, *__first2))
5458 ++__first2;
Marshall Clowb4687412017-10-30 15:50:00 +00005459 *__result = *__first1;
Howard Hinnantc51e1022010-05-11 19:42:16 +00005460 ++__first1;
5461 }
5462 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005463 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005464}
5465
5466template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5467inline _LIBCPP_INLINE_VISIBILITY
5468_OutputIterator
5469set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5470 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5471{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005472#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005473 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5474 __debug_less<_Compare> __c(__comp);
5475 return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005476#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005477 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5478 return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005479#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005480}
5481
5482template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5483inline _LIBCPP_INLINE_VISIBILITY
5484_OutputIterator
5485set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5486 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5487{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005488 return _VSTD::set_union(__first1, __last1, __first2, __last2, __result,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005489 __less<typename iterator_traits<_InputIterator1>::value_type,
5490 typename iterator_traits<_InputIterator2>::value_type>());
5491}
5492
5493// set_intersection
5494
5495template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5496_OutputIterator
5497__set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5498 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5499{
5500 while (__first1 != __last1 && __first2 != __last2)
5501 {
5502 if (__comp(*__first1, *__first2))
5503 ++__first1;
5504 else
5505 {
5506 if (!__comp(*__first2, *__first1))
5507 {
5508 *__result = *__first1;
5509 ++__result;
5510 ++__first1;
5511 }
5512 ++__first2;
5513 }
5514 }
5515 return __result;
5516}
5517
5518template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5519inline _LIBCPP_INLINE_VISIBILITY
5520_OutputIterator
5521set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5522 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5523{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005524#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005525 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5526 __debug_less<_Compare> __c(__comp);
5527 return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005528#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005529 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5530 return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005531#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005532}
5533
5534template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5535inline _LIBCPP_INLINE_VISIBILITY
5536_OutputIterator
5537set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5538 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5539{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005540 return _VSTD::set_intersection(__first1, __last1, __first2, __last2, __result,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005541 __less<typename iterator_traits<_InputIterator1>::value_type,
5542 typename iterator_traits<_InputIterator2>::value_type>());
5543}
5544
5545// set_difference
5546
5547template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5548_OutputIterator
5549__set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5550 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5551{
5552 while (__first1 != __last1)
5553 {
5554 if (__first2 == __last2)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005555 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005556 if (__comp(*__first1, *__first2))
5557 {
5558 *__result = *__first1;
5559 ++__result;
5560 ++__first1;
5561 }
5562 else
5563 {
5564 if (!__comp(*__first2, *__first1))
5565 ++__first1;
5566 ++__first2;
5567 }
5568 }
5569 return __result;
5570}
5571
5572template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5573inline _LIBCPP_INLINE_VISIBILITY
5574_OutputIterator
5575set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5576 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5577{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005578#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005579 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5580 __debug_less<_Compare> __c(__comp);
5581 return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005582#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005583 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5584 return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005585#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005586}
5587
5588template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5589inline _LIBCPP_INLINE_VISIBILITY
5590_OutputIterator
5591set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5592 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5593{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005594 return _VSTD::set_difference(__first1, __last1, __first2, __last2, __result,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005595 __less<typename iterator_traits<_InputIterator1>::value_type,
5596 typename iterator_traits<_InputIterator2>::value_type>());
5597}
5598
5599// set_symmetric_difference
5600
5601template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5602_OutputIterator
5603__set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5604 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5605{
5606 while (__first1 != __last1)
5607 {
5608 if (__first2 == __last2)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005609 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005610 if (__comp(*__first1, *__first2))
5611 {
5612 *__result = *__first1;
5613 ++__result;
5614 ++__first1;
5615 }
5616 else
5617 {
5618 if (__comp(*__first2, *__first1))
5619 {
5620 *__result = *__first2;
5621 ++__result;
5622 }
5623 else
5624 ++__first1;
5625 ++__first2;
5626 }
5627 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005628 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005629}
5630
5631template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5632inline _LIBCPP_INLINE_VISIBILITY
5633_OutputIterator
5634set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5635 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5636{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005637#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005638 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5639 __debug_less<_Compare> __c(__comp);
5640 return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005641#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005642 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5643 return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005644#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005645}
5646
5647template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5648inline _LIBCPP_INLINE_VISIBILITY
5649_OutputIterator
5650set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5651 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5652{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005653 return _VSTD::set_symmetric_difference(__first1, __last1, __first2, __last2, __result,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005654 __less<typename iterator_traits<_InputIterator1>::value_type,
5655 typename iterator_traits<_InputIterator2>::value_type>());
5656}
5657
5658// lexicographical_compare
5659
5660template <class _Compare, class _InputIterator1, class _InputIterator2>
5661bool
5662__lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5663 _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
5664{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00005665 for (; __first2 != __last2; ++__first1, (void) ++__first2)
Howard Hinnantc51e1022010-05-11 19:42:16 +00005666 {
5667 if (__first1 == __last1 || __comp(*__first1, *__first2))
5668 return true;
5669 if (__comp(*__first2, *__first1))
5670 return false;
5671 }
5672 return false;
5673}
5674
5675template <class _InputIterator1, class _InputIterator2, class _Compare>
5676inline _LIBCPP_INLINE_VISIBILITY
5677bool
5678lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5679 _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
5680{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005681#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005682 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5683 __debug_less<_Compare> __c(__comp);
5684 return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005685#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005686 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5687 return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005688#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005689}
5690
5691template <class _InputIterator1, class _InputIterator2>
5692inline _LIBCPP_INLINE_VISIBILITY
5693bool
5694lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5695 _InputIterator2 __first2, _InputIterator2 __last2)
5696{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005697 return _VSTD::lexicographical_compare(__first1, __last1, __first2, __last2,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005698 __less<typename iterator_traits<_InputIterator1>::value_type,
5699 typename iterator_traits<_InputIterator2>::value_type>());
5700}
5701
5702// next_permutation
5703
5704template <class _Compare, class _BidirectionalIterator>
5705bool
5706__next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5707{
5708 _BidirectionalIterator __i = __last;
5709 if (__first == __last || __first == --__i)
5710 return false;
5711 while (true)
5712 {
5713 _BidirectionalIterator __ip1 = __i;
5714 if (__comp(*--__i, *__ip1))
5715 {
5716 _BidirectionalIterator __j = __last;
5717 while (!__comp(*__i, *--__j))
5718 ;
5719 swap(*__i, *__j);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005720 _VSTD::reverse(__ip1, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005721 return true;
5722 }
5723 if (__i == __first)
5724 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005725 _VSTD::reverse(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005726 return false;
5727 }
5728 }
5729}
5730
5731template <class _BidirectionalIterator, class _Compare>
5732inline _LIBCPP_INLINE_VISIBILITY
5733bool
5734next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5735{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005736#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005737 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5738 __debug_less<_Compare> __c(__comp);
5739 return __next_permutation<_Comp_ref>(__first, __last, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005740#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005741 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5742 return __next_permutation<_Comp_ref>(__first, __last, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005743#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005744}
5745
5746template <class _BidirectionalIterator>
5747inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3b6579a2010-08-22 00:02:43 +00005748bool
Howard Hinnantc51e1022010-05-11 19:42:16 +00005749next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
5750{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005751 return _VSTD::next_permutation(__first, __last,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005752 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
5753}
5754
5755// prev_permutation
5756
5757template <class _Compare, class _BidirectionalIterator>
5758bool
5759__prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5760{
5761 _BidirectionalIterator __i = __last;
5762 if (__first == __last || __first == --__i)
5763 return false;
5764 while (true)
5765 {
5766 _BidirectionalIterator __ip1 = __i;
5767 if (__comp(*__ip1, *--__i))
5768 {
5769 _BidirectionalIterator __j = __last;
5770 while (!__comp(*--__j, *__i))
5771 ;
5772 swap(*__i, *__j);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005773 _VSTD::reverse(__ip1, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005774 return true;
5775 }
5776 if (__i == __first)
5777 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005778 _VSTD::reverse(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005779 return false;
5780 }
5781 }
5782}
5783
5784template <class _BidirectionalIterator, class _Compare>
5785inline _LIBCPP_INLINE_VISIBILITY
5786bool
5787prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5788{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005789#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005790 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5791 __debug_less<_Compare> __c(__comp);
5792 return __prev_permutation<_Comp_ref>(__first, __last, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005793#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005794 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5795 return __prev_permutation<_Comp_ref>(__first, __last, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005796#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005797}
5798
5799template <class _BidirectionalIterator>
5800inline _LIBCPP_INLINE_VISIBILITY
5801bool
5802prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
5803{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005804 return _VSTD::prev_permutation(__first, __last,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005805 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
5806}
5807
Howard Hinnantc51e1022010-05-11 19:42:16 +00005808_LIBCPP_END_NAMESPACE_STD
5809
Eric Fiselierf4433a32017-05-31 22:07:49 +00005810_LIBCPP_POP_MACROS
5811
Howard Hinnantc51e1022010-05-11 19:42:16 +00005812#endif // _LIBCPP_ALGORITHM