blob: c00845f6404bad7f2e0e328ed86ecbb638a6a0a9 [file] [log] [blame]
Howard Hinnant3e519522010-05-11 19:42:161// -*- C++ -*-
2//===-------------------------- algorithm ---------------------------------===//
3//
Howard Hinnant5b08a8a2010-05-11 21:36:014// The LLVM Compiler Infrastructure
Howard Hinnant3e519522010-05-11 19:42:165//
Howard Hinnant412dbeb2010-11-16 22:09:026// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
Howard Hinnant3e519522010-05-11 19:42:168//
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 Clow706ffef2018-01-15 17:20:3623 constexpr bool // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:1624 all_of(InputIterator first, InputIterator last, Predicate pred);
25
26template <class InputIterator, class Predicate>
Marshall Clow706ffef2018-01-15 17:20:3627 constexpr bool // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:1628 any_of(InputIterator first, InputIterator last, Predicate pred);
29
30template <class InputIterator, class Predicate>
Marshall Clow706ffef2018-01-15 17:20:3631 constexpr bool // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:1632 none_of(InputIterator first, InputIterator last, Predicate pred);
33
34template <class InputIterator, class Function>
Marshall Clow1b9a4ff2018-01-22 20:44:3335 constexpr Function // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:1636 for_each(InputIterator first, InputIterator last, Function f);
37
Marshall Clowd5c65ff2017-05-25 02:29:5438template<class InputIterator, class Size, class Function>
Marshall Clow1b9a4ff2018-01-22 20:44:3339 constexpr InputIterator // constexpr in C++20
40 for_each_n(InputIterator first, Size n, Function f); // C++17
Marshall Clowd5c65ff2017-05-25 02:29:5441
Howard Hinnant3e519522010-05-11 19:42:1642template <class InputIterator, class T>
Marshall Clow86944282018-01-15 19:26:0543 constexpr InputIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:1644 find(InputIterator first, InputIterator last, const T& value);
45
46template <class InputIterator, class Predicate>
Marshall Clow86944282018-01-15 19:26:0547 constexpr InputIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:1648 find_if(InputIterator first, InputIterator last, Predicate pred);
49
50template<class InputIterator, class Predicate>
Marshall Clow86944282018-01-15 19:26:0551 InputIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:1652 find_if_not(InputIterator first, InputIterator last, Predicate pred);
53
54template <class ForwardIterator1, class ForwardIterator2>
Marshall Clow86944282018-01-15 19:26:0555 ForwardIterator1 // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:1656 find_end(ForwardIterator1 first1, ForwardIterator1 last1,
57 ForwardIterator2 first2, ForwardIterator2 last2);
58
59template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
Marshall Clow86944282018-01-15 19:26:0560 ForwardIterator1 // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:1661 find_end(ForwardIterator1 first1, ForwardIterator1 last1,
62 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
63
64template <class ForwardIterator1, class ForwardIterator2>
Marshall Clow86944282018-01-15 19:26:0565 constexpr ForwardIterator1 // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:1666 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
67 ForwardIterator2 first2, ForwardIterator2 last2);
68
69template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
Marshall Clow86944282018-01-15 19:26:0570 constexpr ForwardIterator1 // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:1671 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
72 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
73
74template <class ForwardIterator>
Marshall Clow86944282018-01-15 19:26:0575 constexpr ForwardIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:1676 adjacent_find(ForwardIterator first, ForwardIterator last);
77
78template <class ForwardIterator, class BinaryPredicate>
Marshall Clow86944282018-01-15 19:26:0579 constexpr ForwardIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:1680 adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
81
82template <class InputIterator, class T>
Marshall Clow056f15e2018-01-15 19:40:3483 constexpr typename iterator_traits<InputIterator>::difference_type // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:1684 count(InputIterator first, InputIterator last, const T& value);
85
86template <class InputIterator, class Predicate>
Marshall Clow056f15e2018-01-15 19:40:3487 constexpr typename iterator_traits<InputIterator>::difference_type // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:1688 count_if(InputIterator first, InputIterator last, Predicate pred);
89
90template <class InputIterator1, class InputIterator2>
Marshall Clow6538e28d2018-01-16 02:04:1091 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:1692 mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
93
Marshall Clow0b0bbd22013-05-09 21:14:2394template <class InputIterator1, class InputIterator2>
Marshall Clow6538e28d2018-01-16 02:04:1095 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20
Aditya Kumar331fb802016-08-25 11:52:3896 mismatch(InputIterator1 first1, InputIterator1 last1,
Marshall Clow0b0bbd22013-05-09 21:14:2397 InputIterator2 first2, InputIterator2 last2); // **C++14**
98
Howard Hinnant3e519522010-05-11 19:42:1699template <class InputIterator1, class InputIterator2, class BinaryPredicate>
Marshall Clow6538e28d2018-01-16 02:04:10100 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16101 mismatch(InputIterator1 first1, InputIterator1 last1,
102 InputIterator2 first2, BinaryPredicate pred);
103
Marshall Clow0b0bbd22013-05-09 21:14:23104template <class InputIterator1, class InputIterator2, class BinaryPredicate>
Marshall Clow6538e28d2018-01-16 02:04:10105 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20
Marshall Clow0b0bbd22013-05-09 21:14:23106 mismatch(InputIterator1 first1, InputIterator1 last1,
107 InputIterator2 first2, InputIterator2 last2,
108 BinaryPredicate pred); // **C++14**
109
Howard Hinnant3e519522010-05-11 19:42:16110template <class InputIterator1, class InputIterator2>
Marshall Clow6538e28d2018-01-16 02:04:10111 constexpr bool // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16112 equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
113
Marshall Clow0b0bbd22013-05-09 21:14:23114template <class InputIterator1, class InputIterator2>
Marshall Clow6538e28d2018-01-16 02:04:10115 constexpr bool // constexpr in C++20
Aditya Kumar331fb802016-08-25 11:52:38116 equal(InputIterator1 first1, InputIterator1 last1,
Marshall Clow0b0bbd22013-05-09 21:14:23117 InputIterator2 first2, InputIterator2 last2); // **C++14**
118
Howard Hinnant3e519522010-05-11 19:42:16119template <class InputIterator1, class InputIterator2, class BinaryPredicate>
Marshall Clow6538e28d2018-01-16 02:04:10120 constexpr bool // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16121 equal(InputIterator1 first1, InputIterator1 last1,
122 InputIterator2 first2, BinaryPredicate pred);
123
Marshall Clow0b0bbd22013-05-09 21:14:23124template <class InputIterator1, class InputIterator2, class BinaryPredicate>
Marshall Clow6538e28d2018-01-16 02:04:10125 constexpr bool // constexpr in C++20
Marshall Clow0b0bbd22013-05-09 21:14:23126 equal(InputIterator1 first1, InputIterator1 last1,
127 InputIterator2 first2, InputIterator2 last2,
128 BinaryPredicate pred); // **C++14**
129
Howard Hinnant3e519522010-05-11 19:42:16130template<class ForwardIterator1, class ForwardIterator2>
Marshall Clow49c76432018-01-15 16:16:32131 constexpr bool // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16132 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
133 ForwardIterator2 first2);
134
Marshall Clow0b0bbd22013-05-09 21:14:23135template<class ForwardIterator1, class ForwardIterator2>
Marshall Clow49c76432018-01-15 16:16:32136 constexpr bool // constexpr in C++20
Marshall Clow0b0bbd22013-05-09 21:14:23137 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
138 ForwardIterator2 first2, ForwardIterator2 last2); // **C++14**
139
Howard Hinnant3e519522010-05-11 19:42:16140template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
Marshall Clow49c76432018-01-15 16:16:32141 constexpr bool // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16142 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
143 ForwardIterator2 first2, BinaryPredicate pred);
144
Marshall Clow0b0bbd22013-05-09 21:14:23145template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
Marshall Clow49c76432018-01-15 16:16:32146 constexpr bool // constexpr in C++20
Marshall Clow0b0bbd22013-05-09 21:14:23147 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
148 ForwardIterator2 first2, ForwardIterator2 last2,
149 BinaryPredicate pred); // **C++14**
150
Howard Hinnant3e519522010-05-11 19:42:16151template <class ForwardIterator1, class ForwardIterator2>
Marshall Clow12f0a772018-01-16 15:48:27152 constexpr ForwardIterator1 // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16153 search(ForwardIterator1 first1, ForwardIterator1 last1,
154 ForwardIterator2 first2, ForwardIterator2 last2);
155
156template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
Marshall Clow12f0a772018-01-16 15:48:27157 constexpr ForwardIterator1 // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16158 search(ForwardIterator1 first1, ForwardIterator1 last1,
159 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
160
161template <class ForwardIterator, class Size, class T>
Marshall Clow12f0a772018-01-16 15:48:27162 constexpr ForwardIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16163 search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value);
164
165template <class ForwardIterator, class Size, class T, class BinaryPredicate>
Marshall Clow12f0a772018-01-16 15:48:27166 constexpr ForwardIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16167 search_n(ForwardIterator first, ForwardIterator last,
168 Size count, const T& value, BinaryPredicate pred);
169
170template <class InputIterator, class OutputIterator>
171 OutputIterator
172 copy(InputIterator first, InputIterator last, OutputIterator result);
173
174template<class InputIterator, class OutputIterator, class Predicate>
175 OutputIterator
176 copy_if(InputIterator first, InputIterator last,
177 OutputIterator result, Predicate pred);
178
179template<class InputIterator, class Size, class OutputIterator>
180 OutputIterator
181 copy_n(InputIterator first, Size n, OutputIterator result);
182
183template <class BidirectionalIterator1, class BidirectionalIterator2>
184 BidirectionalIterator2
185 copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last,
186 BidirectionalIterator2 result);
187
188template <class ForwardIterator1, class ForwardIterator2>
189 ForwardIterator2
190 swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2);
191
192template <class ForwardIterator1, class ForwardIterator2>
193 void
194 iter_swap(ForwardIterator1 a, ForwardIterator2 b);
195
196template <class InputIterator, class OutputIterator, class UnaryOperation>
Marshall Clow99894b62018-01-19 17:45:39197 constexpr OutputIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16198 transform(InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op);
199
200template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation>
Marshall Clow99894b62018-01-19 17:45:39201 constexpr OutputIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16202 transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2,
203 OutputIterator result, BinaryOperation binary_op);
204
205template <class ForwardIterator, class T>
Marshall Clow12c74232018-01-19 18:07:29206 constexpr void // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16207 replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value);
208
209template <class ForwardIterator, class Predicate, class T>
Marshall Clow12c74232018-01-19 18:07:29210 constexpr void // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16211 replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value);
212
213template <class InputIterator, class OutputIterator, class T>
Marshall Clow12c74232018-01-19 18:07:29214 constexpr OutputIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16215 replace_copy(InputIterator first, InputIterator last, OutputIterator result,
216 const T& old_value, const T& new_value);
217
218template <class InputIterator, class OutputIterator, class Predicate, class T>
Marshall Clow12c74232018-01-19 18:07:29219 constexpr OutputIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16220 replace_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value);
221
222template <class ForwardIterator, class T>
Marshall Clow4bfb9312018-01-20 20:14:32223 constexpr void // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16224 fill(ForwardIterator first, ForwardIterator last, const T& value);
225
226template <class OutputIterator, class Size, class T>
Marshall Clow4bfb9312018-01-20 20:14:32227 constexpr OutputIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16228 fill_n(OutputIterator first, Size n, const T& value);
229
230template <class ForwardIterator, class Generator>
Marshall Clow4bfb9312018-01-20 20:14:32231 constexpr void // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16232 generate(ForwardIterator first, ForwardIterator last, Generator gen);
233
234template <class OutputIterator, class Size, class Generator>
Marshall Clow4bfb9312018-01-20 20:14:32235 constexpr OutputIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16236 generate_n(OutputIterator first, Size n, Generator gen);
237
238template <class ForwardIterator, class T>
239 ForwardIterator
240 remove(ForwardIterator first, ForwardIterator last, const T& value);
241
242template <class ForwardIterator, class Predicate>
243 ForwardIterator
244 remove_if(ForwardIterator first, ForwardIterator last, Predicate pred);
245
246template <class InputIterator, class OutputIterator, class T>
247 OutputIterator
248 remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value);
249
250template <class InputIterator, class OutputIterator, class Predicate>
251 OutputIterator
252 remove_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred);
253
254template <class ForwardIterator>
255 ForwardIterator
256 unique(ForwardIterator first, ForwardIterator last);
257
258template <class ForwardIterator, class BinaryPredicate>
259 ForwardIterator
260 unique(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
261
262template <class InputIterator, class OutputIterator>
263 OutputIterator
264 unique_copy(InputIterator first, InputIterator last, OutputIterator result);
265
266template <class InputIterator, class OutputIterator, class BinaryPredicate>
267 OutputIterator
268 unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate pred);
269
270template <class BidirectionalIterator>
271 void
272 reverse(BidirectionalIterator first, BidirectionalIterator last);
273
274template <class BidirectionalIterator, class OutputIterator>
275 OutputIterator
276 reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result);
277
278template <class ForwardIterator>
279 ForwardIterator
280 rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last);
281
282template <class ForwardIterator, class OutputIterator>
283 OutputIterator
284 rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result);
285
286template <class RandomAccessIterator>
287 void
Marshall Clow0f37a412017-03-23 13:43:37288 random_shuffle(RandomAccessIterator first, RandomAccessIterator last); // deprecated in C++14, removed in C++17
Howard Hinnant3e519522010-05-11 19:42:16289
290template <class RandomAccessIterator, class RandomNumberGenerator>
291 void
Marshall Clow06965c12014-03-03 06:14:19292 random_shuffle(RandomAccessIterator first, RandomAccessIterator last,
Marshall Clow0f37a412017-03-23 13:43:37293 RandomNumberGenerator& rand); // deprecated in C++14, removed in C++17
Howard Hinnant3e519522010-05-11 19:42:16294
Eric Fiseliere7154702016-08-28 22:14:37295template<class PopulationIterator, class SampleIterator,
296 class Distance, class UniformRandomBitGenerator>
297 SampleIterator sample(PopulationIterator first, PopulationIterator last,
298 SampleIterator out, Distance n,
299 UniformRandomBitGenerator&& g); // C++17
300
Howard Hinnantf9d540b2010-05-26 17:49:34301template<class RandomAccessIterator, class UniformRandomNumberGenerator>
302 void shuffle(RandomAccessIterator first, RandomAccessIterator last,
Howard Hinnantfb340102010-11-18 01:47:02303 UniformRandomNumberGenerator&& g);
Howard Hinnantf9d540b2010-05-26 17:49:34304
Howard Hinnant3e519522010-05-11 19:42:16305template <class InputIterator, class Predicate>
Marshall Clow49c76432018-01-15 16:16:32306 constexpr bool // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16307 is_partitioned(InputIterator first, InputIterator last, Predicate pred);
308
309template <class ForwardIterator, class Predicate>
310 ForwardIterator
311 partition(ForwardIterator first, ForwardIterator last, Predicate pred);
312
313template <class InputIterator, class OutputIterator1,
314 class OutputIterator2, class Predicate>
Marshall Clow1b9a4ff2018-01-22 20:44:33315 constexpr pair<OutputIterator1, OutputIterator2> // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16316 partition_copy(InputIterator first, InputIterator last,
317 OutputIterator1 out_true, OutputIterator2 out_false,
318 Predicate pred);
319
320template <class ForwardIterator, class Predicate>
321 ForwardIterator
322 stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred);
323
324template<class ForwardIterator, class Predicate>
Marshall Clowd57c03d2018-01-16 02:34:41325 constexpr ForwardIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16326 partition_point(ForwardIterator first, ForwardIterator last, Predicate pred);
327
328template <class ForwardIterator>
Marshall Clow49c76432018-01-15 16:16:32329 constexpr bool // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16330 is_sorted(ForwardIterator first, ForwardIterator last);
331
332template <class ForwardIterator, class Compare>
333 bool
334 is_sorted(ForwardIterator first, ForwardIterator last, Compare comp);
335
336template<class ForwardIterator>
Marshall Clow056f15e2018-01-15 19:40:34337 constexpr ForwardIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16338 is_sorted_until(ForwardIterator first, ForwardIterator last);
339
340template <class ForwardIterator, class Compare>
Marshall Clow056f15e2018-01-15 19:40:34341 constexpr ForwardIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16342 is_sorted_until(ForwardIterator first, ForwardIterator last, Compare comp);
343
344template <class RandomAccessIterator>
345 void
346 sort(RandomAccessIterator first, RandomAccessIterator last);
347
348template <class RandomAccessIterator, class Compare>
349 void
350 sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
351
352template <class RandomAccessIterator>
353 void
354 stable_sort(RandomAccessIterator first, RandomAccessIterator last);
355
356template <class RandomAccessIterator, class Compare>
357 void
358 stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
359
360template <class RandomAccessIterator>
361 void
362 partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last);
363
364template <class RandomAccessIterator, class Compare>
365 void
366 partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp);
367
368template <class InputIterator, class RandomAccessIterator>
369 RandomAccessIterator
370 partial_sort_copy(InputIterator first, InputIterator last,
371 RandomAccessIterator result_first, RandomAccessIterator result_last);
372
373template <class InputIterator, class RandomAccessIterator, class Compare>
374 RandomAccessIterator
375 partial_sort_copy(InputIterator first, InputIterator last,
376 RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp);
377
378template <class RandomAccessIterator>
379 void
380 nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last);
381
382template <class RandomAccessIterator, class Compare>
383 void
384 nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp);
385
386template <class ForwardIterator, class T>
Marshall Clowd57c03d2018-01-16 02:34:41387 constexpr ForwardIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16388 lower_bound(ForwardIterator first, ForwardIterator last, const T& value);
389
390template <class ForwardIterator, class T, class Compare>
Marshall Clowd57c03d2018-01-16 02:34:41391 constexpr ForwardIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16392 lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
393
394template <class ForwardIterator, class T>
Marshall Clowd57c03d2018-01-16 02:34:41395 constexpr ForwardIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16396 upper_bound(ForwardIterator first, ForwardIterator last, const T& value);
397
398template <class ForwardIterator, class T, class Compare>
Marshall Clowd57c03d2018-01-16 02:34:41399 constexpr ForwardIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16400 upper_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
401
402template <class ForwardIterator, class T>
Marshall Clowd57c03d2018-01-16 02:34:41403 constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16404 equal_range(ForwardIterator first, ForwardIterator last, const T& value);
405
406template <class ForwardIterator, class T, class Compare>
Marshall Clowd57c03d2018-01-16 02:34:41407 constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16408 equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
409
410template <class ForwardIterator, class T>
Marshall Clowd57c03d2018-01-16 02:34:41411 constexpr bool // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16412 binary_search(ForwardIterator first, ForwardIterator last, const T& value);
413
414template <class ForwardIterator, class T, class Compare>
Marshall Clowd57c03d2018-01-16 02:34:41415 bool // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16416 binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
417
418template <class InputIterator1, class InputIterator2, class OutputIterator>
419 OutputIterator
420 merge(InputIterator1 first1, InputIterator1 last1,
421 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
422
423template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
424 OutputIterator
425 merge(InputIterator1 first1, InputIterator1 last1,
426 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
427
428template <class BidirectionalIterator>
429 void
430 inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last);
431
432template <class BidirectionalIterator, class Compare>
433 void
434 inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp);
435
436template <class InputIterator1, class InputIterator2>
437 bool
438 includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
439
440template <class InputIterator1, class InputIterator2, class Compare>
441 bool
442 includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp);
443
444template <class InputIterator1, class InputIterator2, class OutputIterator>
445 OutputIterator
446 set_union(InputIterator1 first1, InputIterator1 last1,
447 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
448
449template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
450 OutputIterator
451 set_union(InputIterator1 first1, InputIterator1 last1,
452 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
453
454template <class InputIterator1, class InputIterator2, class OutputIterator>
455 OutputIterator
456 set_intersection(InputIterator1 first1, InputIterator1 last1,
457 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
458
459template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
460 OutputIterator
461 set_intersection(InputIterator1 first1, InputIterator1 last1,
462 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
463
464template <class InputIterator1, class InputIterator2, class OutputIterator>
465 OutputIterator
466 set_difference(InputIterator1 first1, InputIterator1 last1,
467 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
468
469template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
470 OutputIterator
471 set_difference(InputIterator1 first1, InputIterator1 last1,
472 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
473
474template <class InputIterator1, class InputIterator2, class OutputIterator>
475 OutputIterator
476 set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
477 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
478
479template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
480 OutputIterator
481 set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
482 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
483
484template <class RandomAccessIterator>
485 void
486 push_heap(RandomAccessIterator first, RandomAccessIterator last);
487
488template <class RandomAccessIterator, class Compare>
489 void
490 push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
491
492template <class RandomAccessIterator>
493 void
494 pop_heap(RandomAccessIterator first, RandomAccessIterator last);
495
496template <class RandomAccessIterator, class Compare>
497 void
498 pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
499
500template <class RandomAccessIterator>
501 void
502 make_heap(RandomAccessIterator first, RandomAccessIterator last);
503
504template <class RandomAccessIterator, class Compare>
505 void
506 make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
507
508template <class RandomAccessIterator>
509 void
510 sort_heap(RandomAccessIterator first, RandomAccessIterator last);
511
512template <class RandomAccessIterator, class Compare>
513 void
514 sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
515
Howard Hinnantb3371f62010-08-22 00:02:43516template <class RandomAccessIterator>
Marshall Clow49c76432018-01-15 16:16:32517 constexpr bool // constexpr in C++20
Howard Hinnantb3371f62010-08-22 00:02:43518 is_heap(RandomAccessIterator first, RandomAccessiterator last);
Howard Hinnant3e519522010-05-11 19:42:16519
Howard Hinnantb3371f62010-08-22 00:02:43520template <class RandomAccessIterator, class Compare>
Marshall Clow49c76432018-01-15 16:16:32521 constexpr bool // constexpr in C++20
Howard Hinnantb3371f62010-08-22 00:02:43522 is_heap(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
Howard Hinnant3e519522010-05-11 19:42:16523
Howard Hinnantb3371f62010-08-22 00:02:43524template <class RandomAccessIterator>
Marshall Clow49c76432018-01-15 16:16:32525 constexpr RandomAccessIterator // constexpr in C++20
Howard Hinnantb3371f62010-08-22 00:02:43526 is_heap_until(RandomAccessIterator first, RandomAccessiterator last);
Howard Hinnant3e519522010-05-11 19:42:16527
Howard Hinnantb3371f62010-08-22 00:02:43528template <class RandomAccessIterator, class Compare>
Marshall Clow49c76432018-01-15 16:16:32529 constexpr RandomAccessIterator // constexpr in C++20
Howard Hinnantb3371f62010-08-22 00:02:43530 is_heap_until(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
Howard Hinnant3e519522010-05-11 19:42:16531
Howard Hinnant4eb27b72010-08-21 20:10:01532template <class ForwardIterator>
533 ForwardIterator
Marshall Clow0b0671a2015-05-10 13:53:31534 min_element(ForwardIterator first, ForwardIterator last); // constexpr in C++14
Howard Hinnant4eb27b72010-08-21 20:10:01535
536template <class ForwardIterator, class Compare>
537 ForwardIterator
Marshall Clow0b0671a2015-05-10 13:53:31538 min_element(ForwardIterator first, ForwardIterator last, Compare comp); // constexpr in C++14
Howard Hinnant4eb27b72010-08-21 20:10:01539
Howard Hinnant3e519522010-05-11 19:42:16540template <class T>
541 const T&
Marshall Clow9d67c6d2014-02-19 16:51:35542 min(const T& a, const T& b); // constexpr in C++14
Howard Hinnant3e519522010-05-11 19:42:16543
544template <class T, class Compare>
545 const T&
Marshall Clow9d67c6d2014-02-19 16:51:35546 min(const T& a, const T& b, Compare comp); // constexpr in C++14
Howard Hinnant3e519522010-05-11 19:42:16547
Howard Hinnant4eb27b72010-08-21 20:10:01548template<class T>
549 T
Marshall Clow9d67c6d2014-02-19 16:51:35550 min(initializer_list<T> t); // constexpr in C++14
Howard Hinnant4eb27b72010-08-21 20:10:01551
552template<class T, class Compare>
553 T
Marshall Clow9d67c6d2014-02-19 16:51:35554 min(initializer_list<T> t, Compare comp); // constexpr in C++14
Howard Hinnant4eb27b72010-08-21 20:10:01555
Marshall Clow146c14a2016-03-07 22:43:49556template<class T>
557 constexpr const T& clamp( const T& v, const T& lo, const T& hi ); // C++17
558
559template<class T, class Compare>
560 constexpr const T& clamp( const T& v, const T& lo, const T& hi, Compare comp ); // C++17
561
Howard Hinnant4eb27b72010-08-21 20:10:01562template <class ForwardIterator>
563 ForwardIterator
Marshall Clow0b0671a2015-05-10 13:53:31564 max_element(ForwardIterator first, ForwardIterator last); // constexpr in C++14
Howard Hinnant4eb27b72010-08-21 20:10:01565
566template <class ForwardIterator, class Compare>
567 ForwardIterator
Marshall Clow0b0671a2015-05-10 13:53:31568 max_element(ForwardIterator first, ForwardIterator last, Compare comp); // constexpr in C++14
Howard Hinnant4eb27b72010-08-21 20:10:01569
Howard Hinnant3e519522010-05-11 19:42:16570template <class T>
571 const T&
Marshall Clow9d67c6d2014-02-19 16:51:35572 max(const T& a, const T& b); // constexpr in C++14
Howard Hinnant3e519522010-05-11 19:42:16573
574template <class T, class Compare>
575 const T&
Marshall Clow9d67c6d2014-02-19 16:51:35576 max(const T& a, const T& b, Compare comp); // constexpr in C++14
Howard Hinnant3e519522010-05-11 19:42:16577
Howard Hinnant4eb27b72010-08-21 20:10:01578template<class T>
579 T
Marshall Clow9d67c6d2014-02-19 16:51:35580 max(initializer_list<T> t); // constexpr in C++14
Howard Hinnant3e519522010-05-11 19:42:16581
Howard Hinnant4eb27b72010-08-21 20:10:01582template<class T, class Compare>
583 T
Marshall Clow9d67c6d2014-02-19 16:51:35584 max(initializer_list<T> t, Compare comp); // constexpr in C++14
Howard Hinnant3e519522010-05-11 19:42:16585
Howard Hinnant4eb27b72010-08-21 20:10:01586template<class ForwardIterator>
587 pair<ForwardIterator, ForwardIterator>
Marshall Clow0b0671a2015-05-10 13:53:31588 minmax_element(ForwardIterator first, ForwardIterator last); // constexpr in C++14
Howard Hinnant3e519522010-05-11 19:42:16589
Howard Hinnant4eb27b72010-08-21 20:10:01590template<class ForwardIterator, class Compare>
591 pair<ForwardIterator, ForwardIterator>
Marshall Clow0b0671a2015-05-10 13:53:31592 minmax_element(ForwardIterator first, ForwardIterator last, Compare comp); // constexpr in C++14
Howard Hinnant4eb27b72010-08-21 20:10:01593
594template<class T>
595 pair<const T&, const T&>
Marshall Clow9d67c6d2014-02-19 16:51:35596 minmax(const T& a, const T& b); // constexpr in C++14
Howard Hinnant4eb27b72010-08-21 20:10:01597
598template<class T, class Compare>
599 pair<const T&, const T&>
Marshall Clow9d67c6d2014-02-19 16:51:35600 minmax(const T& a, const T& b, Compare comp); // constexpr in C++14
Howard Hinnant4eb27b72010-08-21 20:10:01601
602template<class T>
603 pair<T, T>
Marshall Clow9d67c6d2014-02-19 16:51:35604 minmax(initializer_list<T> t); // constexpr in C++14
Howard Hinnant4eb27b72010-08-21 20:10:01605
606template<class T, class Compare>
607 pair<T, T>
Marshall Clow9d67c6d2014-02-19 16:51:35608 minmax(initializer_list<T> t, Compare comp); // constexpr in C++14
Howard Hinnant3e519522010-05-11 19:42:16609
610template <class InputIterator1, class InputIterator2>
Marshall Clow1b9a4ff2018-01-22 20:44:33611 constexpr bool // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16612 lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
613
614template <class InputIterator1, class InputIterator2, class Compare>
Marshall Clow1b9a4ff2018-01-22 20:44:33615 constexpr bool // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16616 lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
617 InputIterator2 first2, InputIterator2 last2, Compare comp);
618
619template <class BidirectionalIterator>
Howard Hinnantb3371f62010-08-22 00:02:43620 bool
Howard Hinnant3e519522010-05-11 19:42:16621 next_permutation(BidirectionalIterator first, BidirectionalIterator last);
622
623template <class BidirectionalIterator, class Compare>
624 bool
625 next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
626
627template <class BidirectionalIterator>
628 bool
629 prev_permutation(BidirectionalIterator first, BidirectionalIterator last);
630
631template <class BidirectionalIterator, class Compare>
632 bool
633 prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
634
635} // std
636
637*/
638
639#include <__config>
640#include <initializer_list>
641#include <type_traits>
642#include <cstring>
Eric Fiselierf07dd8d2016-04-21 23:38:59643#include <utility> // needed to provide swap_ranges.
Howard Hinnant3e519522010-05-11 19:42:16644#include <memory>
Marshall Clowd835e592018-01-08 19:18:00645#include <functional>
Howard Hinnant3e519522010-05-11 19:42:16646#include <iterator>
Howard Hinnanta1d07d52012-07-26 17:09:09647#include <cstddef>
Howard Hinnant3e519522010-05-11 19:42:16648
Howard Hinnant5d1a7012013-08-14 18:00:20649#if defined(__IBMCPP__)
650#include "support/ibm/support.h"
651#endif
Eric Fiselier5d50aa32017-05-10 20:57:45652#if defined(_LIBCPP_COMPILER_MSVC)
Eric Fiselier80f8cfb2017-05-10 21:30:04653#include <intrin.h>
Howard Hinnant5f878d42013-09-17 01:34:47654#endif
Howard Hinnant5d1a7012013-08-14 18:00:20655
Eric Fiselierc1bd9192014-08-10 23:53:08656#include <__debug>
657
Howard Hinnant073458b2011-10-17 20:05:10658#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnant3e519522010-05-11 19:42:16659#pragma GCC system_header
Howard Hinnant073458b2011-10-17 20:05:10660#endif
Howard Hinnant3e519522010-05-11 19:42:16661
Eric Fiseliera016efb2017-05-31 22:07:49662_LIBCPP_PUSH_MACROS
663#include <__undef_macros>
664
665
Howard Hinnant3e519522010-05-11 19:42:16666_LIBCPP_BEGIN_NAMESPACE_STD
667
Marshall Clow9d67c6d2014-02-19 16:51:35668// I'd like to replace these with _VSTD::equal_to<void>, but can't because:
669// * That only works with C++14 and later, and
670// * We haven't included <functional> here.
Howard Hinnant3e519522010-05-11 19:42:16671template <class _T1, class _T2 = _T1>
672struct __equal_to
673{
674 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
675 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T2& __y) const {return __x == __y;}
676 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T1& __y) const {return __x == __y;}
677 _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T2& __y) const {return __x == __y;}
678};
679
680template <class _T1>
681struct __equal_to<_T1, _T1>
682{
Marshall Clow9d67c6d2014-02-19 16:51:35683 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
684 bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
Howard Hinnant3e519522010-05-11 19:42:16685};
686
687template <class _T1>
688struct __equal_to<const _T1, _T1>
689{
Marshall Clow9d67c6d2014-02-19 16:51:35690 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
691 bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
Howard Hinnant3e519522010-05-11 19:42:16692};
693
694template <class _T1>
695struct __equal_to<_T1, const _T1>
696{
Marshall Clow9d67c6d2014-02-19 16:51:35697 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
698 bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
Howard Hinnant3e519522010-05-11 19:42:16699};
700
701template <class _T1, class _T2 = _T1>
702struct __less
703{
Aditya Kumar331fb802016-08-25 11:52:38704 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Marshall Clow9d67c6d2014-02-19 16:51:35705 bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
706
707 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
708 bool operator()(const _T1& __x, const _T2& __y) const {return __x < __y;}
709
710 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
711 bool operator()(const _T2& __x, const _T1& __y) const {return __x < __y;}
712
713 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
714 bool operator()(const _T2& __x, const _T2& __y) const {return __x < __y;}
Howard Hinnant3e519522010-05-11 19:42:16715};
716
717template <class _T1>
718struct __less<_T1, _T1>
719{
Marshall Clow9d67c6d2014-02-19 16:51:35720 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
721 bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
Howard Hinnant3e519522010-05-11 19:42:16722};
723
724template <class _T1>
725struct __less<const _T1, _T1>
726{
Marshall Clow9d67c6d2014-02-19 16:51:35727 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
728 bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
Howard Hinnant3e519522010-05-11 19:42:16729};
730
731template <class _T1>
732struct __less<_T1, const _T1>
733{
Marshall Clow9d67c6d2014-02-19 16:51:35734 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
735 bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
Howard Hinnant3e519522010-05-11 19:42:16736};
737
738template <class _Predicate>
Marshall Clowa763b362017-08-28 23:16:13739class __invert // invert the sense of a comparison
Howard Hinnant3e519522010-05-11 19:42:16740{
741private:
742 _Predicate __p_;
743public:
Marshall Clowa763b362017-08-28 23:16:13744 _LIBCPP_INLINE_VISIBILITY __invert() {}
Howard Hinnant3e519522010-05-11 19:42:16745
746 _LIBCPP_INLINE_VISIBILITY
Marshall Clowa763b362017-08-28 23:16:13747 explicit __invert(_Predicate __p) : __p_(__p) {}
Howard Hinnant3e519522010-05-11 19:42:16748
749 template <class _T1>
750 _LIBCPP_INLINE_VISIBILITY
751 bool operator()(const _T1& __x) {return !__p_(__x);}
752
753 template <class _T1, class _T2>
754 _LIBCPP_INLINE_VISIBILITY
Marshall Clowa763b362017-08-28 23:16:13755 bool operator()(const _T1& __x, const _T2& __y) {return __p_(__y, __x);}
Howard Hinnant3e519522010-05-11 19:42:16756};
757
Howard Hinnant145afa12013-08-23 20:10:18758#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:16759
760template <class _Compare>
761struct __debug_less
762{
763 _Compare __comp_;
764 __debug_less(_Compare& __c) : __comp_(__c) {}
Eric Fiselier331d2152016-07-19 23:27:18765
Howard Hinnant3e519522010-05-11 19:42:16766 template <class _Tp, class _Up>
767 bool operator()(const _Tp& __x, const _Up& __y)
768 {
769 bool __r = __comp_(__x, __y);
770 if (__r)
Eric Fiselier331d2152016-07-19 23:27:18771 __do_compare_assert(0, __y, __x);
Howard Hinnant3e519522010-05-11 19:42:16772 return __r;
773 }
Eric Fiselier331d2152016-07-19 23:27:18774
775 template <class _LHS, class _RHS>
776 inline _LIBCPP_INLINE_VISIBILITY
777 decltype((void)_VSTD::declval<_Compare&>()(
778 _VSTD::declval<_LHS const&>(), _VSTD::declval<_RHS const&>()))
779 __do_compare_assert(int, _LHS const& __l, _RHS const& __r) {
780 _LIBCPP_ASSERT(!__comp_(__l, __r),
781 "Comparator does not induce a strict weak ordering");
782 }
783
784 template <class _LHS, class _RHS>
785 inline _LIBCPP_INLINE_VISIBILITY
786 void __do_compare_assert(long, _LHS const&, _RHS const&) {}
Howard Hinnant3e519522010-05-11 19:42:16787};
788
Howard Hinnant145afa12013-08-23 20:10:18789#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:16790
Howard Hinnantc8edcb32010-05-27 20:06:01791// Precondition: __x != 0
Howard Hinnantc2063662011-12-01 20:21:04792inline _LIBCPP_INLINE_VISIBILITY
Eric Fiselier80f8cfb2017-05-10 21:30:04793unsigned __ctz(unsigned __x) {
794#ifndef _LIBCPP_COMPILER_MSVC
Howard Hinnantc2063662011-12-01 20:21:04795 return static_cast<unsigned>(__builtin_ctz(__x));
Eric Fiselier80f8cfb2017-05-10 21:30:04796#else
797 static_assert(sizeof(unsigned) == sizeof(unsigned long), "");
798 static_assert(sizeof(unsigned long) == 4, "");
799 unsigned long where;
800 // Search from LSB to MSB for first set bit.
801 // Returns zero if no set bit is found.
Shoaib Meenai9a0a0042017-12-05 17:46:23802 if (_BitScanForward(&where, __x))
Eric Fiselier80f8cfb2017-05-10 21:30:04803 return where;
804 return 32;
805#endif
Howard Hinnantc2063662011-12-01 20:21:04806}
807
808inline _LIBCPP_INLINE_VISIBILITY
Eric Fiselier80f8cfb2017-05-10 21:30:04809unsigned long __ctz(unsigned long __x) {
810#ifndef _LIBCPP_COMPILER_MSVC
Howard Hinnantc2063662011-12-01 20:21:04811 return static_cast<unsigned long>(__builtin_ctzl(__x));
Eric Fiselier80f8cfb2017-05-10 21:30:04812#else
813 static_assert(sizeof(unsigned long) == sizeof(unsigned), "");
814 return __ctz(static_cast<unsigned>(__x));
815#endif
Howard Hinnantc2063662011-12-01 20:21:04816}
817
818inline _LIBCPP_INLINE_VISIBILITY
Eric Fiselier80f8cfb2017-05-10 21:30:04819unsigned long long __ctz(unsigned long long __x) {
820#ifndef _LIBCPP_COMPILER_MSVC
Howard Hinnantc2063662011-12-01 20:21:04821 return static_cast<unsigned long long>(__builtin_ctzll(__x));
Eric Fiselier80f8cfb2017-05-10 21:30:04822#else
823 unsigned long where;
824// Search from LSB to MSB for first set bit.
825// Returns zero if no set bit is found.
826#if defined(_LIBCPP_HAS_BITSCAN64)
827 (defined(_M_AMD64) || defined(__x86_64__))
Shoaib Meenai9a0a0042017-12-05 17:46:23828 if (_BitScanForward64(&where, __x))
Eric Fiselier80f8cfb2017-05-10 21:30:04829 return static_cast<int>(where);
830#else
831 // Win32 doesn't have _BitScanForward64 so emulate it with two 32 bit calls.
832 // Scan the Low Word.
Shoaib Meenai9a0a0042017-12-05 17:46:23833 if (_BitScanForward(&where, static_cast<unsigned long>(__x)))
Eric Fiselier80f8cfb2017-05-10 21:30:04834 return where;
835 // Scan the High Word.
Shoaib Meenai9a0a0042017-12-05 17:46:23836 if (_BitScanForward(&where, static_cast<unsigned long>(__x >> 32)))
Eric Fiselier80f8cfb2017-05-10 21:30:04837 return where + 32; // Create a bit offset from the LSB.
838#endif
839 return 64;
840#endif // _LIBCPP_COMPILER_MSVC
Howard Hinnantc2063662011-12-01 20:21:04841}
Howard Hinnantc8edcb32010-05-27 20:06:01842
843// Precondition: __x != 0
Howard Hinnantc2063662011-12-01 20:21:04844inline _LIBCPP_INLINE_VISIBILITY
Eric Fiselier80f8cfb2017-05-10 21:30:04845unsigned __clz(unsigned __x) {
846#ifndef _LIBCPP_COMPILER_MSVC
Howard Hinnantc2063662011-12-01 20:21:04847 return static_cast<unsigned>(__builtin_clz(__x));
Eric Fiselier80f8cfb2017-05-10 21:30:04848#else
849 static_assert(sizeof(unsigned) == sizeof(unsigned long), "");
850 static_assert(sizeof(unsigned long) == 4, "");
851 unsigned long where;
852 // Search from LSB to MSB for first set bit.
853 // Returns zero if no set bit is found.
Shoaib Meenai9a0a0042017-12-05 17:46:23854 if (_BitScanReverse(&where, __x))
Eric Fiselier80f8cfb2017-05-10 21:30:04855 return 31 - where;
856 return 32; // Undefined Behavior.
857#endif
Howard Hinnantc2063662011-12-01 20:21:04858}
859
860inline _LIBCPP_INLINE_VISIBILITY
Eric Fiselier80f8cfb2017-05-10 21:30:04861unsigned long __clz(unsigned long __x) {
862#ifndef _LIBCPP_COMPILER_MSVC
Howard Hinnantc2063662011-12-01 20:21:04863 return static_cast<unsigned long>(__builtin_clzl (__x));
Eric Fiselier80f8cfb2017-05-10 21:30:04864#else
865 static_assert(sizeof(unsigned) == sizeof(unsigned long), "");
866 return __clz(static_cast<unsigned>(__x));
867#endif
Howard Hinnantc2063662011-12-01 20:21:04868}
869
870inline _LIBCPP_INLINE_VISIBILITY
Eric Fiselier80f8cfb2017-05-10 21:30:04871unsigned long long __clz(unsigned long long __x) {
872#ifndef _LIBCPP_COMPILER_MSVC
Howard Hinnantc2063662011-12-01 20:21:04873 return static_cast<unsigned long long>(__builtin_clzll(__x));
Eric Fiselier80f8cfb2017-05-10 21:30:04874#else
875 unsigned long where;
876// BitScanReverse scans from MSB to LSB for first set bit.
877// Returns 0 if no set bit is found.
878#if defined(_LIBCPP_HAS_BITSCAN64)
Shoaib Meenai9a0a0042017-12-05 17:46:23879 if (_BitScanReverse64(&where, __x))
Eric Fiselier80f8cfb2017-05-10 21:30:04880 return static_cast<int>(63 - where);
881#else
882 // Scan the high 32 bits.
Shoaib Meenai9a0a0042017-12-05 17:46:23883 if (_BitScanReverse(&where, static_cast<unsigned long>(__x >> 32)))
Eric Fiselier80f8cfb2017-05-10 21:30:04884 return 63 - (where + 32); // Create a bit offset from the MSB.
885 // Scan the low 32 bits.
Shoaib Meenai9a0a0042017-12-05 17:46:23886 if (_BitScanReverse(&where, static_cast<unsigned long>(__x)))
Eric Fiselier80f8cfb2017-05-10 21:30:04887 return 63 - where;
888#endif
889 return 64; // Undefined Behavior.
890#endif // _LIBCPP_COMPILER_MSVC
Howard Hinnantc2063662011-12-01 20:21:04891}
Howard Hinnantc8edcb32010-05-27 20:06:01892
Eric Fiselier80f8cfb2017-05-10 21:30:04893inline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned __x) {
894#ifndef _LIBCPP_COMPILER_MSVC
895 return __builtin_popcount (__x);
896#else
897 static_assert(sizeof(unsigned) == 4, "");
898 return __popcnt(__x);
899#endif
900}
901
902inline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned long __x) {
903#ifndef _LIBCPP_COMPILER_MSVC
904 return __builtin_popcountl (__x);
905#else
906 static_assert(sizeof(unsigned long) == 4, "");
907 return __popcnt(__x);
908#endif
909}
910
911inline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned long long __x) {
912#ifndef _LIBCPP_COMPILER_MSVC
913 return __builtin_popcountll(__x);
914#else
915 static_assert(sizeof(unsigned long long) == 8, "");
916 return __popcnt64(__x);
917#endif
918}
Howard Hinnantc8edcb32010-05-27 20:06:01919
Howard Hinnant3e519522010-05-11 19:42:16920// all_of
921
922template <class _InputIterator, class _Predicate>
Marshall Clow706ffef2018-01-15 17:20:36923inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:16924bool
925all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
926{
927 for (; __first != __last; ++__first)
928 if (!__pred(*__first))
929 return false;
930 return true;
931}
932
933// any_of
934
935template <class _InputIterator, class _Predicate>
Marshall Clow706ffef2018-01-15 17:20:36936inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:16937bool
938any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
939{
940 for (; __first != __last; ++__first)
941 if (__pred(*__first))
942 return true;
943 return false;
944}
945
946// none_of
947
948template <class _InputIterator, class _Predicate>
Marshall Clow706ffef2018-01-15 17:20:36949inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:16950bool
951none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
952{
953 for (; __first != __last; ++__first)
954 if (__pred(*__first))
955 return false;
956 return true;
957}
958
959// for_each
960
961template <class _InputIterator, class _Function>
Marshall Clow1b9a4ff2018-01-22 20:44:33962inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:16963_Function
964for_each(_InputIterator __first, _InputIterator __last, _Function __f)
965{
966 for (; __first != __last; ++__first)
967 __f(*__first);
Marshall Clow1c7fe122016-11-14 18:22:19968 return __f;
Howard Hinnant3e519522010-05-11 19:42:16969}
970
Marshall Clow1d029962017-05-25 13:40:57971#if _LIBCPP_STD_VER > 14
Marshall Clowd5c65ff2017-05-25 02:29:54972// for_each_n
973
974template <class _InputIterator, class _Size, class _Function>
Marshall Clow1b9a4ff2018-01-22 20:44:33975inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clowd5c65ff2017-05-25 02:29:54976_InputIterator
977for_each_n(_InputIterator __first, _Size __orig_n, _Function __f)
978{
979 typedef decltype(__convert_to_integral(__orig_n)) _IntegralSize;
980 _IntegralSize __n = __orig_n;
981 while (__n > 0)
982 {
983 __f(*__first);
984 ++__first;
985 --__n;
986 }
987 return __first;
988}
Marshall Clow1d029962017-05-25 13:40:57989#endif
Marshall Clowd5c65ff2017-05-25 02:29:54990
Howard Hinnant3e519522010-05-11 19:42:16991// find
992
993template <class _InputIterator, class _Tp>
Marshall Clow49c76432018-01-15 16:16:32994inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:16995_InputIterator
Howard Hinnante4383372011-10-22 20:59:45996find(_InputIterator __first, _InputIterator __last, const _Tp& __value_)
Howard Hinnant3e519522010-05-11 19:42:16997{
998 for (; __first != __last; ++__first)
Howard Hinnante4383372011-10-22 20:59:45999 if (*__first == __value_)
Howard Hinnant3e519522010-05-11 19:42:161000 break;
1001 return __first;
1002}
1003
1004// find_if
1005
1006template <class _InputIterator, class _Predicate>
Marshall Clow49c76432018-01-15 16:16:321007inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161008_InputIterator
1009find_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
1010{
1011 for (; __first != __last; ++__first)
1012 if (__pred(*__first))
1013 break;
1014 return __first;
1015}
1016
1017// find_if_not
1018
1019template<class _InputIterator, class _Predicate>
Marshall Clow86944282018-01-15 19:26:051020inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161021_InputIterator
1022find_if_not(_InputIterator __first, _InputIterator __last, _Predicate __pred)
1023{
1024 for (; __first != __last; ++__first)
1025 if (!__pred(*__first))
1026 break;
1027 return __first;
1028}
1029
1030// find_end
1031
1032template <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
Marshall Clow86944282018-01-15 19:26:051033_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator1
Howard Hinnant3e519522010-05-11 19:42:161034__find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1035 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred,
1036 forward_iterator_tag, forward_iterator_tag)
1037{
1038 // modeled after search algorithm
1039 _ForwardIterator1 __r = __last1; // __last1 is the "default" answer
1040 if (__first2 == __last2)
1041 return __r;
1042 while (true)
1043 {
1044 while (true)
1045 {
1046 if (__first1 == __last1) // if source exhausted return last correct answer
1047 return __r; // (or __last1 if never found)
1048 if (__pred(*__first1, *__first2))
1049 break;
1050 ++__first1;
1051 }
1052 // *__first1 matches *__first2, now match elements after here
1053 _ForwardIterator1 __m1 = __first1;
1054 _ForwardIterator2 __m2 = __first2;
1055 while (true)
1056 {
1057 if (++__m2 == __last2)
1058 { // Pattern exhaused, record answer and search for another one
1059 __r = __first1;
1060 ++__first1;
1061 break;
1062 }
1063 if (++__m1 == __last1) // Source exhausted, return last answer
1064 return __r;
1065 if (!__pred(*__m1, *__m2)) // mismatch, restart with a new __first
1066 {
1067 ++__first1;
1068 break;
1069 } // else there is a match, check next elements
1070 }
1071 }
1072}
1073
1074template <class _BinaryPredicate, class _BidirectionalIterator1, class _BidirectionalIterator2>
Marshall Clow86944282018-01-15 19:26:051075_LIBCPP_CONSTEXPR_AFTER_CXX17 _BidirectionalIterator1
Howard Hinnant3e519522010-05-11 19:42:161076__find_end(_BidirectionalIterator1 __first1, _BidirectionalIterator1 __last1,
1077 _BidirectionalIterator2 __first2, _BidirectionalIterator2 __last2, _BinaryPredicate __pred,
1078 bidirectional_iterator_tag, bidirectional_iterator_tag)
1079{
1080 // modeled after search algorithm (in reverse)
1081 if (__first2 == __last2)
1082 return __last1; // Everything matches an empty sequence
1083 _BidirectionalIterator1 __l1 = __last1;
1084 _BidirectionalIterator2 __l2 = __last2;
1085 --__l2;
1086 while (true)
1087 {
1088 // Find last element in sequence 1 that matchs *(__last2-1), with a mininum of loop checks
1089 while (true)
1090 {
1091 if (__first1 == __l1) // return __last1 if no element matches *__first2
1092 return __last1;
1093 if (__pred(*--__l1, *__l2))
1094 break;
1095 }
1096 // *__l1 matches *__l2, now match elements before here
1097 _BidirectionalIterator1 __m1 = __l1;
1098 _BidirectionalIterator2 __m2 = __l2;
1099 while (true)
1100 {
1101 if (__m2 == __first2) // If pattern exhausted, __m1 is the answer (works for 1 element pattern)
1102 return __m1;
1103 if (__m1 == __first1) // Otherwise if source exhaused, pattern not found
1104 return __last1;
1105 if (!__pred(*--__m1, *--__m2)) // if there is a mismatch, restart with a new __l1
1106 {
1107 break;
1108 } // else there is a match, check next elements
1109 }
1110 }
1111}
1112
1113template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
Marshall Clow9b0af342014-06-10 18:51:551114_LIBCPP_CONSTEXPR_AFTER_CXX11 _RandomAccessIterator1
Howard Hinnant3e519522010-05-11 19:42:161115__find_end(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
1116 _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
1117 random_access_iterator_tag, random_access_iterator_tag)
1118{
1119 // Take advantage of knowing source and pattern lengths. Stop short when source is smaller than pattern
1120 typename iterator_traits<_RandomAccessIterator2>::difference_type __len2 = __last2 - __first2;
1121 if (__len2 == 0)
1122 return __last1;
1123 typename iterator_traits<_RandomAccessIterator1>::difference_type __len1 = __last1 - __first1;
1124 if (__len1 < __len2)
1125 return __last1;
1126 const _RandomAccessIterator1 __s = __first1 + (__len2 - 1); // End of pattern match can't go before here
1127 _RandomAccessIterator1 __l1 = __last1;
1128 _RandomAccessIterator2 __l2 = __last2;
1129 --__l2;
1130 while (true)
1131 {
1132 while (true)
1133 {
1134 if (__s == __l1)
1135 return __last1;
1136 if (__pred(*--__l1, *__l2))
1137 break;
1138 }
1139 _RandomAccessIterator1 __m1 = __l1;
1140 _RandomAccessIterator2 __m2 = __l2;
1141 while (true)
1142 {
1143 if (__m2 == __first2)
1144 return __m1;
1145 // no need to check range on __m1 because __s guarantees we have enough source
1146 if (!__pred(*--__m1, *--__m2))
1147 {
1148 break;
1149 }
1150 }
1151 }
1152}
1153
1154template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Marshall Clow86944282018-01-15 19:26:051155inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161156_ForwardIterator1
1157find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1158 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1159{
Howard Hinnantce48a112011-06-30 21:18:191160 return _VSTD::__find_end<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnant3e519522010-05-11 19:42:161161 (__first1, __last1, __first2, __last2, __pred,
1162 typename iterator_traits<_ForwardIterator1>::iterator_category(),
1163 typename iterator_traits<_ForwardIterator2>::iterator_category());
1164}
1165
1166template <class _ForwardIterator1, class _ForwardIterator2>
Marshall Clow86944282018-01-15 19:26:051167inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161168_ForwardIterator1
1169find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1170 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1171{
1172 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1173 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnantce48a112011-06-30 21:18:191174 return _VSTD::find_end(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnant3e519522010-05-11 19:42:161175}
1176
1177// find_first_of
1178
1179template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Marshall Clow9b0af342014-06-10 18:51:551180_LIBCPP_CONSTEXPR_AFTER_CXX11 _ForwardIterator1
1181__find_first_of_ce(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
Howard Hinnant3e519522010-05-11 19:42:161182 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1183{
1184 for (; __first1 != __last1; ++__first1)
1185 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
1186 if (__pred(*__first1, *__j))
1187 return __first1;
1188 return __last1;
1189}
1190
Marshall Clow9b0af342014-06-10 18:51:551191
1192template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Marshall Clow86944282018-01-15 19:26:051193inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow9b0af342014-06-10 18:51:551194_ForwardIterator1
1195find_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1196 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1197{
1198 return _VSTD::__find_first_of_ce(__first1, __last1, __first2, __last2, __pred);
1199}
1200
Howard Hinnant3e519522010-05-11 19:42:161201template <class _ForwardIterator1, class _ForwardIterator2>
Marshall Clow86944282018-01-15 19:26:051202inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161203_ForwardIterator1
1204find_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1205 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1206{
1207 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1208 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Marshall Clow9b0af342014-06-10 18:51:551209 return _VSTD::__find_first_of_ce(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnant3e519522010-05-11 19:42:161210}
1211
1212// adjacent_find
1213
1214template <class _ForwardIterator, class _BinaryPredicate>
Marshall Clow86944282018-01-15 19:26:051215inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161216_ForwardIterator
1217adjacent_find(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred)
1218{
1219 if (__first != __last)
1220 {
1221 _ForwardIterator __i = __first;
1222 while (++__i != __last)
1223 {
1224 if (__pred(*__first, *__i))
1225 return __first;
1226 __first = __i;
1227 }
1228 }
1229 return __last;
1230}
1231
1232template <class _ForwardIterator>
Marshall Clow86944282018-01-15 19:26:051233inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161234_ForwardIterator
1235adjacent_find(_ForwardIterator __first, _ForwardIterator __last)
1236{
1237 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Howard Hinnantce48a112011-06-30 21:18:191238 return _VSTD::adjacent_find(__first, __last, __equal_to<__v>());
Howard Hinnant3e519522010-05-11 19:42:161239}
1240
1241// count
1242
1243template <class _InputIterator, class _Tp>
Marshall Clow056f15e2018-01-15 19:40:341244inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161245typename iterator_traits<_InputIterator>::difference_type
Howard Hinnante4383372011-10-22 20:59:451246count(_InputIterator __first, _InputIterator __last, const _Tp& __value_)
Howard Hinnant3e519522010-05-11 19:42:161247{
1248 typename iterator_traits<_InputIterator>::difference_type __r(0);
1249 for (; __first != __last; ++__first)
Howard Hinnante4383372011-10-22 20:59:451250 if (*__first == __value_)
Howard Hinnant3e519522010-05-11 19:42:161251 ++__r;
1252 return __r;
1253}
1254
1255// count_if
1256
1257template <class _InputIterator, class _Predicate>
Marshall Clow056f15e2018-01-15 19:40:341258inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161259typename iterator_traits<_InputIterator>::difference_type
1260count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
1261{
1262 typename iterator_traits<_InputIterator>::difference_type __r(0);
1263 for (; __first != __last; ++__first)
1264 if (__pred(*__first))
1265 ++__r;
1266 return __r;
1267}
1268
1269// mismatch
1270
1271template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
Marshall Clow6538e28d2018-01-16 02:04:101272inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161273pair<_InputIterator1, _InputIterator2>
1274mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1275 _InputIterator2 __first2, _BinaryPredicate __pred)
1276{
Marshall Clowbd7c7b52014-09-16 20:40:051277 for (; __first1 != __last1; ++__first1, (void) ++__first2)
Howard Hinnant3e519522010-05-11 19:42:161278 if (!__pred(*__first1, *__first2))
1279 break;
1280 return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
1281}
1282
1283template <class _InputIterator1, class _InputIterator2>
Marshall Clow6538e28d2018-01-16 02:04:101284inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161285pair<_InputIterator1, _InputIterator2>
1286mismatch(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2)
1287{
1288 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1289 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
Howard Hinnantce48a112011-06-30 21:18:191290 return _VSTD::mismatch(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnant3e519522010-05-11 19:42:161291}
1292
Marshall Clow0b0bbd22013-05-09 21:14:231293#if _LIBCPP_STD_VER > 11
1294template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
Marshall Clow6538e28d2018-01-16 02:04:101295inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow0b0bbd22013-05-09 21:14:231296pair<_InputIterator1, _InputIterator2>
1297mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1298 _InputIterator2 __first2, _InputIterator2 __last2,
1299 _BinaryPredicate __pred)
1300{
Marshall Clowbd7c7b52014-09-16 20:40:051301 for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void) ++__first2)
Marshall Clow0b0bbd22013-05-09 21:14:231302 if (!__pred(*__first1, *__first2))
1303 break;
1304 return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
1305}
1306
1307template <class _InputIterator1, class _InputIterator2>
Marshall Clow6538e28d2018-01-16 02:04:101308inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow0b0bbd22013-05-09 21:14:231309pair<_InputIterator1, _InputIterator2>
1310mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1311 _InputIterator2 __first2, _InputIterator2 __last2)
1312{
1313 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1314 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
1315 return _VSTD::mismatch(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
1316}
1317#endif
1318
Howard Hinnant3e519522010-05-11 19:42:161319// equal
1320
1321template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
Marshall Clow6538e28d2018-01-16 02:04:101322inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161323bool
1324equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _BinaryPredicate __pred)
1325{
Eric Fiselier910285b2014-10-27 19:28:201326 for (; __first1 != __last1; ++__first1, (void) ++__first2)
Howard Hinnant3e519522010-05-11 19:42:161327 if (!__pred(*__first1, *__first2))
1328 return false;
1329 return true;
1330}
1331
1332template <class _InputIterator1, class _InputIterator2>
Marshall Clow6538e28d2018-01-16 02:04:101333inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161334bool
1335equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2)
1336{
1337 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1338 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
Howard Hinnantce48a112011-06-30 21:18:191339 return _VSTD::equal(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnant3e519522010-05-11 19:42:161340}
1341
Marshall Clow0b0bbd22013-05-09 21:14:231342#if _LIBCPP_STD_VER > 11
1343template <class _BinaryPredicate, class _InputIterator1, class _InputIterator2>
Marshall Clow6538e28d2018-01-16 02:04:101344inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow0b0bbd22013-05-09 21:14:231345bool
Aditya Kumar331fb802016-08-25 11:52:381346__equal(_InputIterator1 __first1, _InputIterator1 __last1,
Marshall Clow0b0bbd22013-05-09 21:14:231347 _InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred,
1348 input_iterator_tag, input_iterator_tag )
1349{
Eric Fiselier910285b2014-10-27 19:28:201350 for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void) ++__first2)
Marshall Clow0b0bbd22013-05-09 21:14:231351 if (!__pred(*__first1, *__first2))
1352 return false;
1353 return __first1 == __last1 && __first2 == __last2;
1354}
1355
1356template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
Marshall Clow6538e28d2018-01-16 02:04:101357inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow0b0bbd22013-05-09 21:14:231358bool
Aditya Kumar331fb802016-08-25 11:52:381359__equal(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
1360 _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
Marshall Clow0b0bbd22013-05-09 21:14:231361 random_access_iterator_tag, random_access_iterator_tag )
1362{
1363 if ( _VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2))
1364 return false;
1365 return _VSTD::equal<_RandomAccessIterator1, _RandomAccessIterator2,
1366 typename add_lvalue_reference<_BinaryPredicate>::type>
1367 (__first1, __last1, __first2, __pred );
1368}
1369
1370template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
Marshall Clow6538e28d2018-01-16 02:04:101371inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow0b0bbd22013-05-09 21:14:231372bool
Aditya Kumar331fb802016-08-25 11:52:381373equal(_InputIterator1 __first1, _InputIterator1 __last1,
Marshall Clow0b0bbd22013-05-09 21:14:231374 _InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred )
1375{
1376 return _VSTD::__equal<typename add_lvalue_reference<_BinaryPredicate>::type>
Aditya Kumar331fb802016-08-25 11:52:381377 (__first1, __last1, __first2, __last2, __pred,
Marshall Clow0b0bbd22013-05-09 21:14:231378 typename iterator_traits<_InputIterator1>::iterator_category(),
1379 typename iterator_traits<_InputIterator2>::iterator_category());
1380}
1381
1382template <class _InputIterator1, class _InputIterator2>
Marshall Clow6538e28d2018-01-16 02:04:101383inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow0b0bbd22013-05-09 21:14:231384bool
Aditya Kumar331fb802016-08-25 11:52:381385equal(_InputIterator1 __first1, _InputIterator1 __last1,
Marshall Clow0b0bbd22013-05-09 21:14:231386 _InputIterator2 __first2, _InputIterator2 __last2)
1387{
1388 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1389 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
1390 return _VSTD::__equal(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>(),
1391 typename iterator_traits<_InputIterator1>::iterator_category(),
1392 typename iterator_traits<_InputIterator2>::iterator_category());
1393}
1394#endif
1395
Howard Hinnant3e519522010-05-11 19:42:161396// is_permutation
1397
1398template<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Marshall Clow49c76432018-01-15 16:16:321399_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Howard Hinnant3e519522010-05-11 19:42:161400is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1401 _ForwardIterator2 __first2, _BinaryPredicate __pred)
1402{
Marshall Clow49c76432018-01-15 16:16:321403// shorten sequences as much as possible by lopping of any equal prefix
Eric Fiselier910285b2014-10-27 19:28:201404 for (; __first1 != __last1; ++__first1, (void) ++__first2)
Howard Hinnant3e519522010-05-11 19:42:161405 if (!__pred(*__first1, *__first2))
Marshall Clow49c76432018-01-15 16:16:321406 break;
1407 if (__first1 == __last1)
1408 return true;
1409
1410// __first1 != __last1 && *__first1 != *__first2
Howard Hinnant3e519522010-05-11 19:42:161411 typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1;
Howard Hinnantce48a112011-06-30 21:18:191412 _D1 __l1 = _VSTD::distance(__first1, __last1);
Howard Hinnant3e519522010-05-11 19:42:161413 if (__l1 == _D1(1))
1414 return false;
Howard Hinnantce48a112011-06-30 21:18:191415 _ForwardIterator2 __last2 = _VSTD::next(__first2, __l1);
Howard Hinnant3e519522010-05-11 19:42:161416 // For each element in [f1, l1) see if there are the same number of
1417 // equal elements in [f2, l2)
1418 for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i)
1419 {
Marshall Clow49c76432018-01-15 16:16:321420 // Have we already counted the number of *__i in [f1, l1)?
1421 if (find(__first1, __i, *__i) == __i) {
Howard Hinnant3e519522010-05-11 19:42:161422 // Count number of *__i in [f2, l2)
1423 _D1 __c2 = 0;
1424 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
1425 if (__pred(*__i, *__j))
1426 ++__c2;
1427 if (__c2 == 0)
1428 return false;
1429 // Count number of *__i in [__i, l1) (we can start with 1)
1430 _D1 __c1 = 1;
Howard Hinnantce48a112011-06-30 21:18:191431 for (_ForwardIterator1 __j = _VSTD::next(__i); __j != __last1; ++__j)
Howard Hinnant3e519522010-05-11 19:42:161432 if (__pred(*__i, *__j))
1433 ++__c1;
1434 if (__c1 != __c2)
1435 return false;
1436 }
Howard Hinnant3e519522010-05-11 19:42:161437 }
1438 return true;
1439}
1440
1441template<class _ForwardIterator1, class _ForwardIterator2>
Marshall Clow49c76432018-01-15 16:16:321442inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161443bool
1444is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1445 _ForwardIterator2 __first2)
1446{
1447 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1448 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnantce48a112011-06-30 21:18:191449 return _VSTD::is_permutation(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnant3e519522010-05-11 19:42:161450}
1451
Marshall Clow0b0bbd22013-05-09 21:14:231452#if _LIBCPP_STD_VER > 11
1453template<class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
Marshall Clow49c76432018-01-15 16:16:321454_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Marshall Clow0b0bbd22013-05-09 21:14:231455__is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
Aditya Kumar331fb802016-08-25 11:52:381456 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
Marshall Clow0b0bbd22013-05-09 21:14:231457 _BinaryPredicate __pred,
1458 forward_iterator_tag, forward_iterator_tag )
1459{
Marshall Clow49c76432018-01-15 16:16:321460// shorten sequences as much as possible by lopping of any equal prefix
Eric Fiselier847ee132014-10-27 20:26:251461 for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void) ++__first2)
Marshall Clow0b0bbd22013-05-09 21:14:231462 if (!__pred(*__first1, *__first2))
Marshall Clow49c76432018-01-15 16:16:321463 break;
1464 if (__first1 == __last1)
Marshall Clow12c74232018-01-19 18:07:291465 return __first2 == __last2;
Marshall Clow49c76432018-01-15 16:16:321466 else if (__first2 == __last2)
Marshall Clow12c74232018-01-19 18:07:291467 return false;
Marshall Clow49c76432018-01-15 16:16:321468
Marshall Clow0b0bbd22013-05-09 21:14:231469 typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1;
1470 _D1 __l1 = _VSTD::distance(__first1, __last1);
1471
1472 typedef typename iterator_traits<_ForwardIterator2>::difference_type _D2;
Marshall Clowfce85ba2013-05-10 00:16:101473 _D2 __l2 = _VSTD::distance(__first2, __last2);
Marshall Clow0b0bbd22013-05-09 21:14:231474 if (__l1 != __l2)
1475 return false;
1476
1477 // For each element in [f1, l1) see if there are the same number of
1478 // equal elements in [f2, l2)
1479 for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i)
1480 {
Marshall Clow49c76432018-01-15 16:16:321481 // Have we already counted the number of *__i in [f1, l1)?
1482 if (find(__first1, __i, *__i) == __i) {
Marshall Clow0b0bbd22013-05-09 21:14:231483 // Count number of *__i in [f2, l2)
1484 _D1 __c2 = 0;
1485 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
1486 if (__pred(*__i, *__j))
1487 ++__c2;
1488 if (__c2 == 0)
1489 return false;
1490 // Count number of *__i in [__i, l1) (we can start with 1)
1491 _D1 __c1 = 1;
1492 for (_ForwardIterator1 __j = _VSTD::next(__i); __j != __last1; ++__j)
1493 if (__pred(*__i, *__j))
1494 ++__c1;
1495 if (__c1 != __c2)
1496 return false;
1497 }
Marshall Clow0b0bbd22013-05-09 21:14:231498 }
1499 return true;
1500}
1501
1502template<class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
Marshall Clow49c76432018-01-15 16:16:321503_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Marshall Clow0b0bbd22013-05-09 21:14:231504__is_permutation(_RandomAccessIterator1 __first1, _RandomAccessIterator2 __last1,
Aditya Kumar331fb802016-08-25 11:52:381505 _RandomAccessIterator1 __first2, _RandomAccessIterator2 __last2,
Marshall Clow0b0bbd22013-05-09 21:14:231506 _BinaryPredicate __pred,
1507 random_access_iterator_tag, random_access_iterator_tag )
1508{
1509 if ( _VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2))
1510 return false;
1511 return _VSTD::is_permutation<_RandomAccessIterator1, _RandomAccessIterator2,
1512 typename add_lvalue_reference<_BinaryPredicate>::type>
1513 (__first1, __last1, __first2, __pred );
1514}
1515
1516template<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Marshall Clow49c76432018-01-15 16:16:321517inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow0b0bbd22013-05-09 21:14:231518bool
1519is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1520 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
1521 _BinaryPredicate __pred )
1522{
1523 return _VSTD::__is_permutation<typename add_lvalue_reference<_BinaryPredicate>::type>
1524 (__first1, __last1, __first2, __last2, __pred,
1525 typename iterator_traits<_ForwardIterator1>::iterator_category(),
1526 typename iterator_traits<_ForwardIterator2>::iterator_category());
1527}
1528
1529template<class _ForwardIterator1, class _ForwardIterator2>
Marshall Clow49c76432018-01-15 16:16:321530inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow0b0bbd22013-05-09 21:14:231531bool
1532is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1533 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1534{
1535 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1536 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
1537 return _VSTD::__is_permutation(__first1, __last1, __first2, __last2,
1538 __equal_to<__v1, __v2>(),
1539 typename iterator_traits<_ForwardIterator1>::iterator_category(),
1540 typename iterator_traits<_ForwardIterator2>::iterator_category());
1541}
1542#endif
1543
Howard Hinnant3e519522010-05-11 19:42:161544// search
Marshall Clowd835e592018-01-08 19:18:001545// __search is in <functional>
Howard Hinnant3e519522010-05-11 19:42:161546
1547template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Marshall Clow12f0a772018-01-16 15:48:271548inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161549_ForwardIterator1
1550search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1551 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1552{
Howard Hinnantce48a112011-06-30 21:18:191553 return _VSTD::__search<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnant3e519522010-05-11 19:42:161554 (__first1, __last1, __first2, __last2, __pred,
Marshall Clow28cc4dd2016-03-08 15:12:521555 typename iterator_traits<_ForwardIterator1>::iterator_category(),
1556 typename iterator_traits<_ForwardIterator2>::iterator_category())
1557 .first;
Howard Hinnant3e519522010-05-11 19:42:161558}
1559
1560template <class _ForwardIterator1, class _ForwardIterator2>
Marshall Clow12f0a772018-01-16 15:48:271561inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161562_ForwardIterator1
1563search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1564 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1565{
Marshall Clow28cc4dd2016-03-08 15:12:521566 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1567 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnantce48a112011-06-30 21:18:191568 return _VSTD::search(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnant3e519522010-05-11 19:42:161569}
1570
Marshall Clowd835e592018-01-08 19:18:001571
1572#if _LIBCPP_STD_VER > 14
1573template <class _ForwardIterator, class _Searcher>
Marshall Clow12f0a772018-01-16 15:48:271574_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clowd835e592018-01-08 19:18:001575_ForwardIterator search(_ForwardIterator __f, _ForwardIterator __l, const _Searcher &__s)
1576{ return __s(__f, __l).first; }
1577#endif
1578
Howard Hinnant3e519522010-05-11 19:42:161579// search_n
1580
1581template <class _BinaryPredicate, class _ForwardIterator, class _Size, class _Tp>
Marshall Clow12f0a772018-01-16 15:48:271582_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnant3e519522010-05-11 19:42:161583__search_n(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnante4383372011-10-22 20:59:451584 _Size __count, const _Tp& __value_, _BinaryPredicate __pred, forward_iterator_tag)
Howard Hinnant3e519522010-05-11 19:42:161585{
1586 if (__count <= 0)
1587 return __first;
1588 while (true)
1589 {
Howard Hinnante4383372011-10-22 20:59:451590 // Find first element in sequence that matchs __value_, with a mininum of loop checks
Howard Hinnant3e519522010-05-11 19:42:161591 while (true)
1592 {
Howard Hinnante4383372011-10-22 20:59:451593 if (__first == __last) // return __last if no element matches __value_
Howard Hinnant3e519522010-05-11 19:42:161594 return __last;
Howard Hinnante4383372011-10-22 20:59:451595 if (__pred(*__first, __value_))
Howard Hinnant3e519522010-05-11 19:42:161596 break;
1597 ++__first;
1598 }
Howard Hinnante4383372011-10-22 20:59:451599 // *__first matches __value_, now match elements after here
Howard Hinnant3e519522010-05-11 19:42:161600 _ForwardIterator __m = __first;
1601 _Size __c(0);
1602 while (true)
1603 {
1604 if (++__c == __count) // If pattern exhausted, __first is the answer (works for 1 element pattern)
1605 return __first;
1606 if (++__m == __last) // Otherwise if source exhaused, pattern not found
1607 return __last;
Howard Hinnante4383372011-10-22 20:59:451608 if (!__pred(*__m, __value_)) // if there is a mismatch, restart with a new __first
Howard Hinnant3e519522010-05-11 19:42:161609 {
1610 __first = __m;
1611 ++__first;
1612 break;
1613 } // else there is a match, check next elements
1614 }
1615 }
1616}
1617
1618template <class _BinaryPredicate, class _RandomAccessIterator, class _Size, class _Tp>
Marshall Clow12f0a772018-01-16 15:48:271619_LIBCPP_CONSTEXPR_AFTER_CXX17 _RandomAccessIterator
Howard Hinnant3e519522010-05-11 19:42:161620__search_n(_RandomAccessIterator __first, _RandomAccessIterator __last,
Howard Hinnante4383372011-10-22 20:59:451621 _Size __count, const _Tp& __value_, _BinaryPredicate __pred, random_access_iterator_tag)
Howard Hinnant3e519522010-05-11 19:42:161622{
1623 if (__count <= 0)
1624 return __first;
1625 _Size __len = static_cast<_Size>(__last - __first);
1626 if (__len < __count)
1627 return __last;
1628 const _RandomAccessIterator __s = __last - (__count - 1); // Start of pattern match can't go beyond here
1629 while (true)
1630 {
Howard Hinnante4383372011-10-22 20:59:451631 // Find first element in sequence that matchs __value_, with a mininum of loop checks
Howard Hinnant3e519522010-05-11 19:42:161632 while (true)
1633 {
Howard Hinnantb13fcad2013-04-04 15:40:481634 if (__first >= __s) // return __last if no element matches __value_
Howard Hinnant3e519522010-05-11 19:42:161635 return __last;
Howard Hinnante4383372011-10-22 20:59:451636 if (__pred(*__first, __value_))
Howard Hinnant3e519522010-05-11 19:42:161637 break;
1638 ++__first;
1639 }
Howard Hinnante4383372011-10-22 20:59:451640 // *__first matches __value_, now match elements after here
Howard Hinnant3e519522010-05-11 19:42:161641 _RandomAccessIterator __m = __first;
1642 _Size __c(0);
1643 while (true)
1644 {
1645 if (++__c == __count) // If pattern exhausted, __first is the answer (works for 1 element pattern)
1646 return __first;
1647 ++__m; // no need to check range on __m because __s guarantees we have enough source
Howard Hinnante4383372011-10-22 20:59:451648 if (!__pred(*__m, __value_)) // if there is a mismatch, restart with a new __first
Howard Hinnant3e519522010-05-11 19:42:161649 {
1650 __first = __m;
1651 ++__first;
1652 break;
1653 } // else there is a match, check next elements
1654 }
1655 }
1656}
1657
1658template <class _ForwardIterator, class _Size, class _Tp, class _BinaryPredicate>
Marshall Clow12f0a772018-01-16 15:48:271659inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161660_ForwardIterator
1661search_n(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnante4383372011-10-22 20:59:451662 _Size __count, const _Tp& __value_, _BinaryPredicate __pred)
Howard Hinnant3e519522010-05-11 19:42:161663{
Howard Hinnantce48a112011-06-30 21:18:191664 return _VSTD::__search_n<typename add_lvalue_reference<_BinaryPredicate>::type>
Eric Fiselier51544022015-02-10 16:46:421665 (__first, __last, __convert_to_integral(__count), __value_, __pred,
1666 typename iterator_traits<_ForwardIterator>::iterator_category());
Howard Hinnant3e519522010-05-11 19:42:161667}
1668
1669template <class _ForwardIterator, class _Size, class _Tp>
Marshall Clow12f0a772018-01-16 15:48:271670inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161671_ForwardIterator
Howard Hinnante4383372011-10-22 20:59:451672search_n(_ForwardIterator __first, _ForwardIterator __last, _Size __count, const _Tp& __value_)
Howard Hinnant3e519522010-05-11 19:42:161673{
1674 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Eric Fiselier51544022015-02-10 16:46:421675 return _VSTD::search_n(__first, __last, __convert_to_integral(__count),
1676 __value_, __equal_to<__v, _Tp>());
Howard Hinnant3e519522010-05-11 19:42:161677}
1678
1679// copy
Howard Hinnant3e519522010-05-11 19:42:161680template <class _Iter>
1681inline _LIBCPP_INLINE_VISIBILITY
1682_Iter
1683__unwrap_iter(_Iter __i)
1684{
1685 return __i;
1686}
1687
1688template <class _Tp>
Marshall Clow5b7c98e2017-05-25 14:20:261689inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161690typename enable_if
1691<
Howard Hinnantca740482010-11-19 22:17:281692 is_trivially_copy_assignable<_Tp>::value,
Howard Hinnant3e519522010-05-11 19:42:161693 _Tp*
1694>::type
1695__unwrap_iter(move_iterator<_Tp*> __i)
1696{
1697 return __i.base();
1698}
1699
Howard Hinnantfc88dbd2013-08-23 17:37:051700#if _LIBCPP_DEBUG_LEVEL < 2
1701
Howard Hinnant3e519522010-05-11 19:42:161702template <class _Tp>
Marshall Clow5b7c98e2017-05-25 14:20:261703inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161704typename enable_if
1705<
Howard Hinnantca740482010-11-19 22:17:281706 is_trivially_copy_assignable<_Tp>::value,
Howard Hinnant3e519522010-05-11 19:42:161707 _Tp*
1708>::type
1709__unwrap_iter(__wrap_iter<_Tp*> __i)
1710{
1711 return __i.base();
1712}
1713
Eric Fiselier14bd0bf2016-12-28 05:35:321714#else
1715
1716template <class _Tp>
Marshall Clow5b7c98e2017-05-25 14:20:261717inline _LIBCPP_INLINE_VISIBILITY
Eric Fiselier14bd0bf2016-12-28 05:35:321718typename enable_if
1719<
1720 is_trivially_copy_assignable<_Tp>::value,
1721 __wrap_iter<_Tp*>
1722>::type
1723__unwrap_iter(__wrap_iter<_Tp*> __i)
1724{
1725 return __i;
1726}
1727
Howard Hinnantfc88dbd2013-08-23 17:37:051728#endif // _LIBCPP_DEBUG_LEVEL < 2
1729
Howard Hinnant3e519522010-05-11 19:42:161730template <class _InputIterator, class _OutputIterator>
1731inline _LIBCPP_INLINE_VISIBILITY
1732_OutputIterator
1733__copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1734{
Eric Fiselier910285b2014-10-27 19:28:201735 for (; __first != __last; ++__first, (void) ++__result)
Howard Hinnant3e519522010-05-11 19:42:161736 *__result = *__first;
1737 return __result;
1738}
1739
1740template <class _Tp, class _Up>
1741inline _LIBCPP_INLINE_VISIBILITY
1742typename enable_if
1743<
1744 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnantca740482010-11-19 22:17:281745 is_trivially_copy_assignable<_Up>::value,
Howard Hinnant3e519522010-05-11 19:42:161746 _Up*
1747>::type
1748__copy(_Tp* __first, _Tp* __last, _Up* __result)
1749{
1750 const size_t __n = static_cast<size_t>(__last - __first);
Marshall Clow5b312052015-06-02 13:52:161751 if (__n > 0)
1752 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
Howard Hinnant3e519522010-05-11 19:42:161753 return __result + __n;
1754}
1755
1756template <class _InputIterator, class _OutputIterator>
1757inline _LIBCPP_INLINE_VISIBILITY
1758_OutputIterator
1759copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1760{
Howard Hinnantce48a112011-06-30 21:18:191761 return _VSTD::__copy(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnant3e519522010-05-11 19:42:161762}
1763
1764// copy_backward
1765
Howard Hinnantd3d43562013-02-06 21:03:391766template <class _BidirectionalIterator, class _OutputIterator>
Howard Hinnant3e519522010-05-11 19:42:161767inline _LIBCPP_INLINE_VISIBILITY
1768_OutputIterator
Howard Hinnantd3d43562013-02-06 21:03:391769__copy_backward(_BidirectionalIterator __first, _BidirectionalIterator __last, _OutputIterator __result)
Howard Hinnant3e519522010-05-11 19:42:161770{
1771 while (__first != __last)
1772 *--__result = *--__last;
1773 return __result;
1774}
1775
1776template <class _Tp, class _Up>
1777inline _LIBCPP_INLINE_VISIBILITY
1778typename enable_if
1779<
1780 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnantca740482010-11-19 22:17:281781 is_trivially_copy_assignable<_Up>::value,
Howard Hinnant3e519522010-05-11 19:42:161782 _Up*
1783>::type
1784__copy_backward(_Tp* __first, _Tp* __last, _Up* __result)
1785{
1786 const size_t __n = static_cast<size_t>(__last - __first);
Marshall Clow5b312052015-06-02 13:52:161787 if (__n > 0)
1788 {
1789 __result -= __n;
1790 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
1791 }
Howard Hinnant3e519522010-05-11 19:42:161792 return __result;
1793}
1794
1795template <class _BidirectionalIterator1, class _BidirectionalIterator2>
1796inline _LIBCPP_INLINE_VISIBILITY
1797_BidirectionalIterator2
1798copy_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
1799 _BidirectionalIterator2 __result)
1800{
Eric Fiselierfd838222016-12-23 23:37:521801 return _VSTD::__copy_backward(__unwrap_iter(__first),
1802 __unwrap_iter(__last),
1803 __unwrap_iter(__result));
Howard Hinnant3e519522010-05-11 19:42:161804}
1805
1806// copy_if
1807
1808template<class _InputIterator, class _OutputIterator, class _Predicate>
1809inline _LIBCPP_INLINE_VISIBILITY
1810_OutputIterator
1811copy_if(_InputIterator __first, _InputIterator __last,
1812 _OutputIterator __result, _Predicate __pred)
1813{
1814 for (; __first != __last; ++__first)
1815 {
1816 if (__pred(*__first))
1817 {
1818 *__result = *__first;
1819 ++__result;
1820 }
1821 }
1822 return __result;
1823}
1824
1825// copy_n
1826
1827template<class _InputIterator, class _Size, class _OutputIterator>
1828inline _LIBCPP_INLINE_VISIBILITY
1829typename enable_if
1830<
1831 __is_input_iterator<_InputIterator>::value &&
1832 !__is_random_access_iterator<_InputIterator>::value,
1833 _OutputIterator
1834>::type
Eric Fiselier51544022015-02-10 16:46:421835copy_n(_InputIterator __first, _Size __orig_n, _OutputIterator __result)
Howard Hinnant3e519522010-05-11 19:42:161836{
Eric Fiselier51544022015-02-10 16:46:421837 typedef decltype(__convert_to_integral(__orig_n)) _IntegralSize;
1838 _IntegralSize __n = __orig_n;
Howard Hinnant99847d22011-02-27 20:55:391839 if (__n > 0)
1840 {
Howard Hinnant3e519522010-05-11 19:42:161841 *__result = *__first;
Howard Hinnant99847d22011-02-27 20:55:391842 ++__result;
1843 for (--__n; __n > 0; --__n)
1844 {
1845 ++__first;
1846 *__result = *__first;
1847 ++__result;
1848 }
1849 }
Howard Hinnant3e519522010-05-11 19:42:161850 return __result;
1851}
1852
1853template<class _InputIterator, class _Size, class _OutputIterator>
1854inline _LIBCPP_INLINE_VISIBILITY
1855typename enable_if
1856<
1857 __is_random_access_iterator<_InputIterator>::value,
1858 _OutputIterator
1859>::type
Eric Fiselier51544022015-02-10 16:46:421860copy_n(_InputIterator __first, _Size __orig_n, _OutputIterator __result)
Howard Hinnant3e519522010-05-11 19:42:161861{
Eric Fiselier51544022015-02-10 16:46:421862 typedef decltype(__convert_to_integral(__orig_n)) _IntegralSize;
1863 _IntegralSize __n = __orig_n;
Howard Hinnantce48a112011-06-30 21:18:191864 return _VSTD::copy(__first, __first + __n, __result);
Howard Hinnant3e519522010-05-11 19:42:161865}
1866
1867// move
1868
1869template <class _InputIterator, class _OutputIterator>
1870inline _LIBCPP_INLINE_VISIBILITY
1871_OutputIterator
1872__move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1873{
Eric Fiselier910285b2014-10-27 19:28:201874 for (; __first != __last; ++__first, (void) ++__result)
Howard Hinnantce48a112011-06-30 21:18:191875 *__result = _VSTD::move(*__first);
Howard Hinnant3e519522010-05-11 19:42:161876 return __result;
1877}
1878
1879template <class _Tp, class _Up>
1880inline _LIBCPP_INLINE_VISIBILITY
1881typename enable_if
1882<
1883 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnantca740482010-11-19 22:17:281884 is_trivially_copy_assignable<_Up>::value,
Howard Hinnant3e519522010-05-11 19:42:161885 _Up*
1886>::type
1887__move(_Tp* __first, _Tp* __last, _Up* __result)
1888{
1889 const size_t __n = static_cast<size_t>(__last - __first);
Marshall Clow5b312052015-06-02 13:52:161890 if (__n > 0)
1891 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
Howard Hinnant3e519522010-05-11 19:42:161892 return __result + __n;
1893}
1894
1895template <class _InputIterator, class _OutputIterator>
1896inline _LIBCPP_INLINE_VISIBILITY
1897_OutputIterator
1898move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1899{
Howard Hinnantce48a112011-06-30 21:18:191900 return _VSTD::__move(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnant3e519522010-05-11 19:42:161901}
1902
1903// move_backward
1904
1905template <class _InputIterator, class _OutputIterator>
1906inline _LIBCPP_INLINE_VISIBILITY
1907_OutputIterator
1908__move_backward(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1909{
1910 while (__first != __last)
Howard Hinnantce48a112011-06-30 21:18:191911 *--__result = _VSTD::move(*--__last);
Howard Hinnant3e519522010-05-11 19:42:161912 return __result;
1913}
1914
1915template <class _Tp, class _Up>
1916inline _LIBCPP_INLINE_VISIBILITY
1917typename enable_if
1918<
1919 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnantca740482010-11-19 22:17:281920 is_trivially_copy_assignable<_Up>::value,
Howard Hinnant3e519522010-05-11 19:42:161921 _Up*
1922>::type
1923__move_backward(_Tp* __first, _Tp* __last, _Up* __result)
1924{
1925 const size_t __n = static_cast<size_t>(__last - __first);
Marshall Clow5b312052015-06-02 13:52:161926 if (__n > 0)
1927 {
1928 __result -= __n;
1929 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
1930 }
Howard Hinnant3e519522010-05-11 19:42:161931 return __result;
1932}
1933
1934template <class _BidirectionalIterator1, class _BidirectionalIterator2>
1935inline _LIBCPP_INLINE_VISIBILITY
1936_BidirectionalIterator2
1937move_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
1938 _BidirectionalIterator2 __result)
1939{
Howard Hinnantce48a112011-06-30 21:18:191940 return _VSTD::__move_backward(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnant3e519522010-05-11 19:42:161941}
1942
1943// iter_swap
1944
Howard Hinnanta676f7d2011-05-27 15:04:191945// moved to <type_traits> for better swap / noexcept support
Howard Hinnant3e519522010-05-11 19:42:161946
1947// transform
1948
1949template <class _InputIterator, class _OutputIterator, class _UnaryOperation>
Marshall Clow99894b62018-01-19 17:45:391950inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161951_OutputIterator
1952transform(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _UnaryOperation __op)
1953{
Eric Fiselier910285b2014-10-27 19:28:201954 for (; __first != __last; ++__first, (void) ++__result)
Howard Hinnant3e519522010-05-11 19:42:161955 *__result = __op(*__first);
1956 return __result;
1957}
1958
1959template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _BinaryOperation>
Marshall Clow99894b62018-01-19 17:45:391960inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161961_OutputIterator
1962transform(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2,
1963 _OutputIterator __result, _BinaryOperation __binary_op)
1964{
Eric Fiselier910285b2014-10-27 19:28:201965 for (; __first1 != __last1; ++__first1, (void) ++__first2, ++__result)
Howard Hinnant3e519522010-05-11 19:42:161966 *__result = __binary_op(*__first1, *__first2);
1967 return __result;
1968}
1969
1970// replace
1971
1972template <class _ForwardIterator, class _Tp>
Marshall Clow12c74232018-01-19 18:07:291973inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161974void
1975replace(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __old_value, const _Tp& __new_value)
1976{
1977 for (; __first != __last; ++__first)
1978 if (*__first == __old_value)
1979 *__first = __new_value;
1980}
1981
1982// replace_if
1983
1984template <class _ForwardIterator, class _Predicate, class _Tp>
Marshall Clow12c74232018-01-19 18:07:291985inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161986void
1987replace_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, const _Tp& __new_value)
1988{
1989 for (; __first != __last; ++__first)
1990 if (__pred(*__first))
1991 *__first = __new_value;
1992}
1993
1994// replace_copy
1995
1996template <class _InputIterator, class _OutputIterator, class _Tp>
Marshall Clow12c74232018-01-19 18:07:291997inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161998_OutputIterator
1999replace_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
2000 const _Tp& __old_value, const _Tp& __new_value)
2001{
Eric Fiselier910285b2014-10-27 19:28:202002 for (; __first != __last; ++__first, (void) ++__result)
Howard Hinnant3e519522010-05-11 19:42:162003 if (*__first == __old_value)
2004 *__result = __new_value;
2005 else
2006 *__result = *__first;
2007 return __result;
2008}
2009
2010// replace_copy_if
2011
2012template <class _InputIterator, class _OutputIterator, class _Predicate, class _Tp>
Marshall Clow12c74232018-01-19 18:07:292013inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:162014_OutputIterator
2015replace_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
2016 _Predicate __pred, const _Tp& __new_value)
2017{
Eric Fiselier910285b2014-10-27 19:28:202018 for (; __first != __last; ++__first, (void) ++__result)
Howard Hinnant3e519522010-05-11 19:42:162019 if (__pred(*__first))
2020 *__result = __new_value;
2021 else
2022 *__result = *__first;
2023 return __result;
2024}
2025
2026// fill_n
2027
2028template <class _OutputIterator, class _Size, class _Tp>
Marshall Clow4bfb9312018-01-20 20:14:322029inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:162030_OutputIterator
Howard Hinnant0f242be2013-08-01 17:29:282031__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_)
Howard Hinnant3e519522010-05-11 19:42:162032{
Eric Fiselier910285b2014-10-27 19:28:202033 for (; __n > 0; ++__first, (void) --__n)
Howard Hinnante4383372011-10-22 20:59:452034 *__first = __value_;
Howard Hinnant3e519522010-05-11 19:42:162035 return __first;
2036}
2037
Howard Hinnant3e519522010-05-11 19:42:162038template <class _OutputIterator, class _Size, class _Tp>
Marshall Clow4bfb9312018-01-20 20:14:322039inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:162040_OutputIterator
Howard Hinnante4383372011-10-22 20:59:452041fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_)
Howard Hinnant3e519522010-05-11 19:42:162042{
Eric Fiselier51544022015-02-10 16:46:422043 return _VSTD::__fill_n(__first, __convert_to_integral(__n), __value_);
Howard Hinnant3e519522010-05-11 19:42:162044}
2045
2046// fill
2047
2048template <class _ForwardIterator, class _Tp>
Marshall Clow4bfb9312018-01-20 20:14:322049inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:162050void
Howard Hinnante4383372011-10-22 20:59:452051__fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, forward_iterator_tag)
Howard Hinnant3e519522010-05-11 19:42:162052{
2053 for (; __first != __last; ++__first)
Howard Hinnante4383372011-10-22 20:59:452054 *__first = __value_;
Howard Hinnant3e519522010-05-11 19:42:162055}
2056
2057template <class _RandomAccessIterator, class _Tp>
Marshall Clow4bfb9312018-01-20 20:14:322058inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:162059void
Howard Hinnante4383372011-10-22 20:59:452060__fill(_RandomAccessIterator __first, _RandomAccessIterator __last, const _Tp& __value_, random_access_iterator_tag)
Howard Hinnant3e519522010-05-11 19:42:162061{
Howard Hinnante4383372011-10-22 20:59:452062 _VSTD::fill_n(__first, __last - __first, __value_);
Howard Hinnant3e519522010-05-11 19:42:162063}
2064
2065template <class _ForwardIterator, class _Tp>
Marshall Clow4bfb9312018-01-20 20:14:322066inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:162067void
Howard Hinnante4383372011-10-22 20:59:452068fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnant3e519522010-05-11 19:42:162069{
Howard Hinnante4383372011-10-22 20:59:452070 _VSTD::__fill(__first, __last, __value_, typename iterator_traits<_ForwardIterator>::iterator_category());
Howard Hinnant3e519522010-05-11 19:42:162071}
2072
2073// generate
2074
2075template <class _ForwardIterator, class _Generator>
Marshall Clow4bfb9312018-01-20 20:14:322076inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:162077void
2078generate(_ForwardIterator __first, _ForwardIterator __last, _Generator __gen)
2079{
2080 for (; __first != __last; ++__first)
2081 *__first = __gen();
2082}
2083
2084// generate_n
2085
2086template <class _OutputIterator, class _Size, class _Generator>
Marshall Clow4bfb9312018-01-20 20:14:322087inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:162088_OutputIterator
Eric Fiselier51544022015-02-10 16:46:422089generate_n(_OutputIterator __first, _Size __orig_n, _Generator __gen)
Howard Hinnant3e519522010-05-11 19:42:162090{
Eric Fiselier51544022015-02-10 16:46:422091 typedef decltype(__convert_to_integral(__orig_n)) _IntegralSize;
2092 _IntegralSize __n = __orig_n;
Eric Fiselier910285b2014-10-27 19:28:202093 for (; __n > 0; ++__first, (void) --__n)
Howard Hinnant3e519522010-05-11 19:42:162094 *__first = __gen();
2095 return __first;
2096}
2097
2098// remove
2099
2100template <class _ForwardIterator, class _Tp>
2101_ForwardIterator
Howard Hinnante4383372011-10-22 20:59:452102remove(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnant3e519522010-05-11 19:42:162103{
Howard Hinnante4383372011-10-22 20:59:452104 __first = _VSTD::find(__first, __last, __value_);
Howard Hinnant3e519522010-05-11 19:42:162105 if (__first != __last)
2106 {
2107 _ForwardIterator __i = __first;
2108 while (++__i != __last)
2109 {
Howard Hinnante4383372011-10-22 20:59:452110 if (!(*__i == __value_))
Howard Hinnant3e519522010-05-11 19:42:162111 {
Howard Hinnantce48a112011-06-30 21:18:192112 *__first = _VSTD::move(*__i);
Howard Hinnant3e519522010-05-11 19:42:162113 ++__first;
2114 }
2115 }
2116 }
2117 return __first;
2118}
2119
2120// remove_if
2121
2122template <class _ForwardIterator, class _Predicate>
2123_ForwardIterator
2124remove_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
2125{
Howard Hinnantce48a112011-06-30 21:18:192126 __first = _VSTD::find_if<_ForwardIterator, typename add_lvalue_reference<_Predicate>::type>
Howard Hinnant3e519522010-05-11 19:42:162127 (__first, __last, __pred);
2128 if (__first != __last)
2129 {
2130 _ForwardIterator __i = __first;
2131 while (++__i != __last)
2132 {
2133 if (!__pred(*__i))
2134 {
Howard Hinnantce48a112011-06-30 21:18:192135 *__first = _VSTD::move(*__i);
Howard Hinnant3e519522010-05-11 19:42:162136 ++__first;
2137 }
2138 }
2139 }
2140 return __first;
2141}
2142
2143// remove_copy
2144
2145template <class _InputIterator, class _OutputIterator, class _Tp>
2146inline _LIBCPP_INLINE_VISIBILITY
2147_OutputIterator
Howard Hinnante4383372011-10-22 20:59:452148remove_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, const _Tp& __value_)
Howard Hinnant3e519522010-05-11 19:42:162149{
2150 for (; __first != __last; ++__first)
2151 {
Howard Hinnante4383372011-10-22 20:59:452152 if (!(*__first == __value_))
Howard Hinnant3e519522010-05-11 19:42:162153 {
2154 *__result = *__first;
2155 ++__result;
2156 }
2157 }
2158 return __result;
2159}
2160
2161// remove_copy_if
2162
2163template <class _InputIterator, class _OutputIterator, class _Predicate>
2164inline _LIBCPP_INLINE_VISIBILITY
2165_OutputIterator
2166remove_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Predicate __pred)
2167{
2168 for (; __first != __last; ++__first)
2169 {
2170 if (!__pred(*__first))
2171 {
2172 *__result = *__first;
2173 ++__result;
2174 }
2175 }
2176 return __result;
2177}
2178
2179// unique
2180
2181template <class _ForwardIterator, class _BinaryPredicate>
Marshall Clow4bfb9312018-01-20 20:14:322182_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnant3e519522010-05-11 19:42:162183unique(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred)
2184{
Howard Hinnantce48a112011-06-30 21:18:192185 __first = _VSTD::adjacent_find<_ForwardIterator, typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnant3e519522010-05-11 19:42:162186 (__first, __last, __pred);
2187 if (__first != __last)
2188 {
2189 // ... a a ? ...
2190 // f i
2191 _ForwardIterator __i = __first;
2192 for (++__i; ++__i != __last;)
2193 if (!__pred(*__first, *__i))
Howard Hinnantce48a112011-06-30 21:18:192194 *++__first = _VSTD::move(*__i);
Howard Hinnant3e519522010-05-11 19:42:162195 ++__first;
2196 }
2197 return __first;
2198}
2199
2200template <class _ForwardIterator>
Marshall Clow4bfb9312018-01-20 20:14:322201inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:162202_ForwardIterator
2203unique(_ForwardIterator __first, _ForwardIterator __last)
2204{
2205 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Howard Hinnantce48a112011-06-30 21:18:192206 return _VSTD::unique(__first, __last, __equal_to<__v>());
Howard Hinnant3e519522010-05-11 19:42:162207}
2208
2209// unique_copy
2210
2211template <class _BinaryPredicate, class _InputIterator, class _OutputIterator>
Marshall Clow4bfb9312018-01-20 20:14:322212_LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator
Howard Hinnant3e519522010-05-11 19:42:162213__unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred,
2214 input_iterator_tag, output_iterator_tag)
2215{
2216 if (__first != __last)
2217 {
2218 typename iterator_traits<_InputIterator>::value_type __t(*__first);
2219 *__result = __t;
2220 ++__result;
2221 while (++__first != __last)
2222 {
2223 if (!__pred(__t, *__first))
2224 {
2225 __t = *__first;
2226 *__result = __t;
2227 ++__result;
2228 }
2229 }
2230 }
2231 return __result;
2232}
2233
2234template <class _BinaryPredicate, class _ForwardIterator, class _OutputIterator>
Marshall Clow4bfb9312018-01-20 20:14:322235_LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator
Howard Hinnant3e519522010-05-11 19:42:162236__unique_copy(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result, _BinaryPredicate __pred,
2237 forward_iterator_tag, output_iterator_tag)
2238{
2239 if (__first != __last)
2240 {
2241 _ForwardIterator __i = __first;
2242 *__result = *__i;
2243 ++__result;
2244 while (++__first != __last)
2245 {
2246 if (!__pred(*__i, *__first))
2247 {
2248 *__result = *__first;
2249 ++__result;
2250 __i = __first;
2251 }
2252 }
2253 }
2254 return __result;
2255}
2256
2257template <class _BinaryPredicate, class _InputIterator, class _ForwardIterator>
Marshall Clow4bfb9312018-01-20 20:14:322258_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnant3e519522010-05-11 19:42:162259__unique_copy(_InputIterator __first, _InputIterator __last, _ForwardIterator __result, _BinaryPredicate __pred,
2260 input_iterator_tag, forward_iterator_tag)
2261{
2262 if (__first != __last)
2263 {
2264 *__result = *__first;
2265 while (++__first != __last)
2266 if (!__pred(*__result, *__first))
2267 *++__result = *__first;
2268 ++__result;
2269 }
2270 return __result;
2271}
2272
Howard Hinnant3e519522010-05-11 19:42:162273template <class _InputIterator, class _OutputIterator, class _BinaryPredicate>
Marshall Clow4bfb9312018-01-20 20:14:322274inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:162275_OutputIterator
2276unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred)
2277{
Howard Hinnantce48a112011-06-30 21:18:192278 return _VSTD::__unique_copy<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnant3e519522010-05-11 19:42:162279 (__first, __last, __result, __pred,
2280 typename iterator_traits<_InputIterator>::iterator_category(),
2281 typename iterator_traits<_OutputIterator>::iterator_category());
2282}
2283
2284template <class _InputIterator, class _OutputIterator>
Marshall Clow4bfb9312018-01-20 20:14:322285inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:162286_OutputIterator
2287unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
2288{
2289 typedef typename iterator_traits<_InputIterator>::value_type __v;
Howard Hinnantce48a112011-06-30 21:18:192290 return _VSTD::unique_copy(__first, __last, __result, __equal_to<__v>());
Howard Hinnant3e519522010-05-11 19:42:162291}
2292
2293// reverse
2294
2295template <class _BidirectionalIterator>
2296inline _LIBCPP_INLINE_VISIBILITY
2297void
2298__reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirectional_iterator_tag)
2299{
2300 while (__first != __last)
2301 {
2302 if (__first == --__last)
2303 break;
Marshall Clowdef501d2015-11-02 21:34:252304 _VSTD::iter_swap(__first, __last);
Howard Hinnant3e519522010-05-11 19:42:162305 ++__first;
2306 }
2307}
2308
2309template <class _RandomAccessIterator>
2310inline _LIBCPP_INLINE_VISIBILITY
2311void
2312__reverse(_RandomAccessIterator __first, _RandomAccessIterator __last, random_access_iterator_tag)
2313{
2314 if (__first != __last)
2315 for (; __first < --__last; ++__first)
Marshall Clowdef501d2015-11-02 21:34:252316 _VSTD::iter_swap(__first, __last);
Howard Hinnant3e519522010-05-11 19:42:162317}
2318
2319template <class _BidirectionalIterator>
2320inline _LIBCPP_INLINE_VISIBILITY
2321void
2322reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
2323{
Howard Hinnantce48a112011-06-30 21:18:192324 _VSTD::__reverse(__first, __last, typename iterator_traits<_BidirectionalIterator>::iterator_category());
Howard Hinnant3e519522010-05-11 19:42:162325}
2326
2327// reverse_copy
2328
2329template <class _BidirectionalIterator, class _OutputIterator>
2330inline _LIBCPP_INLINE_VISIBILITY
2331_OutputIterator
2332reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last, _OutputIterator __result)
2333{
2334 for (; __first != __last; ++__result)
2335 *__result = *--__last;
2336 return __result;
2337}
2338
2339// rotate
2340
2341template <class _ForwardIterator>
2342_ForwardIterator
Howard Hinnantaca09de2012-08-03 18:01:202343__rotate_left(_ForwardIterator __first, _ForwardIterator __last)
Howard Hinnant3e519522010-05-11 19:42:162344{
Howard Hinnantaca09de2012-08-03 18:01:202345 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
2346 value_type __tmp = _VSTD::move(*__first);
2347 _ForwardIterator __lm1 = _VSTD::move(_VSTD::next(__first), __last, __first);
2348 *__lm1 = _VSTD::move(__tmp);
2349 return __lm1;
2350}
2351
2352template <class _BidirectionalIterator>
2353_BidirectionalIterator
2354__rotate_right(_BidirectionalIterator __first, _BidirectionalIterator __last)
2355{
2356 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
2357 _BidirectionalIterator __lm1 = _VSTD::prev(__last);
2358 value_type __tmp = _VSTD::move(*__lm1);
2359 _BidirectionalIterator __fp1 = _VSTD::move_backward(__first, __lm1, __last);
2360 *__first = _VSTD::move(__tmp);
2361 return __fp1;
2362}
2363
2364template <class _ForwardIterator>
2365_ForwardIterator
2366__rotate_forward(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last)
2367{
Howard Hinnant3e519522010-05-11 19:42:162368 _ForwardIterator __i = __middle;
2369 while (true)
2370 {
2371 swap(*__first, *__i);
2372 ++__first;
2373 if (++__i == __last)
2374 break;
2375 if (__first == __middle)
2376 __middle = __i;
2377 }
2378 _ForwardIterator __r = __first;
2379 if (__first != __middle)
2380 {
2381 __i = __middle;
2382 while (true)
2383 {
2384 swap(*__first, *__i);
2385 ++__first;
2386 if (++__i == __last)
2387 {
2388 if (__first == __middle)
2389 break;
2390 __i = __middle;
2391 }
2392 else if (__first == __middle)
2393 __middle = __i;
2394 }
2395 }
2396 return __r;
2397}
2398
2399template<typename _Integral>
2400inline _LIBCPP_INLINE_VISIBILITY
2401_Integral
Marshall Clow19b40352016-07-26 14:29:452402__algo_gcd(_Integral __x, _Integral __y)
Howard Hinnant3e519522010-05-11 19:42:162403{
2404 do
2405 {
2406 _Integral __t = __x % __y;
2407 __x = __y;
2408 __y = __t;
2409 } while (__y);
2410 return __x;
2411}
2412
2413template<typename _RandomAccessIterator>
2414_RandomAccessIterator
Howard Hinnantaca09de2012-08-03 18:01:202415__rotate_gcd(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last)
Howard Hinnant3e519522010-05-11 19:42:162416{
2417 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
2418 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
Howard Hinnantb3371f62010-08-22 00:02:432419
Howard Hinnant3e519522010-05-11 19:42:162420 const difference_type __m1 = __middle - __first;
2421 const difference_type __m2 = __last - __middle;
2422 if (__m1 == __m2)
2423 {
Howard Hinnantce48a112011-06-30 21:18:192424 _VSTD::swap_ranges(__first, __middle, __middle);
Howard Hinnant3e519522010-05-11 19:42:162425 return __middle;
2426 }
Marshall Clow19b40352016-07-26 14:29:452427 const difference_type __g = _VSTD::__algo_gcd(__m1, __m2);
Howard Hinnant3e519522010-05-11 19:42:162428 for (_RandomAccessIterator __p = __first + __g; __p != __first;)
2429 {
Howard Hinnantaca09de2012-08-03 18:01:202430 value_type __t(_VSTD::move(*--__p));
Howard Hinnant3e519522010-05-11 19:42:162431 _RandomAccessIterator __p1 = __p;
2432 _RandomAccessIterator __p2 = __p1 + __m1;
2433 do
2434 {
Howard Hinnantaca09de2012-08-03 18:01:202435 *__p1 = _VSTD::move(*__p2);
Howard Hinnant3e519522010-05-11 19:42:162436 __p1 = __p2;
2437 const difference_type __d = __last - __p2;
2438 if (__m1 < __d)
2439 __p2 += __m1;
2440 else
2441 __p2 = __first + (__m1 - __d);
2442 } while (__p2 != __p);
Howard Hinnantaca09de2012-08-03 18:01:202443 *__p1 = _VSTD::move(__t);
Howard Hinnant3e519522010-05-11 19:42:162444 }
2445 return __first + __m2;
2446}
2447
2448template <class _ForwardIterator>
2449inline _LIBCPP_INLINE_VISIBILITY
2450_ForwardIterator
Howard Hinnantaca09de2012-08-03 18:01:202451__rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last,
2452 _VSTD::forward_iterator_tag)
2453{
2454 typedef typename _VSTD::iterator_traits<_ForwardIterator>::value_type value_type;
2455 if (_VSTD::is_trivially_move_assignable<value_type>::value)
2456 {
2457 if (_VSTD::next(__first) == __middle)
2458 return _VSTD::__rotate_left(__first, __last);
2459 }
2460 return _VSTD::__rotate_forward(__first, __middle, __last);
2461}
2462
2463template <class _BidirectionalIterator>
2464inline _LIBCPP_INLINE_VISIBILITY
2465_BidirectionalIterator
2466__rotate(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
2467 _VSTD::bidirectional_iterator_tag)
2468{
2469 typedef typename _VSTD::iterator_traits<_BidirectionalIterator>::value_type value_type;
2470 if (_VSTD::is_trivially_move_assignable<value_type>::value)
2471 {
2472 if (_VSTD::next(__first) == __middle)
2473 return _VSTD::__rotate_left(__first, __last);
2474 if (_VSTD::next(__middle) == __last)
2475 return _VSTD::__rotate_right(__first, __last);
2476 }
2477 return _VSTD::__rotate_forward(__first, __middle, __last);
2478}
2479
2480template <class _RandomAccessIterator>
2481inline _LIBCPP_INLINE_VISIBILITY
2482_RandomAccessIterator
2483__rotate(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
2484 _VSTD::random_access_iterator_tag)
2485{
2486 typedef typename _VSTD::iterator_traits<_RandomAccessIterator>::value_type value_type;
2487 if (_VSTD::is_trivially_move_assignable<value_type>::value)
2488 {
2489 if (_VSTD::next(__first) == __middle)
2490 return _VSTD::__rotate_left(__first, __last);
2491 if (_VSTD::next(__middle) == __last)
2492 return _VSTD::__rotate_right(__first, __last);
2493 return _VSTD::__rotate_gcd(__first, __middle, __last);
2494 }
2495 return _VSTD::__rotate_forward(__first, __middle, __last);
2496}
2497
2498template <class _ForwardIterator>
2499inline _LIBCPP_INLINE_VISIBILITY
2500_ForwardIterator
Howard Hinnant3e519522010-05-11 19:42:162501rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last)
2502{
Howard Hinnantaca09de2012-08-03 18:01:202503 if (__first == __middle)
2504 return __last;
2505 if (__middle == __last)
2506 return __first;
Howard Hinnantce48a112011-06-30 21:18:192507 return _VSTD::__rotate(__first, __middle, __last,
Howard Hinnantaca09de2012-08-03 18:01:202508 typename _VSTD::iterator_traits<_ForwardIterator>::iterator_category());
Howard Hinnant3e519522010-05-11 19:42:162509}
2510
2511// rotate_copy
2512
2513template <class _ForwardIterator, class _OutputIterator>
2514inline _LIBCPP_INLINE_VISIBILITY
2515_OutputIterator
2516rotate_copy(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last, _OutputIterator __result)
2517{
Howard Hinnantce48a112011-06-30 21:18:192518 return _VSTD::copy(__first, __middle, _VSTD::copy(__middle, __last, __result));
Howard Hinnant3e519522010-05-11 19:42:162519}
2520
Howard Hinnant3e519522010-05-11 19:42:162521// min_element
2522
2523template <class _ForwardIterator, class _Compare>
Marshall Clow9d67c6d2014-02-19 16:51:352524inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant3e519522010-05-11 19:42:162525_ForwardIterator
Marshall Clow0b0671a2015-05-10 13:53:312526min_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
Howard Hinnant3e519522010-05-11 19:42:162527{
2528 if (__first != __last)
2529 {
2530 _ForwardIterator __i = __first;
2531 while (++__i != __last)
2532 if (__comp(*__i, *__first))
2533 __first = __i;
2534 }
2535 return __first;
2536}
2537
2538template <class _ForwardIterator>
Marshall Clow0b0671a2015-05-10 13:53:312539inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant3e519522010-05-11 19:42:162540_ForwardIterator
2541min_element(_ForwardIterator __first, _ForwardIterator __last)
2542{
Marshall Clow0b0671a2015-05-10 13:53:312543 return _VSTD::min_element(__first, __last,
Howard Hinnant4eb27b72010-08-21 20:10:012544 __less<typename iterator_traits<_ForwardIterator>::value_type>());
2545}
2546
2547// min
2548
2549template <class _Tp, class _Compare>
Marshall Clow9d67c6d2014-02-19 16:51:352550inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant4eb27b72010-08-21 20:10:012551const _Tp&
2552min(const _Tp& __a, const _Tp& __b, _Compare __comp)
2553{
2554 return __comp(__b, __a) ? __b : __a;
2555}
2556
2557template <class _Tp>
Marshall Clow9d67c6d2014-02-19 16:51:352558inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant4eb27b72010-08-21 20:10:012559const _Tp&
2560min(const _Tp& __a, const _Tp& __b)
2561{
Howard Hinnantce48a112011-06-30 21:18:192562 return _VSTD::min(__a, __b, __less<_Tp>());
Howard Hinnant4eb27b72010-08-21 20:10:012563}
2564
Eric Fiselierddda4562017-04-18 23:26:472565#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant54976f22011-08-12 21:56:022566
Howard Hinnant4eb27b72010-08-21 20:10:012567template<class _Tp, class _Compare>
Marshall Clow9d67c6d2014-02-19 16:51:352568inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant4eb27b72010-08-21 20:10:012569_Tp
2570min(initializer_list<_Tp> __t, _Compare __comp)
2571{
Marshall Clow0b0671a2015-05-10 13:53:312572 return *_VSTD::min_element(__t.begin(), __t.end(), __comp);
Howard Hinnant4eb27b72010-08-21 20:10:012573}
2574
2575template<class _Tp>
Marshall Clow9d67c6d2014-02-19 16:51:352576inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant4eb27b72010-08-21 20:10:012577_Tp
2578min(initializer_list<_Tp> __t)
2579{
Marshall Clow0b0671a2015-05-10 13:53:312580 return *_VSTD::min_element(__t.begin(), __t.end(), __less<_Tp>());
Howard Hinnant3e519522010-05-11 19:42:162581}
2582
Eric Fiselierddda4562017-04-18 23:26:472583#endif // _LIBCPP_CXX03_LANG
Howard Hinnant54976f22011-08-12 21:56:022584
Howard Hinnant3e519522010-05-11 19:42:162585// max_element
2586
2587template <class _ForwardIterator, class _Compare>
Marshall Clow9d67c6d2014-02-19 16:51:352588inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant3e519522010-05-11 19:42:162589_ForwardIterator
Marshall Clow0b0671a2015-05-10 13:53:312590max_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
Howard Hinnant3e519522010-05-11 19:42:162591{
2592 if (__first != __last)
2593 {
2594 _ForwardIterator __i = __first;
2595 while (++__i != __last)
2596 if (__comp(*__first, *__i))
2597 __first = __i;
2598 }
2599 return __first;
2600}
2601
Marshall Clow9d67c6d2014-02-19 16:51:352602
Howard Hinnant3e519522010-05-11 19:42:162603template <class _ForwardIterator>
Marshall Clow0b0671a2015-05-10 13:53:312604inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant3e519522010-05-11 19:42:162605_ForwardIterator
2606max_element(_ForwardIterator __first, _ForwardIterator __last)
2607{
Marshall Clow0b0671a2015-05-10 13:53:312608 return _VSTD::max_element(__first, __last,
Howard Hinnant4eb27b72010-08-21 20:10:012609 __less<typename iterator_traits<_ForwardIterator>::value_type>());
2610}
2611
2612// max
2613
2614template <class _Tp, class _Compare>
Marshall Clow9d67c6d2014-02-19 16:51:352615inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant4eb27b72010-08-21 20:10:012616const _Tp&
2617max(const _Tp& __a, const _Tp& __b, _Compare __comp)
2618{
2619 return __comp(__a, __b) ? __b : __a;
2620}
2621
2622template <class _Tp>
Marshall Clow9d67c6d2014-02-19 16:51:352623inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant4eb27b72010-08-21 20:10:012624const _Tp&
2625max(const _Tp& __a, const _Tp& __b)
2626{
Howard Hinnantce48a112011-06-30 21:18:192627 return _VSTD::max(__a, __b, __less<_Tp>());
Howard Hinnant4eb27b72010-08-21 20:10:012628}
2629
Eric Fiselierddda4562017-04-18 23:26:472630#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant54976f22011-08-12 21:56:022631
Howard Hinnant4eb27b72010-08-21 20:10:012632template<class _Tp, class _Compare>
Marshall Clow9d67c6d2014-02-19 16:51:352633inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant4eb27b72010-08-21 20:10:012634_Tp
2635max(initializer_list<_Tp> __t, _Compare __comp)
2636{
Marshall Clow0b0671a2015-05-10 13:53:312637 return *_VSTD::max_element(__t.begin(), __t.end(), __comp);
Howard Hinnant4eb27b72010-08-21 20:10:012638}
2639
2640template<class _Tp>
Marshall Clow9d67c6d2014-02-19 16:51:352641inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant4eb27b72010-08-21 20:10:012642_Tp
2643max(initializer_list<_Tp> __t)
2644{
Marshall Clow0b0671a2015-05-10 13:53:312645 return *_VSTD::max_element(__t.begin(), __t.end(), __less<_Tp>());
Howard Hinnant3e519522010-05-11 19:42:162646}
2647
Eric Fiselierddda4562017-04-18 23:26:472648#endif // _LIBCPP_CXX03_LANG
Howard Hinnant54976f22011-08-12 21:56:022649
Marshall Clow146c14a2016-03-07 22:43:492650#if _LIBCPP_STD_VER > 14
2651// clamp
2652template<class _Tp, class _Compare>
2653inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
2654const _Tp&
2655clamp(const _Tp& __v, const _Tp& __lo, const _Tp& __hi, _Compare __comp)
2656{
2657 _LIBCPP_ASSERT(!__comp(__hi, __lo), "Bad bounds passed to std::clamp");
2658 return __comp(__v, __lo) ? __lo : __comp(__hi, __v) ? __hi : __v;
2659
2660}
2661
2662template<class _Tp>
2663inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
2664const _Tp&
2665clamp(const _Tp& __v, const _Tp& __lo, const _Tp& __hi)
2666{
2667 return _VSTD::clamp(__v, __lo, __hi, __less<_Tp>());
2668}
2669#endif
2670
Howard Hinnant3e519522010-05-11 19:42:162671// minmax_element
2672
2673template <class _ForwardIterator, class _Compare>
Marshall Clow0b0671a2015-05-10 13:53:312674_LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant3e519522010-05-11 19:42:162675std::pair<_ForwardIterator, _ForwardIterator>
2676minmax_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
2677{
2678 std::pair<_ForwardIterator, _ForwardIterator> __result(__first, __first);
2679 if (__first != __last)
2680 {
2681 if (++__first != __last)
2682 {
2683 if (__comp(*__first, *__result.first))
Howard Hinnant3e519522010-05-11 19:42:162684 __result.first = __first;
Howard Hinnant3e519522010-05-11 19:42:162685 else
2686 __result.second = __first;
2687 while (++__first != __last)
2688 {
2689 _ForwardIterator __i = __first;
2690 if (++__first == __last)
2691 {
2692 if (__comp(*__i, *__result.first))
2693 __result.first = __i;
2694 else if (!__comp(*__i, *__result.second))
2695 __result.second = __i;
2696 break;
2697 }
2698 else
2699 {
2700 if (__comp(*__first, *__i))
2701 {
2702 if (__comp(*__first, *__result.first))
2703 __result.first = __first;
2704 if (!__comp(*__i, *__result.second))
2705 __result.second = __i;
2706 }
2707 else
2708 {
2709 if (__comp(*__i, *__result.first))
2710 __result.first = __i;
2711 if (!__comp(*__first, *__result.second))
2712 __result.second = __first;
2713 }
2714 }
2715 }
2716 }
2717 }
2718 return __result;
2719}
2720
2721template <class _ForwardIterator>
Marshall Clow0b0671a2015-05-10 13:53:312722inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant3e519522010-05-11 19:42:162723std::pair<_ForwardIterator, _ForwardIterator>
2724minmax_element(_ForwardIterator __first, _ForwardIterator __last)
2725{
Marshall Clow9d67c6d2014-02-19 16:51:352726 return _VSTD::minmax_element(__first, __last,
2727 __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnant3e519522010-05-11 19:42:162728}
2729
Howard Hinnant4eb27b72010-08-21 20:10:012730// minmax
2731
2732template<class _Tp, class _Compare>
Marshall Clow9d67c6d2014-02-19 16:51:352733inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant4eb27b72010-08-21 20:10:012734pair<const _Tp&, const _Tp&>
2735minmax(const _Tp& __a, const _Tp& __b, _Compare __comp)
2736{
2737 return __comp(__b, __a) ? pair<const _Tp&, const _Tp&>(__b, __a) :
2738 pair<const _Tp&, const _Tp&>(__a, __b);
2739}
2740
2741template<class _Tp>
Marshall Clow9d67c6d2014-02-19 16:51:352742inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant4eb27b72010-08-21 20:10:012743pair<const _Tp&, const _Tp&>
2744minmax(const _Tp& __a, const _Tp& __b)
2745{
Howard Hinnantce48a112011-06-30 21:18:192746 return _VSTD::minmax(__a, __b, __less<_Tp>());
Howard Hinnant4eb27b72010-08-21 20:10:012747}
2748
Eric Fiselierddda4562017-04-18 23:26:472749#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant54976f22011-08-12 21:56:022750
Howard Hinnant4eb27b72010-08-21 20:10:012751template<class _Tp, class _Compare>
Marshall Clow9d67c6d2014-02-19 16:51:352752inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant4eb27b72010-08-21 20:10:012753pair<_Tp, _Tp>
2754minmax(initializer_list<_Tp> __t, _Compare __comp)
2755{
Marshall Clow9d67c6d2014-02-19 16:51:352756 typedef typename initializer_list<_Tp>::const_iterator _Iter;
2757 _Iter __first = __t.begin();
2758 _Iter __last = __t.end();
Marshall Clow002144f2015-02-11 15:41:342759 std::pair<_Tp, _Tp> __result(*__first, *__first);
Marshall Clow9d67c6d2014-02-19 16:51:352760
2761 ++__first;
2762 if (__t.size() % 2 == 0)
2763 {
2764 if (__comp(*__first, __result.first))
2765 __result.first = *__first;
2766 else
2767 __result.second = *__first;
2768 ++__first;
2769 }
Aditya Kumar331fb802016-08-25 11:52:382770
Marshall Clow9d67c6d2014-02-19 16:51:352771 while (__first != __last)
2772 {
2773 _Tp __prev = *__first++;
Marshall Clow002144f2015-02-11 15:41:342774 if (__comp(*__first, __prev)) {
2775 if ( __comp(*__first, __result.first)) __result.first = *__first;
2776 if (!__comp(__prev, __result.second)) __result.second = __prev;
Marshall Clow9d67c6d2014-02-19 16:51:352777 }
2778 else {
Marshall Clow002144f2015-02-11 15:41:342779 if ( __comp(__prev, __result.first)) __result.first = __prev;
2780 if (!__comp(*__first, __result.second)) __result.second = *__first;
Marshall Clow9d67c6d2014-02-19 16:51:352781 }
Aditya Kumar331fb802016-08-25 11:52:382782
Marshall Clow9d67c6d2014-02-19 16:51:352783 __first++;
2784 }
2785 return __result;
2786}
2787
2788template<class _Tp>
2789inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
2790pair<_Tp, _Tp>
2791minmax(initializer_list<_Tp> __t)
2792{
2793 return _VSTD::minmax(__t, __less<_Tp>());
Howard Hinnant4eb27b72010-08-21 20:10:012794}
2795
Eric Fiselierddda4562017-04-18 23:26:472796#endif // _LIBCPP_CXX03_LANG
Howard Hinnant54976f22011-08-12 21:56:022797
Howard Hinnant3e519522010-05-11 19:42:162798// random_shuffle
2799
Howard Hinnantf9d540b2010-05-26 17:49:342800// __independent_bits_engine
2801
Howard Hinnantc003db12011-11-29 18:15:502802template <unsigned long long _Xp, size_t _Rp>
Howard Hinnantf9d540b2010-05-26 17:49:342803struct __log2_imp
Howard Hinnant3e519522010-05-11 19:42:162804{
Howard Hinnantc003db12011-11-29 18:15:502805 static const size_t value = _Xp & ((unsigned long long)(1) << _Rp) ? _Rp
2806 : __log2_imp<_Xp, _Rp - 1>::value;
Howard Hinnant3e519522010-05-11 19:42:162807};
2808
Howard Hinnantc003db12011-11-29 18:15:502809template <unsigned long long _Xp>
2810struct __log2_imp<_Xp, 0>
Howard Hinnant3e519522010-05-11 19:42:162811{
Howard Hinnantf9d540b2010-05-26 17:49:342812 static const size_t value = 0;
Howard Hinnant3e519522010-05-11 19:42:162813};
2814
Howard Hinnantc003db12011-11-29 18:15:502815template <size_t _Rp>
2816struct __log2_imp<0, _Rp>
Howard Hinnant3e519522010-05-11 19:42:162817{
Howard Hinnantc003db12011-11-29 18:15:502818 static const size_t value = _Rp + 1;
Howard Hinnant3e519522010-05-11 19:42:162819};
2820
Eric Fiselier89918ca2017-05-31 21:20:182821template <class _UIntType, _UIntType _Xp>
Howard Hinnantf9d540b2010-05-26 17:49:342822struct __log2
Howard Hinnant3e519522010-05-11 19:42:162823{
Howard Hinnantc003db12011-11-29 18:15:502824 static const size_t value = __log2_imp<_Xp,
Eric Fiselier89918ca2017-05-31 21:20:182825 sizeof(_UIntType) * __CHAR_BIT__ - 1>::value;
Howard Hinnant3e519522010-05-11 19:42:162826};
2827
Howard Hinnantf9d540b2010-05-26 17:49:342828template<class _Engine, class _UIntType>
2829class __independent_bits_engine
Howard Hinnant3e519522010-05-11 19:42:162830{
Howard Hinnantf9d540b2010-05-26 17:49:342831public:
2832 // types
2833 typedef _UIntType result_type;
2834
2835private:
2836 typedef typename _Engine::result_type _Engine_result_type;
2837 typedef typename conditional
2838 <
2839 sizeof(_Engine_result_type) <= sizeof(result_type),
2840 result_type,
2841 _Engine_result_type
2842 >::type _Working_result_type;
2843
2844 _Engine& __e_;
2845 size_t __w_;
2846 size_t __w0_;
2847 size_t __n_;
2848 size_t __n0_;
2849 _Working_result_type __y0_;
2850 _Working_result_type __y1_;
2851 _Engine_result_type __mask0_;
2852 _Engine_result_type __mask1_;
2853
Eric Fiselierddda4562017-04-18 23:26:472854#ifdef _LIBCPP_CXX03_LANG
Howard Hinnantc003db12011-11-29 18:15:502855 static const _Working_result_type _Rp = _Engine::_Max - _Engine::_Min
Howard Hinnante386b7b2012-04-02 21:00:452856 + _Working_result_type(1);
2857#else
2858 static _LIBCPP_CONSTEXPR const _Working_result_type _Rp = _Engine::max() - _Engine::min()
2859 + _Working_result_type(1);
2860#endif
2861 static _LIBCPP_CONSTEXPR const size_t __m = __log2<_Working_result_type, _Rp>::value;
2862 static _LIBCPP_CONSTEXPR const size_t _WDt = numeric_limits<_Working_result_type>::digits;
2863 static _LIBCPP_CONSTEXPR const size_t _EDt = numeric_limits<_Engine_result_type>::digits;
Howard Hinnantf9d540b2010-05-26 17:49:342864
2865public:
2866 // constructors and seeding functions
2867 __independent_bits_engine(_Engine& __e, size_t __w);
2868
2869 // generating functions
Howard Hinnantc003db12011-11-29 18:15:502870 result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>());}
Howard Hinnantf9d540b2010-05-26 17:49:342871
2872private:
Marshall Clow08bba642017-09-20 19:38:432873 result_type __eval(false_type);
2874 result_type __eval(true_type);
Howard Hinnantf9d540b2010-05-26 17:49:342875};
2876
2877template<class _Engine, class _UIntType>
2878__independent_bits_engine<_Engine, _UIntType>
2879 ::__independent_bits_engine(_Engine& __e, size_t __w)
2880 : __e_(__e),
2881 __w_(__w)
2882{
2883 __n_ = __w_ / __m + (__w_ % __m != 0);
2884 __w0_ = __w_ / __n_;
Howard Hinnantc003db12011-11-29 18:15:502885 if (_Rp == 0)
2886 __y0_ = _Rp;
Howard Hinnantf9d540b2010-05-26 17:49:342887 else if (__w0_ < _WDt)
Howard Hinnantc003db12011-11-29 18:15:502888 __y0_ = (_Rp >> __w0_) << __w0_;
Howard Hinnantf9d540b2010-05-26 17:49:342889 else
2890 __y0_ = 0;
Howard Hinnantc003db12011-11-29 18:15:502891 if (_Rp - __y0_ > __y0_ / __n_)
Howard Hinnantf9d540b2010-05-26 17:49:342892 {
2893 ++__n_;
2894 __w0_ = __w_ / __n_;
2895 if (__w0_ < _WDt)
Howard Hinnantc003db12011-11-29 18:15:502896 __y0_ = (_Rp >> __w0_) << __w0_;
Howard Hinnantf9d540b2010-05-26 17:49:342897 else
2898 __y0_ = 0;
2899 }
2900 __n0_ = __n_ - __w_ % __n_;
2901 if (__w0_ < _WDt - 1)
Howard Hinnantc003db12011-11-29 18:15:502902 __y1_ = (_Rp >> (__w0_ + 1)) << (__w0_ + 1);
Howard Hinnantf9d540b2010-05-26 17:49:342903 else
2904 __y1_ = 0;
2905 __mask0_ = __w0_ > 0 ? _Engine_result_type(~0) >> (_EDt - __w0_) :
2906 _Engine_result_type(0);
2907 __mask1_ = __w0_ < _EDt - 1 ?
2908 _Engine_result_type(~0) >> (_EDt - (__w0_ + 1)) :
2909 _Engine_result_type(~0);
Howard Hinnant3e519522010-05-11 19:42:162910}
2911
Howard Hinnantf9d540b2010-05-26 17:49:342912template<class _Engine, class _UIntType>
2913inline
2914_UIntType
Marshall Clow08bba642017-09-20 19:38:432915__independent_bits_engine<_Engine, _UIntType>::__eval(false_type)
Howard Hinnant3e519522010-05-11 19:42:162916{
Howard Hinnantf9d540b2010-05-26 17:49:342917 return static_cast<result_type>(__e_() & __mask0_);
Howard Hinnant3e519522010-05-11 19:42:162918}
2919
Howard Hinnantf9d540b2010-05-26 17:49:342920template<class _Engine, class _UIntType>
2921_UIntType
Marshall Clow08bba642017-09-20 19:38:432922__independent_bits_engine<_Engine, _UIntType>::__eval(true_type)
Howard Hinnant3e519522010-05-11 19:42:162923{
Marshall Clow5beb2c32017-09-20 17:34:112924 const size_t _WRt = numeric_limits<result_type>::digits;
Howard Hinnantc003db12011-11-29 18:15:502925 result_type _Sp = 0;
Howard Hinnantf9d540b2010-05-26 17:49:342926 for (size_t __k = 0; __k < __n0_; ++__k)
2927 {
2928 _Engine_result_type __u;
2929 do
2930 {
2931 __u = __e_() - _Engine::min();
2932 } while (__u >= __y0_);
Marshall Clow5beb2c32017-09-20 17:34:112933 if (__w0_ < _WRt)
Howard Hinnantc003db12011-11-29 18:15:502934 _Sp <<= __w0_;
Howard Hinnantf9d540b2010-05-26 17:49:342935 else
Howard Hinnantc003db12011-11-29 18:15:502936 _Sp = 0;
2937 _Sp += __u & __mask0_;
Howard Hinnantf9d540b2010-05-26 17:49:342938 }
2939 for (size_t __k = __n0_; __k < __n_; ++__k)
2940 {
2941 _Engine_result_type __u;
2942 do
2943 {
2944 __u = __e_() - _Engine::min();
2945 } while (__u >= __y1_);
Marshall Clow5beb2c32017-09-20 17:34:112946 if (__w0_ < _WRt - 1)
Howard Hinnantc003db12011-11-29 18:15:502947 _Sp <<= __w0_ + 1;
Howard Hinnantf9d540b2010-05-26 17:49:342948 else
Howard Hinnantc003db12011-11-29 18:15:502949 _Sp = 0;
2950 _Sp += __u & __mask1_;
Howard Hinnantf9d540b2010-05-26 17:49:342951 }
Howard Hinnantc003db12011-11-29 18:15:502952 return _Sp;
Howard Hinnantf9d540b2010-05-26 17:49:342953}
2954
2955// uniform_int_distribution
2956
2957template<class _IntType = int>
2958class uniform_int_distribution
2959{
2960public:
2961 // types
2962 typedef _IntType result_type;
2963
2964 class param_type
2965 {
2966 result_type __a_;
2967 result_type __b_;
2968 public:
2969 typedef uniform_int_distribution distribution_type;
2970
2971 explicit param_type(result_type __a = 0,
2972 result_type __b = numeric_limits<result_type>::max())
2973 : __a_(__a), __b_(__b) {}
2974
2975 result_type a() const {return __a_;}
2976 result_type b() const {return __b_;}
2977
2978 friend bool operator==(const param_type& __x, const param_type& __y)
2979 {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;}
2980 friend bool operator!=(const param_type& __x, const param_type& __y)
2981 {return !(__x == __y);}
2982 };
2983
2984private:
2985 param_type __p_;
2986
2987public:
2988 // constructors and reset functions
2989 explicit uniform_int_distribution(result_type __a = 0,
2990 result_type __b = numeric_limits<result_type>::max())
2991 : __p_(param_type(__a, __b)) {}
2992 explicit uniform_int_distribution(const param_type& __p) : __p_(__p) {}
2993 void reset() {}
2994
2995 // generating functions
2996 template<class _URNG> result_type operator()(_URNG& __g)
2997 {return (*this)(__g, __p_);}
2998 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
2999
3000 // property functions
3001 result_type a() const {return __p_.a();}
3002 result_type b() const {return __p_.b();}
3003
3004 param_type param() const {return __p_;}
3005 void param(const param_type& __p) {__p_ = __p;}
3006
3007 result_type min() const {return a();}
3008 result_type max() const {return b();}
3009
3010 friend bool operator==(const uniform_int_distribution& __x,
3011 const uniform_int_distribution& __y)
3012 {return __x.__p_ == __y.__p_;}
3013 friend bool operator!=(const uniform_int_distribution& __x,
3014 const uniform_int_distribution& __y)
3015 {return !(__x == __y);}
3016};
3017
3018template<class _IntType>
3019template<class _URNG>
3020typename uniform_int_distribution<_IntType>::result_type
3021uniform_int_distribution<_IntType>::operator()(_URNG& __g, const param_type& __p)
3022{
3023 typedef typename conditional<sizeof(result_type) <= sizeof(uint32_t),
3024 uint32_t, uint64_t>::type _UIntType;
Howard Hinnantc003db12011-11-29 18:15:503025 const _UIntType _Rp = __p.b() - __p.a() + _UIntType(1);
3026 if (_Rp == 1)
Howard Hinnantf9d540b2010-05-26 17:49:343027 return __p.a();
3028 const size_t _Dt = numeric_limits<_UIntType>::digits;
3029 typedef __independent_bits_engine<_URNG, _UIntType> _Eng;
Howard Hinnantc003db12011-11-29 18:15:503030 if (_Rp == 0)
Howard Hinnantf9d540b2010-05-26 17:49:343031 return static_cast<result_type>(_Eng(__g, _Dt)());
Howard Hinnantc003db12011-11-29 18:15:503032 size_t __w = _Dt - __clz(_Rp) - 1;
Marshall Clowa6438ca2015-07-30 18:26:343033 if ((_Rp & (std::numeric_limits<_UIntType>::max() >> (_Dt - __w))) != 0)
Howard Hinnantf9d540b2010-05-26 17:49:343034 ++__w;
3035 _Eng __e(__g, __w);
3036 _UIntType __u;
Howard Hinnant3e519522010-05-11 19:42:163037 do
Howard Hinnantf9d540b2010-05-26 17:49:343038 {
3039 __u = __e();
Howard Hinnantc003db12011-11-29 18:15:503040 } while (__u >= _Rp);
Howard Hinnantf9d540b2010-05-26 17:49:343041 return static_cast<result_type>(__u + __p.a());
Howard Hinnant3e519522010-05-11 19:42:163042}
3043
Eric Fiselier66f1ec42017-04-03 23:23:443044#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_RANDOM_SHUFFLE) \
3045 || defined(_LIBCPP_BUILDING_LIBRARY)
Howard Hinnantf0544c22013-08-12 18:38:343046class _LIBCPP_TYPE_VIS __rs_default;
Howard Hinnant3e519522010-05-11 19:42:163047
Howard Hinnantf0544c22013-08-12 18:38:343048_LIBCPP_FUNC_VIS __rs_default __rs_get();
Howard Hinnantf9d540b2010-05-26 17:49:343049
Howard Hinnantf0544c22013-08-12 18:38:343050class _LIBCPP_TYPE_VIS __rs_default
Howard Hinnant3e519522010-05-11 19:42:163051{
Howard Hinnantf9d540b2010-05-26 17:49:343052 static unsigned __c_;
3053
3054 __rs_default();
3055public:
Marshall Clowb6e5f852013-02-07 22:12:023056 typedef uint_fast32_t result_type;
Howard Hinnantf9d540b2010-05-26 17:49:343057
3058 static const result_type _Min = 0;
3059 static const result_type _Max = 0xFFFFFFFF;
3060
3061 __rs_default(const __rs_default&);
3062 ~__rs_default();
3063
3064 result_type operator()();
3065
Howard Hinnant788c9972012-04-02 00:40:413066 static _LIBCPP_CONSTEXPR result_type min() {return _Min;}
3067 static _LIBCPP_CONSTEXPR result_type max() {return _Max;}
Howard Hinnantf9d540b2010-05-26 17:49:343068
Howard Hinnantf0544c22013-08-12 18:38:343069 friend _LIBCPP_FUNC_VIS __rs_default __rs_get();
Howard Hinnant3e519522010-05-11 19:42:163070};
3071
Howard Hinnantf0544c22013-08-12 18:38:343072_LIBCPP_FUNC_VIS __rs_default __rs_get();
Howard Hinnant3e519522010-05-11 19:42:163073
3074template <class _RandomAccessIterator>
3075void
3076random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
3077{
3078 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnantc003db12011-11-29 18:15:503079 typedef uniform_int_distribution<ptrdiff_t> _Dp;
3080 typedef typename _Dp::param_type _Pp;
Howard Hinnant3e519522010-05-11 19:42:163081 difference_type __d = __last - __first;
3082 if (__d > 1)
3083 {
Howard Hinnantc003db12011-11-29 18:15:503084 _Dp __uid;
Howard Hinnantf9d540b2010-05-26 17:49:343085 __rs_default __g = __rs_get();
3086 for (--__last, --__d; __first < __last; ++__first, --__d)
Howard Hinnant007b26b2010-10-22 15:26:393087 {
Howard Hinnantc003db12011-11-29 18:15:503088 difference_type __i = __uid(__g, _Pp(0, __d));
Howard Hinnant007b26b2010-10-22 15:26:393089 if (__i != difference_type(0))
3090 swap(*__first, *(__first + __i));
3091 }
Howard Hinnant3e519522010-05-11 19:42:163092 }
3093}
3094
3095template <class _RandomAccessIterator, class _RandomNumberGenerator>
3096void
3097random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
Eric Fiselierddda4562017-04-18 23:26:473098#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant3e519522010-05-11 19:42:163099 _RandomNumberGenerator&& __rand)
3100#else
3101 _RandomNumberGenerator& __rand)
3102#endif
3103{
3104 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
3105 difference_type __d = __last - __first;
3106 if (__d > 1)
3107 {
3108 for (--__last; __first < __last; ++__first, --__d)
Howard Hinnant007b26b2010-10-22 15:26:393109 {
3110 difference_type __i = __rand(__d);
3111 swap(*__first, *(__first + __i));
3112 }
Howard Hinnant3e519522010-05-11 19:42:163113 }
3114}
Marshall Clow0f37a412017-03-23 13:43:373115#endif
Howard Hinnant3e519522010-05-11 19:42:163116
Eric Fiseliere7154702016-08-28 22:14:373117template <class _PopulationIterator, class _SampleIterator, class _Distance,
3118 class _UniformRandomNumberGenerator>
3119_LIBCPP_INLINE_VISIBILITY
3120_SampleIterator __sample(_PopulationIterator __first,
Alexander Richardson42bfedd2017-11-14 11:14:253121 _PopulationIterator __last, _SampleIterator __output_iter,
Eric Fiseliere7154702016-08-28 22:14:373122 _Distance __n,
3123 _UniformRandomNumberGenerator & __g,
3124 input_iterator_tag) {
3125
3126 _Distance __k = 0;
3127 for (; __first != __last && __k < __n; ++__first, (void)++__k)
Alexander Richardson42bfedd2017-11-14 11:14:253128 __output_iter[__k] = *__first;
Eric Fiseliere7154702016-08-28 22:14:373129 _Distance __sz = __k;
3130 for (; __first != __last; ++__first, (void)++__k) {
3131 _Distance __r = _VSTD::uniform_int_distribution<_Distance>(0, __k)(__g);
3132 if (__r < __sz)
Alexander Richardson42bfedd2017-11-14 11:14:253133 __output_iter[__r] = *__first;
Eric Fiseliere7154702016-08-28 22:14:373134 }
Alexander Richardson42bfedd2017-11-14 11:14:253135 return __output_iter + _VSTD::min(__n, __k);
Eric Fiseliere7154702016-08-28 22:14:373136}
3137
3138template <class _PopulationIterator, class _SampleIterator, class _Distance,
3139 class _UniformRandomNumberGenerator>
3140_LIBCPP_INLINE_VISIBILITY
3141_SampleIterator __sample(_PopulationIterator __first,
Alexander Richardson42bfedd2017-11-14 11:14:253142 _PopulationIterator __last, _SampleIterator __output_iter,
Eric Fiseliere7154702016-08-28 22:14:373143 _Distance __n,
3144 _UniformRandomNumberGenerator& __g,
3145 forward_iterator_tag) {
3146 _Distance __unsampled_sz = _VSTD::distance(__first, __last);
3147 for (__n = _VSTD::min(__n, __unsampled_sz); __n != 0; ++__first) {
3148 _Distance __r =
3149 _VSTD::uniform_int_distribution<_Distance>(0, --__unsampled_sz)(__g);
3150 if (__r < __n) {
Alexander Richardson42bfedd2017-11-14 11:14:253151 *__output_iter++ = *__first;
Eric Fiseliere7154702016-08-28 22:14:373152 --__n;
3153 }
3154 }
Alexander Richardson42bfedd2017-11-14 11:14:253155 return __output_iter;
Eric Fiseliere7154702016-08-28 22:14:373156}
3157
3158template <class _PopulationIterator, class _SampleIterator, class _Distance,
3159 class _UniformRandomNumberGenerator>
3160_LIBCPP_INLINE_VISIBILITY
3161_SampleIterator __sample(_PopulationIterator __first,
Alexander Richardson42bfedd2017-11-14 11:14:253162 _PopulationIterator __last, _SampleIterator __output_iter,
Eric Fiseliere7154702016-08-28 22:14:373163 _Distance __n, _UniformRandomNumberGenerator& __g) {
3164 typedef typename iterator_traits<_PopulationIterator>::iterator_category
3165 _PopCategory;
3166 typedef typename iterator_traits<_PopulationIterator>::difference_type
3167 _Difference;
3168 static_assert(__is_forward_iterator<_PopulationIterator>::value ||
3169 __is_random_access_iterator<_SampleIterator>::value,
3170 "SampleIterator must meet the requirements of RandomAccessIterator");
3171 typedef typename common_type<_Distance, _Difference>::type _CommonType;
3172 _LIBCPP_ASSERT(__n >= 0, "N must be a positive number.");
3173 return _VSTD::__sample(
Alexander Richardson42bfedd2017-11-14 11:14:253174 __first, __last, __output_iter, _CommonType(__n),
Eric Fiseliere7154702016-08-28 22:14:373175 __g, _PopCategory());
3176}
3177
3178#if _LIBCPP_STD_VER > 14
3179template <class _PopulationIterator, class _SampleIterator, class _Distance,
3180 class _UniformRandomNumberGenerator>
3181inline _LIBCPP_INLINE_VISIBILITY
3182_SampleIterator sample(_PopulationIterator __first,
Alexander Richardson42bfedd2017-11-14 11:14:253183 _PopulationIterator __last, _SampleIterator __output_iter,
Eric Fiseliere7154702016-08-28 22:14:373184 _Distance __n, _UniformRandomNumberGenerator&& __g) {
Alexander Richardson42bfedd2017-11-14 11:14:253185 return _VSTD::__sample(__first, __last, __output_iter, __n, __g);
Eric Fiseliere7154702016-08-28 22:14:373186}
3187#endif // _LIBCPP_STD_VER > 14
3188
Howard Hinnantf9d540b2010-05-26 17:49:343189template<class _RandomAccessIterator, class _UniformRandomNumberGenerator>
3190 void shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
Eric Fiselierddda4562017-04-18 23:26:473191#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantfb340102010-11-18 01:47:023192 _UniformRandomNumberGenerator&& __g)
3193#else
Howard Hinnantf9d540b2010-05-26 17:49:343194 _UniformRandomNumberGenerator& __g)
Howard Hinnantfb340102010-11-18 01:47:023195#endif
Howard Hinnantf9d540b2010-05-26 17:49:343196{
3197 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnantc003db12011-11-29 18:15:503198 typedef uniform_int_distribution<ptrdiff_t> _Dp;
3199 typedef typename _Dp::param_type _Pp;
Howard Hinnantf9d540b2010-05-26 17:49:343200 difference_type __d = __last - __first;
3201 if (__d > 1)
3202 {
Howard Hinnantc003db12011-11-29 18:15:503203 _Dp __uid;
Howard Hinnantf9d540b2010-05-26 17:49:343204 for (--__last, --__d; __first < __last; ++__first, --__d)
Howard Hinnant007b26b2010-10-22 15:26:393205 {
Howard Hinnantc003db12011-11-29 18:15:503206 difference_type __i = __uid(__g, _Pp(0, __d));
Howard Hinnant007b26b2010-10-22 15:26:393207 if (__i != difference_type(0))
3208 swap(*__first, *(__first + __i));
3209 }
Howard Hinnantf9d540b2010-05-26 17:49:343210 }
3211}
3212
Howard Hinnant3e519522010-05-11 19:42:163213template <class _InputIterator, class _Predicate>
Marshall Clow49c76432018-01-15 16:16:323214_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Howard Hinnant3e519522010-05-11 19:42:163215is_partitioned(_InputIterator __first, _InputIterator __last, _Predicate __pred)
3216{
3217 for (; __first != __last; ++__first)
3218 if (!__pred(*__first))
3219 break;
Marshall Clowb9595b72015-02-02 18:16:353220 if ( __first == __last )
3221 return true;
3222 ++__first;
Howard Hinnant3e519522010-05-11 19:42:163223 for (; __first != __last; ++__first)
3224 if (__pred(*__first))
3225 return false;
3226 return true;
3227}
3228
3229// partition
3230
3231template <class _Predicate, class _ForwardIterator>
3232_ForwardIterator
3233__partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, forward_iterator_tag)
3234{
3235 while (true)
3236 {
3237 if (__first == __last)
3238 return __first;
3239 if (!__pred(*__first))
3240 break;
3241 ++__first;
3242 }
3243 for (_ForwardIterator __p = __first; ++__p != __last;)
3244 {
3245 if (__pred(*__p))
3246 {
3247 swap(*__first, *__p);
3248 ++__first;
3249 }
3250 }
3251 return __first;
3252}
3253
3254template <class _Predicate, class _BidirectionalIterator>
3255_BidirectionalIterator
3256__partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3257 bidirectional_iterator_tag)
3258{
3259 while (true)
3260 {
3261 while (true)
3262 {
3263 if (__first == __last)
3264 return __first;
3265 if (!__pred(*__first))
3266 break;
3267 ++__first;
3268 }
3269 do
3270 {
3271 if (__first == --__last)
3272 return __first;
3273 } while (!__pred(*__last));
3274 swap(*__first, *__last);
3275 ++__first;
3276 }
3277}
3278
3279template <class _ForwardIterator, class _Predicate>
3280inline _LIBCPP_INLINE_VISIBILITY
3281_ForwardIterator
3282partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
3283{
Howard Hinnantce48a112011-06-30 21:18:193284 return _VSTD::__partition<typename add_lvalue_reference<_Predicate>::type>
Howard Hinnant3e519522010-05-11 19:42:163285 (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
3286}
3287
3288// partition_copy
3289
3290template <class _InputIterator, class _OutputIterator1,
3291 class _OutputIterator2, class _Predicate>
Marshall Clow1b9a4ff2018-01-22 20:44:333292_LIBCPP_CONSTEXPR_AFTER_CXX17 pair<_OutputIterator1, _OutputIterator2>
Howard Hinnant3e519522010-05-11 19:42:163293partition_copy(_InputIterator __first, _InputIterator __last,
3294 _OutputIterator1 __out_true, _OutputIterator2 __out_false,
3295 _Predicate __pred)
3296{
3297 for (; __first != __last; ++__first)
3298 {
3299 if (__pred(*__first))
3300 {
3301 *__out_true = *__first;
3302 ++__out_true;
3303 }
3304 else
3305 {
3306 *__out_false = *__first;
3307 ++__out_false;
3308 }
3309 }
3310 return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false);
3311}
3312
3313// partition_point
3314
3315template<class _ForwardIterator, class _Predicate>
Marshall Clow674f9122018-01-15 17:53:343316_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnant3e519522010-05-11 19:42:163317partition_point(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
3318{
3319 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnantce48a112011-06-30 21:18:193320 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnant3e519522010-05-11 19:42:163321 while (__len != 0)
3322 {
3323 difference_type __l2 = __len / 2;
3324 _ForwardIterator __m = __first;
Howard Hinnantce48a112011-06-30 21:18:193325 _VSTD::advance(__m, __l2);
Howard Hinnant3e519522010-05-11 19:42:163326 if (__pred(*__m))
3327 {
3328 __first = ++__m;
3329 __len -= __l2 + 1;
3330 }
3331 else
3332 __len = __l2;
3333 }
3334 return __first;
3335}
3336
3337// stable_partition
3338
3339template <class _Predicate, class _ForwardIterator, class _Distance, class _Pair>
3340_ForwardIterator
3341__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
3342 _Distance __len, _Pair __p, forward_iterator_tag __fit)
3343{
3344 // *__first is known to be false
3345 // __len >= 1
3346 if (__len == 1)
3347 return __first;
3348 if (__len == 2)
3349 {
3350 _ForwardIterator __m = __first;
3351 if (__pred(*++__m))
3352 {
3353 swap(*__first, *__m);
3354 return __m;
3355 }
3356 return __first;
3357 }
3358 if (__len <= __p.second)
3359 { // The buffer is big enough to use
3360 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
3361 __destruct_n __d(0);
3362 unique_ptr<value_type, __destruct_n&> __h(__p.first, __d);
3363 // Move the falses into the temporary buffer, and the trues to the front of the line
3364 // Update __first to always point to the end of the trues
3365 value_type* __t = __p.first;
Howard Hinnantce48a112011-06-30 21:18:193366 ::new(__t) value_type(_VSTD::move(*__first));
Howard Hinnant3e519522010-05-11 19:42:163367 __d.__incr((value_type*)0);
3368 ++__t;
3369 _ForwardIterator __i = __first;
3370 while (++__i != __last)
3371 {
3372 if (__pred(*__i))
3373 {
Howard Hinnantce48a112011-06-30 21:18:193374 *__first = _VSTD::move(*__i);
Howard Hinnant3e519522010-05-11 19:42:163375 ++__first;
3376 }
3377 else
3378 {
Howard Hinnantce48a112011-06-30 21:18:193379 ::new(__t) value_type(_VSTD::move(*__i));
Howard Hinnant3e519522010-05-11 19:42:163380 __d.__incr((value_type*)0);
3381 ++__t;
3382 }
3383 }
3384 // All trues now at start of range, all falses in buffer
3385 // Move falses back into range, but don't mess up __first which points to first false
3386 __i = __first;
3387 for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i)
Howard Hinnantce48a112011-06-30 21:18:193388 *__i = _VSTD::move(*__t2);
Howard Hinnant3e519522010-05-11 19:42:163389 // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer
3390 return __first;
3391 }
3392 // Else not enough buffer, do in place
3393 // __len >= 3
3394 _ForwardIterator __m = __first;
3395 _Distance __len2 = __len / 2; // __len2 >= 2
Howard Hinnantce48a112011-06-30 21:18:193396 _VSTD::advance(__m, __len2);
Howard Hinnant3e519522010-05-11 19:42:163397 // recurse on [__first, __m), *__first know to be false
3398 // F?????????????????
3399 // f m l
3400 typedef typename add_lvalue_reference<_Predicate>::type _PredRef;
3401 _ForwardIterator __first_false = __stable_partition<_PredRef>(__first, __m, __pred, __len2, __p, __fit);
3402 // TTTFFFFF??????????
3403 // f ff m l
3404 // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true
3405 _ForwardIterator __m1 = __m;
3406 _ForwardIterator __second_false = __last;
3407 _Distance __len_half = __len - __len2;
3408 while (__pred(*__m1))
3409 {
3410 if (++__m1 == __last)
3411 goto __second_half_done;
3412 --__len_half;
3413 }
3414 // TTTFFFFFTTTF??????
3415 // f ff m m1 l
3416 __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __fit);
3417__second_half_done:
3418 // TTTFFFFFTTTTTFFFFF
3419 // f ff m sf l
Howard Hinnantce48a112011-06-30 21:18:193420 return _VSTD::rotate(__first_false, __m, __second_false);
Howard Hinnant3e519522010-05-11 19:42:163421 // TTTTTTTTFFFFFFFFFF
3422 // |
3423}
3424
3425struct __return_temporary_buffer
3426{
3427 template <class _Tp>
Howard Hinnantce48a112011-06-30 21:18:193428 _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) const {_VSTD::return_temporary_buffer(__p);}
Howard Hinnant3e519522010-05-11 19:42:163429};
3430
3431template <class _Predicate, class _ForwardIterator>
3432_ForwardIterator
3433__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
3434 forward_iterator_tag)
3435{
3436 const unsigned __alloc_limit = 3; // might want to make this a function of trivial assignment
3437 // Either prove all true and return __first or point to first false
3438 while (true)
3439 {
3440 if (__first == __last)
3441 return __first;
3442 if (!__pred(*__first))
3443 break;
3444 ++__first;
3445 }
3446 // We now have a reduced range [__first, __last)
3447 // *__first is known to be false
3448 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
3449 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
Howard Hinnantce48a112011-06-30 21:18:193450 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnant3e519522010-05-11 19:42:163451 pair<value_type*, ptrdiff_t> __p(0, 0);
3452 unique_ptr<value_type, __return_temporary_buffer> __h;
3453 if (__len >= __alloc_limit)
3454 {
Howard Hinnantce48a112011-06-30 21:18:193455 __p = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnant3e519522010-05-11 19:42:163456 __h.reset(__p.first);
3457 }
3458 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
3459 (__first, __last, __pred, __len, __p, forward_iterator_tag());
3460}
3461
3462template <class _Predicate, class _BidirectionalIterator, class _Distance, class _Pair>
3463_BidirectionalIterator
3464__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3465 _Distance __len, _Pair __p, bidirectional_iterator_tag __bit)
3466{
3467 // *__first is known to be false
3468 // *__last is known to be true
3469 // __len >= 2
3470 if (__len == 2)
3471 {
3472 swap(*__first, *__last);
3473 return __last;
3474 }
3475 if (__len == 3)
3476 {
3477 _BidirectionalIterator __m = __first;
3478 if (__pred(*++__m))
3479 {
3480 swap(*__first, *__m);
3481 swap(*__m, *__last);
3482 return __last;
3483 }
3484 swap(*__m, *__last);
3485 swap(*__first, *__m);
3486 return __m;
3487 }
3488 if (__len <= __p.second)
3489 { // The buffer is big enough to use
3490 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3491 __destruct_n __d(0);
3492 unique_ptr<value_type, __destruct_n&> __h(__p.first, __d);
3493 // Move the falses into the temporary buffer, and the trues to the front of the line
3494 // Update __first to always point to the end of the trues
3495 value_type* __t = __p.first;
Howard Hinnantce48a112011-06-30 21:18:193496 ::new(__t) value_type(_VSTD::move(*__first));
Howard Hinnant3e519522010-05-11 19:42:163497 __d.__incr((value_type*)0);
3498 ++__t;
3499 _BidirectionalIterator __i = __first;
3500 while (++__i != __last)
3501 {
3502 if (__pred(*__i))
3503 {
Howard Hinnantce48a112011-06-30 21:18:193504 *__first = _VSTD::move(*__i);
Howard Hinnant3e519522010-05-11 19:42:163505 ++__first;
3506 }
3507 else
3508 {
Howard Hinnantce48a112011-06-30 21:18:193509 ::new(__t) value_type(_VSTD::move(*__i));
Howard Hinnant3e519522010-05-11 19:42:163510 __d.__incr((value_type*)0);
3511 ++__t;
3512 }
3513 }
3514 // move *__last, known to be true
Howard Hinnantce48a112011-06-30 21:18:193515 *__first = _VSTD::move(*__i);
Howard Hinnant3e519522010-05-11 19:42:163516 __i = ++__first;
3517 // All trues now at start of range, all falses in buffer
3518 // Move falses back into range, but don't mess up __first which points to first false
3519 for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i)
Howard Hinnantce48a112011-06-30 21:18:193520 *__i = _VSTD::move(*__t2);
Howard Hinnant3e519522010-05-11 19:42:163521 // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer
3522 return __first;
3523 }
3524 // Else not enough buffer, do in place
3525 // __len >= 4
3526 _BidirectionalIterator __m = __first;
3527 _Distance __len2 = __len / 2; // __len2 >= 2
Howard Hinnantce48a112011-06-30 21:18:193528 _VSTD::advance(__m, __len2);
Howard Hinnant3e519522010-05-11 19:42:163529 // recurse on [__first, __m-1], except reduce __m-1 until *(__m-1) is true, *__first know to be false
3530 // F????????????????T
3531 // f m l
3532 _BidirectionalIterator __m1 = __m;
3533 _BidirectionalIterator __first_false = __first;
3534 _Distance __len_half = __len2;
3535 while (!__pred(*--__m1))
3536 {
3537 if (__m1 == __first)
3538 goto __first_half_done;
3539 --__len_half;
3540 }
3541 // F???TFFF?????????T
3542 // f m1 m l
3543 typedef typename add_lvalue_reference<_Predicate>::type _PredRef;
3544 __first_false = __stable_partition<_PredRef>(__first, __m1, __pred, __len_half, __p, __bit);
3545__first_half_done:
3546 // TTTFFFFF?????????T
3547 // f ff m l
3548 // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true
3549 __m1 = __m;
3550 _BidirectionalIterator __second_false = __last;
3551 ++__second_false;
3552 __len_half = __len - __len2;
3553 while (__pred(*__m1))
3554 {
3555 if (++__m1 == __last)
3556 goto __second_half_done;
3557 --__len_half;
3558 }
3559 // TTTFFFFFTTTF?????T
3560 // f ff m m1 l
3561 __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __bit);
3562__second_half_done:
3563 // TTTFFFFFTTTTTFFFFF
3564 // f ff m sf l
Howard Hinnantce48a112011-06-30 21:18:193565 return _VSTD::rotate(__first_false, __m, __second_false);
Howard Hinnant3e519522010-05-11 19:42:163566 // TTTTTTTTFFFFFFFFFF
3567 // |
3568}
3569
3570template <class _Predicate, class _BidirectionalIterator>
3571_BidirectionalIterator
3572__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3573 bidirectional_iterator_tag)
3574{
3575 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
3576 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3577 const difference_type __alloc_limit = 4; // might want to make this a function of trivial assignment
3578 // Either prove all true and return __first or point to first false
3579 while (true)
3580 {
3581 if (__first == __last)
3582 return __first;
3583 if (!__pred(*__first))
3584 break;
3585 ++__first;
3586 }
3587 // __first points to first false, everything prior to __first is already set.
3588 // Either prove [__first, __last) is all false and return __first, or point __last to last true
3589 do
3590 {
3591 if (__first == --__last)
3592 return __first;
3593 } while (!__pred(*__last));
3594 // We now have a reduced range [__first, __last]
3595 // *__first is known to be false
3596 // *__last is known to be true
3597 // __len >= 2
Howard Hinnantce48a112011-06-30 21:18:193598 difference_type __len = _VSTD::distance(__first, __last) + 1;
Howard Hinnant3e519522010-05-11 19:42:163599 pair<value_type*, ptrdiff_t> __p(0, 0);
3600 unique_ptr<value_type, __return_temporary_buffer> __h;
3601 if (__len >= __alloc_limit)
3602 {
Howard Hinnantce48a112011-06-30 21:18:193603 __p = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnant3e519522010-05-11 19:42:163604 __h.reset(__p.first);
3605 }
3606 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
3607 (__first, __last, __pred, __len, __p, bidirectional_iterator_tag());
3608}
3609
3610template <class _ForwardIterator, class _Predicate>
3611inline _LIBCPP_INLINE_VISIBILITY
3612_ForwardIterator
3613stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
3614{
3615 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
3616 (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
3617}
3618
3619// is_sorted_until
3620
3621template <class _ForwardIterator, class _Compare>
Marshall Clow49c76432018-01-15 16:16:323622_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnant3e519522010-05-11 19:42:163623is_sorted_until(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
3624{
3625 if (__first != __last)
3626 {
3627 _ForwardIterator __i = __first;
3628 while (++__i != __last)
3629 {
3630 if (__comp(*__i, *__first))
3631 return __i;
3632 __first = __i;
3633 }
3634 }
3635 return __last;
3636}
3637
Howard Hinnantb3371f62010-08-22 00:02:433638template<class _ForwardIterator>
Marshall Clow49c76432018-01-15 16:16:323639inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:163640_ForwardIterator
3641is_sorted_until(_ForwardIterator __first, _ForwardIterator __last)
3642{
Howard Hinnantce48a112011-06-30 21:18:193643 return _VSTD::is_sorted_until(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnant3e519522010-05-11 19:42:163644}
3645
3646// is_sorted
3647
3648template <class _ForwardIterator, class _Compare>
Marshall Clow49c76432018-01-15 16:16:323649inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:163650bool
3651is_sorted(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
3652{
Howard Hinnantce48a112011-06-30 21:18:193653 return _VSTD::is_sorted_until(__first, __last, __comp) == __last;
Howard Hinnant3e519522010-05-11 19:42:163654}
3655
Howard Hinnantb3371f62010-08-22 00:02:433656template<class _ForwardIterator>
Marshall Clow49c76432018-01-15 16:16:323657inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:163658bool
3659is_sorted(_ForwardIterator __first, _ForwardIterator __last)
3660{
Howard Hinnantce48a112011-06-30 21:18:193661 return _VSTD::is_sorted(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnant3e519522010-05-11 19:42:163662}
3663
3664// sort
3665
3666// stable, 2-3 compares, 0-2 swaps
3667
3668template <class _Compare, class _ForwardIterator>
3669unsigned
3670__sort3(_ForwardIterator __x, _ForwardIterator __y, _ForwardIterator __z, _Compare __c)
3671{
3672 unsigned __r = 0;
3673 if (!__c(*__y, *__x)) // if x <= y
3674 {
3675 if (!__c(*__z, *__y)) // if y <= z
3676 return __r; // x <= y && y <= z
3677 // x <= y && y > z
3678 swap(*__y, *__z); // x <= z && y < z
3679 __r = 1;
3680 if (__c(*__y, *__x)) // if x > y
3681 {
3682 swap(*__x, *__y); // x < y && y <= z
3683 __r = 2;
3684 }
3685 return __r; // x <= y && y < z
3686 }
3687 if (__c(*__z, *__y)) // x > y, if y > z
3688 {
3689 swap(*__x, *__z); // x < y && y < z
3690 __r = 1;
3691 return __r;
3692 }
3693 swap(*__x, *__y); // x > y && y <= z
3694 __r = 1; // x < y && x <= z
3695 if (__c(*__z, *__y)) // if y > z
3696 {
3697 swap(*__y, *__z); // x <= y && y < z
3698 __r = 2;
3699 }
3700 return __r;
3701} // x <= y && y <= z
3702
3703// stable, 3-6 compares, 0-5 swaps
3704
3705template <class _Compare, class _ForwardIterator>
3706unsigned
3707__sort4(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3,
3708 _ForwardIterator __x4, _Compare __c)
3709{
3710 unsigned __r = __sort3<_Compare>(__x1, __x2, __x3, __c);
3711 if (__c(*__x4, *__x3))
3712 {
3713 swap(*__x3, *__x4);
3714 ++__r;
3715 if (__c(*__x3, *__x2))
3716 {
3717 swap(*__x2, *__x3);
3718 ++__r;
3719 if (__c(*__x2, *__x1))
3720 {
3721 swap(*__x1, *__x2);
3722 ++__r;
3723 }
3724 }
3725 }
3726 return __r;
3727}
3728
3729// stable, 4-10 compares, 0-9 swaps
3730
3731template <class _Compare, class _ForwardIterator>
3732unsigned
3733__sort5(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3,
3734 _ForwardIterator __x4, _ForwardIterator __x5, _Compare __c)
3735{
3736 unsigned __r = __sort4<_Compare>(__x1, __x2, __x3, __x4, __c);
3737 if (__c(*__x5, *__x4))
3738 {
3739 swap(*__x4, *__x5);
3740 ++__r;
3741 if (__c(*__x4, *__x3))
3742 {
3743 swap(*__x3, *__x4);
3744 ++__r;
3745 if (__c(*__x3, *__x2))
3746 {
3747 swap(*__x2, *__x3);
3748 ++__r;
3749 if (__c(*__x2, *__x1))
3750 {
3751 swap(*__x1, *__x2);
3752 ++__r;
3753 }
3754 }
3755 }
3756 }
3757 return __r;
3758}
3759
3760// Assumes size > 0
3761template <class _Compare, class _BirdirectionalIterator>
3762void
3763__selection_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp)
3764{
3765 _BirdirectionalIterator __lm1 = __last;
3766 for (--__lm1; __first != __lm1; ++__first)
3767 {
Howard Hinnantce48a112011-06-30 21:18:193768 _BirdirectionalIterator __i = _VSTD::min_element<_BirdirectionalIterator,
Howard Hinnant3e519522010-05-11 19:42:163769 typename add_lvalue_reference<_Compare>::type>
3770 (__first, __last, __comp);
3771 if (__i != __first)
3772 swap(*__first, *__i);
3773 }
3774}
3775
3776template <class _Compare, class _BirdirectionalIterator>
3777void
3778__insertion_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp)
3779{
3780 typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type;
3781 if (__first != __last)
3782 {
3783 _BirdirectionalIterator __i = __first;
3784 for (++__i; __i != __last; ++__i)
3785 {
3786 _BirdirectionalIterator __j = __i;
Howard Hinnantce48a112011-06-30 21:18:193787 value_type __t(_VSTD::move(*__j));
Howard Hinnant3e519522010-05-11 19:42:163788 for (_BirdirectionalIterator __k = __i; __k != __first && __comp(__t, *--__k); --__j)
Howard Hinnantce48a112011-06-30 21:18:193789 *__j = _VSTD::move(*__k);
3790 *__j = _VSTD::move(__t);
Howard Hinnant3e519522010-05-11 19:42:163791 }
3792 }
3793}
3794
3795template <class _Compare, class _RandomAccessIterator>
3796void
3797__insertion_sort_3(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3798{
3799 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3800 _RandomAccessIterator __j = __first+2;
3801 __sort3<_Compare>(__first, __first+1, __j, __comp);
3802 for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
3803 {
3804 if (__comp(*__i, *__j))
3805 {
Howard Hinnantce48a112011-06-30 21:18:193806 value_type __t(_VSTD::move(*__i));
Howard Hinnant3e519522010-05-11 19:42:163807 _RandomAccessIterator __k = __j;
3808 __j = __i;
3809 do
3810 {
Howard Hinnantce48a112011-06-30 21:18:193811 *__j = _VSTD::move(*__k);
Howard Hinnant3e519522010-05-11 19:42:163812 __j = __k;
3813 } while (__j != __first && __comp(__t, *--__k));
Howard Hinnantce48a112011-06-30 21:18:193814 *__j = _VSTD::move(__t);
Howard Hinnant3e519522010-05-11 19:42:163815 }
3816 __j = __i;
3817 }
3818}
3819
3820template <class _Compare, class _RandomAccessIterator>
3821bool
3822__insertion_sort_incomplete(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3823{
3824 switch (__last - __first)
3825 {
3826 case 0:
3827 case 1:
3828 return true;
3829 case 2:
3830 if (__comp(*--__last, *__first))
3831 swap(*__first, *__last);
3832 return true;
3833 case 3:
Howard Hinnantce48a112011-06-30 21:18:193834 _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp);
Howard Hinnant3e519522010-05-11 19:42:163835 return true;
3836 case 4:
Howard Hinnantce48a112011-06-30 21:18:193837 _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp);
Howard Hinnant3e519522010-05-11 19:42:163838 return true;
3839 case 5:
Howard Hinnantce48a112011-06-30 21:18:193840 _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp);
Howard Hinnant3e519522010-05-11 19:42:163841 return true;
3842 }
3843 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3844 _RandomAccessIterator __j = __first+2;
3845 __sort3<_Compare>(__first, __first+1, __j, __comp);
3846 const unsigned __limit = 8;
3847 unsigned __count = 0;
3848 for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
3849 {
3850 if (__comp(*__i, *__j))
3851 {
Howard Hinnantce48a112011-06-30 21:18:193852 value_type __t(_VSTD::move(*__i));
Howard Hinnant3e519522010-05-11 19:42:163853 _RandomAccessIterator __k = __j;
3854 __j = __i;
3855 do
3856 {
Howard Hinnantce48a112011-06-30 21:18:193857 *__j = _VSTD::move(*__k);
Howard Hinnant3e519522010-05-11 19:42:163858 __j = __k;
3859 } while (__j != __first && __comp(__t, *--__k));
Howard Hinnantce48a112011-06-30 21:18:193860 *__j = _VSTD::move(__t);
Howard Hinnant3e519522010-05-11 19:42:163861 if (++__count == __limit)
3862 return ++__i == __last;
3863 }
3864 __j = __i;
3865 }
3866 return true;
3867}
3868
3869template <class _Compare, class _BirdirectionalIterator>
3870void
3871__insertion_sort_move(_BirdirectionalIterator __first1, _BirdirectionalIterator __last1,
3872 typename iterator_traits<_BirdirectionalIterator>::value_type* __first2, _Compare __comp)
3873{
3874 typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type;
3875 if (__first1 != __last1)
3876 {
3877 __destruct_n __d(0);
3878 unique_ptr<value_type, __destruct_n&> __h(__first2, __d);
3879 value_type* __last2 = __first2;
Howard Hinnantce48a112011-06-30 21:18:193880 ::new(__last2) value_type(_VSTD::move(*__first1));
Howard Hinnant3e519522010-05-11 19:42:163881 __d.__incr((value_type*)0);
3882 for (++__last2; ++__first1 != __last1; ++__last2)
3883 {
3884 value_type* __j2 = __last2;
3885 value_type* __i2 = __j2;
3886 if (__comp(*__first1, *--__i2))
3887 {
Howard Hinnantce48a112011-06-30 21:18:193888 ::new(__j2) value_type(_VSTD::move(*__i2));
Howard Hinnant3e519522010-05-11 19:42:163889 __d.__incr((value_type*)0);
3890 for (--__j2; __i2 != __first2 && __comp(*__first1, *--__i2); --__j2)
Howard Hinnantce48a112011-06-30 21:18:193891 *__j2 = _VSTD::move(*__i2);
3892 *__j2 = _VSTD::move(*__first1);
Howard Hinnant3e519522010-05-11 19:42:163893 }
3894 else
3895 {
Howard Hinnantce48a112011-06-30 21:18:193896 ::new(__j2) value_type(_VSTD::move(*__first1));
Howard Hinnant3e519522010-05-11 19:42:163897 __d.__incr((value_type*)0);
3898 }
3899 }
3900 __h.release();
3901 }
3902}
3903
3904template <class _Compare, class _RandomAccessIterator>
3905void
3906__sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3907{
3908 // _Compare is known to be a reference type
3909 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
3910 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
Howard Hinnantca740482010-11-19 22:17:283911 const difference_type __limit = is_trivially_copy_constructible<value_type>::value &&
3912 is_trivially_copy_assignable<value_type>::value ? 30 : 6;
Howard Hinnant3e519522010-05-11 19:42:163913 while (true)
3914 {
3915 __restart:
3916 difference_type __len = __last - __first;
3917 switch (__len)
3918 {
3919 case 0:
3920 case 1:
3921 return;
3922 case 2:
3923 if (__comp(*--__last, *__first))
3924 swap(*__first, *__last);
3925 return;
3926 case 3:
Howard Hinnantce48a112011-06-30 21:18:193927 _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp);
Howard Hinnant3e519522010-05-11 19:42:163928 return;
3929 case 4:
Howard Hinnantce48a112011-06-30 21:18:193930 _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp);
Howard Hinnant3e519522010-05-11 19:42:163931 return;
3932 case 5:
Howard Hinnantce48a112011-06-30 21:18:193933 _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp);
Howard Hinnant3e519522010-05-11 19:42:163934 return;
3935 }
3936 if (__len <= __limit)
3937 {
Howard Hinnantce48a112011-06-30 21:18:193938 _VSTD::__insertion_sort_3<_Compare>(__first, __last, __comp);
Howard Hinnant3e519522010-05-11 19:42:163939 return;
3940 }
3941 // __len > 5
3942 _RandomAccessIterator __m = __first;
3943 _RandomAccessIterator __lm1 = __last;
3944 --__lm1;
3945 unsigned __n_swaps;
3946 {
3947 difference_type __delta;
3948 if (__len >= 1000)
3949 {
3950 __delta = __len/2;
3951 __m += __delta;
3952 __delta /= 2;
Howard Hinnantce48a112011-06-30 21:18:193953 __n_swaps = _VSTD::__sort5<_Compare>(__first, __first + __delta, __m, __m+__delta, __lm1, __comp);
Howard Hinnant3e519522010-05-11 19:42:163954 }
3955 else
3956 {
3957 __delta = __len/2;
3958 __m += __delta;
Howard Hinnantce48a112011-06-30 21:18:193959 __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, __lm1, __comp);
Howard Hinnant3e519522010-05-11 19:42:163960 }
3961 }
3962 // *__m is median
3963 // partition [__first, __m) < *__m and *__m <= [__m, __last)
3964 // (this inhibits tossing elements equivalent to __m around unnecessarily)
3965 _RandomAccessIterator __i = __first;
3966 _RandomAccessIterator __j = __lm1;
3967 // j points beyond range to be tested, *__m is known to be <= *__lm1
3968 // The search going up is known to be guarded but the search coming down isn't.
3969 // Prime the downward search with a guard.
3970 if (!__comp(*__i, *__m)) // if *__first == *__m
3971 {
3972 // *__first == *__m, *__first doesn't go in first part
3973 // manually guard downward moving __j against __i
3974 while (true)
3975 {
3976 if (__i == --__j)
3977 {
3978 // *__first == *__m, *__m <= all other elements
3979 // Parition instead into [__first, __i) == *__first and *__first < [__i, __last)
3980 ++__i; // __first + 1
3981 __j = __last;
3982 if (!__comp(*__first, *--__j)) // we need a guard if *__first == *(__last-1)
3983 {
3984 while (true)
3985 {
3986 if (__i == __j)
3987 return; // [__first, __last) all equivalent elements
3988 if (__comp(*__first, *__i))
3989 {
3990 swap(*__i, *__j);
3991 ++__n_swaps;
3992 ++__i;
3993 break;
3994 }
3995 ++__i;
3996 }
3997 }
3998 // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1
3999 if (__i == __j)
4000 return;
4001 while (true)
4002 {
4003 while (!__comp(*__first, *__i))
4004 ++__i;
4005 while (__comp(*__first, *--__j))
4006 ;
4007 if (__i >= __j)
4008 break;
4009 swap(*__i, *__j);
4010 ++__n_swaps;
4011 ++__i;
4012 }
4013 // [__first, __i) == *__first and *__first < [__i, __last)
4014 // The first part is sorted, sort the secod part
Howard Hinnantce48a112011-06-30 21:18:194015 // _VSTD::__sort<_Compare>(__i, __last, __comp);
Howard Hinnant3e519522010-05-11 19:42:164016 __first = __i;
4017 goto __restart;
4018 }
4019 if (__comp(*__j, *__m))
4020 {
4021 swap(*__i, *__j);
4022 ++__n_swaps;
4023 break; // found guard for downward moving __j, now use unguarded partition
4024 }
4025 }
4026 }
4027 // It is known that *__i < *__m
4028 ++__i;
4029 // j points beyond range to be tested, *__m is known to be <= *__lm1
4030 // if not yet partitioned...
4031 if (__i < __j)
4032 {
4033 // known that *(__i - 1) < *__m
4034 // known that __i <= __m
4035 while (true)
4036 {
4037 // __m still guards upward moving __i
4038 while (__comp(*__i, *__m))
4039 ++__i;
4040 // It is now known that a guard exists for downward moving __j
4041 while (!__comp(*--__j, *__m))
4042 ;
4043 if (__i > __j)
4044 break;
4045 swap(*__i, *__j);
4046 ++__n_swaps;
4047 // It is known that __m != __j
4048 // If __m just moved, follow it
4049 if (__m == __i)
4050 __m = __j;
4051 ++__i;
4052 }
4053 }
4054 // [__first, __i) < *__m and *__m <= [__i, __last)
4055 if (__i != __m && __comp(*__m, *__i))
4056 {
4057 swap(*__i, *__m);
4058 ++__n_swaps;
4059 }
4060 // [__first, __i) < *__i and *__i <= [__i+1, __last)
4061 // If we were given a perfect partition, see if insertion sort is quick...
4062 if (__n_swaps == 0)
4063 {
Howard Hinnantce48a112011-06-30 21:18:194064 bool __fs = _VSTD::__insertion_sort_incomplete<_Compare>(__first, __i, __comp);
4065 if (_VSTD::__insertion_sort_incomplete<_Compare>(__i+1, __last, __comp))
Howard Hinnant3e519522010-05-11 19:42:164066 {
4067 if (__fs)
4068 return;
4069 __last = __i;
4070 continue;
4071 }
4072 else
4073 {
4074 if (__fs)
4075 {
4076 __first = ++__i;
4077 continue;
4078 }
4079 }
4080 }
4081 // sort smaller range with recursive call and larger with tail recursion elimination
4082 if (__i - __first < __last - __i)
4083 {
Howard Hinnantce48a112011-06-30 21:18:194084 _VSTD::__sort<_Compare>(__first, __i, __comp);
4085 // _VSTD::__sort<_Compare>(__i+1, __last, __comp);
Howard Hinnant3e519522010-05-11 19:42:164086 __first = ++__i;
4087 }
4088 else
4089 {
Howard Hinnantce48a112011-06-30 21:18:194090 _VSTD::__sort<_Compare>(__i+1, __last, __comp);
4091 // _VSTD::__sort<_Compare>(__first, __i, __comp);
Howard Hinnant3e519522010-05-11 19:42:164092 __last = __i;
4093 }
4094 }
4095}
4096
4097// This forwarder keeps the top call and the recursive calls using the same instantiation, forcing a reference _Compare
4098template <class _RandomAccessIterator, class _Compare>
4099inline _LIBCPP_INLINE_VISIBILITY
4100void
4101sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4102{
Howard Hinnant145afa12013-08-23 20:10:184103#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164104 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4105 __debug_less<_Compare> __c(__comp);
4106 __sort<_Comp_ref>(__first, __last, __c);
Howard Hinnant145afa12013-08-23 20:10:184107#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164108 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4109 __sort<_Comp_ref>(__first, __last, __comp);
Howard Hinnant145afa12013-08-23 20:10:184110#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164111}
4112
4113template <class _RandomAccessIterator>
4114inline _LIBCPP_INLINE_VISIBILITY
4115void
4116sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
4117{
Howard Hinnantce48a112011-06-30 21:18:194118 _VSTD::sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnant3e519522010-05-11 19:42:164119}
4120
4121template <class _Tp>
4122inline _LIBCPP_INLINE_VISIBILITY
4123void
4124sort(_Tp** __first, _Tp** __last)
4125{
Howard Hinnantce48a112011-06-30 21:18:194126 _VSTD::sort((size_t*)__first, (size_t*)__last, __less<size_t>());
Howard Hinnant3e519522010-05-11 19:42:164127}
4128
4129template <class _Tp>
4130inline _LIBCPP_INLINE_VISIBILITY
4131void
4132sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last)
4133{
Howard Hinnantce48a112011-06-30 21:18:194134 _VSTD::sort(__first.base(), __last.base());
Howard Hinnant3e519522010-05-11 19:42:164135}
4136
Howard Hinnantf554add2011-09-14 18:33:514137template <class _Tp, class _Compare>
4138inline _LIBCPP_INLINE_VISIBILITY
4139void
4140sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last, _Compare __comp)
4141{
4142 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4143 _VSTD::sort<_Tp*, _Comp_ref>(__first.base(), __last.base(), __comp);
4144}
4145
Howard Hinnantf0544c22013-08-12 18:38:344146_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<char>&, char*>(char*, char*, __less<char>&))
4147_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&))
4148_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&))
4149_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&))
4150_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<short>&, short*>(short*, short*, __less<short>&))
4151_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&))
4152_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<int>&, int*>(int*, int*, __less<int>&))
4153_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&))
4154_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<long>&, long*>(long*, long*, __less<long>&))
4155_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&))
4156_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<long long>&, long long*>(long long*, long long*, __less<long long>&))
4157_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>&))
4158_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<float>&, float*>(float*, float*, __less<float>&))
4159_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<double>&, double*>(double*, double*, __less<double>&))
4160_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<long double>&, long double*>(long double*, long double*, __less<long double>&))
Howard Hinnant3e519522010-05-11 19:42:164161
Howard Hinnantf0544c22013-08-12 18:38:344162_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<char>&, char*>(char*, char*, __less<char>&))
4163_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&))
4164_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&))
4165_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&))
4166_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<short>&, short*>(short*, short*, __less<short>&))
4167_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&))
4168_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<int>&, int*>(int*, int*, __less<int>&))
4169_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&))
4170_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<long>&, long*>(long*, long*, __less<long>&))
4171_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&))
4172_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<long long>&, long long*>(long long*, long long*, __less<long long>&))
4173_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>&))
4174_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<float>&, float*>(float*, float*, __less<float>&))
4175_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<double>&, double*>(double*, double*, __less<double>&))
4176_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<long double>&, long double*>(long double*, long double*, __less<long double>&))
Howard Hinnant3e519522010-05-11 19:42:164177
Howard Hinnantf0544c22013-08-12 18:38:344178_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 Hinnant3e519522010-05-11 19:42:164179
4180// lower_bound
4181
4182template <class _Compare, class _ForwardIterator, class _Tp>
Marshall Clowd57c03d2018-01-16 02:34:414183_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnante4383372011-10-22 20:59:454184__lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnant3e519522010-05-11 19:42:164185{
4186 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnantce48a112011-06-30 21:18:194187 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnant3e519522010-05-11 19:42:164188 while (__len != 0)
4189 {
4190 difference_type __l2 = __len / 2;
4191 _ForwardIterator __m = __first;
Howard Hinnantce48a112011-06-30 21:18:194192 _VSTD::advance(__m, __l2);
Howard Hinnante4383372011-10-22 20:59:454193 if (__comp(*__m, __value_))
Howard Hinnant3e519522010-05-11 19:42:164194 {
4195 __first = ++__m;
4196 __len -= __l2 + 1;
4197 }
4198 else
4199 __len = __l2;
4200 }
4201 return __first;
4202}
4203
4204template <class _ForwardIterator, class _Tp, class _Compare>
Marshall Clowd57c03d2018-01-16 02:34:414205inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:164206_ForwardIterator
Howard Hinnante4383372011-10-22 20:59:454207lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnant3e519522010-05-11 19:42:164208{
Howard Hinnant145afa12013-08-23 20:10:184209#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164210 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4211 __debug_less<_Compare> __c(__comp);
Howard Hinnante4383372011-10-22 20:59:454212 return __lower_bound<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant145afa12013-08-23 20:10:184213#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164214 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnante4383372011-10-22 20:59:454215 return __lower_bound<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant145afa12013-08-23 20:10:184216#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164217}
4218
4219template <class _ForwardIterator, class _Tp>
Marshall Clowd57c03d2018-01-16 02:34:414220inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:164221_ForwardIterator
Howard Hinnante4383372011-10-22 20:59:454222lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnant3e519522010-05-11 19:42:164223{
Howard Hinnante4383372011-10-22 20:59:454224 return _VSTD::lower_bound(__first, __last, __value_,
Howard Hinnant3e519522010-05-11 19:42:164225 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
4226}
4227
4228// upper_bound
4229
4230template <class _Compare, class _ForwardIterator, class _Tp>
Marshall Clowd57c03d2018-01-16 02:34:414231_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnante4383372011-10-22 20:59:454232__upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnant3e519522010-05-11 19:42:164233{
4234 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnantce48a112011-06-30 21:18:194235 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnant3e519522010-05-11 19:42:164236 while (__len != 0)
4237 {
4238 difference_type __l2 = __len / 2;
4239 _ForwardIterator __m = __first;
Howard Hinnantce48a112011-06-30 21:18:194240 _VSTD::advance(__m, __l2);
Howard Hinnante4383372011-10-22 20:59:454241 if (__comp(__value_, *__m))
Howard Hinnant3e519522010-05-11 19:42:164242 __len = __l2;
4243 else
4244 {
4245 __first = ++__m;
4246 __len -= __l2 + 1;
4247 }
4248 }
4249 return __first;
4250}
4251
4252template <class _ForwardIterator, class _Tp, class _Compare>
Marshall Clowd57c03d2018-01-16 02:34:414253inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:164254_ForwardIterator
Howard Hinnante4383372011-10-22 20:59:454255upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnant3e519522010-05-11 19:42:164256{
Howard Hinnant145afa12013-08-23 20:10:184257#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164258 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4259 __debug_less<_Compare> __c(__comp);
Howard Hinnante4383372011-10-22 20:59:454260 return __upper_bound<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant145afa12013-08-23 20:10:184261#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164262 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnante4383372011-10-22 20:59:454263 return __upper_bound<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant145afa12013-08-23 20:10:184264#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164265}
4266
4267template <class _ForwardIterator, class _Tp>
Marshall Clowd57c03d2018-01-16 02:34:414268inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:164269_ForwardIterator
Howard Hinnante4383372011-10-22 20:59:454270upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnant3e519522010-05-11 19:42:164271{
Howard Hinnante4383372011-10-22 20:59:454272 return _VSTD::upper_bound(__first, __last, __value_,
Howard Hinnant3e519522010-05-11 19:42:164273 __less<_Tp, typename iterator_traits<_ForwardIterator>::value_type>());
4274}
4275
4276// equal_range
4277
4278template <class _Compare, class _ForwardIterator, class _Tp>
Marshall Clowd57c03d2018-01-16 02:34:414279_LIBCPP_CONSTEXPR_AFTER_CXX17 pair<_ForwardIterator, _ForwardIterator>
Howard Hinnante4383372011-10-22 20:59:454280__equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnant3e519522010-05-11 19:42:164281{
4282 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnantce48a112011-06-30 21:18:194283 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnant3e519522010-05-11 19:42:164284 while (__len != 0)
4285 {
4286 difference_type __l2 = __len / 2;
4287 _ForwardIterator __m = __first;
Howard Hinnantce48a112011-06-30 21:18:194288 _VSTD::advance(__m, __l2);
Howard Hinnante4383372011-10-22 20:59:454289 if (__comp(*__m, __value_))
Howard Hinnant3e519522010-05-11 19:42:164290 {
4291 __first = ++__m;
4292 __len -= __l2 + 1;
4293 }
Howard Hinnante4383372011-10-22 20:59:454294 else if (__comp(__value_, *__m))
Howard Hinnant3e519522010-05-11 19:42:164295 {
4296 __last = __m;
4297 __len = __l2;
4298 }
4299 else
4300 {
4301 _ForwardIterator __mp1 = __m;
4302 return pair<_ForwardIterator, _ForwardIterator>
4303 (
Howard Hinnante4383372011-10-22 20:59:454304 __lower_bound<_Compare>(__first, __m, __value_, __comp),
4305 __upper_bound<_Compare>(++__mp1, __last, __value_, __comp)
Howard Hinnant3e519522010-05-11 19:42:164306 );
4307 }
4308 }
4309 return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
4310}
4311
4312template <class _ForwardIterator, class _Tp, class _Compare>
Marshall Clowd57c03d2018-01-16 02:34:414313inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:164314pair<_ForwardIterator, _ForwardIterator>
Howard Hinnante4383372011-10-22 20:59:454315equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnant3e519522010-05-11 19:42:164316{
Howard Hinnant145afa12013-08-23 20:10:184317#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164318 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4319 __debug_less<_Compare> __c(__comp);
Howard Hinnante4383372011-10-22 20:59:454320 return __equal_range<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant145afa12013-08-23 20:10:184321#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164322 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnante4383372011-10-22 20:59:454323 return __equal_range<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant145afa12013-08-23 20:10:184324#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164325}
4326
4327template <class _ForwardIterator, class _Tp>
Marshall Clowd57c03d2018-01-16 02:34:414328inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:164329pair<_ForwardIterator, _ForwardIterator>
Howard Hinnante4383372011-10-22 20:59:454330equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnant3e519522010-05-11 19:42:164331{
Howard Hinnante4383372011-10-22 20:59:454332 return _VSTD::equal_range(__first, __last, __value_,
Howard Hinnant3e519522010-05-11 19:42:164333 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
4334}
4335
4336// binary_search
4337
4338template <class _Compare, class _ForwardIterator, class _Tp>
Marshall Clowd57c03d2018-01-16 02:34:414339inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:164340bool
Howard Hinnante4383372011-10-22 20:59:454341__binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnant3e519522010-05-11 19:42:164342{
Howard Hinnante4383372011-10-22 20:59:454343 __first = __lower_bound<_Compare>(__first, __last, __value_, __comp);
4344 return __first != __last && !__comp(__value_, *__first);
Howard Hinnant3e519522010-05-11 19:42:164345}
4346
4347template <class _ForwardIterator, class _Tp, class _Compare>
Marshall Clowd57c03d2018-01-16 02:34:414348inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:164349bool
Howard Hinnante4383372011-10-22 20:59:454350binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnant3e519522010-05-11 19:42:164351{
Howard Hinnant145afa12013-08-23 20:10:184352#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164353 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4354 __debug_less<_Compare> __c(__comp);
Howard Hinnante4383372011-10-22 20:59:454355 return __binary_search<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant145afa12013-08-23 20:10:184356#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164357 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnante4383372011-10-22 20:59:454358 return __binary_search<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant145afa12013-08-23 20:10:184359#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164360}
4361
4362template <class _ForwardIterator, class _Tp>
Marshall Clowd57c03d2018-01-16 02:34:414363inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:164364bool
Howard Hinnante4383372011-10-22 20:59:454365binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnant3e519522010-05-11 19:42:164366{
Howard Hinnante4383372011-10-22 20:59:454367 return _VSTD::binary_search(__first, __last, __value_,
Howard Hinnant3e519522010-05-11 19:42:164368 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
4369}
4370
4371// merge
4372
4373template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4374_OutputIterator
4375__merge(_InputIterator1 __first1, _InputIterator1 __last1,
4376 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4377{
4378 for (; __first1 != __last1; ++__result)
4379 {
4380 if (__first2 == __last2)
Howard Hinnantce48a112011-06-30 21:18:194381 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnant3e519522010-05-11 19:42:164382 if (__comp(*__first2, *__first1))
4383 {
4384 *__result = *__first2;
4385 ++__first2;
4386 }
4387 else
4388 {
4389 *__result = *__first1;
4390 ++__first1;
4391 }
4392 }
Howard Hinnantce48a112011-06-30 21:18:194393 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnant3e519522010-05-11 19:42:164394}
4395
4396template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
4397inline _LIBCPP_INLINE_VISIBILITY
4398_OutputIterator
4399merge(_InputIterator1 __first1, _InputIterator1 __last1,
4400 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4401{
Howard Hinnant145afa12013-08-23 20:10:184402#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164403 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4404 __debug_less<_Compare> __c(__comp);
Howard Hinnantce48a112011-06-30 21:18:194405 return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant145afa12013-08-23 20:10:184406#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164407 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnantce48a112011-06-30 21:18:194408 return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant145afa12013-08-23 20:10:184409#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164410}
4411
4412template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
4413inline _LIBCPP_INLINE_VISIBILITY
4414_OutputIterator
4415merge(_InputIterator1 __first1, _InputIterator1 __last1,
4416 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
4417{
4418 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
4419 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
4420 return merge(__first1, __last1, __first2, __last2, __result, __less<__v1, __v2>());
4421}
4422
4423// inplace_merge
4424
Marshall Clowadfdae12015-07-29 16:25:454425template <class _Compare, class _InputIterator1, class _InputIterator2,
4426 class _OutputIterator>
4427void __half_inplace_merge(_InputIterator1 __first1, _InputIterator1 __last1,
4428 _InputIterator2 __first2, _InputIterator2 __last2,
4429 _OutputIterator __result, _Compare __comp)
4430{
4431 for (; __first1 != __last1; ++__result)
4432 {
4433 if (__first2 == __last2)
4434 {
4435 _VSTD::move(__first1, __last1, __result);
4436 return;
4437 }
4438
4439 if (__comp(*__first2, *__first1))
4440 {
4441 *__result = _VSTD::move(*__first2);
4442 ++__first2;
4443 }
4444 else
4445 {
4446 *__result = _VSTD::move(*__first1);
4447 ++__first1;
4448 }
4449 }
4450 // __first2 through __last2 are already in the right spot.
4451}
4452
Howard Hinnant3e519522010-05-11 19:42:164453template <class _Compare, class _BidirectionalIterator>
4454void
4455__buffered_inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4456 _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1,
4457 typename iterator_traits<_BidirectionalIterator>::difference_type __len2,
4458 typename iterator_traits<_BidirectionalIterator>::value_type* __buff)
4459{
4460 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
Howard Hinnant3e519522010-05-11 19:42:164461 __destruct_n __d(0);
4462 unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
4463 if (__len1 <= __len2)
4464 {
4465 value_type* __p = __buff;
Eric Fiselier910285b2014-10-27 19:28:204466 for (_BidirectionalIterator __i = __first; __i != __middle; __d.__incr((value_type*)0), (void) ++__i, ++__p)
Howard Hinnantce48a112011-06-30 21:18:194467 ::new(__p) value_type(_VSTD::move(*__i));
Marshall Clowadfdae12015-07-29 16:25:454468 __half_inplace_merge(__buff, __p, __middle, __last, __first, __comp);
Howard Hinnant3e519522010-05-11 19:42:164469 }
4470 else
4471 {
4472 value_type* __p = __buff;
Eric Fiselier910285b2014-10-27 19:28:204473 for (_BidirectionalIterator __i = __middle; __i != __last; __d.__incr((value_type*)0), (void) ++__i, ++__p)
Howard Hinnantce48a112011-06-30 21:18:194474 ::new(__p) value_type(_VSTD::move(*__i));
Howard Hinnant3e519522010-05-11 19:42:164475 typedef reverse_iterator<_BidirectionalIterator> _RBi;
4476 typedef reverse_iterator<value_type*> _Rv;
Aditya Kumar331fb802016-08-25 11:52:384477 __half_inplace_merge(_Rv(__p), _Rv(__buff),
Marshall Clowadfdae12015-07-29 16:25:454478 _RBi(__middle), _RBi(__first),
Marshall Clowa763b362017-08-28 23:16:134479 _RBi(__last), __invert<_Compare>(__comp));
Howard Hinnant3e519522010-05-11 19:42:164480 }
4481}
4482
4483template <class _Compare, class _BidirectionalIterator>
4484void
4485__inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4486 _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1,
4487 typename iterator_traits<_BidirectionalIterator>::difference_type __len2,
4488 typename iterator_traits<_BidirectionalIterator>::value_type* __buff, ptrdiff_t __buff_size)
4489{
Howard Hinnant3e519522010-05-11 19:42:164490 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
4491 while (true)
4492 {
4493 // if __middle == __last, we're done
4494 if (__len2 == 0)
4495 return;
Marshall Clow526e0922015-02-02 16:44:114496 if (__len1 <= __buff_size || __len2 <= __buff_size)
4497 return __buffered_inplace_merge<_Compare>
4498 (__first, __middle, __last, __comp, __len1, __len2, __buff);
Howard Hinnant3e519522010-05-11 19:42:164499 // shrink [__first, __middle) as much as possible (with no moves), returning if it shrinks to 0
Eric Fiselier910285b2014-10-27 19:28:204500 for (; true; ++__first, (void) --__len1)
Howard Hinnant3e519522010-05-11 19:42:164501 {
4502 if (__len1 == 0)
4503 return;
4504 if (__comp(*__middle, *__first))
4505 break;
4506 }
Howard Hinnant3e519522010-05-11 19:42:164507 // __first < __middle < __last
4508 // *__first > *__middle
4509 // partition [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last) such that
4510 // all elements in:
4511 // [__first, __m1) <= [__middle, __m2)
4512 // [__middle, __m2) < [__m1, __middle)
4513 // [__m1, __middle) <= [__m2, __last)
4514 // and __m1 or __m2 is in the middle of its range
4515 _BidirectionalIterator __m1; // "median" of [__first, __middle)
4516 _BidirectionalIterator __m2; // "median" of [__middle, __last)
4517 difference_type __len11; // distance(__first, __m1)
4518 difference_type __len21; // distance(__middle, __m2)
4519 // binary search smaller range
4520 if (__len1 < __len2)
4521 { // __len >= 1, __len2 >= 2
4522 __len21 = __len2 / 2;
4523 __m2 = __middle;
Howard Hinnantce48a112011-06-30 21:18:194524 _VSTD::advance(__m2, __len21);
Howard Hinnant3e519522010-05-11 19:42:164525 __m1 = __upper_bound<_Compare>(__first, __middle, *__m2, __comp);
Howard Hinnantce48a112011-06-30 21:18:194526 __len11 = _VSTD::distance(__first, __m1);
Howard Hinnant3e519522010-05-11 19:42:164527 }
4528 else
4529 {
4530 if (__len1 == 1)
4531 { // __len1 >= __len2 && __len2 > 0, therefore __len2 == 1
4532 // It is known *__first > *__middle
4533 swap(*__first, *__middle);
4534 return;
4535 }
4536 // __len1 >= 2, __len2 >= 1
4537 __len11 = __len1 / 2;
4538 __m1 = __first;
Howard Hinnantce48a112011-06-30 21:18:194539 _VSTD::advance(__m1, __len11);
Howard Hinnant3e519522010-05-11 19:42:164540 __m2 = __lower_bound<_Compare>(__middle, __last, *__m1, __comp);
Howard Hinnantce48a112011-06-30 21:18:194541 __len21 = _VSTD::distance(__middle, __m2);
Howard Hinnant3e519522010-05-11 19:42:164542 }
4543 difference_type __len12 = __len1 - __len11; // distance(__m1, __middle)
4544 difference_type __len22 = __len2 - __len21; // distance(__m2, __last)
4545 // [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last)
4546 // swap middle two partitions
Howard Hinnantce48a112011-06-30 21:18:194547 __middle = _VSTD::rotate(__m1, __middle, __m2);
Howard Hinnant3e519522010-05-11 19:42:164548 // __len12 and __len21 now have swapped meanings
4549 // merge smaller range with recurisve call and larger with tail recursion elimination
4550 if (__len11 + __len21 < __len12 + __len22)
4551 {
4552 __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size);
4553// __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size);
4554 __first = __middle;
4555 __middle = __m2;
4556 __len1 = __len12;
4557 __len2 = __len22;
4558 }
4559 else
4560 {
4561 __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size);
4562// __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size);
4563 __last = __middle;
4564 __middle = __m1;
4565 __len1 = __len11;
4566 __len2 = __len21;
4567 }
4568 }
4569}
4570
Howard Hinnant3e519522010-05-11 19:42:164571template <class _BidirectionalIterator, class _Compare>
4572inline _LIBCPP_INLINE_VISIBILITY
4573void
4574inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4575 _Compare __comp)
4576{
4577 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
4578 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
Howard Hinnantce48a112011-06-30 21:18:194579 difference_type __len1 = _VSTD::distance(__first, __middle);
4580 difference_type __len2 = _VSTD::distance(__middle, __last);
4581 difference_type __buf_size = _VSTD::min(__len1, __len2);
Marshall Clow0b48cf92015-02-02 17:35:534582 pair<value_type*, ptrdiff_t> __buf = _VSTD::get_temporary_buffer<value_type>(__buf_size);
4583 unique_ptr<value_type, __return_temporary_buffer> __h(__buf.first);
4584
Howard Hinnant145afa12013-08-23 20:10:184585#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164586 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4587 __debug_less<_Compare> __c(__comp);
Howard Hinnantce48a112011-06-30 21:18:194588 return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __c, __len1, __len2,
Howard Hinnant3e519522010-05-11 19:42:164589 __buf.first, __buf.second);
Howard Hinnant145afa12013-08-23 20:10:184590#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164591 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnantce48a112011-06-30 21:18:194592 return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __comp, __len1, __len2,
Howard Hinnant3e519522010-05-11 19:42:164593 __buf.first, __buf.second);
Howard Hinnant145afa12013-08-23 20:10:184594#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164595}
4596
4597template <class _BidirectionalIterator>
4598inline _LIBCPP_INLINE_VISIBILITY
4599void
4600inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last)
4601{
Howard Hinnantce48a112011-06-30 21:18:194602 _VSTD::inplace_merge(__first, __middle, __last,
Howard Hinnant3e519522010-05-11 19:42:164603 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
4604}
4605
4606// stable_sort
4607
4608template <class _Compare, class _InputIterator1, class _InputIterator2>
4609void
4610__merge_move_construct(_InputIterator1 __first1, _InputIterator1 __last1,
4611 _InputIterator2 __first2, _InputIterator2 __last2,
4612 typename iterator_traits<_InputIterator1>::value_type* __result, _Compare __comp)
4613{
4614 typedef typename iterator_traits<_InputIterator1>::value_type value_type;
4615 __destruct_n __d(0);
4616 unique_ptr<value_type, __destruct_n&> __h(__result, __d);
4617 for (; true; ++__result)
4618 {
4619 if (__first1 == __last1)
4620 {
4621 for (; __first2 != __last2; ++__first2, ++__result, __d.__incr((value_type*)0))
Howard Hinnantce48a112011-06-30 21:18:194622 ::new (__result) value_type(_VSTD::move(*__first2));
Howard Hinnant3e519522010-05-11 19:42:164623 __h.release();
4624 return;
4625 }
4626 if (__first2 == __last2)
4627 {
4628 for (; __first1 != __last1; ++__first1, ++__result, __d.__incr((value_type*)0))
Howard Hinnantce48a112011-06-30 21:18:194629 ::new (__result) value_type(_VSTD::move(*__first1));
Howard Hinnant3e519522010-05-11 19:42:164630 __h.release();
4631 return;
4632 }
4633 if (__comp(*__first2, *__first1))
4634 {
Howard Hinnantce48a112011-06-30 21:18:194635 ::new (__result) value_type(_VSTD::move(*__first2));
Howard Hinnant3e519522010-05-11 19:42:164636 __d.__incr((value_type*)0);
4637 ++__first2;
4638 }
4639 else
4640 {
Howard Hinnantce48a112011-06-30 21:18:194641 ::new (__result) value_type(_VSTD::move(*__first1));
Howard Hinnant3e519522010-05-11 19:42:164642 __d.__incr((value_type*)0);
4643 ++__first1;
4644 }
4645 }
4646}
4647
4648template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4649void
4650__merge_move_assign(_InputIterator1 __first1, _InputIterator1 __last1,
4651 _InputIterator2 __first2, _InputIterator2 __last2,
4652 _OutputIterator __result, _Compare __comp)
4653{
4654 for (; __first1 != __last1; ++__result)
4655 {
4656 if (__first2 == __last2)
4657 {
4658 for (; __first1 != __last1; ++__first1, ++__result)
Howard Hinnantce48a112011-06-30 21:18:194659 *__result = _VSTD::move(*__first1);
Howard Hinnant3e519522010-05-11 19:42:164660 return;
4661 }
4662 if (__comp(*__first2, *__first1))
4663 {
Howard Hinnantce48a112011-06-30 21:18:194664 *__result = _VSTD::move(*__first2);
Howard Hinnant3e519522010-05-11 19:42:164665 ++__first2;
4666 }
4667 else
4668 {
Howard Hinnantce48a112011-06-30 21:18:194669 *__result = _VSTD::move(*__first1);
Howard Hinnant3e519522010-05-11 19:42:164670 ++__first1;
4671 }
4672 }
4673 for (; __first2 != __last2; ++__first2, ++__result)
Howard Hinnantce48a112011-06-30 21:18:194674 *__result = _VSTD::move(*__first2);
Howard Hinnant3e519522010-05-11 19:42:164675}
4676
4677template <class _Compare, class _RandomAccessIterator>
4678void
4679__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4680 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4681 typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size);
4682
4683template <class _Compare, class _RandomAccessIterator>
4684void
4685__stable_sort_move(_RandomAccessIterator __first1, _RandomAccessIterator __last1, _Compare __comp,
4686 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4687 typename iterator_traits<_RandomAccessIterator>::value_type* __first2)
4688{
4689 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4690 switch (__len)
4691 {
4692 case 0:
4693 return;
4694 case 1:
Howard Hinnantce48a112011-06-30 21:18:194695 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnant3e519522010-05-11 19:42:164696 return;
4697 case 2:
4698 __destruct_n __d(0);
4699 unique_ptr<value_type, __destruct_n&> __h2(__first2, __d);
4700 if (__comp(*--__last1, *__first1))
4701 {
Howard Hinnantce48a112011-06-30 21:18:194702 ::new(__first2) value_type(_VSTD::move(*__last1));
Howard Hinnant3e519522010-05-11 19:42:164703 __d.__incr((value_type*)0);
4704 ++__first2;
Howard Hinnantce48a112011-06-30 21:18:194705 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnant3e519522010-05-11 19:42:164706 }
4707 else
4708 {
Howard Hinnantce48a112011-06-30 21:18:194709 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnant3e519522010-05-11 19:42:164710 __d.__incr((value_type*)0);
4711 ++__first2;
Howard Hinnantce48a112011-06-30 21:18:194712 ::new(__first2) value_type(_VSTD::move(*__last1));
Howard Hinnant3e519522010-05-11 19:42:164713 }
4714 __h2.release();
4715 return;
4716 }
4717 if (__len <= 8)
4718 {
4719 __insertion_sort_move<_Compare>(__first1, __last1, __first2, __comp);
4720 return;
4721 }
4722 typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2;
4723 _RandomAccessIterator __m = __first1 + __l2;
4724 __stable_sort<_Compare>(__first1, __m, __comp, __l2, __first2, __l2);
4725 __stable_sort<_Compare>(__m, __last1, __comp, __len - __l2, __first2 + __l2, __len - __l2);
4726 __merge_move_construct<_Compare>(__first1, __m, __m, __last1, __first2, __comp);
4727}
4728
4729template <class _Tp>
4730struct __stable_sort_switch
4731{
Howard Hinnantca740482010-11-19 22:17:284732 static const unsigned value = 128*is_trivially_copy_assignable<_Tp>::value;
Howard Hinnant3e519522010-05-11 19:42:164733};
4734
4735template <class _Compare, class _RandomAccessIterator>
4736void
4737__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4738 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4739 typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size)
4740{
4741 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4742 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4743 switch (__len)
4744 {
4745 case 0:
4746 case 1:
4747 return;
4748 case 2:
4749 if (__comp(*--__last, *__first))
4750 swap(*__first, *__last);
4751 return;
4752 }
4753 if (__len <= static_cast<difference_type>(__stable_sort_switch<value_type>::value))
4754 {
4755 __insertion_sort<_Compare>(__first, __last, __comp);
4756 return;
4757 }
4758 typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2;
4759 _RandomAccessIterator __m = __first + __l2;
4760 if (__len <= __buff_size)
4761 {
4762 __destruct_n __d(0);
4763 unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
4764 __stable_sort_move<_Compare>(__first, __m, __comp, __l2, __buff);
4765 __d.__set(__l2, (value_type*)0);
4766 __stable_sort_move<_Compare>(__m, __last, __comp, __len - __l2, __buff + __l2);
4767 __d.__set(__len, (value_type*)0);
4768 __merge_move_assign<_Compare>(__buff, __buff + __l2, __buff + __l2, __buff + __len, __first, __comp);
4769// __merge<_Compare>(move_iterator<value_type*>(__buff),
4770// move_iterator<value_type*>(__buff + __l2),
4771// move_iterator<_RandomAccessIterator>(__buff + __l2),
4772// move_iterator<_RandomAccessIterator>(__buff + __len),
4773// __first, __comp);
4774 return;
4775 }
4776 __stable_sort<_Compare>(__first, __m, __comp, __l2, __buff, __buff_size);
4777 __stable_sort<_Compare>(__m, __last, __comp, __len - __l2, __buff, __buff_size);
4778 __inplace_merge<_Compare>(__first, __m, __last, __comp, __l2, __len - __l2, __buff, __buff_size);
4779}
4780
4781template <class _RandomAccessIterator, class _Compare>
4782inline _LIBCPP_INLINE_VISIBILITY
4783void
4784stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4785{
4786 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4787 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4788 difference_type __len = __last - __first;
4789 pair<value_type*, ptrdiff_t> __buf(0, 0);
4790 unique_ptr<value_type, __return_temporary_buffer> __h;
4791 if (__len > static_cast<difference_type>(__stable_sort_switch<value_type>::value))
4792 {
Howard Hinnantce48a112011-06-30 21:18:194793 __buf = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnant3e519522010-05-11 19:42:164794 __h.reset(__buf.first);
4795 }
Howard Hinnant145afa12013-08-23 20:10:184796#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164797 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4798 __debug_less<_Compare> __c(__comp);
4799 __stable_sort<_Comp_ref>(__first, __last, __c, __len, __buf.first, __buf.second);
Howard Hinnant145afa12013-08-23 20:10:184800#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164801 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4802 __stable_sort<_Comp_ref>(__first, __last, __comp, __len, __buf.first, __buf.second);
Howard Hinnant145afa12013-08-23 20:10:184803#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164804}
4805
4806template <class _RandomAccessIterator>
4807inline _LIBCPP_INLINE_VISIBILITY
4808void
4809stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
4810{
Howard Hinnantce48a112011-06-30 21:18:194811 _VSTD::stable_sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnant3e519522010-05-11 19:42:164812}
4813
4814// is_heap_until
4815
4816template <class _RandomAccessIterator, class _Compare>
Marshall Clow49c76432018-01-15 16:16:324817_LIBCPP_CONSTEXPR_AFTER_CXX17 _RandomAccessIterator
Howard Hinnant3e519522010-05-11 19:42:164818is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4819{
Howard Hinnantce48a112011-06-30 21:18:194820 typedef typename _VSTD::iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnant3e519522010-05-11 19:42:164821 difference_type __len = __last - __first;
4822 difference_type __p = 0;
4823 difference_type __c = 1;
4824 _RandomAccessIterator __pp = __first;
4825 while (__c < __len)
4826 {
4827 _RandomAccessIterator __cp = __first + __c;
4828 if (__comp(*__pp, *__cp))
4829 return __cp;
4830 ++__c;
4831 ++__cp;
4832 if (__c == __len)
4833 return __last;
4834 if (__comp(*__pp, *__cp))
4835 return __cp;
4836 ++__p;
4837 ++__pp;
4838 __c = 2 * __p + 1;
4839 }
4840 return __last;
4841}
4842
Howard Hinnantb3371f62010-08-22 00:02:434843template<class _RandomAccessIterator>
Marshall Clow49c76432018-01-15 16:16:324844inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:164845_RandomAccessIterator
4846is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last)
4847{
Howard Hinnantce48a112011-06-30 21:18:194848 return _VSTD::is_heap_until(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnant3e519522010-05-11 19:42:164849}
4850
4851// is_heap
4852
4853template <class _RandomAccessIterator, class _Compare>
Marshall Clow49c76432018-01-15 16:16:324854inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:164855bool
4856is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4857{
Howard Hinnantce48a112011-06-30 21:18:194858 return _VSTD::is_heap_until(__first, __last, __comp) == __last;
Howard Hinnant3e519522010-05-11 19:42:164859}
4860
Howard Hinnantb3371f62010-08-22 00:02:434861template<class _RandomAccessIterator>
Marshall Clow49c76432018-01-15 16:16:324862inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:164863bool
4864is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4865{
Howard Hinnantce48a112011-06-30 21:18:194866 return _VSTD::is_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnant3e519522010-05-11 19:42:164867}
4868
4869// push_heap
4870
4871template <class _Compare, class _RandomAccessIterator>
4872void
David Majnemer8b512602014-07-22 06:07:094873__sift_up(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4874 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
Howard Hinnant3e519522010-05-11 19:42:164875{
Howard Hinnant3e519522010-05-11 19:42:164876 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4877 if (__len > 1)
4878 {
4879 __len = (__len - 2) / 2;
4880 _RandomAccessIterator __ptr = __first + __len;
4881 if (__comp(*__ptr, *--__last))
4882 {
Howard Hinnantce48a112011-06-30 21:18:194883 value_type __t(_VSTD::move(*__last));
Howard Hinnant3e519522010-05-11 19:42:164884 do
4885 {
Howard Hinnantce48a112011-06-30 21:18:194886 *__last = _VSTD::move(*__ptr);
Howard Hinnant3e519522010-05-11 19:42:164887 __last = __ptr;
4888 if (__len == 0)
4889 break;
4890 __len = (__len - 1) / 2;
4891 __ptr = __first + __len;
4892 } while (__comp(*__ptr, __t));
Howard Hinnantce48a112011-06-30 21:18:194893 *__last = _VSTD::move(__t);
Howard Hinnant3e519522010-05-11 19:42:164894 }
4895 }
4896}
4897
4898template <class _RandomAccessIterator, class _Compare>
4899inline _LIBCPP_INLINE_VISIBILITY
4900void
4901push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4902{
Howard Hinnant145afa12013-08-23 20:10:184903#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164904 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4905 __debug_less<_Compare> __c(__comp);
David Majnemer8b512602014-07-22 06:07:094906 __sift_up<_Comp_ref>(__first, __last, __c, __last - __first);
Howard Hinnant145afa12013-08-23 20:10:184907#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164908 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
David Majnemer8b512602014-07-22 06:07:094909 __sift_up<_Comp_ref>(__first, __last, __comp, __last - __first);
Howard Hinnant145afa12013-08-23 20:10:184910#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164911}
4912
4913template <class _RandomAccessIterator>
4914inline _LIBCPP_INLINE_VISIBILITY
4915void
4916push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4917{
Howard Hinnantce48a112011-06-30 21:18:194918 _VSTD::push_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnant3e519522010-05-11 19:42:164919}
4920
4921// pop_heap
4922
4923template <class _Compare, class _RandomAccessIterator>
David Majnemer8b512602014-07-22 06:07:094924void
Eric Fiselierfd838222016-12-23 23:37:524925__sift_down(_RandomAccessIterator __first, _RandomAccessIterator /*__last*/,
4926 _Compare __comp,
David Majnemer8b512602014-07-22 06:07:094927 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4928 _RandomAccessIterator __start)
4929{
4930 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4931 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4932 // left-child of __start is at 2 * __start + 1
4933 // right-child of __start is at 2 * __start + 2
4934 difference_type __child = __start - __first;
4935
4936 if (__len < 2 || (__len - 2) / 2 < __child)
4937 return;
4938
4939 __child = 2 * __child + 1;
4940 _RandomAccessIterator __child_i = __first + __child;
4941
4942 if ((__child + 1) < __len && __comp(*__child_i, *(__child_i + 1))) {
4943 // right-child exists and is greater than left-child
4944 ++__child_i;
4945 ++__child;
4946 }
4947
4948 // check if we are in heap-order
4949 if (__comp(*__child_i, *__start))
4950 // we are, __start is larger than it's largest child
4951 return;
4952
4953 value_type __top(_VSTD::move(*__start));
4954 do
4955 {
4956 // we are not in heap-order, swap the parent with it's largest child
4957 *__start = _VSTD::move(*__child_i);
4958 __start = __child_i;
4959
4960 if ((__len - 2) / 2 < __child)
4961 break;
4962
4963 // recompute the child based off of the updated parent
4964 __child = 2 * __child + 1;
4965 __child_i = __first + __child;
4966
4967 if ((__child + 1) < __len && __comp(*__child_i, *(__child_i + 1))) {
4968 // right-child exists and is greater than left-child
4969 ++__child_i;
4970 ++__child;
4971 }
4972
4973 // check if we are in heap-order
4974 } while (!__comp(*__child_i, __top));
4975 *__start = _VSTD::move(__top);
4976}
4977
4978template <class _Compare, class _RandomAccessIterator>
Howard Hinnant3e519522010-05-11 19:42:164979inline _LIBCPP_INLINE_VISIBILITY
4980void
4981__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4982 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
4983{
4984 if (__len > 1)
4985 {
4986 swap(*__first, *--__last);
David Majnemer8b512602014-07-22 06:07:094987 __sift_down<_Compare>(__first, __last, __comp, __len - 1, __first);
Howard Hinnant3e519522010-05-11 19:42:164988 }
4989}
4990
4991template <class _RandomAccessIterator, class _Compare>
4992inline _LIBCPP_INLINE_VISIBILITY
4993void
4994pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4995{
Howard Hinnant145afa12013-08-23 20:10:184996#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164997 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4998 __debug_less<_Compare> __c(__comp);
4999 __pop_heap<_Comp_ref>(__first, __last, __c, __last - __first);
Howard Hinnant145afa12013-08-23 20:10:185000#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165001 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5002 __pop_heap<_Comp_ref>(__first, __last, __comp, __last - __first);
Howard Hinnant145afa12013-08-23 20:10:185003#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165004}
5005
5006template <class _RandomAccessIterator>
5007inline _LIBCPP_INLINE_VISIBILITY
5008void
5009pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
5010{
Howard Hinnantce48a112011-06-30 21:18:195011 _VSTD::pop_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnant3e519522010-05-11 19:42:165012}
5013
5014// make_heap
5015
5016template <class _Compare, class _RandomAccessIterator>
5017void
5018__make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
5019{
5020 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
5021 difference_type __n = __last - __first;
5022 if (__n > 1)
5023 {
David Majnemer8b512602014-07-22 06:07:095024 // start from the first parent, there is no need to consider children
5025 for (difference_type __start = (__n - 2) / 2; __start >= 0; --__start)
5026 {
5027 __sift_down<_Compare>(__first, __last, __comp, __n, __first + __start);
5028 }
Howard Hinnant3e519522010-05-11 19:42:165029 }
5030}
5031
5032template <class _RandomAccessIterator, class _Compare>
5033inline _LIBCPP_INLINE_VISIBILITY
5034void
5035make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
5036{
Howard Hinnant145afa12013-08-23 20:10:185037#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165038 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5039 __debug_less<_Compare> __c(__comp);
5040 __make_heap<_Comp_ref>(__first, __last, __c);
Howard Hinnant145afa12013-08-23 20:10:185041#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165042 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5043 __make_heap<_Comp_ref>(__first, __last, __comp);
Howard Hinnant145afa12013-08-23 20:10:185044#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165045}
5046
5047template <class _RandomAccessIterator>
5048inline _LIBCPP_INLINE_VISIBILITY
5049void
5050make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
5051{
Howard Hinnantce48a112011-06-30 21:18:195052 _VSTD::make_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnant3e519522010-05-11 19:42:165053}
5054
5055// sort_heap
5056
5057template <class _Compare, class _RandomAccessIterator>
5058void
5059__sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
5060{
5061 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
5062 for (difference_type __n = __last - __first; __n > 1; --__last, --__n)
5063 __pop_heap<_Compare>(__first, __last, __comp, __n);
5064}
5065
5066template <class _RandomAccessIterator, class _Compare>
5067inline _LIBCPP_INLINE_VISIBILITY
5068void
5069sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
5070{
Howard Hinnant145afa12013-08-23 20:10:185071#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165072 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5073 __debug_less<_Compare> __c(__comp);
5074 __sort_heap<_Comp_ref>(__first, __last, __c);
Howard Hinnant145afa12013-08-23 20:10:185075#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165076 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5077 __sort_heap<_Comp_ref>(__first, __last, __comp);
Howard Hinnant145afa12013-08-23 20:10:185078#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165079}
5080
5081template <class _RandomAccessIterator>
5082inline _LIBCPP_INLINE_VISIBILITY
5083void
5084sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
5085{
Howard Hinnantce48a112011-06-30 21:18:195086 _VSTD::sort_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnant3e519522010-05-11 19:42:165087}
5088
5089// partial_sort
5090
5091template <class _Compare, class _RandomAccessIterator>
5092void
5093__partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
5094 _Compare __comp)
5095{
5096 __make_heap<_Compare>(__first, __middle, __comp);
5097 typename iterator_traits<_RandomAccessIterator>::difference_type __len = __middle - __first;
5098 for (_RandomAccessIterator __i = __middle; __i != __last; ++__i)
5099 {
5100 if (__comp(*__i, *__first))
5101 {
5102 swap(*__i, *__first);
David Majnemer8b512602014-07-22 06:07:095103 __sift_down<_Compare>(__first, __middle, __comp, __len, __first);
Howard Hinnant3e519522010-05-11 19:42:165104 }
5105 }
5106 __sort_heap<_Compare>(__first, __middle, __comp);
5107}
5108
5109template <class _RandomAccessIterator, class _Compare>
5110inline _LIBCPP_INLINE_VISIBILITY
5111void
5112partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
5113 _Compare __comp)
5114{
Howard Hinnant145afa12013-08-23 20:10:185115#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165116 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5117 __debug_less<_Compare> __c(__comp);
5118 __partial_sort<_Comp_ref>(__first, __middle, __last, __c);
Howard Hinnant145afa12013-08-23 20:10:185119#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165120 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5121 __partial_sort<_Comp_ref>(__first, __middle, __last, __comp);
Howard Hinnant145afa12013-08-23 20:10:185122#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165123}
5124
5125template <class _RandomAccessIterator>
5126inline _LIBCPP_INLINE_VISIBILITY
5127void
5128partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last)
5129{
Howard Hinnantce48a112011-06-30 21:18:195130 _VSTD::partial_sort(__first, __middle, __last,
Howard Hinnant3e519522010-05-11 19:42:165131 __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
5132}
5133
5134// partial_sort_copy
5135
5136template <class _Compare, class _InputIterator, class _RandomAccessIterator>
5137_RandomAccessIterator
5138__partial_sort_copy(_InputIterator __first, _InputIterator __last,
5139 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp)
5140{
5141 _RandomAccessIterator __r = __result_first;
5142 if (__r != __result_last)
5143 {
Eric Fiselier910285b2014-10-27 19:28:205144 for (; __first != __last && __r != __result_last; (void) ++__first, ++__r)
Howard Hinnant3e519522010-05-11 19:42:165145 *__r = *__first;
5146 __make_heap<_Compare>(__result_first, __r, __comp);
David Majnemer8b512602014-07-22 06:07:095147 typename iterator_traits<_RandomAccessIterator>::difference_type __len = __r - __result_first;
Howard Hinnant3e519522010-05-11 19:42:165148 for (; __first != __last; ++__first)
5149 if (__comp(*__first, *__result_first))
5150 {
5151 *__result_first = *__first;
David Majnemer8b512602014-07-22 06:07:095152 __sift_down<_Compare>(__result_first, __r, __comp, __len, __result_first);
Howard Hinnant3e519522010-05-11 19:42:165153 }
5154 __sort_heap<_Compare>(__result_first, __r, __comp);
5155 }
5156 return __r;
5157}
5158
5159template <class _InputIterator, class _RandomAccessIterator, class _Compare>
5160inline _LIBCPP_INLINE_VISIBILITY
5161_RandomAccessIterator
5162partial_sort_copy(_InputIterator __first, _InputIterator __last,
5163 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp)
5164{
Howard Hinnant145afa12013-08-23 20:10:185165#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165166 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5167 __debug_less<_Compare> __c(__comp);
5168 return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __c);
Howard Hinnant145afa12013-08-23 20:10:185169#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165170 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5171 return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __comp);
Howard Hinnant145afa12013-08-23 20:10:185172#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165173}
5174
5175template <class _InputIterator, class _RandomAccessIterator>
5176inline _LIBCPP_INLINE_VISIBILITY
5177_RandomAccessIterator
5178partial_sort_copy(_InputIterator __first, _InputIterator __last,
5179 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last)
5180{
Howard Hinnantce48a112011-06-30 21:18:195181 return _VSTD::partial_sort_copy(__first, __last, __result_first, __result_last,
Howard Hinnant3e519522010-05-11 19:42:165182 __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
5183}
5184
5185// nth_element
5186
5187template <class _Compare, class _RandomAccessIterator>
5188void
5189__nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
5190{
5191 // _Compare is known to be a reference type
5192 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
5193 const difference_type __limit = 7;
5194 while (true)
5195 {
5196 __restart:
Howard Hinnantb34b48192011-12-29 17:45:355197 if (__nth == __last)
5198 return;
Howard Hinnant3e519522010-05-11 19:42:165199 difference_type __len = __last - __first;
5200 switch (__len)
5201 {
5202 case 0:
5203 case 1:
5204 return;
5205 case 2:
5206 if (__comp(*--__last, *__first))
5207 swap(*__first, *__last);
5208 return;
5209 case 3:
5210 {
5211 _RandomAccessIterator __m = __first;
Howard Hinnantce48a112011-06-30 21:18:195212 _VSTD::__sort3<_Compare>(__first, ++__m, --__last, __comp);
Howard Hinnant3e519522010-05-11 19:42:165213 return;
5214 }
5215 }
5216 if (__len <= __limit)
5217 {
5218 __selection_sort<_Compare>(__first, __last, __comp);
5219 return;
5220 }
5221 // __len > __limit >= 3
5222 _RandomAccessIterator __m = __first + __len/2;
5223 _RandomAccessIterator __lm1 = __last;
Howard Hinnantce48a112011-06-30 21:18:195224 unsigned __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, --__lm1, __comp);
Howard Hinnant3e519522010-05-11 19:42:165225 // *__m is median
5226 // partition [__first, __m) < *__m and *__m <= [__m, __last)
5227 // (this inhibits tossing elements equivalent to __m around unnecessarily)
5228 _RandomAccessIterator __i = __first;
5229 _RandomAccessIterator __j = __lm1;
5230 // j points beyond range to be tested, *__lm1 is known to be <= *__m
5231 // The search going up is known to be guarded but the search coming down isn't.
5232 // Prime the downward search with a guard.
5233 if (!__comp(*__i, *__m)) // if *__first == *__m
5234 {
5235 // *__first == *__m, *__first doesn't go in first part
5236 // manually guard downward moving __j against __i
5237 while (true)
5238 {
5239 if (__i == --__j)
5240 {
5241 // *__first == *__m, *__m <= all other elements
5242 // Parition instead into [__first, __i) == *__first and *__first < [__i, __last)
5243 ++__i; // __first + 1
5244 __j = __last;
5245 if (!__comp(*__first, *--__j)) // we need a guard if *__first == *(__last-1)
5246 {
5247 while (true)
5248 {
5249 if (__i == __j)
5250 return; // [__first, __last) all equivalent elements
5251 if (__comp(*__first, *__i))
5252 {
5253 swap(*__i, *__j);
5254 ++__n_swaps;
5255 ++__i;
5256 break;
5257 }
5258 ++__i;
5259 }
5260 }
5261 // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1
5262 if (__i == __j)
5263 return;
5264 while (true)
5265 {
5266 while (!__comp(*__first, *__i))
5267 ++__i;
5268 while (__comp(*__first, *--__j))
5269 ;
5270 if (__i >= __j)
5271 break;
5272 swap(*__i, *__j);
5273 ++__n_swaps;
5274 ++__i;
5275 }
5276 // [__first, __i) == *__first and *__first < [__i, __last)
5277 // The first part is sorted,
5278 if (__nth < __i)
5279 return;
5280 // __nth_element the secod part
5281 // __nth_element<_Compare>(__i, __nth, __last, __comp);
5282 __first = __i;
5283 goto __restart;
5284 }
5285 if (__comp(*__j, *__m))
5286 {
5287 swap(*__i, *__j);
5288 ++__n_swaps;
5289 break; // found guard for downward moving __j, now use unguarded partition
5290 }
5291 }
5292 }
5293 ++__i;
5294 // j points beyond range to be tested, *__lm1 is known to be <= *__m
5295 // if not yet partitioned...
5296 if (__i < __j)
5297 {
5298 // known that *(__i - 1) < *__m
5299 while (true)
5300 {
5301 // __m still guards upward moving __i
5302 while (__comp(*__i, *__m))
5303 ++__i;
5304 // It is now known that a guard exists for downward moving __j
5305 while (!__comp(*--__j, *__m))
5306 ;
5307 if (__i >= __j)
5308 break;
5309 swap(*__i, *__j);
5310 ++__n_swaps;
5311 // It is known that __m != __j
5312 // If __m just moved, follow it
5313 if (__m == __i)
5314 __m = __j;
5315 ++__i;
5316 }
5317 }
5318 // [__first, __i) < *__m and *__m <= [__i, __last)
5319 if (__i != __m && __comp(*__m, *__i))
5320 {
5321 swap(*__i, *__m);
5322 ++__n_swaps;
5323 }
5324 // [__first, __i) < *__i and *__i <= [__i+1, __last)
5325 if (__nth == __i)
5326 return;
5327 if (__n_swaps == 0)
5328 {
5329 // We were given a perfectly partitioned sequence. Coincidence?
5330 if (__nth < __i)
5331 {
5332 // Check for [__first, __i) already sorted
5333 __j = __m = __first;
5334 while (++__j != __i)
5335 {
5336 if (__comp(*__j, *__m))
5337 // not yet sorted, so sort
5338 goto not_sorted;
5339 __m = __j;
5340 }
5341 // [__first, __i) sorted
5342 return;
5343 }
5344 else
5345 {
5346 // Check for [__i, __last) already sorted
5347 __j = __m = __i;
5348 while (++__j != __last)
5349 {
5350 if (__comp(*__j, *__m))
5351 // not yet sorted, so sort
5352 goto not_sorted;
5353 __m = __j;
5354 }
5355 // [__i, __last) sorted
5356 return;
5357 }
5358 }
5359not_sorted:
5360 // __nth_element on range containing __nth
5361 if (__nth < __i)
5362 {
5363 // __nth_element<_Compare>(__first, __nth, __i, __comp);
5364 __last = __i;
5365 }
5366 else
5367 {
5368 // __nth_element<_Compare>(__i+1, __nth, __last, __comp);
5369 __first = ++__i;
5370 }
5371 }
5372}
5373
5374template <class _RandomAccessIterator, class _Compare>
5375inline _LIBCPP_INLINE_VISIBILITY
5376void
5377nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
5378{
Howard Hinnant145afa12013-08-23 20:10:185379#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165380 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5381 __debug_less<_Compare> __c(__comp);
5382 __nth_element<_Comp_ref>(__first, __nth, __last, __c);
Howard Hinnant145afa12013-08-23 20:10:185383#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165384 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5385 __nth_element<_Comp_ref>(__first, __nth, __last, __comp);
Howard Hinnant145afa12013-08-23 20:10:185386#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165387}
5388
5389template <class _RandomAccessIterator>
5390inline _LIBCPP_INLINE_VISIBILITY
5391void
5392nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last)
5393{
Howard Hinnantce48a112011-06-30 21:18:195394 _VSTD::nth_element(__first, __nth, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnant3e519522010-05-11 19:42:165395}
5396
5397// includes
5398
5399template <class _Compare, class _InputIterator1, class _InputIterator2>
5400bool
5401__includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
5402 _Compare __comp)
5403{
5404 for (; __first2 != __last2; ++__first1)
5405 {
5406 if (__first1 == __last1 || __comp(*__first2, *__first1))
5407 return false;
5408 if (!__comp(*__first1, *__first2))
5409 ++__first2;
5410 }
5411 return true;
5412}
5413
5414template <class _InputIterator1, class _InputIterator2, class _Compare>
5415inline _LIBCPP_INLINE_VISIBILITY
5416bool
5417includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
5418 _Compare __comp)
5419{
Howard Hinnant145afa12013-08-23 20:10:185420#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165421 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5422 __debug_less<_Compare> __c(__comp);
5423 return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __c);
Howard Hinnant145afa12013-08-23 20:10:185424#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165425 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5426 return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
Howard Hinnant145afa12013-08-23 20:10:185427#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165428}
5429
5430template <class _InputIterator1, class _InputIterator2>
5431inline _LIBCPP_INLINE_VISIBILITY
5432bool
5433includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2)
5434{
Howard Hinnantce48a112011-06-30 21:18:195435 return _VSTD::includes(__first1, __last1, __first2, __last2,
Howard Hinnant3e519522010-05-11 19:42:165436 __less<typename iterator_traits<_InputIterator1>::value_type,
5437 typename iterator_traits<_InputIterator2>::value_type>());
5438}
5439
5440// set_union
5441
5442template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5443_OutputIterator
5444__set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5445 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5446{
5447 for (; __first1 != __last1; ++__result)
5448 {
5449 if (__first2 == __last2)
Howard Hinnantce48a112011-06-30 21:18:195450 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnant3e519522010-05-11 19:42:165451 if (__comp(*__first2, *__first1))
5452 {
5453 *__result = *__first2;
5454 ++__first2;
5455 }
5456 else
5457 {
Howard Hinnant3e519522010-05-11 19:42:165458 if (!__comp(*__first1, *__first2))
5459 ++__first2;
Marshall Clow05da5b02017-10-30 15:50:005460 *__result = *__first1;
Howard Hinnant3e519522010-05-11 19:42:165461 ++__first1;
5462 }
5463 }
Howard Hinnantce48a112011-06-30 21:18:195464 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnant3e519522010-05-11 19:42:165465}
5466
5467template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5468inline _LIBCPP_INLINE_VISIBILITY
5469_OutputIterator
5470set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5471 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5472{
Howard Hinnant145afa12013-08-23 20:10:185473#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165474 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5475 __debug_less<_Compare> __c(__comp);
5476 return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant145afa12013-08-23 20:10:185477#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165478 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5479 return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant145afa12013-08-23 20:10:185480#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165481}
5482
5483template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5484inline _LIBCPP_INLINE_VISIBILITY
5485_OutputIterator
5486set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5487 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5488{
Howard Hinnantce48a112011-06-30 21:18:195489 return _VSTD::set_union(__first1, __last1, __first2, __last2, __result,
Howard Hinnant3e519522010-05-11 19:42:165490 __less<typename iterator_traits<_InputIterator1>::value_type,
5491 typename iterator_traits<_InputIterator2>::value_type>());
5492}
5493
5494// set_intersection
5495
5496template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5497_OutputIterator
5498__set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5499 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5500{
5501 while (__first1 != __last1 && __first2 != __last2)
5502 {
5503 if (__comp(*__first1, *__first2))
5504 ++__first1;
5505 else
5506 {
5507 if (!__comp(*__first2, *__first1))
5508 {
5509 *__result = *__first1;
5510 ++__result;
5511 ++__first1;
5512 }
5513 ++__first2;
5514 }
5515 }
5516 return __result;
5517}
5518
5519template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5520inline _LIBCPP_INLINE_VISIBILITY
5521_OutputIterator
5522set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5523 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5524{
Howard Hinnant145afa12013-08-23 20:10:185525#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165526 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5527 __debug_less<_Compare> __c(__comp);
5528 return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant145afa12013-08-23 20:10:185529#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165530 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5531 return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant145afa12013-08-23 20:10:185532#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165533}
5534
5535template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5536inline _LIBCPP_INLINE_VISIBILITY
5537_OutputIterator
5538set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5539 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5540{
Howard Hinnantce48a112011-06-30 21:18:195541 return _VSTD::set_intersection(__first1, __last1, __first2, __last2, __result,
Howard Hinnant3e519522010-05-11 19:42:165542 __less<typename iterator_traits<_InputIterator1>::value_type,
5543 typename iterator_traits<_InputIterator2>::value_type>());
5544}
5545
5546// set_difference
5547
5548template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5549_OutputIterator
5550__set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5551 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5552{
5553 while (__first1 != __last1)
5554 {
5555 if (__first2 == __last2)
Howard Hinnantce48a112011-06-30 21:18:195556 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnant3e519522010-05-11 19:42:165557 if (__comp(*__first1, *__first2))
5558 {
5559 *__result = *__first1;
5560 ++__result;
5561 ++__first1;
5562 }
5563 else
5564 {
5565 if (!__comp(*__first2, *__first1))
5566 ++__first1;
5567 ++__first2;
5568 }
5569 }
5570 return __result;
5571}
5572
5573template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5574inline _LIBCPP_INLINE_VISIBILITY
5575_OutputIterator
5576set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5577 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5578{
Howard Hinnant145afa12013-08-23 20:10:185579#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165580 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5581 __debug_less<_Compare> __c(__comp);
5582 return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant145afa12013-08-23 20:10:185583#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165584 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5585 return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant145afa12013-08-23 20:10:185586#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165587}
5588
5589template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5590inline _LIBCPP_INLINE_VISIBILITY
5591_OutputIterator
5592set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5593 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5594{
Howard Hinnantce48a112011-06-30 21:18:195595 return _VSTD::set_difference(__first1, __last1, __first2, __last2, __result,
Howard Hinnant3e519522010-05-11 19:42:165596 __less<typename iterator_traits<_InputIterator1>::value_type,
5597 typename iterator_traits<_InputIterator2>::value_type>());
5598}
5599
5600// set_symmetric_difference
5601
5602template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5603_OutputIterator
5604__set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5605 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5606{
5607 while (__first1 != __last1)
5608 {
5609 if (__first2 == __last2)
Howard Hinnantce48a112011-06-30 21:18:195610 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnant3e519522010-05-11 19:42:165611 if (__comp(*__first1, *__first2))
5612 {
5613 *__result = *__first1;
5614 ++__result;
5615 ++__first1;
5616 }
5617 else
5618 {
5619 if (__comp(*__first2, *__first1))
5620 {
5621 *__result = *__first2;
5622 ++__result;
5623 }
5624 else
5625 ++__first1;
5626 ++__first2;
5627 }
5628 }
Howard Hinnantce48a112011-06-30 21:18:195629 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnant3e519522010-05-11 19:42:165630}
5631
5632template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5633inline _LIBCPP_INLINE_VISIBILITY
5634_OutputIterator
5635set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5636 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5637{
Howard Hinnant145afa12013-08-23 20:10:185638#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165639 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5640 __debug_less<_Compare> __c(__comp);
5641 return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant145afa12013-08-23 20:10:185642#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165643 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5644 return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant145afa12013-08-23 20:10:185645#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165646}
5647
5648template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5649inline _LIBCPP_INLINE_VISIBILITY
5650_OutputIterator
5651set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5652 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5653{
Howard Hinnantce48a112011-06-30 21:18:195654 return _VSTD::set_symmetric_difference(__first1, __last1, __first2, __last2, __result,
Howard Hinnant3e519522010-05-11 19:42:165655 __less<typename iterator_traits<_InputIterator1>::value_type,
5656 typename iterator_traits<_InputIterator2>::value_type>());
5657}
5658
5659// lexicographical_compare
5660
5661template <class _Compare, class _InputIterator1, class _InputIterator2>
Marshall Clow1b9a4ff2018-01-22 20:44:335662_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Howard Hinnant3e519522010-05-11 19:42:165663__lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5664 _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
5665{
Eric Fiselier910285b2014-10-27 19:28:205666 for (; __first2 != __last2; ++__first1, (void) ++__first2)
Howard Hinnant3e519522010-05-11 19:42:165667 {
5668 if (__first1 == __last1 || __comp(*__first1, *__first2))
5669 return true;
5670 if (__comp(*__first2, *__first1))
5671 return false;
5672 }
5673 return false;
5674}
5675
5676template <class _InputIterator1, class _InputIterator2, class _Compare>
Marshall Clow1b9a4ff2018-01-22 20:44:335677inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:165678bool
5679lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5680 _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
5681{
Howard Hinnant145afa12013-08-23 20:10:185682#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165683 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5684 __debug_less<_Compare> __c(__comp);
5685 return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __c);
Howard Hinnant145afa12013-08-23 20:10:185686#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165687 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5688 return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
Howard Hinnant145afa12013-08-23 20:10:185689#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165690}
5691
5692template <class _InputIterator1, class _InputIterator2>
Marshall Clow1b9a4ff2018-01-22 20:44:335693inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:165694bool
5695lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5696 _InputIterator2 __first2, _InputIterator2 __last2)
5697{
Howard Hinnantce48a112011-06-30 21:18:195698 return _VSTD::lexicographical_compare(__first1, __last1, __first2, __last2,
Howard Hinnant3e519522010-05-11 19:42:165699 __less<typename iterator_traits<_InputIterator1>::value_type,
5700 typename iterator_traits<_InputIterator2>::value_type>());
5701}
5702
5703// next_permutation
5704
5705template <class _Compare, class _BidirectionalIterator>
5706bool
5707__next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5708{
5709 _BidirectionalIterator __i = __last;
5710 if (__first == __last || __first == --__i)
5711 return false;
5712 while (true)
5713 {
5714 _BidirectionalIterator __ip1 = __i;
5715 if (__comp(*--__i, *__ip1))
5716 {
5717 _BidirectionalIterator __j = __last;
5718 while (!__comp(*__i, *--__j))
5719 ;
5720 swap(*__i, *__j);
Howard Hinnantce48a112011-06-30 21:18:195721 _VSTD::reverse(__ip1, __last);
Howard Hinnant3e519522010-05-11 19:42:165722 return true;
5723 }
5724 if (__i == __first)
5725 {
Howard Hinnantce48a112011-06-30 21:18:195726 _VSTD::reverse(__first, __last);
Howard Hinnant3e519522010-05-11 19:42:165727 return false;
5728 }
5729 }
5730}
5731
5732template <class _BidirectionalIterator, class _Compare>
5733inline _LIBCPP_INLINE_VISIBILITY
5734bool
5735next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5736{
Howard Hinnant145afa12013-08-23 20:10:185737#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165738 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5739 __debug_less<_Compare> __c(__comp);
5740 return __next_permutation<_Comp_ref>(__first, __last, __c);
Howard Hinnant145afa12013-08-23 20:10:185741#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165742 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5743 return __next_permutation<_Comp_ref>(__first, __last, __comp);
Howard Hinnant145afa12013-08-23 20:10:185744#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165745}
5746
5747template <class _BidirectionalIterator>
5748inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb3371f62010-08-22 00:02:435749bool
Howard Hinnant3e519522010-05-11 19:42:165750next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
5751{
Howard Hinnantce48a112011-06-30 21:18:195752 return _VSTD::next_permutation(__first, __last,
Howard Hinnant3e519522010-05-11 19:42:165753 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
5754}
5755
5756// prev_permutation
5757
5758template <class _Compare, class _BidirectionalIterator>
5759bool
5760__prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5761{
5762 _BidirectionalIterator __i = __last;
5763 if (__first == __last || __first == --__i)
5764 return false;
5765 while (true)
5766 {
5767 _BidirectionalIterator __ip1 = __i;
5768 if (__comp(*__ip1, *--__i))
5769 {
5770 _BidirectionalIterator __j = __last;
5771 while (!__comp(*--__j, *__i))
5772 ;
5773 swap(*__i, *__j);
Howard Hinnantce48a112011-06-30 21:18:195774 _VSTD::reverse(__ip1, __last);
Howard Hinnant3e519522010-05-11 19:42:165775 return true;
5776 }
5777 if (__i == __first)
5778 {
Howard Hinnantce48a112011-06-30 21:18:195779 _VSTD::reverse(__first, __last);
Howard Hinnant3e519522010-05-11 19:42:165780 return false;
5781 }
5782 }
5783}
5784
5785template <class _BidirectionalIterator, class _Compare>
5786inline _LIBCPP_INLINE_VISIBILITY
5787bool
5788prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5789{
Howard Hinnant145afa12013-08-23 20:10:185790#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165791 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5792 __debug_less<_Compare> __c(__comp);
5793 return __prev_permutation<_Comp_ref>(__first, __last, __c);
Howard Hinnant145afa12013-08-23 20:10:185794#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165795 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5796 return __prev_permutation<_Comp_ref>(__first, __last, __comp);
Howard Hinnant145afa12013-08-23 20:10:185797#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165798}
5799
5800template <class _BidirectionalIterator>
5801inline _LIBCPP_INLINE_VISIBILITY
5802bool
5803prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
5804{
Howard Hinnantce48a112011-06-30 21:18:195805 return _VSTD::prev_permutation(__first, __last,
Howard Hinnant3e519522010-05-11 19:42:165806 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
5807}
5808
Howard Hinnant3e519522010-05-11 19:42:165809_LIBCPP_END_NAMESPACE_STD
5810
Eric Fiseliera016efb2017-05-31 22:07:495811_LIBCPP_POP_MACROS
5812
Howard Hinnant3e519522010-05-11 19:42:165813#endif // _LIBCPP_ALGORITHM