blob: 74a326dbf5ea4230934072f7f6248914e728d7b6 [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>
Marshall Clowe8ea8292018-01-22 21:43:04239 constexpr ForwardIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16240 remove(ForwardIterator first, ForwardIterator last, const T& value);
241
242template <class ForwardIterator, class Predicate>
Marshall Clowe8ea8292018-01-22 21:43:04243 constexpr ForwardIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16244 remove_if(ForwardIterator first, ForwardIterator last, Predicate pred);
245
246template <class InputIterator, class OutputIterator, class T>
Marshall Clowe8ea8292018-01-22 21:43:04247 constexpr OutputIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16248 remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value);
249
250template <class InputIterator, class OutputIterator, class Predicate>
Marshall Clowe8ea8292018-01-22 21:43:04251 constexpr OutputIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16252 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>
Marshall Clowe8ea8292018-01-22 21:43:04275 constexpr OutputIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16276 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 Clow8da1a482018-01-22 23:10:40415 constexpr 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>
Marshall Clow8da1a482018-01-22 23:10:40437 constexpr bool // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16438 includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
439
440template <class InputIterator1, class InputIterator2, class Compare>
Marshall Clow8da1a482018-01-22 23:10:40441 constexpr bool // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16442 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>
Marshall Clow8da1a482018-01-22 23:10:40455 constexpr OutputIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16456 set_intersection(InputIterator1 first1, InputIterator1 last1,
457 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
458
459template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
Marshall Clow8da1a482018-01-22 23:10:40460 constexpr OutputIterator // constexpr in C++20
Howard Hinnant3e519522010-05-11 19:42:16461 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>
Marshall Clowe02ee4f2018-08-17 16:07:48648#include <bit>
Howard Hinnant5d1a7012013-08-14 18:00:20649
Eric Fiselierc1bd9192014-08-10 23:53:08650#include <__debug>
651
Howard Hinnant073458b2011-10-17 20:05:10652#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnant3e519522010-05-11 19:42:16653#pragma GCC system_header
Howard Hinnant073458b2011-10-17 20:05:10654#endif
Howard Hinnant3e519522010-05-11 19:42:16655
Eric Fiseliera016efb2017-05-31 22:07:49656_LIBCPP_PUSH_MACROS
657#include <__undef_macros>
658
659
Howard Hinnant3e519522010-05-11 19:42:16660_LIBCPP_BEGIN_NAMESPACE_STD
661
Marshall Clow9d67c6d2014-02-19 16:51:35662// I'd like to replace these with _VSTD::equal_to<void>, but can't because:
663// * That only works with C++14 and later, and
664// * We haven't included <functional> here.
Howard Hinnant3e519522010-05-11 19:42:16665template <class _T1, class _T2 = _T1>
666struct __equal_to
667{
Marshall Clowd8098f92018-07-14 04:15:19668 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
669 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(const _T1& __x, const _T2& __y) const {return __x == __y;}
670 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(const _T2& __x, const _T1& __y) const {return __x == __y;}
671 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(const _T2& __x, const _T2& __y) const {return __x == __y;}
Howard Hinnant3e519522010-05-11 19:42:16672};
673
674template <class _T1>
675struct __equal_to<_T1, _T1>
676{
Marshall Clow9d67c6d2014-02-19 16:51:35677 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
678 bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
Howard Hinnant3e519522010-05-11 19:42:16679};
680
681template <class _T1>
682struct __equal_to<const _T1, _T1>
683{
Marshall Clow9d67c6d2014-02-19 16:51:35684 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
685 bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
Howard Hinnant3e519522010-05-11 19:42:16686};
687
688template <class _T1>
689struct __equal_to<_T1, const _T1>
690{
Marshall Clow9d67c6d2014-02-19 16:51:35691 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
692 bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
Howard Hinnant3e519522010-05-11 19:42:16693};
694
695template <class _T1, class _T2 = _T1>
696struct __less
697{
Aditya Kumar331fb802016-08-25 11:52:38698 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Marshall Clow9d67c6d2014-02-19 16:51:35699 bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
700
701 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
702 bool operator()(const _T1& __x, const _T2& __y) const {return __x < __y;}
703
704 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
705 bool operator()(const _T2& __x, const _T1& __y) const {return __x < __y;}
706
707 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
708 bool operator()(const _T2& __x, const _T2& __y) const {return __x < __y;}
Howard Hinnant3e519522010-05-11 19:42:16709};
710
711template <class _T1>
712struct __less<_T1, _T1>
713{
Marshall Clow9d67c6d2014-02-19 16:51:35714 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
715 bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
Howard Hinnant3e519522010-05-11 19:42:16716};
717
718template <class _T1>
719struct __less<const _T1, _T1>
720{
Marshall Clow9d67c6d2014-02-19 16:51:35721 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
722 bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
Howard Hinnant3e519522010-05-11 19:42:16723};
724
725template <class _T1>
726struct __less<_T1, const _T1>
727{
Marshall Clow9d67c6d2014-02-19 16:51:35728 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
729 bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
Howard Hinnant3e519522010-05-11 19:42:16730};
731
732template <class _Predicate>
Marshall Clowa763b362017-08-28 23:16:13733class __invert // invert the sense of a comparison
Howard Hinnant3e519522010-05-11 19:42:16734{
735private:
736 _Predicate __p_;
737public:
Marshall Clowa763b362017-08-28 23:16:13738 _LIBCPP_INLINE_VISIBILITY __invert() {}
Howard Hinnant3e519522010-05-11 19:42:16739
740 _LIBCPP_INLINE_VISIBILITY
Marshall Clowa763b362017-08-28 23:16:13741 explicit __invert(_Predicate __p) : __p_(__p) {}
Howard Hinnant3e519522010-05-11 19:42:16742
743 template <class _T1>
744 _LIBCPP_INLINE_VISIBILITY
745 bool operator()(const _T1& __x) {return !__p_(__x);}
746
747 template <class _T1, class _T2>
748 _LIBCPP_INLINE_VISIBILITY
Marshall Clowa763b362017-08-28 23:16:13749 bool operator()(const _T1& __x, const _T2& __y) {return __p_(__y, __x);}
Howard Hinnant3e519522010-05-11 19:42:16750};
751
Howard Hinnant145afa12013-08-23 20:10:18752#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:16753
754template <class _Compare>
755struct __debug_less
756{
757 _Compare __comp_;
758 __debug_less(_Compare& __c) : __comp_(__c) {}
Eric Fiselier331d2152016-07-19 23:27:18759
Howard Hinnant3e519522010-05-11 19:42:16760 template <class _Tp, class _Up>
761 bool operator()(const _Tp& __x, const _Up& __y)
762 {
763 bool __r = __comp_(__x, __y);
764 if (__r)
Eric Fiselier331d2152016-07-19 23:27:18765 __do_compare_assert(0, __y, __x);
Howard Hinnant3e519522010-05-11 19:42:16766 return __r;
767 }
Eric Fiselier331d2152016-07-19 23:27:18768
769 template <class _LHS, class _RHS>
770 inline _LIBCPP_INLINE_VISIBILITY
771 decltype((void)_VSTD::declval<_Compare&>()(
772 _VSTD::declval<_LHS const&>(), _VSTD::declval<_RHS const&>()))
773 __do_compare_assert(int, _LHS const& __l, _RHS const& __r) {
774 _LIBCPP_ASSERT(!__comp_(__l, __r),
775 "Comparator does not induce a strict weak ordering");
776 }
777
778 template <class _LHS, class _RHS>
779 inline _LIBCPP_INLINE_VISIBILITY
780 void __do_compare_assert(long, _LHS const&, _RHS const&) {}
Howard Hinnant3e519522010-05-11 19:42:16781};
782
Howard Hinnant145afa12013-08-23 20:10:18783#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:16784
Howard Hinnant3e519522010-05-11 19:42:16785// all_of
786
787template <class _InputIterator, class _Predicate>
Marshall Clow706ffef2018-01-15 17:20:36788inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:16789bool
790all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
791{
792 for (; __first != __last; ++__first)
793 if (!__pred(*__first))
794 return false;
795 return true;
796}
797
798// any_of
799
800template <class _InputIterator, class _Predicate>
Marshall Clow706ffef2018-01-15 17:20:36801inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:16802bool
803any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
804{
805 for (; __first != __last; ++__first)
806 if (__pred(*__first))
807 return true;
808 return false;
809}
810
811// none_of
812
813template <class _InputIterator, class _Predicate>
Marshall Clow706ffef2018-01-15 17:20:36814inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:16815bool
816none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
817{
818 for (; __first != __last; ++__first)
819 if (__pred(*__first))
820 return false;
821 return true;
822}
823
824// for_each
825
826template <class _InputIterator, class _Function>
Marshall Clow1b9a4ff2018-01-22 20:44:33827inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:16828_Function
829for_each(_InputIterator __first, _InputIterator __last, _Function __f)
830{
831 for (; __first != __last; ++__first)
832 __f(*__first);
Marshall Clow1c7fe122016-11-14 18:22:19833 return __f;
Howard Hinnant3e519522010-05-11 19:42:16834}
835
Marshall Clow1d029962017-05-25 13:40:57836#if _LIBCPP_STD_VER > 14
Marshall Clowd5c65ff2017-05-25 02:29:54837// for_each_n
838
839template <class _InputIterator, class _Size, class _Function>
Marshall Clow1b9a4ff2018-01-22 20:44:33840inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clowd5c65ff2017-05-25 02:29:54841_InputIterator
842for_each_n(_InputIterator __first, _Size __orig_n, _Function __f)
843{
844 typedef decltype(__convert_to_integral(__orig_n)) _IntegralSize;
845 _IntegralSize __n = __orig_n;
846 while (__n > 0)
847 {
848 __f(*__first);
849 ++__first;
850 --__n;
851 }
852 return __first;
853}
Marshall Clow1d029962017-05-25 13:40:57854#endif
Marshall Clowd5c65ff2017-05-25 02:29:54855
Howard Hinnant3e519522010-05-11 19:42:16856// find
857
858template <class _InputIterator, class _Tp>
Marshall Clow49c76432018-01-15 16:16:32859inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:16860_InputIterator
Howard Hinnante4383372011-10-22 20:59:45861find(_InputIterator __first, _InputIterator __last, const _Tp& __value_)
Howard Hinnant3e519522010-05-11 19:42:16862{
863 for (; __first != __last; ++__first)
Howard Hinnante4383372011-10-22 20:59:45864 if (*__first == __value_)
Howard Hinnant3e519522010-05-11 19:42:16865 break;
866 return __first;
867}
868
869// find_if
870
871template <class _InputIterator, class _Predicate>
Marshall Clow49c76432018-01-15 16:16:32872inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:16873_InputIterator
874find_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
875{
876 for (; __first != __last; ++__first)
877 if (__pred(*__first))
878 break;
879 return __first;
880}
881
882// find_if_not
883
884template<class _InputIterator, class _Predicate>
Marshall Clow86944282018-01-15 19:26:05885inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:16886_InputIterator
887find_if_not(_InputIterator __first, _InputIterator __last, _Predicate __pred)
888{
889 for (; __first != __last; ++__first)
890 if (!__pred(*__first))
891 break;
892 return __first;
893}
894
895// find_end
896
897template <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
Marshall Clow86944282018-01-15 19:26:05898_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator1
Howard Hinnant3e519522010-05-11 19:42:16899__find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
900 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred,
901 forward_iterator_tag, forward_iterator_tag)
902{
903 // modeled after search algorithm
904 _ForwardIterator1 __r = __last1; // __last1 is the "default" answer
905 if (__first2 == __last2)
906 return __r;
907 while (true)
908 {
909 while (true)
910 {
911 if (__first1 == __last1) // if source exhausted return last correct answer
912 return __r; // (or __last1 if never found)
913 if (__pred(*__first1, *__first2))
914 break;
915 ++__first1;
916 }
917 // *__first1 matches *__first2, now match elements after here
918 _ForwardIterator1 __m1 = __first1;
919 _ForwardIterator2 __m2 = __first2;
920 while (true)
921 {
922 if (++__m2 == __last2)
923 { // Pattern exhaused, record answer and search for another one
924 __r = __first1;
925 ++__first1;
926 break;
927 }
928 if (++__m1 == __last1) // Source exhausted, return last answer
929 return __r;
930 if (!__pred(*__m1, *__m2)) // mismatch, restart with a new __first
931 {
932 ++__first1;
933 break;
934 } // else there is a match, check next elements
935 }
936 }
937}
938
939template <class _BinaryPredicate, class _BidirectionalIterator1, class _BidirectionalIterator2>
Marshall Clow86944282018-01-15 19:26:05940_LIBCPP_CONSTEXPR_AFTER_CXX17 _BidirectionalIterator1
Howard Hinnant3e519522010-05-11 19:42:16941__find_end(_BidirectionalIterator1 __first1, _BidirectionalIterator1 __last1,
942 _BidirectionalIterator2 __first2, _BidirectionalIterator2 __last2, _BinaryPredicate __pred,
943 bidirectional_iterator_tag, bidirectional_iterator_tag)
944{
945 // modeled after search algorithm (in reverse)
946 if (__first2 == __last2)
947 return __last1; // Everything matches an empty sequence
948 _BidirectionalIterator1 __l1 = __last1;
949 _BidirectionalIterator2 __l2 = __last2;
950 --__l2;
951 while (true)
952 {
953 // Find last element in sequence 1 that matchs *(__last2-1), with a mininum of loop checks
954 while (true)
955 {
956 if (__first1 == __l1) // return __last1 if no element matches *__first2
957 return __last1;
958 if (__pred(*--__l1, *__l2))
959 break;
960 }
961 // *__l1 matches *__l2, now match elements before here
962 _BidirectionalIterator1 __m1 = __l1;
963 _BidirectionalIterator2 __m2 = __l2;
964 while (true)
965 {
966 if (__m2 == __first2) // If pattern exhausted, __m1 is the answer (works for 1 element pattern)
967 return __m1;
968 if (__m1 == __first1) // Otherwise if source exhaused, pattern not found
969 return __last1;
970 if (!__pred(*--__m1, *--__m2)) // if there is a mismatch, restart with a new __l1
971 {
972 break;
973 } // else there is a match, check next elements
974 }
975 }
976}
977
978template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
Marshall Clow9b0af342014-06-10 18:51:55979_LIBCPP_CONSTEXPR_AFTER_CXX11 _RandomAccessIterator1
Howard Hinnant3e519522010-05-11 19:42:16980__find_end(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
981 _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
982 random_access_iterator_tag, random_access_iterator_tag)
983{
984 // Take advantage of knowing source and pattern lengths. Stop short when source is smaller than pattern
985 typename iterator_traits<_RandomAccessIterator2>::difference_type __len2 = __last2 - __first2;
986 if (__len2 == 0)
987 return __last1;
988 typename iterator_traits<_RandomAccessIterator1>::difference_type __len1 = __last1 - __first1;
989 if (__len1 < __len2)
990 return __last1;
991 const _RandomAccessIterator1 __s = __first1 + (__len2 - 1); // End of pattern match can't go before here
992 _RandomAccessIterator1 __l1 = __last1;
993 _RandomAccessIterator2 __l2 = __last2;
994 --__l2;
995 while (true)
996 {
997 while (true)
998 {
999 if (__s == __l1)
1000 return __last1;
1001 if (__pred(*--__l1, *__l2))
1002 break;
1003 }
1004 _RandomAccessIterator1 __m1 = __l1;
1005 _RandomAccessIterator2 __m2 = __l2;
1006 while (true)
1007 {
1008 if (__m2 == __first2)
1009 return __m1;
1010 // no need to check range on __m1 because __s guarantees we have enough source
1011 if (!__pred(*--__m1, *--__m2))
1012 {
1013 break;
1014 }
1015 }
1016 }
1017}
1018
1019template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Marshall Clow86944282018-01-15 19:26:051020inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161021_ForwardIterator1
1022find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1023 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1024{
Howard Hinnantce48a112011-06-30 21:18:191025 return _VSTD::__find_end<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnant3e519522010-05-11 19:42:161026 (__first1, __last1, __first2, __last2, __pred,
1027 typename iterator_traits<_ForwardIterator1>::iterator_category(),
1028 typename iterator_traits<_ForwardIterator2>::iterator_category());
1029}
1030
1031template <class _ForwardIterator1, class _ForwardIterator2>
Marshall Clow86944282018-01-15 19:26:051032inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161033_ForwardIterator1
1034find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1035 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1036{
1037 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1038 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnantce48a112011-06-30 21:18:191039 return _VSTD::find_end(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnant3e519522010-05-11 19:42:161040}
1041
1042// find_first_of
1043
1044template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Marshall Clow9b0af342014-06-10 18:51:551045_LIBCPP_CONSTEXPR_AFTER_CXX11 _ForwardIterator1
1046__find_first_of_ce(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
Howard Hinnant3e519522010-05-11 19:42:161047 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1048{
1049 for (; __first1 != __last1; ++__first1)
1050 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
1051 if (__pred(*__first1, *__j))
1052 return __first1;
1053 return __last1;
1054}
1055
Marshall Clow9b0af342014-06-10 18:51:551056
1057template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Marshall Clow86944282018-01-15 19:26:051058inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow9b0af342014-06-10 18:51:551059_ForwardIterator1
1060find_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1061 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1062{
1063 return _VSTD::__find_first_of_ce(__first1, __last1, __first2, __last2, __pred);
1064}
1065
Howard Hinnant3e519522010-05-11 19:42:161066template <class _ForwardIterator1, class _ForwardIterator2>
Marshall Clow86944282018-01-15 19:26:051067inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161068_ForwardIterator1
1069find_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1070 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1071{
1072 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1073 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Marshall Clow9b0af342014-06-10 18:51:551074 return _VSTD::__find_first_of_ce(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnant3e519522010-05-11 19:42:161075}
1076
1077// adjacent_find
1078
1079template <class _ForwardIterator, class _BinaryPredicate>
Marshall Clow86944282018-01-15 19:26:051080inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161081_ForwardIterator
1082adjacent_find(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred)
1083{
1084 if (__first != __last)
1085 {
1086 _ForwardIterator __i = __first;
1087 while (++__i != __last)
1088 {
1089 if (__pred(*__first, *__i))
1090 return __first;
1091 __first = __i;
1092 }
1093 }
1094 return __last;
1095}
1096
1097template <class _ForwardIterator>
Marshall Clow86944282018-01-15 19:26:051098inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161099_ForwardIterator
1100adjacent_find(_ForwardIterator __first, _ForwardIterator __last)
1101{
1102 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Howard Hinnantce48a112011-06-30 21:18:191103 return _VSTD::adjacent_find(__first, __last, __equal_to<__v>());
Howard Hinnant3e519522010-05-11 19:42:161104}
1105
1106// count
1107
1108template <class _InputIterator, class _Tp>
Marshall Clow056f15e2018-01-15 19:40:341109inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161110typename iterator_traits<_InputIterator>::difference_type
Howard Hinnante4383372011-10-22 20:59:451111count(_InputIterator __first, _InputIterator __last, const _Tp& __value_)
Howard Hinnant3e519522010-05-11 19:42:161112{
1113 typename iterator_traits<_InputIterator>::difference_type __r(0);
1114 for (; __first != __last; ++__first)
Howard Hinnante4383372011-10-22 20:59:451115 if (*__first == __value_)
Howard Hinnant3e519522010-05-11 19:42:161116 ++__r;
1117 return __r;
1118}
1119
1120// count_if
1121
1122template <class _InputIterator, class _Predicate>
Marshall Clow056f15e2018-01-15 19:40:341123inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161124typename iterator_traits<_InputIterator>::difference_type
1125count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
1126{
1127 typename iterator_traits<_InputIterator>::difference_type __r(0);
1128 for (; __first != __last; ++__first)
1129 if (__pred(*__first))
1130 ++__r;
1131 return __r;
1132}
1133
1134// mismatch
1135
1136template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
Marshall Clow6538e28d2018-01-16 02:04:101137inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161138pair<_InputIterator1, _InputIterator2>
1139mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1140 _InputIterator2 __first2, _BinaryPredicate __pred)
1141{
Marshall Clowbd7c7b52014-09-16 20:40:051142 for (; __first1 != __last1; ++__first1, (void) ++__first2)
Howard Hinnant3e519522010-05-11 19:42:161143 if (!__pred(*__first1, *__first2))
1144 break;
1145 return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
1146}
1147
1148template <class _InputIterator1, class _InputIterator2>
Marshall Clow6538e28d2018-01-16 02:04:101149inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161150pair<_InputIterator1, _InputIterator2>
1151mismatch(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2)
1152{
1153 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1154 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
Howard Hinnantce48a112011-06-30 21:18:191155 return _VSTD::mismatch(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnant3e519522010-05-11 19:42:161156}
1157
Marshall Clow0b0bbd22013-05-09 21:14:231158#if _LIBCPP_STD_VER > 11
1159template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
Marshall Clow6538e28d2018-01-16 02:04:101160inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow0b0bbd22013-05-09 21:14:231161pair<_InputIterator1, _InputIterator2>
1162mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1163 _InputIterator2 __first2, _InputIterator2 __last2,
1164 _BinaryPredicate __pred)
1165{
Marshall Clowbd7c7b52014-09-16 20:40:051166 for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void) ++__first2)
Marshall Clow0b0bbd22013-05-09 21:14:231167 if (!__pred(*__first1, *__first2))
1168 break;
1169 return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
1170}
1171
1172template <class _InputIterator1, class _InputIterator2>
Marshall Clow6538e28d2018-01-16 02:04:101173inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow0b0bbd22013-05-09 21:14:231174pair<_InputIterator1, _InputIterator2>
1175mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1176 _InputIterator2 __first2, _InputIterator2 __last2)
1177{
1178 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1179 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
1180 return _VSTD::mismatch(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
1181}
1182#endif
1183
Howard Hinnant3e519522010-05-11 19:42:161184// equal
1185
1186template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
Marshall Clow6538e28d2018-01-16 02:04:101187inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161188bool
1189equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _BinaryPredicate __pred)
1190{
Eric Fiselier910285b2014-10-27 19:28:201191 for (; __first1 != __last1; ++__first1, (void) ++__first2)
Howard Hinnant3e519522010-05-11 19:42:161192 if (!__pred(*__first1, *__first2))
1193 return false;
1194 return true;
1195}
1196
1197template <class _InputIterator1, class _InputIterator2>
Marshall Clow6538e28d2018-01-16 02:04:101198inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161199bool
1200equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2)
1201{
1202 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1203 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
Howard Hinnantce48a112011-06-30 21:18:191204 return _VSTD::equal(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnant3e519522010-05-11 19:42:161205}
1206
Marshall Clow0b0bbd22013-05-09 21:14:231207#if _LIBCPP_STD_VER > 11
1208template <class _BinaryPredicate, class _InputIterator1, class _InputIterator2>
Marshall Clow6538e28d2018-01-16 02:04:101209inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow0b0bbd22013-05-09 21:14:231210bool
Aditya Kumar331fb802016-08-25 11:52:381211__equal(_InputIterator1 __first1, _InputIterator1 __last1,
Marshall Clow0b0bbd22013-05-09 21:14:231212 _InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred,
1213 input_iterator_tag, input_iterator_tag )
1214{
Eric Fiselier910285b2014-10-27 19:28:201215 for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void) ++__first2)
Marshall Clow0b0bbd22013-05-09 21:14:231216 if (!__pred(*__first1, *__first2))
1217 return false;
1218 return __first1 == __last1 && __first2 == __last2;
1219}
1220
1221template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
Marshall Clow6538e28d2018-01-16 02:04:101222inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow0b0bbd22013-05-09 21:14:231223bool
Aditya Kumar331fb802016-08-25 11:52:381224__equal(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
1225 _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
Marshall Clow0b0bbd22013-05-09 21:14:231226 random_access_iterator_tag, random_access_iterator_tag )
1227{
1228 if ( _VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2))
1229 return false;
1230 return _VSTD::equal<_RandomAccessIterator1, _RandomAccessIterator2,
1231 typename add_lvalue_reference<_BinaryPredicate>::type>
1232 (__first1, __last1, __first2, __pred );
1233}
1234
1235template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
Marshall Clow6538e28d2018-01-16 02:04:101236inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow0b0bbd22013-05-09 21:14:231237bool
Aditya Kumar331fb802016-08-25 11:52:381238equal(_InputIterator1 __first1, _InputIterator1 __last1,
Marshall Clow0b0bbd22013-05-09 21:14:231239 _InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred )
1240{
1241 return _VSTD::__equal<typename add_lvalue_reference<_BinaryPredicate>::type>
Aditya Kumar331fb802016-08-25 11:52:381242 (__first1, __last1, __first2, __last2, __pred,
Marshall Clow0b0bbd22013-05-09 21:14:231243 typename iterator_traits<_InputIterator1>::iterator_category(),
1244 typename iterator_traits<_InputIterator2>::iterator_category());
1245}
1246
1247template <class _InputIterator1, class _InputIterator2>
Marshall Clow6538e28d2018-01-16 02:04:101248inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow0b0bbd22013-05-09 21:14:231249bool
Aditya Kumar331fb802016-08-25 11:52:381250equal(_InputIterator1 __first1, _InputIterator1 __last1,
Marshall Clow0b0bbd22013-05-09 21:14:231251 _InputIterator2 __first2, _InputIterator2 __last2)
1252{
1253 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1254 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
1255 return _VSTD::__equal(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>(),
1256 typename iterator_traits<_InputIterator1>::iterator_category(),
1257 typename iterator_traits<_InputIterator2>::iterator_category());
1258}
1259#endif
1260
Howard Hinnant3e519522010-05-11 19:42:161261// is_permutation
1262
1263template<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Marshall Clow49c76432018-01-15 16:16:321264_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Howard Hinnant3e519522010-05-11 19:42:161265is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1266 _ForwardIterator2 __first2, _BinaryPredicate __pred)
1267{
Marshall Clow49c76432018-01-15 16:16:321268// shorten sequences as much as possible by lopping of any equal prefix
Eric Fiselier910285b2014-10-27 19:28:201269 for (; __first1 != __last1; ++__first1, (void) ++__first2)
Howard Hinnant3e519522010-05-11 19:42:161270 if (!__pred(*__first1, *__first2))
Marshall Clow49c76432018-01-15 16:16:321271 break;
1272 if (__first1 == __last1)
1273 return true;
1274
1275// __first1 != __last1 && *__first1 != *__first2
Howard Hinnant3e519522010-05-11 19:42:161276 typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1;
Howard Hinnantce48a112011-06-30 21:18:191277 _D1 __l1 = _VSTD::distance(__first1, __last1);
Howard Hinnant3e519522010-05-11 19:42:161278 if (__l1 == _D1(1))
1279 return false;
Howard Hinnantce48a112011-06-30 21:18:191280 _ForwardIterator2 __last2 = _VSTD::next(__first2, __l1);
Howard Hinnant3e519522010-05-11 19:42:161281 // For each element in [f1, l1) see if there are the same number of
1282 // equal elements in [f2, l2)
1283 for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i)
1284 {
Marshall Clow49c76432018-01-15 16:16:321285 // Have we already counted the number of *__i in [f1, l1)?
Peter Collingbourne939b1622018-01-26 21:23:271286 _ForwardIterator1 __match = __first1;
1287 for (; __match != __i; ++__match)
1288 if (__pred(*__match, *__i))
1289 break;
1290 if (__match == __i) {
Howard Hinnant3e519522010-05-11 19:42:161291 // Count number of *__i in [f2, l2)
1292 _D1 __c2 = 0;
1293 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
1294 if (__pred(*__i, *__j))
1295 ++__c2;
1296 if (__c2 == 0)
1297 return false;
1298 // Count number of *__i in [__i, l1) (we can start with 1)
1299 _D1 __c1 = 1;
Howard Hinnantce48a112011-06-30 21:18:191300 for (_ForwardIterator1 __j = _VSTD::next(__i); __j != __last1; ++__j)
Howard Hinnant3e519522010-05-11 19:42:161301 if (__pred(*__i, *__j))
1302 ++__c1;
1303 if (__c1 != __c2)
1304 return false;
1305 }
Howard Hinnant3e519522010-05-11 19:42:161306 }
1307 return true;
1308}
1309
1310template<class _ForwardIterator1, class _ForwardIterator2>
Marshall Clow49c76432018-01-15 16:16:321311inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161312bool
1313is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1314 _ForwardIterator2 __first2)
1315{
1316 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1317 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnantce48a112011-06-30 21:18:191318 return _VSTD::is_permutation(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnant3e519522010-05-11 19:42:161319}
1320
Marshall Clow0b0bbd22013-05-09 21:14:231321#if _LIBCPP_STD_VER > 11
1322template<class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
Marshall Clow49c76432018-01-15 16:16:321323_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Marshall Clow0b0bbd22013-05-09 21:14:231324__is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
Aditya Kumar331fb802016-08-25 11:52:381325 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
Marshall Clow0b0bbd22013-05-09 21:14:231326 _BinaryPredicate __pred,
1327 forward_iterator_tag, forward_iterator_tag )
1328{
Marshall Clow49c76432018-01-15 16:16:321329// shorten sequences as much as possible by lopping of any equal prefix
Eric Fiselier847ee132014-10-27 20:26:251330 for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void) ++__first2)
Marshall Clow0b0bbd22013-05-09 21:14:231331 if (!__pred(*__first1, *__first2))
Marshall Clow49c76432018-01-15 16:16:321332 break;
1333 if (__first1 == __last1)
Marshall Clow12c74232018-01-19 18:07:291334 return __first2 == __last2;
Marshall Clow49c76432018-01-15 16:16:321335 else if (__first2 == __last2)
Marshall Clow12c74232018-01-19 18:07:291336 return false;
Marshall Clow49c76432018-01-15 16:16:321337
Marshall Clow0b0bbd22013-05-09 21:14:231338 typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1;
1339 _D1 __l1 = _VSTD::distance(__first1, __last1);
1340
1341 typedef typename iterator_traits<_ForwardIterator2>::difference_type _D2;
Marshall Clowfce85ba2013-05-10 00:16:101342 _D2 __l2 = _VSTD::distance(__first2, __last2);
Marshall Clow0b0bbd22013-05-09 21:14:231343 if (__l1 != __l2)
1344 return false;
1345
1346 // For each element in [f1, l1) see if there are the same number of
1347 // equal elements in [f2, l2)
1348 for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i)
1349 {
Marshall Clow49c76432018-01-15 16:16:321350 // Have we already counted the number of *__i in [f1, l1)?
Peter Collingbourne939b1622018-01-26 21:23:271351 _ForwardIterator1 __match = __first1;
1352 for (; __match != __i; ++__match)
1353 if (__pred(*__match, *__i))
1354 break;
1355 if (__match == __i) {
Marshall Clow0b0bbd22013-05-09 21:14:231356 // Count number of *__i in [f2, l2)
1357 _D1 __c2 = 0;
1358 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
1359 if (__pred(*__i, *__j))
1360 ++__c2;
1361 if (__c2 == 0)
1362 return false;
1363 // Count number of *__i in [__i, l1) (we can start with 1)
1364 _D1 __c1 = 1;
1365 for (_ForwardIterator1 __j = _VSTD::next(__i); __j != __last1; ++__j)
1366 if (__pred(*__i, *__j))
1367 ++__c1;
1368 if (__c1 != __c2)
1369 return false;
1370 }
Marshall Clow0b0bbd22013-05-09 21:14:231371 }
1372 return true;
1373}
1374
1375template<class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
Marshall Clow49c76432018-01-15 16:16:321376_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Marshall Clow0b0bbd22013-05-09 21:14:231377__is_permutation(_RandomAccessIterator1 __first1, _RandomAccessIterator2 __last1,
Aditya Kumar331fb802016-08-25 11:52:381378 _RandomAccessIterator1 __first2, _RandomAccessIterator2 __last2,
Marshall Clow0b0bbd22013-05-09 21:14:231379 _BinaryPredicate __pred,
1380 random_access_iterator_tag, random_access_iterator_tag )
1381{
1382 if ( _VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2))
1383 return false;
1384 return _VSTD::is_permutation<_RandomAccessIterator1, _RandomAccessIterator2,
1385 typename add_lvalue_reference<_BinaryPredicate>::type>
1386 (__first1, __last1, __first2, __pred );
1387}
1388
1389template<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Marshall Clow49c76432018-01-15 16:16:321390inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow0b0bbd22013-05-09 21:14:231391bool
1392is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1393 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
1394 _BinaryPredicate __pred )
1395{
1396 return _VSTD::__is_permutation<typename add_lvalue_reference<_BinaryPredicate>::type>
1397 (__first1, __last1, __first2, __last2, __pred,
1398 typename iterator_traits<_ForwardIterator1>::iterator_category(),
1399 typename iterator_traits<_ForwardIterator2>::iterator_category());
1400}
1401
1402template<class _ForwardIterator1, class _ForwardIterator2>
Marshall Clow49c76432018-01-15 16:16:321403inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow0b0bbd22013-05-09 21:14:231404bool
1405is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1406 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1407{
1408 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1409 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
1410 return _VSTD::__is_permutation(__first1, __last1, __first2, __last2,
1411 __equal_to<__v1, __v2>(),
1412 typename iterator_traits<_ForwardIterator1>::iterator_category(),
1413 typename iterator_traits<_ForwardIterator2>::iterator_category());
1414}
1415#endif
1416
Howard Hinnant3e519522010-05-11 19:42:161417// search
Marshall Clowd835e592018-01-08 19:18:001418// __search is in <functional>
Howard Hinnant3e519522010-05-11 19:42:161419
1420template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Marshall Clow12f0a772018-01-16 15:48:271421inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161422_ForwardIterator1
1423search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1424 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1425{
Howard Hinnantce48a112011-06-30 21:18:191426 return _VSTD::__search<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnant3e519522010-05-11 19:42:161427 (__first1, __last1, __first2, __last2, __pred,
Marshall Clow28cc4dd2016-03-08 15:12:521428 typename iterator_traits<_ForwardIterator1>::iterator_category(),
1429 typename iterator_traits<_ForwardIterator2>::iterator_category())
1430 .first;
Howard Hinnant3e519522010-05-11 19:42:161431}
1432
1433template <class _ForwardIterator1, class _ForwardIterator2>
Marshall Clow12f0a772018-01-16 15:48:271434inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161435_ForwardIterator1
1436search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1437 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1438{
Marshall Clow28cc4dd2016-03-08 15:12:521439 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1440 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnantce48a112011-06-30 21:18:191441 return _VSTD::search(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnant3e519522010-05-11 19:42:161442}
1443
Marshall Clowd835e592018-01-08 19:18:001444
1445#if _LIBCPP_STD_VER > 14
1446template <class _ForwardIterator, class _Searcher>
Marshall Clow12f0a772018-01-16 15:48:271447_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clowd835e592018-01-08 19:18:001448_ForwardIterator search(_ForwardIterator __f, _ForwardIterator __l, const _Searcher &__s)
1449{ return __s(__f, __l).first; }
1450#endif
1451
Howard Hinnant3e519522010-05-11 19:42:161452// search_n
1453
1454template <class _BinaryPredicate, class _ForwardIterator, class _Size, class _Tp>
Marshall Clow12f0a772018-01-16 15:48:271455_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnant3e519522010-05-11 19:42:161456__search_n(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnante4383372011-10-22 20:59:451457 _Size __count, const _Tp& __value_, _BinaryPredicate __pred, forward_iterator_tag)
Howard Hinnant3e519522010-05-11 19:42:161458{
1459 if (__count <= 0)
1460 return __first;
1461 while (true)
1462 {
Howard Hinnante4383372011-10-22 20:59:451463 // Find first element in sequence that matchs __value_, with a mininum of loop checks
Howard Hinnant3e519522010-05-11 19:42:161464 while (true)
1465 {
Howard Hinnante4383372011-10-22 20:59:451466 if (__first == __last) // return __last if no element matches __value_
Howard Hinnant3e519522010-05-11 19:42:161467 return __last;
Howard Hinnante4383372011-10-22 20:59:451468 if (__pred(*__first, __value_))
Howard Hinnant3e519522010-05-11 19:42:161469 break;
1470 ++__first;
1471 }
Howard Hinnante4383372011-10-22 20:59:451472 // *__first matches __value_, now match elements after here
Howard Hinnant3e519522010-05-11 19:42:161473 _ForwardIterator __m = __first;
1474 _Size __c(0);
1475 while (true)
1476 {
1477 if (++__c == __count) // If pattern exhausted, __first is the answer (works for 1 element pattern)
1478 return __first;
1479 if (++__m == __last) // Otherwise if source exhaused, pattern not found
1480 return __last;
Howard Hinnante4383372011-10-22 20:59:451481 if (!__pred(*__m, __value_)) // if there is a mismatch, restart with a new __first
Howard Hinnant3e519522010-05-11 19:42:161482 {
1483 __first = __m;
1484 ++__first;
1485 break;
1486 } // else there is a match, check next elements
1487 }
1488 }
1489}
1490
1491template <class _BinaryPredicate, class _RandomAccessIterator, class _Size, class _Tp>
Marshall Clow12f0a772018-01-16 15:48:271492_LIBCPP_CONSTEXPR_AFTER_CXX17 _RandomAccessIterator
Howard Hinnant3e519522010-05-11 19:42:161493__search_n(_RandomAccessIterator __first, _RandomAccessIterator __last,
Howard Hinnante4383372011-10-22 20:59:451494 _Size __count, const _Tp& __value_, _BinaryPredicate __pred, random_access_iterator_tag)
Howard Hinnant3e519522010-05-11 19:42:161495{
1496 if (__count <= 0)
1497 return __first;
1498 _Size __len = static_cast<_Size>(__last - __first);
1499 if (__len < __count)
1500 return __last;
1501 const _RandomAccessIterator __s = __last - (__count - 1); // Start of pattern match can't go beyond here
1502 while (true)
1503 {
Howard Hinnante4383372011-10-22 20:59:451504 // Find first element in sequence that matchs __value_, with a mininum of loop checks
Howard Hinnant3e519522010-05-11 19:42:161505 while (true)
1506 {
Howard Hinnantb13fcad2013-04-04 15:40:481507 if (__first >= __s) // return __last if no element matches __value_
Howard Hinnant3e519522010-05-11 19:42:161508 return __last;
Howard Hinnante4383372011-10-22 20:59:451509 if (__pred(*__first, __value_))
Howard Hinnant3e519522010-05-11 19:42:161510 break;
1511 ++__first;
1512 }
Howard Hinnante4383372011-10-22 20:59:451513 // *__first matches __value_, now match elements after here
Howard Hinnant3e519522010-05-11 19:42:161514 _RandomAccessIterator __m = __first;
1515 _Size __c(0);
1516 while (true)
1517 {
1518 if (++__c == __count) // If pattern exhausted, __first is the answer (works for 1 element pattern)
1519 return __first;
1520 ++__m; // no need to check range on __m because __s guarantees we have enough source
Howard Hinnante4383372011-10-22 20:59:451521 if (!__pred(*__m, __value_)) // if there is a mismatch, restart with a new __first
Howard Hinnant3e519522010-05-11 19:42:161522 {
1523 __first = __m;
1524 ++__first;
1525 break;
1526 } // else there is a match, check next elements
1527 }
1528 }
1529}
1530
1531template <class _ForwardIterator, class _Size, class _Tp, class _BinaryPredicate>
Marshall Clow12f0a772018-01-16 15:48:271532inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161533_ForwardIterator
1534search_n(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnante4383372011-10-22 20:59:451535 _Size __count, const _Tp& __value_, _BinaryPredicate __pred)
Howard Hinnant3e519522010-05-11 19:42:161536{
Howard Hinnantce48a112011-06-30 21:18:191537 return _VSTD::__search_n<typename add_lvalue_reference<_BinaryPredicate>::type>
Eric Fiselier51544022015-02-10 16:46:421538 (__first, __last, __convert_to_integral(__count), __value_, __pred,
1539 typename iterator_traits<_ForwardIterator>::iterator_category());
Howard Hinnant3e519522010-05-11 19:42:161540}
1541
1542template <class _ForwardIterator, class _Size, class _Tp>
Marshall Clow12f0a772018-01-16 15:48:271543inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161544_ForwardIterator
Howard Hinnante4383372011-10-22 20:59:451545search_n(_ForwardIterator __first, _ForwardIterator __last, _Size __count, const _Tp& __value_)
Howard Hinnant3e519522010-05-11 19:42:161546{
1547 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Eric Fiselier51544022015-02-10 16:46:421548 return _VSTD::search_n(__first, __last, __convert_to_integral(__count),
1549 __value_, __equal_to<__v, _Tp>());
Howard Hinnant3e519522010-05-11 19:42:161550}
1551
1552// copy
Howard Hinnant3e519522010-05-11 19:42:161553template <class _Iter>
1554inline _LIBCPP_INLINE_VISIBILITY
1555_Iter
1556__unwrap_iter(_Iter __i)
1557{
1558 return __i;
1559}
1560
1561template <class _Tp>
Marshall Clow5b7c98e2017-05-25 14:20:261562inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161563typename enable_if
1564<
Howard Hinnantca740482010-11-19 22:17:281565 is_trivially_copy_assignable<_Tp>::value,
Howard Hinnant3e519522010-05-11 19:42:161566 _Tp*
1567>::type
1568__unwrap_iter(move_iterator<_Tp*> __i)
1569{
1570 return __i.base();
1571}
1572
Howard Hinnantfc88dbd2013-08-23 17:37:051573#if _LIBCPP_DEBUG_LEVEL < 2
1574
Howard Hinnant3e519522010-05-11 19:42:161575template <class _Tp>
Marshall Clow9cad5022018-07-13 16:35:261576inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
Howard Hinnant3e519522010-05-11 19:42:161577typename enable_if
1578<
Howard Hinnantca740482010-11-19 22:17:281579 is_trivially_copy_assignable<_Tp>::value,
Howard Hinnant3e519522010-05-11 19:42:161580 _Tp*
1581>::type
1582__unwrap_iter(__wrap_iter<_Tp*> __i)
1583{
1584 return __i.base();
1585}
1586
Eric Fiselier14bd0bf2016-12-28 05:35:321587#else
1588
1589template <class _Tp>
Marshall Clow9cad5022018-07-13 16:35:261590inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
Eric Fiselier14bd0bf2016-12-28 05:35:321591typename enable_if
1592<
1593 is_trivially_copy_assignable<_Tp>::value,
1594 __wrap_iter<_Tp*>
1595>::type
1596__unwrap_iter(__wrap_iter<_Tp*> __i)
1597{
1598 return __i;
1599}
1600
Howard Hinnantfc88dbd2013-08-23 17:37:051601#endif // _LIBCPP_DEBUG_LEVEL < 2
1602
Howard Hinnant3e519522010-05-11 19:42:161603template <class _InputIterator, class _OutputIterator>
1604inline _LIBCPP_INLINE_VISIBILITY
1605_OutputIterator
1606__copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1607{
Eric Fiselier910285b2014-10-27 19:28:201608 for (; __first != __last; ++__first, (void) ++__result)
Howard Hinnant3e519522010-05-11 19:42:161609 *__result = *__first;
1610 return __result;
1611}
1612
1613template <class _Tp, class _Up>
1614inline _LIBCPP_INLINE_VISIBILITY
1615typename enable_if
1616<
1617 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnantca740482010-11-19 22:17:281618 is_trivially_copy_assignable<_Up>::value,
Howard Hinnant3e519522010-05-11 19:42:161619 _Up*
1620>::type
1621__copy(_Tp* __first, _Tp* __last, _Up* __result)
1622{
1623 const size_t __n = static_cast<size_t>(__last - __first);
Marshall Clow5b312052015-06-02 13:52:161624 if (__n > 0)
1625 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
Howard Hinnant3e519522010-05-11 19:42:161626 return __result + __n;
1627}
1628
1629template <class _InputIterator, class _OutputIterator>
1630inline _LIBCPP_INLINE_VISIBILITY
1631_OutputIterator
1632copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1633{
Howard Hinnantce48a112011-06-30 21:18:191634 return _VSTD::__copy(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnant3e519522010-05-11 19:42:161635}
1636
1637// copy_backward
1638
Howard Hinnantd3d43562013-02-06 21:03:391639template <class _BidirectionalIterator, class _OutputIterator>
Howard Hinnant3e519522010-05-11 19:42:161640inline _LIBCPP_INLINE_VISIBILITY
1641_OutputIterator
Howard Hinnantd3d43562013-02-06 21:03:391642__copy_backward(_BidirectionalIterator __first, _BidirectionalIterator __last, _OutputIterator __result)
Howard Hinnant3e519522010-05-11 19:42:161643{
1644 while (__first != __last)
1645 *--__result = *--__last;
1646 return __result;
1647}
1648
1649template <class _Tp, class _Up>
1650inline _LIBCPP_INLINE_VISIBILITY
1651typename enable_if
1652<
1653 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnantca740482010-11-19 22:17:281654 is_trivially_copy_assignable<_Up>::value,
Howard Hinnant3e519522010-05-11 19:42:161655 _Up*
1656>::type
1657__copy_backward(_Tp* __first, _Tp* __last, _Up* __result)
1658{
1659 const size_t __n = static_cast<size_t>(__last - __first);
Marshall Clow5b312052015-06-02 13:52:161660 if (__n > 0)
1661 {
1662 __result -= __n;
1663 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
1664 }
Howard Hinnant3e519522010-05-11 19:42:161665 return __result;
1666}
1667
1668template <class _BidirectionalIterator1, class _BidirectionalIterator2>
1669inline _LIBCPP_INLINE_VISIBILITY
1670_BidirectionalIterator2
1671copy_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
1672 _BidirectionalIterator2 __result)
1673{
Eric Fiselierfd838222016-12-23 23:37:521674 return _VSTD::__copy_backward(__unwrap_iter(__first),
1675 __unwrap_iter(__last),
1676 __unwrap_iter(__result));
Howard Hinnant3e519522010-05-11 19:42:161677}
1678
1679// copy_if
1680
1681template<class _InputIterator, class _OutputIterator, class _Predicate>
1682inline _LIBCPP_INLINE_VISIBILITY
1683_OutputIterator
1684copy_if(_InputIterator __first, _InputIterator __last,
1685 _OutputIterator __result, _Predicate __pred)
1686{
1687 for (; __first != __last; ++__first)
1688 {
1689 if (__pred(*__first))
1690 {
1691 *__result = *__first;
1692 ++__result;
1693 }
1694 }
1695 return __result;
1696}
1697
1698// copy_n
1699
1700template<class _InputIterator, class _Size, class _OutputIterator>
1701inline _LIBCPP_INLINE_VISIBILITY
1702typename enable_if
1703<
1704 __is_input_iterator<_InputIterator>::value &&
1705 !__is_random_access_iterator<_InputIterator>::value,
1706 _OutputIterator
1707>::type
Eric Fiselier51544022015-02-10 16:46:421708copy_n(_InputIterator __first, _Size __orig_n, _OutputIterator __result)
Howard Hinnant3e519522010-05-11 19:42:161709{
Eric Fiselier51544022015-02-10 16:46:421710 typedef decltype(__convert_to_integral(__orig_n)) _IntegralSize;
1711 _IntegralSize __n = __orig_n;
Howard Hinnant99847d22011-02-27 20:55:391712 if (__n > 0)
1713 {
Howard Hinnant3e519522010-05-11 19:42:161714 *__result = *__first;
Howard Hinnant99847d22011-02-27 20:55:391715 ++__result;
1716 for (--__n; __n > 0; --__n)
1717 {
1718 ++__first;
1719 *__result = *__first;
1720 ++__result;
1721 }
1722 }
Howard Hinnant3e519522010-05-11 19:42:161723 return __result;
1724}
1725
1726template<class _InputIterator, class _Size, class _OutputIterator>
1727inline _LIBCPP_INLINE_VISIBILITY
1728typename enable_if
1729<
1730 __is_random_access_iterator<_InputIterator>::value,
1731 _OutputIterator
1732>::type
Eric Fiselier51544022015-02-10 16:46:421733copy_n(_InputIterator __first, _Size __orig_n, _OutputIterator __result)
Howard Hinnant3e519522010-05-11 19:42:161734{
Eric Fiselier51544022015-02-10 16:46:421735 typedef decltype(__convert_to_integral(__orig_n)) _IntegralSize;
1736 _IntegralSize __n = __orig_n;
Howard Hinnantce48a112011-06-30 21:18:191737 return _VSTD::copy(__first, __first + __n, __result);
Howard Hinnant3e519522010-05-11 19:42:161738}
1739
1740// move
1741
1742template <class _InputIterator, class _OutputIterator>
1743inline _LIBCPP_INLINE_VISIBILITY
1744_OutputIterator
1745__move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1746{
Eric Fiselier910285b2014-10-27 19:28:201747 for (; __first != __last; ++__first, (void) ++__result)
Howard Hinnantce48a112011-06-30 21:18:191748 *__result = _VSTD::move(*__first);
Howard Hinnant3e519522010-05-11 19:42:161749 return __result;
1750}
1751
1752template <class _Tp, class _Up>
1753inline _LIBCPP_INLINE_VISIBILITY
1754typename enable_if
1755<
1756 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnantca740482010-11-19 22:17:281757 is_trivially_copy_assignable<_Up>::value,
Howard Hinnant3e519522010-05-11 19:42:161758 _Up*
1759>::type
1760__move(_Tp* __first, _Tp* __last, _Up* __result)
1761{
1762 const size_t __n = static_cast<size_t>(__last - __first);
Marshall Clow5b312052015-06-02 13:52:161763 if (__n > 0)
1764 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
Howard Hinnant3e519522010-05-11 19:42:161765 return __result + __n;
1766}
1767
1768template <class _InputIterator, class _OutputIterator>
1769inline _LIBCPP_INLINE_VISIBILITY
1770_OutputIterator
1771move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1772{
Howard Hinnantce48a112011-06-30 21:18:191773 return _VSTD::__move(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnant3e519522010-05-11 19:42:161774}
1775
1776// move_backward
1777
1778template <class _InputIterator, class _OutputIterator>
1779inline _LIBCPP_INLINE_VISIBILITY
1780_OutputIterator
1781__move_backward(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1782{
1783 while (__first != __last)
Howard Hinnantce48a112011-06-30 21:18:191784 *--__result = _VSTD::move(*--__last);
Howard Hinnant3e519522010-05-11 19:42:161785 return __result;
1786}
1787
1788template <class _Tp, class _Up>
1789inline _LIBCPP_INLINE_VISIBILITY
1790typename enable_if
1791<
1792 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnantca740482010-11-19 22:17:281793 is_trivially_copy_assignable<_Up>::value,
Howard Hinnant3e519522010-05-11 19:42:161794 _Up*
1795>::type
1796__move_backward(_Tp* __first, _Tp* __last, _Up* __result)
1797{
1798 const size_t __n = static_cast<size_t>(__last - __first);
Marshall Clow5b312052015-06-02 13:52:161799 if (__n > 0)
1800 {
1801 __result -= __n;
1802 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
1803 }
Howard Hinnant3e519522010-05-11 19:42:161804 return __result;
1805}
1806
1807template <class _BidirectionalIterator1, class _BidirectionalIterator2>
1808inline _LIBCPP_INLINE_VISIBILITY
1809_BidirectionalIterator2
1810move_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
1811 _BidirectionalIterator2 __result)
1812{
Howard Hinnantce48a112011-06-30 21:18:191813 return _VSTD::__move_backward(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnant3e519522010-05-11 19:42:161814}
1815
1816// iter_swap
1817
Howard Hinnanta676f7d2011-05-27 15:04:191818// moved to <type_traits> for better swap / noexcept support
Howard Hinnant3e519522010-05-11 19:42:161819
1820// transform
1821
1822template <class _InputIterator, class _OutputIterator, class _UnaryOperation>
Marshall Clow99894b62018-01-19 17:45:391823inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161824_OutputIterator
1825transform(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _UnaryOperation __op)
1826{
Eric Fiselier910285b2014-10-27 19:28:201827 for (; __first != __last; ++__first, (void) ++__result)
Howard Hinnant3e519522010-05-11 19:42:161828 *__result = __op(*__first);
1829 return __result;
1830}
1831
1832template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _BinaryOperation>
Marshall Clow99894b62018-01-19 17:45:391833inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161834_OutputIterator
1835transform(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2,
1836 _OutputIterator __result, _BinaryOperation __binary_op)
1837{
Eric Fiselier910285b2014-10-27 19:28:201838 for (; __first1 != __last1; ++__first1, (void) ++__first2, ++__result)
Howard Hinnant3e519522010-05-11 19:42:161839 *__result = __binary_op(*__first1, *__first2);
1840 return __result;
1841}
1842
1843// replace
1844
1845template <class _ForwardIterator, class _Tp>
Marshall Clow12c74232018-01-19 18:07:291846inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161847void
1848replace(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __old_value, const _Tp& __new_value)
1849{
1850 for (; __first != __last; ++__first)
1851 if (*__first == __old_value)
1852 *__first = __new_value;
1853}
1854
1855// replace_if
1856
1857template <class _ForwardIterator, class _Predicate, class _Tp>
Marshall Clow12c74232018-01-19 18:07:291858inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161859void
1860replace_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, const _Tp& __new_value)
1861{
1862 for (; __first != __last; ++__first)
1863 if (__pred(*__first))
1864 *__first = __new_value;
1865}
1866
1867// replace_copy
1868
1869template <class _InputIterator, class _OutputIterator, class _Tp>
Marshall Clow12c74232018-01-19 18:07:291870inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161871_OutputIterator
1872replace_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
1873 const _Tp& __old_value, const _Tp& __new_value)
1874{
Eric Fiselier910285b2014-10-27 19:28:201875 for (; __first != __last; ++__first, (void) ++__result)
Howard Hinnant3e519522010-05-11 19:42:161876 if (*__first == __old_value)
1877 *__result = __new_value;
1878 else
1879 *__result = *__first;
1880 return __result;
1881}
1882
1883// replace_copy_if
1884
1885template <class _InputIterator, class _OutputIterator, class _Predicate, class _Tp>
Marshall Clow12c74232018-01-19 18:07:291886inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161887_OutputIterator
1888replace_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
1889 _Predicate __pred, const _Tp& __new_value)
1890{
Eric Fiselier910285b2014-10-27 19:28:201891 for (; __first != __last; ++__first, (void) ++__result)
Howard Hinnant3e519522010-05-11 19:42:161892 if (__pred(*__first))
1893 *__result = __new_value;
1894 else
1895 *__result = *__first;
1896 return __result;
1897}
1898
1899// fill_n
1900
1901template <class _OutputIterator, class _Size, class _Tp>
Marshall Clow4bfb9312018-01-20 20:14:321902inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161903_OutputIterator
Howard Hinnant0f242be2013-08-01 17:29:281904__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_)
Howard Hinnant3e519522010-05-11 19:42:161905{
Eric Fiselier910285b2014-10-27 19:28:201906 for (; __n > 0; ++__first, (void) --__n)
Howard Hinnante4383372011-10-22 20:59:451907 *__first = __value_;
Howard Hinnant3e519522010-05-11 19:42:161908 return __first;
1909}
1910
Howard Hinnant3e519522010-05-11 19:42:161911template <class _OutputIterator, class _Size, class _Tp>
Marshall Clow4bfb9312018-01-20 20:14:321912inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161913_OutputIterator
Howard Hinnante4383372011-10-22 20:59:451914fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_)
Howard Hinnant3e519522010-05-11 19:42:161915{
Eric Fiselier51544022015-02-10 16:46:421916 return _VSTD::__fill_n(__first, __convert_to_integral(__n), __value_);
Howard Hinnant3e519522010-05-11 19:42:161917}
1918
1919// fill
1920
1921template <class _ForwardIterator, class _Tp>
Marshall Clow4bfb9312018-01-20 20:14:321922inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161923void
Howard Hinnante4383372011-10-22 20:59:451924__fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, forward_iterator_tag)
Howard Hinnant3e519522010-05-11 19:42:161925{
1926 for (; __first != __last; ++__first)
Howard Hinnante4383372011-10-22 20:59:451927 *__first = __value_;
Howard Hinnant3e519522010-05-11 19:42:161928}
1929
1930template <class _RandomAccessIterator, class _Tp>
Marshall Clow4bfb9312018-01-20 20:14:321931inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161932void
Howard Hinnante4383372011-10-22 20:59:451933__fill(_RandomAccessIterator __first, _RandomAccessIterator __last, const _Tp& __value_, random_access_iterator_tag)
Howard Hinnant3e519522010-05-11 19:42:161934{
Howard Hinnante4383372011-10-22 20:59:451935 _VSTD::fill_n(__first, __last - __first, __value_);
Howard Hinnant3e519522010-05-11 19:42:161936}
1937
1938template <class _ForwardIterator, class _Tp>
Marshall Clow4bfb9312018-01-20 20:14:321939inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161940void
Howard Hinnante4383372011-10-22 20:59:451941fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnant3e519522010-05-11 19:42:161942{
Howard Hinnante4383372011-10-22 20:59:451943 _VSTD::__fill(__first, __last, __value_, typename iterator_traits<_ForwardIterator>::iterator_category());
Howard Hinnant3e519522010-05-11 19:42:161944}
1945
1946// generate
1947
1948template <class _ForwardIterator, class _Generator>
Marshall Clow4bfb9312018-01-20 20:14:321949inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161950void
1951generate(_ForwardIterator __first, _ForwardIterator __last, _Generator __gen)
1952{
1953 for (; __first != __last; ++__first)
1954 *__first = __gen();
1955}
1956
1957// generate_n
1958
1959template <class _OutputIterator, class _Size, class _Generator>
Marshall Clow4bfb9312018-01-20 20:14:321960inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:161961_OutputIterator
Eric Fiselier51544022015-02-10 16:46:421962generate_n(_OutputIterator __first, _Size __orig_n, _Generator __gen)
Howard Hinnant3e519522010-05-11 19:42:161963{
Eric Fiselier51544022015-02-10 16:46:421964 typedef decltype(__convert_to_integral(__orig_n)) _IntegralSize;
1965 _IntegralSize __n = __orig_n;
Eric Fiselier910285b2014-10-27 19:28:201966 for (; __n > 0; ++__first, (void) --__n)
Howard Hinnant3e519522010-05-11 19:42:161967 *__first = __gen();
1968 return __first;
1969}
1970
1971// remove
1972
1973template <class _ForwardIterator, class _Tp>
Marshall Clowe8ea8292018-01-22 21:43:041974_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnante4383372011-10-22 20:59:451975remove(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnant3e519522010-05-11 19:42:161976{
Howard Hinnante4383372011-10-22 20:59:451977 __first = _VSTD::find(__first, __last, __value_);
Howard Hinnant3e519522010-05-11 19:42:161978 if (__first != __last)
1979 {
1980 _ForwardIterator __i = __first;
1981 while (++__i != __last)
1982 {
Howard Hinnante4383372011-10-22 20:59:451983 if (!(*__i == __value_))
Howard Hinnant3e519522010-05-11 19:42:161984 {
Howard Hinnantce48a112011-06-30 21:18:191985 *__first = _VSTD::move(*__i);
Howard Hinnant3e519522010-05-11 19:42:161986 ++__first;
1987 }
1988 }
1989 }
1990 return __first;
1991}
1992
1993// remove_if
1994
1995template <class _ForwardIterator, class _Predicate>
Marshall Clowe8ea8292018-01-22 21:43:041996_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnant3e519522010-05-11 19:42:161997remove_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
1998{
Howard Hinnantce48a112011-06-30 21:18:191999 __first = _VSTD::find_if<_ForwardIterator, typename add_lvalue_reference<_Predicate>::type>
Howard Hinnant3e519522010-05-11 19:42:162000 (__first, __last, __pred);
2001 if (__first != __last)
2002 {
2003 _ForwardIterator __i = __first;
2004 while (++__i != __last)
2005 {
2006 if (!__pred(*__i))
2007 {
Howard Hinnantce48a112011-06-30 21:18:192008 *__first = _VSTD::move(*__i);
Howard Hinnant3e519522010-05-11 19:42:162009 ++__first;
2010 }
2011 }
2012 }
2013 return __first;
2014}
2015
2016// remove_copy
2017
2018template <class _InputIterator, class _OutputIterator, class _Tp>
Marshall Clowe8ea8292018-01-22 21:43:042019inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:162020_OutputIterator
Howard Hinnante4383372011-10-22 20:59:452021remove_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, const _Tp& __value_)
Howard Hinnant3e519522010-05-11 19:42:162022{
2023 for (; __first != __last; ++__first)
2024 {
Howard Hinnante4383372011-10-22 20:59:452025 if (!(*__first == __value_))
Howard Hinnant3e519522010-05-11 19:42:162026 {
2027 *__result = *__first;
2028 ++__result;
2029 }
2030 }
2031 return __result;
2032}
2033
2034// remove_copy_if
2035
2036template <class _InputIterator, class _OutputIterator, class _Predicate>
Marshall Clowe8ea8292018-01-22 21:43:042037inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:162038_OutputIterator
2039remove_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Predicate __pred)
2040{
2041 for (; __first != __last; ++__first)
2042 {
2043 if (!__pred(*__first))
2044 {
2045 *__result = *__first;
2046 ++__result;
2047 }
2048 }
2049 return __result;
2050}
2051
2052// unique
2053
2054template <class _ForwardIterator, class _BinaryPredicate>
Marshall Clow4bfb9312018-01-20 20:14:322055_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnant3e519522010-05-11 19:42:162056unique(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred)
2057{
Howard Hinnantce48a112011-06-30 21:18:192058 __first = _VSTD::adjacent_find<_ForwardIterator, typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnant3e519522010-05-11 19:42:162059 (__first, __last, __pred);
2060 if (__first != __last)
2061 {
2062 // ... a a ? ...
2063 // f i
2064 _ForwardIterator __i = __first;
2065 for (++__i; ++__i != __last;)
2066 if (!__pred(*__first, *__i))
Howard Hinnantce48a112011-06-30 21:18:192067 *++__first = _VSTD::move(*__i);
Howard Hinnant3e519522010-05-11 19:42:162068 ++__first;
2069 }
2070 return __first;
2071}
2072
2073template <class _ForwardIterator>
Marshall Clow4bfb9312018-01-20 20:14:322074inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:162075_ForwardIterator
2076unique(_ForwardIterator __first, _ForwardIterator __last)
2077{
2078 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Howard Hinnantce48a112011-06-30 21:18:192079 return _VSTD::unique(__first, __last, __equal_to<__v>());
Howard Hinnant3e519522010-05-11 19:42:162080}
2081
2082// unique_copy
2083
2084template <class _BinaryPredicate, class _InputIterator, class _OutputIterator>
Marshall Clow4bfb9312018-01-20 20:14:322085_LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator
Howard Hinnant3e519522010-05-11 19:42:162086__unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred,
2087 input_iterator_tag, output_iterator_tag)
2088{
2089 if (__first != __last)
2090 {
2091 typename iterator_traits<_InputIterator>::value_type __t(*__first);
2092 *__result = __t;
2093 ++__result;
2094 while (++__first != __last)
2095 {
2096 if (!__pred(__t, *__first))
2097 {
2098 __t = *__first;
2099 *__result = __t;
2100 ++__result;
2101 }
2102 }
2103 }
2104 return __result;
2105}
2106
2107template <class _BinaryPredicate, class _ForwardIterator, class _OutputIterator>
Marshall Clow4bfb9312018-01-20 20:14:322108_LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator
Howard Hinnant3e519522010-05-11 19:42:162109__unique_copy(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result, _BinaryPredicate __pred,
2110 forward_iterator_tag, output_iterator_tag)
2111{
2112 if (__first != __last)
2113 {
2114 _ForwardIterator __i = __first;
2115 *__result = *__i;
2116 ++__result;
2117 while (++__first != __last)
2118 {
2119 if (!__pred(*__i, *__first))
2120 {
2121 *__result = *__first;
2122 ++__result;
2123 __i = __first;
2124 }
2125 }
2126 }
2127 return __result;
2128}
2129
2130template <class _BinaryPredicate, class _InputIterator, class _ForwardIterator>
Marshall Clow4bfb9312018-01-20 20:14:322131_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnant3e519522010-05-11 19:42:162132__unique_copy(_InputIterator __first, _InputIterator __last, _ForwardIterator __result, _BinaryPredicate __pred,
2133 input_iterator_tag, forward_iterator_tag)
2134{
2135 if (__first != __last)
2136 {
2137 *__result = *__first;
2138 while (++__first != __last)
2139 if (!__pred(*__result, *__first))
2140 *++__result = *__first;
2141 ++__result;
2142 }
2143 return __result;
2144}
2145
Howard Hinnant3e519522010-05-11 19:42:162146template <class _InputIterator, class _OutputIterator, class _BinaryPredicate>
Marshall Clow4bfb9312018-01-20 20:14:322147inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:162148_OutputIterator
2149unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred)
2150{
Howard Hinnantce48a112011-06-30 21:18:192151 return _VSTD::__unique_copy<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnant3e519522010-05-11 19:42:162152 (__first, __last, __result, __pred,
2153 typename iterator_traits<_InputIterator>::iterator_category(),
2154 typename iterator_traits<_OutputIterator>::iterator_category());
2155}
2156
2157template <class _InputIterator, class _OutputIterator>
Marshall Clow4bfb9312018-01-20 20:14:322158inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:162159_OutputIterator
2160unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
2161{
2162 typedef typename iterator_traits<_InputIterator>::value_type __v;
Howard Hinnantce48a112011-06-30 21:18:192163 return _VSTD::unique_copy(__first, __last, __result, __equal_to<__v>());
Howard Hinnant3e519522010-05-11 19:42:162164}
2165
2166// reverse
2167
2168template <class _BidirectionalIterator>
2169inline _LIBCPP_INLINE_VISIBILITY
2170void
2171__reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirectional_iterator_tag)
2172{
2173 while (__first != __last)
2174 {
2175 if (__first == --__last)
2176 break;
Marshall Clowdef501d2015-11-02 21:34:252177 _VSTD::iter_swap(__first, __last);
Howard Hinnant3e519522010-05-11 19:42:162178 ++__first;
2179 }
2180}
2181
2182template <class _RandomAccessIterator>
2183inline _LIBCPP_INLINE_VISIBILITY
2184void
2185__reverse(_RandomAccessIterator __first, _RandomAccessIterator __last, random_access_iterator_tag)
2186{
2187 if (__first != __last)
2188 for (; __first < --__last; ++__first)
Marshall Clowdef501d2015-11-02 21:34:252189 _VSTD::iter_swap(__first, __last);
Howard Hinnant3e519522010-05-11 19:42:162190}
2191
2192template <class _BidirectionalIterator>
2193inline _LIBCPP_INLINE_VISIBILITY
2194void
2195reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
2196{
Howard Hinnantce48a112011-06-30 21:18:192197 _VSTD::__reverse(__first, __last, typename iterator_traits<_BidirectionalIterator>::iterator_category());
Howard Hinnant3e519522010-05-11 19:42:162198}
2199
2200// reverse_copy
2201
2202template <class _BidirectionalIterator, class _OutputIterator>
Marshall Clowe8ea8292018-01-22 21:43:042203inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:162204_OutputIterator
2205reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last, _OutputIterator __result)
2206{
2207 for (; __first != __last; ++__result)
2208 *__result = *--__last;
2209 return __result;
2210}
2211
2212// rotate
2213
2214template <class _ForwardIterator>
2215_ForwardIterator
Howard Hinnantaca09de2012-08-03 18:01:202216__rotate_left(_ForwardIterator __first, _ForwardIterator __last)
Howard Hinnant3e519522010-05-11 19:42:162217{
Howard Hinnantaca09de2012-08-03 18:01:202218 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
2219 value_type __tmp = _VSTD::move(*__first);
2220 _ForwardIterator __lm1 = _VSTD::move(_VSTD::next(__first), __last, __first);
2221 *__lm1 = _VSTD::move(__tmp);
2222 return __lm1;
2223}
2224
2225template <class _BidirectionalIterator>
2226_BidirectionalIterator
2227__rotate_right(_BidirectionalIterator __first, _BidirectionalIterator __last)
2228{
2229 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
2230 _BidirectionalIterator __lm1 = _VSTD::prev(__last);
2231 value_type __tmp = _VSTD::move(*__lm1);
2232 _BidirectionalIterator __fp1 = _VSTD::move_backward(__first, __lm1, __last);
2233 *__first = _VSTD::move(__tmp);
2234 return __fp1;
2235}
2236
2237template <class _ForwardIterator>
2238_ForwardIterator
2239__rotate_forward(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last)
2240{
Howard Hinnant3e519522010-05-11 19:42:162241 _ForwardIterator __i = __middle;
2242 while (true)
2243 {
2244 swap(*__first, *__i);
2245 ++__first;
2246 if (++__i == __last)
2247 break;
2248 if (__first == __middle)
2249 __middle = __i;
2250 }
2251 _ForwardIterator __r = __first;
2252 if (__first != __middle)
2253 {
2254 __i = __middle;
2255 while (true)
2256 {
2257 swap(*__first, *__i);
2258 ++__first;
2259 if (++__i == __last)
2260 {
2261 if (__first == __middle)
2262 break;
2263 __i = __middle;
2264 }
2265 else if (__first == __middle)
2266 __middle = __i;
2267 }
2268 }
2269 return __r;
2270}
2271
2272template<typename _Integral>
2273inline _LIBCPP_INLINE_VISIBILITY
2274_Integral
Marshall Clow19b40352016-07-26 14:29:452275__algo_gcd(_Integral __x, _Integral __y)
Howard Hinnant3e519522010-05-11 19:42:162276{
2277 do
2278 {
2279 _Integral __t = __x % __y;
2280 __x = __y;
2281 __y = __t;
2282 } while (__y);
2283 return __x;
2284}
2285
2286template<typename _RandomAccessIterator>
2287_RandomAccessIterator
Howard Hinnantaca09de2012-08-03 18:01:202288__rotate_gcd(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last)
Howard Hinnant3e519522010-05-11 19:42:162289{
2290 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
2291 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
Howard Hinnantb3371f62010-08-22 00:02:432292
Howard Hinnant3e519522010-05-11 19:42:162293 const difference_type __m1 = __middle - __first;
2294 const difference_type __m2 = __last - __middle;
2295 if (__m1 == __m2)
2296 {
Howard Hinnantce48a112011-06-30 21:18:192297 _VSTD::swap_ranges(__first, __middle, __middle);
Howard Hinnant3e519522010-05-11 19:42:162298 return __middle;
2299 }
Marshall Clow19b40352016-07-26 14:29:452300 const difference_type __g = _VSTD::__algo_gcd(__m1, __m2);
Howard Hinnant3e519522010-05-11 19:42:162301 for (_RandomAccessIterator __p = __first + __g; __p != __first;)
2302 {
Howard Hinnantaca09de2012-08-03 18:01:202303 value_type __t(_VSTD::move(*--__p));
Howard Hinnant3e519522010-05-11 19:42:162304 _RandomAccessIterator __p1 = __p;
2305 _RandomAccessIterator __p2 = __p1 + __m1;
2306 do
2307 {
Howard Hinnantaca09de2012-08-03 18:01:202308 *__p1 = _VSTD::move(*__p2);
Howard Hinnant3e519522010-05-11 19:42:162309 __p1 = __p2;
2310 const difference_type __d = __last - __p2;
2311 if (__m1 < __d)
2312 __p2 += __m1;
2313 else
2314 __p2 = __first + (__m1 - __d);
2315 } while (__p2 != __p);
Howard Hinnantaca09de2012-08-03 18:01:202316 *__p1 = _VSTD::move(__t);
Howard Hinnant3e519522010-05-11 19:42:162317 }
2318 return __first + __m2;
2319}
2320
2321template <class _ForwardIterator>
2322inline _LIBCPP_INLINE_VISIBILITY
2323_ForwardIterator
Howard Hinnantaca09de2012-08-03 18:01:202324__rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last,
2325 _VSTD::forward_iterator_tag)
2326{
2327 typedef typename _VSTD::iterator_traits<_ForwardIterator>::value_type value_type;
2328 if (_VSTD::is_trivially_move_assignable<value_type>::value)
2329 {
2330 if (_VSTD::next(__first) == __middle)
2331 return _VSTD::__rotate_left(__first, __last);
2332 }
2333 return _VSTD::__rotate_forward(__first, __middle, __last);
2334}
2335
2336template <class _BidirectionalIterator>
2337inline _LIBCPP_INLINE_VISIBILITY
2338_BidirectionalIterator
2339__rotate(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
2340 _VSTD::bidirectional_iterator_tag)
2341{
2342 typedef typename _VSTD::iterator_traits<_BidirectionalIterator>::value_type value_type;
2343 if (_VSTD::is_trivially_move_assignable<value_type>::value)
2344 {
2345 if (_VSTD::next(__first) == __middle)
2346 return _VSTD::__rotate_left(__first, __last);
2347 if (_VSTD::next(__middle) == __last)
2348 return _VSTD::__rotate_right(__first, __last);
2349 }
2350 return _VSTD::__rotate_forward(__first, __middle, __last);
2351}
2352
2353template <class _RandomAccessIterator>
2354inline _LIBCPP_INLINE_VISIBILITY
2355_RandomAccessIterator
2356__rotate(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
2357 _VSTD::random_access_iterator_tag)
2358{
2359 typedef typename _VSTD::iterator_traits<_RandomAccessIterator>::value_type value_type;
2360 if (_VSTD::is_trivially_move_assignable<value_type>::value)
2361 {
2362 if (_VSTD::next(__first) == __middle)
2363 return _VSTD::__rotate_left(__first, __last);
2364 if (_VSTD::next(__middle) == __last)
2365 return _VSTD::__rotate_right(__first, __last);
2366 return _VSTD::__rotate_gcd(__first, __middle, __last);
2367 }
2368 return _VSTD::__rotate_forward(__first, __middle, __last);
2369}
2370
2371template <class _ForwardIterator>
2372inline _LIBCPP_INLINE_VISIBILITY
2373_ForwardIterator
Howard Hinnant3e519522010-05-11 19:42:162374rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last)
2375{
Howard Hinnantaca09de2012-08-03 18:01:202376 if (__first == __middle)
2377 return __last;
2378 if (__middle == __last)
2379 return __first;
Howard Hinnantce48a112011-06-30 21:18:192380 return _VSTD::__rotate(__first, __middle, __last,
Howard Hinnantaca09de2012-08-03 18:01:202381 typename _VSTD::iterator_traits<_ForwardIterator>::iterator_category());
Howard Hinnant3e519522010-05-11 19:42:162382}
2383
2384// rotate_copy
2385
2386template <class _ForwardIterator, class _OutputIterator>
2387inline _LIBCPP_INLINE_VISIBILITY
2388_OutputIterator
2389rotate_copy(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last, _OutputIterator __result)
2390{
Howard Hinnantce48a112011-06-30 21:18:192391 return _VSTD::copy(__first, __middle, _VSTD::copy(__middle, __last, __result));
Howard Hinnant3e519522010-05-11 19:42:162392}
2393
Howard Hinnant3e519522010-05-11 19:42:162394// min_element
2395
2396template <class _ForwardIterator, class _Compare>
Marshall Clow9d67c6d2014-02-19 16:51:352397inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant3e519522010-05-11 19:42:162398_ForwardIterator
Marshall Clow0b0671a2015-05-10 13:53:312399min_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
Howard Hinnant3e519522010-05-11 19:42:162400{
2401 if (__first != __last)
2402 {
2403 _ForwardIterator __i = __first;
2404 while (++__i != __last)
2405 if (__comp(*__i, *__first))
2406 __first = __i;
2407 }
2408 return __first;
2409}
2410
2411template <class _ForwardIterator>
Marshall Clow0b0671a2015-05-10 13:53:312412inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant3e519522010-05-11 19:42:162413_ForwardIterator
2414min_element(_ForwardIterator __first, _ForwardIterator __last)
2415{
Marshall Clow0b0671a2015-05-10 13:53:312416 return _VSTD::min_element(__first, __last,
Howard Hinnant4eb27b72010-08-21 20:10:012417 __less<typename iterator_traits<_ForwardIterator>::value_type>());
2418}
2419
2420// min
2421
2422template <class _Tp, class _Compare>
Marshall Clow9d67c6d2014-02-19 16:51:352423inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant4eb27b72010-08-21 20:10:012424const _Tp&
2425min(const _Tp& __a, const _Tp& __b, _Compare __comp)
2426{
2427 return __comp(__b, __a) ? __b : __a;
2428}
2429
2430template <class _Tp>
Marshall Clow9d67c6d2014-02-19 16:51:352431inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant4eb27b72010-08-21 20:10:012432const _Tp&
2433min(const _Tp& __a, const _Tp& __b)
2434{
Howard Hinnantce48a112011-06-30 21:18:192435 return _VSTD::min(__a, __b, __less<_Tp>());
Howard Hinnant4eb27b72010-08-21 20:10:012436}
2437
Eric Fiselierddda4562017-04-18 23:26:472438#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant54976f22011-08-12 21:56:022439
Howard Hinnant4eb27b72010-08-21 20:10:012440template<class _Tp, class _Compare>
Marshall Clow9d67c6d2014-02-19 16:51:352441inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant4eb27b72010-08-21 20:10:012442_Tp
2443min(initializer_list<_Tp> __t, _Compare __comp)
2444{
Marshall Clow0b0671a2015-05-10 13:53:312445 return *_VSTD::min_element(__t.begin(), __t.end(), __comp);
Howard Hinnant4eb27b72010-08-21 20:10:012446}
2447
2448template<class _Tp>
Marshall Clow9d67c6d2014-02-19 16:51:352449inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant4eb27b72010-08-21 20:10:012450_Tp
2451min(initializer_list<_Tp> __t)
2452{
Marshall Clow0b0671a2015-05-10 13:53:312453 return *_VSTD::min_element(__t.begin(), __t.end(), __less<_Tp>());
Howard Hinnant3e519522010-05-11 19:42:162454}
2455
Eric Fiselierddda4562017-04-18 23:26:472456#endif // _LIBCPP_CXX03_LANG
Howard Hinnant54976f22011-08-12 21:56:022457
Howard Hinnant3e519522010-05-11 19:42:162458// max_element
2459
2460template <class _ForwardIterator, class _Compare>
Marshall Clow9d67c6d2014-02-19 16:51:352461inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant3e519522010-05-11 19:42:162462_ForwardIterator
Marshall Clow0b0671a2015-05-10 13:53:312463max_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
Howard Hinnant3e519522010-05-11 19:42:162464{
2465 if (__first != __last)
2466 {
2467 _ForwardIterator __i = __first;
2468 while (++__i != __last)
2469 if (__comp(*__first, *__i))
2470 __first = __i;
2471 }
2472 return __first;
2473}
2474
Marshall Clow9d67c6d2014-02-19 16:51:352475
Howard Hinnant3e519522010-05-11 19:42:162476template <class _ForwardIterator>
Marshall Clow0b0671a2015-05-10 13:53:312477inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant3e519522010-05-11 19:42:162478_ForwardIterator
2479max_element(_ForwardIterator __first, _ForwardIterator __last)
2480{
Marshall Clow0b0671a2015-05-10 13:53:312481 return _VSTD::max_element(__first, __last,
Howard Hinnant4eb27b72010-08-21 20:10:012482 __less<typename iterator_traits<_ForwardIterator>::value_type>());
2483}
2484
2485// max
2486
2487template <class _Tp, class _Compare>
Marshall Clow9d67c6d2014-02-19 16:51:352488inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant4eb27b72010-08-21 20:10:012489const _Tp&
2490max(const _Tp& __a, const _Tp& __b, _Compare __comp)
2491{
2492 return __comp(__a, __b) ? __b : __a;
2493}
2494
2495template <class _Tp>
Marshall Clow9d67c6d2014-02-19 16:51:352496inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant4eb27b72010-08-21 20:10:012497const _Tp&
2498max(const _Tp& __a, const _Tp& __b)
2499{
Howard Hinnantce48a112011-06-30 21:18:192500 return _VSTD::max(__a, __b, __less<_Tp>());
Howard Hinnant4eb27b72010-08-21 20:10:012501}
2502
Eric Fiselierddda4562017-04-18 23:26:472503#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant54976f22011-08-12 21:56:022504
Howard Hinnant4eb27b72010-08-21 20:10:012505template<class _Tp, class _Compare>
Marshall Clow9d67c6d2014-02-19 16:51:352506inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant4eb27b72010-08-21 20:10:012507_Tp
2508max(initializer_list<_Tp> __t, _Compare __comp)
2509{
Marshall Clow0b0671a2015-05-10 13:53:312510 return *_VSTD::max_element(__t.begin(), __t.end(), __comp);
Howard Hinnant4eb27b72010-08-21 20:10:012511}
2512
2513template<class _Tp>
Marshall Clow9d67c6d2014-02-19 16:51:352514inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant4eb27b72010-08-21 20:10:012515_Tp
2516max(initializer_list<_Tp> __t)
2517{
Marshall Clow0b0671a2015-05-10 13:53:312518 return *_VSTD::max_element(__t.begin(), __t.end(), __less<_Tp>());
Howard Hinnant3e519522010-05-11 19:42:162519}
2520
Eric Fiselierddda4562017-04-18 23:26:472521#endif // _LIBCPP_CXX03_LANG
Howard Hinnant54976f22011-08-12 21:56:022522
Marshall Clow146c14a2016-03-07 22:43:492523#if _LIBCPP_STD_VER > 14
2524// clamp
2525template<class _Tp, class _Compare>
2526inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
2527const _Tp&
2528clamp(const _Tp& __v, const _Tp& __lo, const _Tp& __hi, _Compare __comp)
2529{
2530 _LIBCPP_ASSERT(!__comp(__hi, __lo), "Bad bounds passed to std::clamp");
2531 return __comp(__v, __lo) ? __lo : __comp(__hi, __v) ? __hi : __v;
2532
2533}
2534
2535template<class _Tp>
2536inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
2537const _Tp&
2538clamp(const _Tp& __v, const _Tp& __lo, const _Tp& __hi)
2539{
2540 return _VSTD::clamp(__v, __lo, __hi, __less<_Tp>());
2541}
2542#endif
2543
Howard Hinnant3e519522010-05-11 19:42:162544// minmax_element
2545
2546template <class _ForwardIterator, class _Compare>
Marshall Clow0b0671a2015-05-10 13:53:312547_LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant3e519522010-05-11 19:42:162548std::pair<_ForwardIterator, _ForwardIterator>
2549minmax_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
2550{
2551 std::pair<_ForwardIterator, _ForwardIterator> __result(__first, __first);
2552 if (__first != __last)
2553 {
2554 if (++__first != __last)
2555 {
2556 if (__comp(*__first, *__result.first))
Howard Hinnant3e519522010-05-11 19:42:162557 __result.first = __first;
Howard Hinnant3e519522010-05-11 19:42:162558 else
2559 __result.second = __first;
2560 while (++__first != __last)
2561 {
2562 _ForwardIterator __i = __first;
2563 if (++__first == __last)
2564 {
2565 if (__comp(*__i, *__result.first))
2566 __result.first = __i;
2567 else if (!__comp(*__i, *__result.second))
2568 __result.second = __i;
2569 break;
2570 }
2571 else
2572 {
2573 if (__comp(*__first, *__i))
2574 {
2575 if (__comp(*__first, *__result.first))
2576 __result.first = __first;
2577 if (!__comp(*__i, *__result.second))
2578 __result.second = __i;
2579 }
2580 else
2581 {
2582 if (__comp(*__i, *__result.first))
2583 __result.first = __i;
2584 if (!__comp(*__first, *__result.second))
2585 __result.second = __first;
2586 }
2587 }
2588 }
2589 }
2590 }
2591 return __result;
2592}
2593
2594template <class _ForwardIterator>
Marshall Clow0b0671a2015-05-10 13:53:312595inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant3e519522010-05-11 19:42:162596std::pair<_ForwardIterator, _ForwardIterator>
2597minmax_element(_ForwardIterator __first, _ForwardIterator __last)
2598{
Marshall Clow9d67c6d2014-02-19 16:51:352599 return _VSTD::minmax_element(__first, __last,
2600 __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnant3e519522010-05-11 19:42:162601}
2602
Howard Hinnant4eb27b72010-08-21 20:10:012603// minmax
2604
2605template<class _Tp, class _Compare>
Marshall Clow9d67c6d2014-02-19 16:51:352606inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant4eb27b72010-08-21 20:10:012607pair<const _Tp&, const _Tp&>
2608minmax(const _Tp& __a, const _Tp& __b, _Compare __comp)
2609{
2610 return __comp(__b, __a) ? pair<const _Tp&, const _Tp&>(__b, __a) :
2611 pair<const _Tp&, const _Tp&>(__a, __b);
2612}
2613
2614template<class _Tp>
Marshall Clow9d67c6d2014-02-19 16:51:352615inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant4eb27b72010-08-21 20:10:012616pair<const _Tp&, const _Tp&>
2617minmax(const _Tp& __a, const _Tp& __b)
2618{
Howard Hinnantce48a112011-06-30 21:18:192619 return _VSTD::minmax(__a, __b, __less<_Tp>());
Howard Hinnant4eb27b72010-08-21 20:10:012620}
2621
Eric Fiselierddda4562017-04-18 23:26:472622#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant54976f22011-08-12 21:56:022623
Howard Hinnant4eb27b72010-08-21 20:10:012624template<class _Tp, class _Compare>
Marshall Clow9d67c6d2014-02-19 16:51:352625inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnant4eb27b72010-08-21 20:10:012626pair<_Tp, _Tp>
2627minmax(initializer_list<_Tp> __t, _Compare __comp)
2628{
Marshall Clow9d67c6d2014-02-19 16:51:352629 typedef typename initializer_list<_Tp>::const_iterator _Iter;
2630 _Iter __first = __t.begin();
2631 _Iter __last = __t.end();
Marshall Clow002144f2015-02-11 15:41:342632 std::pair<_Tp, _Tp> __result(*__first, *__first);
Marshall Clow9d67c6d2014-02-19 16:51:352633
2634 ++__first;
2635 if (__t.size() % 2 == 0)
2636 {
2637 if (__comp(*__first, __result.first))
2638 __result.first = *__first;
2639 else
2640 __result.second = *__first;
2641 ++__first;
2642 }
Aditya Kumar331fb802016-08-25 11:52:382643
Marshall Clow9d67c6d2014-02-19 16:51:352644 while (__first != __last)
2645 {
2646 _Tp __prev = *__first++;
Marshall Clow002144f2015-02-11 15:41:342647 if (__comp(*__first, __prev)) {
2648 if ( __comp(*__first, __result.first)) __result.first = *__first;
2649 if (!__comp(__prev, __result.second)) __result.second = __prev;
Marshall Clow9d67c6d2014-02-19 16:51:352650 }
2651 else {
Marshall Clow002144f2015-02-11 15:41:342652 if ( __comp(__prev, __result.first)) __result.first = __prev;
2653 if (!__comp(*__first, __result.second)) __result.second = *__first;
Marshall Clow9d67c6d2014-02-19 16:51:352654 }
Aditya Kumar331fb802016-08-25 11:52:382655
Marshall Clow9d67c6d2014-02-19 16:51:352656 __first++;
2657 }
2658 return __result;
2659}
2660
2661template<class _Tp>
2662inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
2663pair<_Tp, _Tp>
2664minmax(initializer_list<_Tp> __t)
2665{
2666 return _VSTD::minmax(__t, __less<_Tp>());
Howard Hinnant4eb27b72010-08-21 20:10:012667}
2668
Eric Fiselierddda4562017-04-18 23:26:472669#endif // _LIBCPP_CXX03_LANG
Howard Hinnant54976f22011-08-12 21:56:022670
Howard Hinnant3e519522010-05-11 19:42:162671// random_shuffle
2672
Howard Hinnantf9d540b2010-05-26 17:49:342673// __independent_bits_engine
2674
Howard Hinnantc003db12011-11-29 18:15:502675template <unsigned long long _Xp, size_t _Rp>
Howard Hinnantf9d540b2010-05-26 17:49:342676struct __log2_imp
Howard Hinnant3e519522010-05-11 19:42:162677{
Howard Hinnantc003db12011-11-29 18:15:502678 static const size_t value = _Xp & ((unsigned long long)(1) << _Rp) ? _Rp
2679 : __log2_imp<_Xp, _Rp - 1>::value;
Howard Hinnant3e519522010-05-11 19:42:162680};
2681
Howard Hinnantc003db12011-11-29 18:15:502682template <unsigned long long _Xp>
2683struct __log2_imp<_Xp, 0>
Howard Hinnant3e519522010-05-11 19:42:162684{
Howard Hinnantf9d540b2010-05-26 17:49:342685 static const size_t value = 0;
Howard Hinnant3e519522010-05-11 19:42:162686};
2687
Howard Hinnantc003db12011-11-29 18:15:502688template <size_t _Rp>
2689struct __log2_imp<0, _Rp>
Howard Hinnant3e519522010-05-11 19:42:162690{
Howard Hinnantc003db12011-11-29 18:15:502691 static const size_t value = _Rp + 1;
Howard Hinnant3e519522010-05-11 19:42:162692};
2693
Eric Fiselier89918ca2017-05-31 21:20:182694template <class _UIntType, _UIntType _Xp>
Howard Hinnantf9d540b2010-05-26 17:49:342695struct __log2
Howard Hinnant3e519522010-05-11 19:42:162696{
Howard Hinnantc003db12011-11-29 18:15:502697 static const size_t value = __log2_imp<_Xp,
Eric Fiselier89918ca2017-05-31 21:20:182698 sizeof(_UIntType) * __CHAR_BIT__ - 1>::value;
Howard Hinnant3e519522010-05-11 19:42:162699};
2700
Howard Hinnantf9d540b2010-05-26 17:49:342701template<class _Engine, class _UIntType>
2702class __independent_bits_engine
Howard Hinnant3e519522010-05-11 19:42:162703{
Howard Hinnantf9d540b2010-05-26 17:49:342704public:
2705 // types
2706 typedef _UIntType result_type;
2707
2708private:
2709 typedef typename _Engine::result_type _Engine_result_type;
2710 typedef typename conditional
2711 <
2712 sizeof(_Engine_result_type) <= sizeof(result_type),
2713 result_type,
2714 _Engine_result_type
2715 >::type _Working_result_type;
2716
2717 _Engine& __e_;
2718 size_t __w_;
2719 size_t __w0_;
2720 size_t __n_;
2721 size_t __n0_;
2722 _Working_result_type __y0_;
2723 _Working_result_type __y1_;
2724 _Engine_result_type __mask0_;
2725 _Engine_result_type __mask1_;
2726
Eric Fiselierddda4562017-04-18 23:26:472727#ifdef _LIBCPP_CXX03_LANG
Howard Hinnantc003db12011-11-29 18:15:502728 static const _Working_result_type _Rp = _Engine::_Max - _Engine::_Min
Howard Hinnante386b7b2012-04-02 21:00:452729 + _Working_result_type(1);
2730#else
2731 static _LIBCPP_CONSTEXPR const _Working_result_type _Rp = _Engine::max() - _Engine::min()
2732 + _Working_result_type(1);
2733#endif
2734 static _LIBCPP_CONSTEXPR const size_t __m = __log2<_Working_result_type, _Rp>::value;
2735 static _LIBCPP_CONSTEXPR const size_t _WDt = numeric_limits<_Working_result_type>::digits;
2736 static _LIBCPP_CONSTEXPR const size_t _EDt = numeric_limits<_Engine_result_type>::digits;
Howard Hinnantf9d540b2010-05-26 17:49:342737
2738public:
2739 // constructors and seeding functions
2740 __independent_bits_engine(_Engine& __e, size_t __w);
2741
2742 // generating functions
Howard Hinnantc003db12011-11-29 18:15:502743 result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>());}
Howard Hinnantf9d540b2010-05-26 17:49:342744
2745private:
Marshall Clow08bba642017-09-20 19:38:432746 result_type __eval(false_type);
2747 result_type __eval(true_type);
Howard Hinnantf9d540b2010-05-26 17:49:342748};
2749
2750template<class _Engine, class _UIntType>
2751__independent_bits_engine<_Engine, _UIntType>
2752 ::__independent_bits_engine(_Engine& __e, size_t __w)
2753 : __e_(__e),
2754 __w_(__w)
2755{
2756 __n_ = __w_ / __m + (__w_ % __m != 0);
2757 __w0_ = __w_ / __n_;
Howard Hinnantc003db12011-11-29 18:15:502758 if (_Rp == 0)
2759 __y0_ = _Rp;
Howard Hinnantf9d540b2010-05-26 17:49:342760 else if (__w0_ < _WDt)
Howard Hinnantc003db12011-11-29 18:15:502761 __y0_ = (_Rp >> __w0_) << __w0_;
Howard Hinnantf9d540b2010-05-26 17:49:342762 else
2763 __y0_ = 0;
Howard Hinnantc003db12011-11-29 18:15:502764 if (_Rp - __y0_ > __y0_ / __n_)
Howard Hinnantf9d540b2010-05-26 17:49:342765 {
2766 ++__n_;
2767 __w0_ = __w_ / __n_;
2768 if (__w0_ < _WDt)
Howard Hinnantc003db12011-11-29 18:15:502769 __y0_ = (_Rp >> __w0_) << __w0_;
Howard Hinnantf9d540b2010-05-26 17:49:342770 else
2771 __y0_ = 0;
2772 }
2773 __n0_ = __n_ - __w_ % __n_;
2774 if (__w0_ < _WDt - 1)
Howard Hinnantc003db12011-11-29 18:15:502775 __y1_ = (_Rp >> (__w0_ + 1)) << (__w0_ + 1);
Howard Hinnantf9d540b2010-05-26 17:49:342776 else
2777 __y1_ = 0;
2778 __mask0_ = __w0_ > 0 ? _Engine_result_type(~0) >> (_EDt - __w0_) :
2779 _Engine_result_type(0);
2780 __mask1_ = __w0_ < _EDt - 1 ?
2781 _Engine_result_type(~0) >> (_EDt - (__w0_ + 1)) :
2782 _Engine_result_type(~0);
Howard Hinnant3e519522010-05-11 19:42:162783}
2784
Howard Hinnantf9d540b2010-05-26 17:49:342785template<class _Engine, class _UIntType>
2786inline
2787_UIntType
Marshall Clow08bba642017-09-20 19:38:432788__independent_bits_engine<_Engine, _UIntType>::__eval(false_type)
Howard Hinnant3e519522010-05-11 19:42:162789{
Howard Hinnantf9d540b2010-05-26 17:49:342790 return static_cast<result_type>(__e_() & __mask0_);
Howard Hinnant3e519522010-05-11 19:42:162791}
2792
Howard Hinnantf9d540b2010-05-26 17:49:342793template<class _Engine, class _UIntType>
2794_UIntType
Marshall Clow08bba642017-09-20 19:38:432795__independent_bits_engine<_Engine, _UIntType>::__eval(true_type)
Howard Hinnant3e519522010-05-11 19:42:162796{
Marshall Clow5beb2c32017-09-20 17:34:112797 const size_t _WRt = numeric_limits<result_type>::digits;
Howard Hinnantc003db12011-11-29 18:15:502798 result_type _Sp = 0;
Howard Hinnantf9d540b2010-05-26 17:49:342799 for (size_t __k = 0; __k < __n0_; ++__k)
2800 {
2801 _Engine_result_type __u;
2802 do
2803 {
2804 __u = __e_() - _Engine::min();
2805 } while (__u >= __y0_);
Marshall Clow5beb2c32017-09-20 17:34:112806 if (__w0_ < _WRt)
Howard Hinnantc003db12011-11-29 18:15:502807 _Sp <<= __w0_;
Howard Hinnantf9d540b2010-05-26 17:49:342808 else
Howard Hinnantc003db12011-11-29 18:15:502809 _Sp = 0;
2810 _Sp += __u & __mask0_;
Howard Hinnantf9d540b2010-05-26 17:49:342811 }
2812 for (size_t __k = __n0_; __k < __n_; ++__k)
2813 {
2814 _Engine_result_type __u;
2815 do
2816 {
2817 __u = __e_() - _Engine::min();
2818 } while (__u >= __y1_);
Marshall Clow5beb2c32017-09-20 17:34:112819 if (__w0_ < _WRt - 1)
Howard Hinnantc003db12011-11-29 18:15:502820 _Sp <<= __w0_ + 1;
Howard Hinnantf9d540b2010-05-26 17:49:342821 else
Howard Hinnantc003db12011-11-29 18:15:502822 _Sp = 0;
2823 _Sp += __u & __mask1_;
Howard Hinnantf9d540b2010-05-26 17:49:342824 }
Howard Hinnantc003db12011-11-29 18:15:502825 return _Sp;
Howard Hinnantf9d540b2010-05-26 17:49:342826}
2827
2828// uniform_int_distribution
2829
2830template<class _IntType = int>
2831class uniform_int_distribution
2832{
2833public:
2834 // types
2835 typedef _IntType result_type;
2836
2837 class param_type
2838 {
2839 result_type __a_;
2840 result_type __b_;
2841 public:
2842 typedef uniform_int_distribution distribution_type;
2843
2844 explicit param_type(result_type __a = 0,
2845 result_type __b = numeric_limits<result_type>::max())
2846 : __a_(__a), __b_(__b) {}
2847
2848 result_type a() const {return __a_;}
2849 result_type b() const {return __b_;}
2850
2851 friend bool operator==(const param_type& __x, const param_type& __y)
2852 {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;}
2853 friend bool operator!=(const param_type& __x, const param_type& __y)
2854 {return !(__x == __y);}
2855 };
2856
2857private:
2858 param_type __p_;
2859
2860public:
2861 // constructors and reset functions
2862 explicit uniform_int_distribution(result_type __a = 0,
2863 result_type __b = numeric_limits<result_type>::max())
2864 : __p_(param_type(__a, __b)) {}
2865 explicit uniform_int_distribution(const param_type& __p) : __p_(__p) {}
2866 void reset() {}
2867
2868 // generating functions
2869 template<class _URNG> result_type operator()(_URNG& __g)
2870 {return (*this)(__g, __p_);}
2871 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
2872
2873 // property functions
2874 result_type a() const {return __p_.a();}
2875 result_type b() const {return __p_.b();}
2876
2877 param_type param() const {return __p_;}
2878 void param(const param_type& __p) {__p_ = __p;}
2879
2880 result_type min() const {return a();}
2881 result_type max() const {return b();}
2882
2883 friend bool operator==(const uniform_int_distribution& __x,
2884 const uniform_int_distribution& __y)
2885 {return __x.__p_ == __y.__p_;}
2886 friend bool operator!=(const uniform_int_distribution& __x,
2887 const uniform_int_distribution& __y)
2888 {return !(__x == __y);}
2889};
2890
2891template<class _IntType>
2892template<class _URNG>
2893typename uniform_int_distribution<_IntType>::result_type
2894uniform_int_distribution<_IntType>::operator()(_URNG& __g, const param_type& __p)
2895{
2896 typedef typename conditional<sizeof(result_type) <= sizeof(uint32_t),
2897 uint32_t, uint64_t>::type _UIntType;
Howard Hinnantc003db12011-11-29 18:15:502898 const _UIntType _Rp = __p.b() - __p.a() + _UIntType(1);
2899 if (_Rp == 1)
Howard Hinnantf9d540b2010-05-26 17:49:342900 return __p.a();
2901 const size_t _Dt = numeric_limits<_UIntType>::digits;
2902 typedef __independent_bits_engine<_URNG, _UIntType> _Eng;
Howard Hinnantc003db12011-11-29 18:15:502903 if (_Rp == 0)
Howard Hinnantf9d540b2010-05-26 17:49:342904 return static_cast<result_type>(_Eng(__g, _Dt)());
Howard Hinnantc003db12011-11-29 18:15:502905 size_t __w = _Dt - __clz(_Rp) - 1;
Marshall Clowa6438ca2015-07-30 18:26:342906 if ((_Rp & (std::numeric_limits<_UIntType>::max() >> (_Dt - __w))) != 0)
Howard Hinnantf9d540b2010-05-26 17:49:342907 ++__w;
2908 _Eng __e(__g, __w);
2909 _UIntType __u;
Howard Hinnant3e519522010-05-11 19:42:162910 do
Howard Hinnantf9d540b2010-05-26 17:49:342911 {
2912 __u = __e();
Howard Hinnantc003db12011-11-29 18:15:502913 } while (__u >= _Rp);
Howard Hinnantf9d540b2010-05-26 17:49:342914 return static_cast<result_type>(__u + __p.a());
Howard Hinnant3e519522010-05-11 19:42:162915}
2916
Eric Fiselier66f1ec42017-04-03 23:23:442917#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_RANDOM_SHUFFLE) \
2918 || defined(_LIBCPP_BUILDING_LIBRARY)
Howard Hinnantf0544c22013-08-12 18:38:342919class _LIBCPP_TYPE_VIS __rs_default;
Howard Hinnant3e519522010-05-11 19:42:162920
Howard Hinnantf0544c22013-08-12 18:38:342921_LIBCPP_FUNC_VIS __rs_default __rs_get();
Howard Hinnantf9d540b2010-05-26 17:49:342922
Howard Hinnantf0544c22013-08-12 18:38:342923class _LIBCPP_TYPE_VIS __rs_default
Howard Hinnant3e519522010-05-11 19:42:162924{
Howard Hinnantf9d540b2010-05-26 17:49:342925 static unsigned __c_;
2926
2927 __rs_default();
2928public:
Marshall Clowb6e5f852013-02-07 22:12:022929 typedef uint_fast32_t result_type;
Howard Hinnantf9d540b2010-05-26 17:49:342930
2931 static const result_type _Min = 0;
2932 static const result_type _Max = 0xFFFFFFFF;
2933
2934 __rs_default(const __rs_default&);
2935 ~__rs_default();
2936
2937 result_type operator()();
2938
Howard Hinnant788c9972012-04-02 00:40:412939 static _LIBCPP_CONSTEXPR result_type min() {return _Min;}
2940 static _LIBCPP_CONSTEXPR result_type max() {return _Max;}
Howard Hinnantf9d540b2010-05-26 17:49:342941
Howard Hinnantf0544c22013-08-12 18:38:342942 friend _LIBCPP_FUNC_VIS __rs_default __rs_get();
Howard Hinnant3e519522010-05-11 19:42:162943};
2944
Howard Hinnantf0544c22013-08-12 18:38:342945_LIBCPP_FUNC_VIS __rs_default __rs_get();
Howard Hinnant3e519522010-05-11 19:42:162946
2947template <class _RandomAccessIterator>
2948void
2949random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
2950{
2951 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnantc003db12011-11-29 18:15:502952 typedef uniform_int_distribution<ptrdiff_t> _Dp;
2953 typedef typename _Dp::param_type _Pp;
Howard Hinnant3e519522010-05-11 19:42:162954 difference_type __d = __last - __first;
2955 if (__d > 1)
2956 {
Howard Hinnantc003db12011-11-29 18:15:502957 _Dp __uid;
Howard Hinnantf9d540b2010-05-26 17:49:342958 __rs_default __g = __rs_get();
2959 for (--__last, --__d; __first < __last; ++__first, --__d)
Howard Hinnant007b26b2010-10-22 15:26:392960 {
Howard Hinnantc003db12011-11-29 18:15:502961 difference_type __i = __uid(__g, _Pp(0, __d));
Howard Hinnant007b26b2010-10-22 15:26:392962 if (__i != difference_type(0))
2963 swap(*__first, *(__first + __i));
2964 }
Howard Hinnant3e519522010-05-11 19:42:162965 }
2966}
2967
2968template <class _RandomAccessIterator, class _RandomNumberGenerator>
2969void
2970random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
Eric Fiselierddda4562017-04-18 23:26:472971#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant3e519522010-05-11 19:42:162972 _RandomNumberGenerator&& __rand)
2973#else
2974 _RandomNumberGenerator& __rand)
2975#endif
2976{
2977 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
2978 difference_type __d = __last - __first;
2979 if (__d > 1)
2980 {
2981 for (--__last; __first < __last; ++__first, --__d)
Howard Hinnant007b26b2010-10-22 15:26:392982 {
2983 difference_type __i = __rand(__d);
2984 swap(*__first, *(__first + __i));
2985 }
Howard Hinnant3e519522010-05-11 19:42:162986 }
2987}
Marshall Clow0f37a412017-03-23 13:43:372988#endif
Howard Hinnant3e519522010-05-11 19:42:162989
Eric Fiseliere7154702016-08-28 22:14:372990template <class _PopulationIterator, class _SampleIterator, class _Distance,
2991 class _UniformRandomNumberGenerator>
2992_LIBCPP_INLINE_VISIBILITY
2993_SampleIterator __sample(_PopulationIterator __first,
Alexander Richardson42bfedd2017-11-14 11:14:252994 _PopulationIterator __last, _SampleIterator __output_iter,
Eric Fiseliere7154702016-08-28 22:14:372995 _Distance __n,
2996 _UniformRandomNumberGenerator & __g,
2997 input_iterator_tag) {
2998
2999 _Distance __k = 0;
3000 for (; __first != __last && __k < __n; ++__first, (void)++__k)
Alexander Richardson42bfedd2017-11-14 11:14:253001 __output_iter[__k] = *__first;
Eric Fiseliere7154702016-08-28 22:14:373002 _Distance __sz = __k;
3003 for (; __first != __last; ++__first, (void)++__k) {
3004 _Distance __r = _VSTD::uniform_int_distribution<_Distance>(0, __k)(__g);
3005 if (__r < __sz)
Alexander Richardson42bfedd2017-11-14 11:14:253006 __output_iter[__r] = *__first;
Eric Fiseliere7154702016-08-28 22:14:373007 }
Alexander Richardson42bfedd2017-11-14 11:14:253008 return __output_iter + _VSTD::min(__n, __k);
Eric Fiseliere7154702016-08-28 22:14:373009}
3010
3011template <class _PopulationIterator, class _SampleIterator, class _Distance,
3012 class _UniformRandomNumberGenerator>
3013_LIBCPP_INLINE_VISIBILITY
3014_SampleIterator __sample(_PopulationIterator __first,
Alexander Richardson42bfedd2017-11-14 11:14:253015 _PopulationIterator __last, _SampleIterator __output_iter,
Eric Fiseliere7154702016-08-28 22:14:373016 _Distance __n,
3017 _UniformRandomNumberGenerator& __g,
3018 forward_iterator_tag) {
3019 _Distance __unsampled_sz = _VSTD::distance(__first, __last);
3020 for (__n = _VSTD::min(__n, __unsampled_sz); __n != 0; ++__first) {
3021 _Distance __r =
3022 _VSTD::uniform_int_distribution<_Distance>(0, --__unsampled_sz)(__g);
3023 if (__r < __n) {
Alexander Richardson42bfedd2017-11-14 11:14:253024 *__output_iter++ = *__first;
Eric Fiseliere7154702016-08-28 22:14:373025 --__n;
3026 }
3027 }
Alexander Richardson42bfedd2017-11-14 11:14:253028 return __output_iter;
Eric Fiseliere7154702016-08-28 22:14:373029}
3030
3031template <class _PopulationIterator, class _SampleIterator, class _Distance,
3032 class _UniformRandomNumberGenerator>
3033_LIBCPP_INLINE_VISIBILITY
3034_SampleIterator __sample(_PopulationIterator __first,
Alexander Richardson42bfedd2017-11-14 11:14:253035 _PopulationIterator __last, _SampleIterator __output_iter,
Eric Fiseliere7154702016-08-28 22:14:373036 _Distance __n, _UniformRandomNumberGenerator& __g) {
3037 typedef typename iterator_traits<_PopulationIterator>::iterator_category
3038 _PopCategory;
3039 typedef typename iterator_traits<_PopulationIterator>::difference_type
3040 _Difference;
3041 static_assert(__is_forward_iterator<_PopulationIterator>::value ||
3042 __is_random_access_iterator<_SampleIterator>::value,
3043 "SampleIterator must meet the requirements of RandomAccessIterator");
3044 typedef typename common_type<_Distance, _Difference>::type _CommonType;
3045 _LIBCPP_ASSERT(__n >= 0, "N must be a positive number.");
3046 return _VSTD::__sample(
Alexander Richardson42bfedd2017-11-14 11:14:253047 __first, __last, __output_iter, _CommonType(__n),
Eric Fiseliere7154702016-08-28 22:14:373048 __g, _PopCategory());
3049}
3050
3051#if _LIBCPP_STD_VER > 14
3052template <class _PopulationIterator, class _SampleIterator, class _Distance,
3053 class _UniformRandomNumberGenerator>
3054inline _LIBCPP_INLINE_VISIBILITY
3055_SampleIterator sample(_PopulationIterator __first,
Alexander Richardson42bfedd2017-11-14 11:14:253056 _PopulationIterator __last, _SampleIterator __output_iter,
Eric Fiseliere7154702016-08-28 22:14:373057 _Distance __n, _UniformRandomNumberGenerator&& __g) {
Alexander Richardson42bfedd2017-11-14 11:14:253058 return _VSTD::__sample(__first, __last, __output_iter, __n, __g);
Eric Fiseliere7154702016-08-28 22:14:373059}
3060#endif // _LIBCPP_STD_VER > 14
3061
Howard Hinnantf9d540b2010-05-26 17:49:343062template<class _RandomAccessIterator, class _UniformRandomNumberGenerator>
3063 void shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
Eric Fiselierddda4562017-04-18 23:26:473064#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantfb340102010-11-18 01:47:023065 _UniformRandomNumberGenerator&& __g)
3066#else
Howard Hinnantf9d540b2010-05-26 17:49:343067 _UniformRandomNumberGenerator& __g)
Howard Hinnantfb340102010-11-18 01:47:023068#endif
Howard Hinnantf9d540b2010-05-26 17:49:343069{
3070 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnantc003db12011-11-29 18:15:503071 typedef uniform_int_distribution<ptrdiff_t> _Dp;
3072 typedef typename _Dp::param_type _Pp;
Howard Hinnantf9d540b2010-05-26 17:49:343073 difference_type __d = __last - __first;
3074 if (__d > 1)
3075 {
Howard Hinnantc003db12011-11-29 18:15:503076 _Dp __uid;
Howard Hinnantf9d540b2010-05-26 17:49:343077 for (--__last, --__d; __first < __last; ++__first, --__d)
Howard Hinnant007b26b2010-10-22 15:26:393078 {
Howard Hinnantc003db12011-11-29 18:15:503079 difference_type __i = __uid(__g, _Pp(0, __d));
Howard Hinnant007b26b2010-10-22 15:26:393080 if (__i != difference_type(0))
3081 swap(*__first, *(__first + __i));
3082 }
Howard Hinnantf9d540b2010-05-26 17:49:343083 }
3084}
3085
Howard Hinnant3e519522010-05-11 19:42:163086template <class _InputIterator, class _Predicate>
Marshall Clow49c76432018-01-15 16:16:323087_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Howard Hinnant3e519522010-05-11 19:42:163088is_partitioned(_InputIterator __first, _InputIterator __last, _Predicate __pred)
3089{
3090 for (; __first != __last; ++__first)
3091 if (!__pred(*__first))
3092 break;
Marshall Clowb9595b72015-02-02 18:16:353093 if ( __first == __last )
3094 return true;
3095 ++__first;
Howard Hinnant3e519522010-05-11 19:42:163096 for (; __first != __last; ++__first)
3097 if (__pred(*__first))
3098 return false;
3099 return true;
3100}
3101
3102// partition
3103
3104template <class _Predicate, class _ForwardIterator>
3105_ForwardIterator
3106__partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, forward_iterator_tag)
3107{
3108 while (true)
3109 {
3110 if (__first == __last)
3111 return __first;
3112 if (!__pred(*__first))
3113 break;
3114 ++__first;
3115 }
3116 for (_ForwardIterator __p = __first; ++__p != __last;)
3117 {
3118 if (__pred(*__p))
3119 {
3120 swap(*__first, *__p);
3121 ++__first;
3122 }
3123 }
3124 return __first;
3125}
3126
3127template <class _Predicate, class _BidirectionalIterator>
3128_BidirectionalIterator
3129__partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3130 bidirectional_iterator_tag)
3131{
3132 while (true)
3133 {
3134 while (true)
3135 {
3136 if (__first == __last)
3137 return __first;
3138 if (!__pred(*__first))
3139 break;
3140 ++__first;
3141 }
3142 do
3143 {
3144 if (__first == --__last)
3145 return __first;
3146 } while (!__pred(*__last));
3147 swap(*__first, *__last);
3148 ++__first;
3149 }
3150}
3151
3152template <class _ForwardIterator, class _Predicate>
3153inline _LIBCPP_INLINE_VISIBILITY
3154_ForwardIterator
3155partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
3156{
Howard Hinnantce48a112011-06-30 21:18:193157 return _VSTD::__partition<typename add_lvalue_reference<_Predicate>::type>
Howard Hinnant3e519522010-05-11 19:42:163158 (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
3159}
3160
3161// partition_copy
3162
3163template <class _InputIterator, class _OutputIterator1,
3164 class _OutputIterator2, class _Predicate>
Marshall Clow1b9a4ff2018-01-22 20:44:333165_LIBCPP_CONSTEXPR_AFTER_CXX17 pair<_OutputIterator1, _OutputIterator2>
Howard Hinnant3e519522010-05-11 19:42:163166partition_copy(_InputIterator __first, _InputIterator __last,
3167 _OutputIterator1 __out_true, _OutputIterator2 __out_false,
3168 _Predicate __pred)
3169{
3170 for (; __first != __last; ++__first)
3171 {
3172 if (__pred(*__first))
3173 {
3174 *__out_true = *__first;
3175 ++__out_true;
3176 }
3177 else
3178 {
3179 *__out_false = *__first;
3180 ++__out_false;
3181 }
3182 }
3183 return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false);
3184}
3185
3186// partition_point
3187
3188template<class _ForwardIterator, class _Predicate>
Marshall Clow674f9122018-01-15 17:53:343189_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnant3e519522010-05-11 19:42:163190partition_point(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
3191{
3192 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnantce48a112011-06-30 21:18:193193 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnant3e519522010-05-11 19:42:163194 while (__len != 0)
3195 {
3196 difference_type __l2 = __len / 2;
3197 _ForwardIterator __m = __first;
Howard Hinnantce48a112011-06-30 21:18:193198 _VSTD::advance(__m, __l2);
Howard Hinnant3e519522010-05-11 19:42:163199 if (__pred(*__m))
3200 {
3201 __first = ++__m;
3202 __len -= __l2 + 1;
3203 }
3204 else
3205 __len = __l2;
3206 }
3207 return __first;
3208}
3209
3210// stable_partition
3211
3212template <class _Predicate, class _ForwardIterator, class _Distance, class _Pair>
3213_ForwardIterator
3214__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
3215 _Distance __len, _Pair __p, forward_iterator_tag __fit)
3216{
3217 // *__first is known to be false
3218 // __len >= 1
3219 if (__len == 1)
3220 return __first;
3221 if (__len == 2)
3222 {
3223 _ForwardIterator __m = __first;
3224 if (__pred(*++__m))
3225 {
3226 swap(*__first, *__m);
3227 return __m;
3228 }
3229 return __first;
3230 }
3231 if (__len <= __p.second)
3232 { // The buffer is big enough to use
3233 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
3234 __destruct_n __d(0);
3235 unique_ptr<value_type, __destruct_n&> __h(__p.first, __d);
3236 // Move the falses into the temporary buffer, and the trues to the front of the line
3237 // Update __first to always point to the end of the trues
3238 value_type* __t = __p.first;
Howard Hinnantce48a112011-06-30 21:18:193239 ::new(__t) value_type(_VSTD::move(*__first));
Howard Hinnant3e519522010-05-11 19:42:163240 __d.__incr((value_type*)0);
3241 ++__t;
3242 _ForwardIterator __i = __first;
3243 while (++__i != __last)
3244 {
3245 if (__pred(*__i))
3246 {
Howard Hinnantce48a112011-06-30 21:18:193247 *__first = _VSTD::move(*__i);
Howard Hinnant3e519522010-05-11 19:42:163248 ++__first;
3249 }
3250 else
3251 {
Howard Hinnantce48a112011-06-30 21:18:193252 ::new(__t) value_type(_VSTD::move(*__i));
Howard Hinnant3e519522010-05-11 19:42:163253 __d.__incr((value_type*)0);
3254 ++__t;
3255 }
3256 }
3257 // All trues now at start of range, all falses in buffer
3258 // Move falses back into range, but don't mess up __first which points to first false
3259 __i = __first;
3260 for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i)
Howard Hinnantce48a112011-06-30 21:18:193261 *__i = _VSTD::move(*__t2);
Howard Hinnant3e519522010-05-11 19:42:163262 // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer
3263 return __first;
3264 }
3265 // Else not enough buffer, do in place
3266 // __len >= 3
3267 _ForwardIterator __m = __first;
3268 _Distance __len2 = __len / 2; // __len2 >= 2
Howard Hinnantce48a112011-06-30 21:18:193269 _VSTD::advance(__m, __len2);
Howard Hinnant3e519522010-05-11 19:42:163270 // recurse on [__first, __m), *__first know to be false
3271 // F?????????????????
3272 // f m l
3273 typedef typename add_lvalue_reference<_Predicate>::type _PredRef;
3274 _ForwardIterator __first_false = __stable_partition<_PredRef>(__first, __m, __pred, __len2, __p, __fit);
3275 // TTTFFFFF??????????
3276 // f ff m l
3277 // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true
3278 _ForwardIterator __m1 = __m;
3279 _ForwardIterator __second_false = __last;
3280 _Distance __len_half = __len - __len2;
3281 while (__pred(*__m1))
3282 {
3283 if (++__m1 == __last)
3284 goto __second_half_done;
3285 --__len_half;
3286 }
3287 // TTTFFFFFTTTF??????
3288 // f ff m m1 l
3289 __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __fit);
3290__second_half_done:
3291 // TTTFFFFFTTTTTFFFFF
3292 // f ff m sf l
Howard Hinnantce48a112011-06-30 21:18:193293 return _VSTD::rotate(__first_false, __m, __second_false);
Howard Hinnant3e519522010-05-11 19:42:163294 // TTTTTTTTFFFFFFFFFF
3295 // |
3296}
3297
3298struct __return_temporary_buffer
3299{
3300 template <class _Tp>
Howard Hinnantce48a112011-06-30 21:18:193301 _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) const {_VSTD::return_temporary_buffer(__p);}
Howard Hinnant3e519522010-05-11 19:42:163302};
3303
3304template <class _Predicate, class _ForwardIterator>
3305_ForwardIterator
3306__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
3307 forward_iterator_tag)
3308{
3309 const unsigned __alloc_limit = 3; // might want to make this a function of trivial assignment
3310 // Either prove all true and return __first or point to first false
3311 while (true)
3312 {
3313 if (__first == __last)
3314 return __first;
3315 if (!__pred(*__first))
3316 break;
3317 ++__first;
3318 }
3319 // We now have a reduced range [__first, __last)
3320 // *__first is known to be false
3321 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
3322 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
Howard Hinnantce48a112011-06-30 21:18:193323 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnant3e519522010-05-11 19:42:163324 pair<value_type*, ptrdiff_t> __p(0, 0);
3325 unique_ptr<value_type, __return_temporary_buffer> __h;
3326 if (__len >= __alloc_limit)
3327 {
Howard Hinnantce48a112011-06-30 21:18:193328 __p = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnant3e519522010-05-11 19:42:163329 __h.reset(__p.first);
3330 }
3331 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
3332 (__first, __last, __pred, __len, __p, forward_iterator_tag());
3333}
3334
3335template <class _Predicate, class _BidirectionalIterator, class _Distance, class _Pair>
3336_BidirectionalIterator
3337__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3338 _Distance __len, _Pair __p, bidirectional_iterator_tag __bit)
3339{
3340 // *__first is known to be false
3341 // *__last is known to be true
3342 // __len >= 2
3343 if (__len == 2)
3344 {
3345 swap(*__first, *__last);
3346 return __last;
3347 }
3348 if (__len == 3)
3349 {
3350 _BidirectionalIterator __m = __first;
3351 if (__pred(*++__m))
3352 {
3353 swap(*__first, *__m);
3354 swap(*__m, *__last);
3355 return __last;
3356 }
3357 swap(*__m, *__last);
3358 swap(*__first, *__m);
3359 return __m;
3360 }
3361 if (__len <= __p.second)
3362 { // The buffer is big enough to use
3363 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3364 __destruct_n __d(0);
3365 unique_ptr<value_type, __destruct_n&> __h(__p.first, __d);
3366 // Move the falses into the temporary buffer, and the trues to the front of the line
3367 // Update __first to always point to the end of the trues
3368 value_type* __t = __p.first;
Howard Hinnantce48a112011-06-30 21:18:193369 ::new(__t) value_type(_VSTD::move(*__first));
Howard Hinnant3e519522010-05-11 19:42:163370 __d.__incr((value_type*)0);
3371 ++__t;
3372 _BidirectionalIterator __i = __first;
3373 while (++__i != __last)
3374 {
3375 if (__pred(*__i))
3376 {
Howard Hinnantce48a112011-06-30 21:18:193377 *__first = _VSTD::move(*__i);
Howard Hinnant3e519522010-05-11 19:42:163378 ++__first;
3379 }
3380 else
3381 {
Howard Hinnantce48a112011-06-30 21:18:193382 ::new(__t) value_type(_VSTD::move(*__i));
Howard Hinnant3e519522010-05-11 19:42:163383 __d.__incr((value_type*)0);
3384 ++__t;
3385 }
3386 }
3387 // move *__last, known to be true
Howard Hinnantce48a112011-06-30 21:18:193388 *__first = _VSTD::move(*__i);
Howard Hinnant3e519522010-05-11 19:42:163389 __i = ++__first;
3390 // All trues now at start of range, all falses in buffer
3391 // Move falses back into range, but don't mess up __first which points to first false
3392 for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i)
Howard Hinnantce48a112011-06-30 21:18:193393 *__i = _VSTD::move(*__t2);
Howard Hinnant3e519522010-05-11 19:42:163394 // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer
3395 return __first;
3396 }
3397 // Else not enough buffer, do in place
3398 // __len >= 4
3399 _BidirectionalIterator __m = __first;
3400 _Distance __len2 = __len / 2; // __len2 >= 2
Howard Hinnantce48a112011-06-30 21:18:193401 _VSTD::advance(__m, __len2);
Howard Hinnant3e519522010-05-11 19:42:163402 // recurse on [__first, __m-1], except reduce __m-1 until *(__m-1) is true, *__first know to be false
3403 // F????????????????T
3404 // f m l
3405 _BidirectionalIterator __m1 = __m;
3406 _BidirectionalIterator __first_false = __first;
3407 _Distance __len_half = __len2;
3408 while (!__pred(*--__m1))
3409 {
3410 if (__m1 == __first)
3411 goto __first_half_done;
3412 --__len_half;
3413 }
3414 // F???TFFF?????????T
3415 // f m1 m l
3416 typedef typename add_lvalue_reference<_Predicate>::type _PredRef;
3417 __first_false = __stable_partition<_PredRef>(__first, __m1, __pred, __len_half, __p, __bit);
3418__first_half_done:
3419 // TTTFFFFF?????????T
3420 // f ff m l
3421 // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true
3422 __m1 = __m;
3423 _BidirectionalIterator __second_false = __last;
3424 ++__second_false;
3425 __len_half = __len - __len2;
3426 while (__pred(*__m1))
3427 {
3428 if (++__m1 == __last)
3429 goto __second_half_done;
3430 --__len_half;
3431 }
3432 // TTTFFFFFTTTF?????T
3433 // f ff m m1 l
3434 __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __bit);
3435__second_half_done:
3436 // TTTFFFFFTTTTTFFFFF
3437 // f ff m sf l
Howard Hinnantce48a112011-06-30 21:18:193438 return _VSTD::rotate(__first_false, __m, __second_false);
Howard Hinnant3e519522010-05-11 19:42:163439 // TTTTTTTTFFFFFFFFFF
3440 // |
3441}
3442
3443template <class _Predicate, class _BidirectionalIterator>
3444_BidirectionalIterator
3445__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3446 bidirectional_iterator_tag)
3447{
3448 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
3449 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3450 const difference_type __alloc_limit = 4; // might want to make this a function of trivial assignment
3451 // Either prove all true and return __first or point to first false
3452 while (true)
3453 {
3454 if (__first == __last)
3455 return __first;
3456 if (!__pred(*__first))
3457 break;
3458 ++__first;
3459 }
3460 // __first points to first false, everything prior to __first is already set.
3461 // Either prove [__first, __last) is all false and return __first, or point __last to last true
3462 do
3463 {
3464 if (__first == --__last)
3465 return __first;
3466 } while (!__pred(*__last));
3467 // We now have a reduced range [__first, __last]
3468 // *__first is known to be false
3469 // *__last is known to be true
3470 // __len >= 2
Howard Hinnantce48a112011-06-30 21:18:193471 difference_type __len = _VSTD::distance(__first, __last) + 1;
Howard Hinnant3e519522010-05-11 19:42:163472 pair<value_type*, ptrdiff_t> __p(0, 0);
3473 unique_ptr<value_type, __return_temporary_buffer> __h;
3474 if (__len >= __alloc_limit)
3475 {
Howard Hinnantce48a112011-06-30 21:18:193476 __p = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnant3e519522010-05-11 19:42:163477 __h.reset(__p.first);
3478 }
3479 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
3480 (__first, __last, __pred, __len, __p, bidirectional_iterator_tag());
3481}
3482
3483template <class _ForwardIterator, class _Predicate>
3484inline _LIBCPP_INLINE_VISIBILITY
3485_ForwardIterator
3486stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
3487{
3488 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
3489 (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
3490}
3491
3492// is_sorted_until
3493
3494template <class _ForwardIterator, class _Compare>
Marshall Clow49c76432018-01-15 16:16:323495_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnant3e519522010-05-11 19:42:163496is_sorted_until(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
3497{
3498 if (__first != __last)
3499 {
3500 _ForwardIterator __i = __first;
3501 while (++__i != __last)
3502 {
3503 if (__comp(*__i, *__first))
3504 return __i;
3505 __first = __i;
3506 }
3507 }
3508 return __last;
3509}
3510
Howard Hinnantb3371f62010-08-22 00:02:433511template<class _ForwardIterator>
Marshall Clow49c76432018-01-15 16:16:323512inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:163513_ForwardIterator
3514is_sorted_until(_ForwardIterator __first, _ForwardIterator __last)
3515{
Howard Hinnantce48a112011-06-30 21:18:193516 return _VSTD::is_sorted_until(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnant3e519522010-05-11 19:42:163517}
3518
3519// is_sorted
3520
3521template <class _ForwardIterator, class _Compare>
Marshall Clow49c76432018-01-15 16:16:323522inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:163523bool
3524is_sorted(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
3525{
Howard Hinnantce48a112011-06-30 21:18:193526 return _VSTD::is_sorted_until(__first, __last, __comp) == __last;
Howard Hinnant3e519522010-05-11 19:42:163527}
3528
Howard Hinnantb3371f62010-08-22 00:02:433529template<class _ForwardIterator>
Marshall Clow49c76432018-01-15 16:16:323530inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:163531bool
3532is_sorted(_ForwardIterator __first, _ForwardIterator __last)
3533{
Howard Hinnantce48a112011-06-30 21:18:193534 return _VSTD::is_sorted(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnant3e519522010-05-11 19:42:163535}
3536
3537// sort
3538
3539// stable, 2-3 compares, 0-2 swaps
3540
3541template <class _Compare, class _ForwardIterator>
3542unsigned
3543__sort3(_ForwardIterator __x, _ForwardIterator __y, _ForwardIterator __z, _Compare __c)
3544{
3545 unsigned __r = 0;
3546 if (!__c(*__y, *__x)) // if x <= y
3547 {
3548 if (!__c(*__z, *__y)) // if y <= z
3549 return __r; // x <= y && y <= z
3550 // x <= y && y > z
3551 swap(*__y, *__z); // x <= z && y < z
3552 __r = 1;
3553 if (__c(*__y, *__x)) // if x > y
3554 {
3555 swap(*__x, *__y); // x < y && y <= z
3556 __r = 2;
3557 }
3558 return __r; // x <= y && y < z
3559 }
3560 if (__c(*__z, *__y)) // x > y, if y > z
3561 {
3562 swap(*__x, *__z); // x < y && y < z
3563 __r = 1;
3564 return __r;
3565 }
3566 swap(*__x, *__y); // x > y && y <= z
3567 __r = 1; // x < y && x <= z
3568 if (__c(*__z, *__y)) // if y > z
3569 {
3570 swap(*__y, *__z); // x <= y && y < z
3571 __r = 2;
3572 }
3573 return __r;
3574} // x <= y && y <= z
3575
3576// stable, 3-6 compares, 0-5 swaps
3577
3578template <class _Compare, class _ForwardIterator>
3579unsigned
3580__sort4(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3,
3581 _ForwardIterator __x4, _Compare __c)
3582{
3583 unsigned __r = __sort3<_Compare>(__x1, __x2, __x3, __c);
3584 if (__c(*__x4, *__x3))
3585 {
3586 swap(*__x3, *__x4);
3587 ++__r;
3588 if (__c(*__x3, *__x2))
3589 {
3590 swap(*__x2, *__x3);
3591 ++__r;
3592 if (__c(*__x2, *__x1))
3593 {
3594 swap(*__x1, *__x2);
3595 ++__r;
3596 }
3597 }
3598 }
3599 return __r;
3600}
3601
3602// stable, 4-10 compares, 0-9 swaps
3603
3604template <class _Compare, class _ForwardIterator>
3605unsigned
3606__sort5(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3,
3607 _ForwardIterator __x4, _ForwardIterator __x5, _Compare __c)
3608{
3609 unsigned __r = __sort4<_Compare>(__x1, __x2, __x3, __x4, __c);
3610 if (__c(*__x5, *__x4))
3611 {
3612 swap(*__x4, *__x5);
3613 ++__r;
3614 if (__c(*__x4, *__x3))
3615 {
3616 swap(*__x3, *__x4);
3617 ++__r;
3618 if (__c(*__x3, *__x2))
3619 {
3620 swap(*__x2, *__x3);
3621 ++__r;
3622 if (__c(*__x2, *__x1))
3623 {
3624 swap(*__x1, *__x2);
3625 ++__r;
3626 }
3627 }
3628 }
3629 }
3630 return __r;
3631}
3632
3633// Assumes size > 0
3634template <class _Compare, class _BirdirectionalIterator>
3635void
3636__selection_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp)
3637{
3638 _BirdirectionalIterator __lm1 = __last;
3639 for (--__lm1; __first != __lm1; ++__first)
3640 {
Howard Hinnantce48a112011-06-30 21:18:193641 _BirdirectionalIterator __i = _VSTD::min_element<_BirdirectionalIterator,
Howard Hinnant3e519522010-05-11 19:42:163642 typename add_lvalue_reference<_Compare>::type>
3643 (__first, __last, __comp);
3644 if (__i != __first)
3645 swap(*__first, *__i);
3646 }
3647}
3648
3649template <class _Compare, class _BirdirectionalIterator>
3650void
3651__insertion_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp)
3652{
3653 typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type;
3654 if (__first != __last)
3655 {
3656 _BirdirectionalIterator __i = __first;
3657 for (++__i; __i != __last; ++__i)
3658 {
3659 _BirdirectionalIterator __j = __i;
Howard Hinnantce48a112011-06-30 21:18:193660 value_type __t(_VSTD::move(*__j));
Howard Hinnant3e519522010-05-11 19:42:163661 for (_BirdirectionalIterator __k = __i; __k != __first && __comp(__t, *--__k); --__j)
Howard Hinnantce48a112011-06-30 21:18:193662 *__j = _VSTD::move(*__k);
3663 *__j = _VSTD::move(__t);
Howard Hinnant3e519522010-05-11 19:42:163664 }
3665 }
3666}
3667
3668template <class _Compare, class _RandomAccessIterator>
3669void
3670__insertion_sort_3(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3671{
3672 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3673 _RandomAccessIterator __j = __first+2;
3674 __sort3<_Compare>(__first, __first+1, __j, __comp);
3675 for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
3676 {
3677 if (__comp(*__i, *__j))
3678 {
Howard Hinnantce48a112011-06-30 21:18:193679 value_type __t(_VSTD::move(*__i));
Howard Hinnant3e519522010-05-11 19:42:163680 _RandomAccessIterator __k = __j;
3681 __j = __i;
3682 do
3683 {
Howard Hinnantce48a112011-06-30 21:18:193684 *__j = _VSTD::move(*__k);
Howard Hinnant3e519522010-05-11 19:42:163685 __j = __k;
3686 } while (__j != __first && __comp(__t, *--__k));
Howard Hinnantce48a112011-06-30 21:18:193687 *__j = _VSTD::move(__t);
Howard Hinnant3e519522010-05-11 19:42:163688 }
3689 __j = __i;
3690 }
3691}
3692
3693template <class _Compare, class _RandomAccessIterator>
3694bool
3695__insertion_sort_incomplete(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3696{
3697 switch (__last - __first)
3698 {
3699 case 0:
3700 case 1:
3701 return true;
3702 case 2:
3703 if (__comp(*--__last, *__first))
3704 swap(*__first, *__last);
3705 return true;
3706 case 3:
Howard Hinnantce48a112011-06-30 21:18:193707 _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp);
Howard Hinnant3e519522010-05-11 19:42:163708 return true;
3709 case 4:
Howard Hinnantce48a112011-06-30 21:18:193710 _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp);
Howard Hinnant3e519522010-05-11 19:42:163711 return true;
3712 case 5:
Howard Hinnantce48a112011-06-30 21:18:193713 _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp);
Howard Hinnant3e519522010-05-11 19:42:163714 return true;
3715 }
3716 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3717 _RandomAccessIterator __j = __first+2;
3718 __sort3<_Compare>(__first, __first+1, __j, __comp);
3719 const unsigned __limit = 8;
3720 unsigned __count = 0;
3721 for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
3722 {
3723 if (__comp(*__i, *__j))
3724 {
Howard Hinnantce48a112011-06-30 21:18:193725 value_type __t(_VSTD::move(*__i));
Howard Hinnant3e519522010-05-11 19:42:163726 _RandomAccessIterator __k = __j;
3727 __j = __i;
3728 do
3729 {
Howard Hinnantce48a112011-06-30 21:18:193730 *__j = _VSTD::move(*__k);
Howard Hinnant3e519522010-05-11 19:42:163731 __j = __k;
3732 } while (__j != __first && __comp(__t, *--__k));
Howard Hinnantce48a112011-06-30 21:18:193733 *__j = _VSTD::move(__t);
Howard Hinnant3e519522010-05-11 19:42:163734 if (++__count == __limit)
3735 return ++__i == __last;
3736 }
3737 __j = __i;
3738 }
3739 return true;
3740}
3741
3742template <class _Compare, class _BirdirectionalIterator>
3743void
3744__insertion_sort_move(_BirdirectionalIterator __first1, _BirdirectionalIterator __last1,
3745 typename iterator_traits<_BirdirectionalIterator>::value_type* __first2, _Compare __comp)
3746{
3747 typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type;
3748 if (__first1 != __last1)
3749 {
3750 __destruct_n __d(0);
3751 unique_ptr<value_type, __destruct_n&> __h(__first2, __d);
3752 value_type* __last2 = __first2;
Howard Hinnantce48a112011-06-30 21:18:193753 ::new(__last2) value_type(_VSTD::move(*__first1));
Howard Hinnant3e519522010-05-11 19:42:163754 __d.__incr((value_type*)0);
3755 for (++__last2; ++__first1 != __last1; ++__last2)
3756 {
3757 value_type* __j2 = __last2;
3758 value_type* __i2 = __j2;
3759 if (__comp(*__first1, *--__i2))
3760 {
Howard Hinnantce48a112011-06-30 21:18:193761 ::new(__j2) value_type(_VSTD::move(*__i2));
Howard Hinnant3e519522010-05-11 19:42:163762 __d.__incr((value_type*)0);
3763 for (--__j2; __i2 != __first2 && __comp(*__first1, *--__i2); --__j2)
Howard Hinnantce48a112011-06-30 21:18:193764 *__j2 = _VSTD::move(*__i2);
3765 *__j2 = _VSTD::move(*__first1);
Howard Hinnant3e519522010-05-11 19:42:163766 }
3767 else
3768 {
Howard Hinnantce48a112011-06-30 21:18:193769 ::new(__j2) value_type(_VSTD::move(*__first1));
Howard Hinnant3e519522010-05-11 19:42:163770 __d.__incr((value_type*)0);
3771 }
3772 }
3773 __h.release();
3774 }
3775}
3776
3777template <class _Compare, class _RandomAccessIterator>
3778void
3779__sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3780{
3781 // _Compare is known to be a reference type
3782 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
3783 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
Howard Hinnantca740482010-11-19 22:17:283784 const difference_type __limit = is_trivially_copy_constructible<value_type>::value &&
3785 is_trivially_copy_assignable<value_type>::value ? 30 : 6;
Howard Hinnant3e519522010-05-11 19:42:163786 while (true)
3787 {
3788 __restart:
3789 difference_type __len = __last - __first;
3790 switch (__len)
3791 {
3792 case 0:
3793 case 1:
3794 return;
3795 case 2:
3796 if (__comp(*--__last, *__first))
3797 swap(*__first, *__last);
3798 return;
3799 case 3:
Howard Hinnantce48a112011-06-30 21:18:193800 _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp);
Howard Hinnant3e519522010-05-11 19:42:163801 return;
3802 case 4:
Howard Hinnantce48a112011-06-30 21:18:193803 _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp);
Howard Hinnant3e519522010-05-11 19:42:163804 return;
3805 case 5:
Howard Hinnantce48a112011-06-30 21:18:193806 _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp);
Howard Hinnant3e519522010-05-11 19:42:163807 return;
3808 }
3809 if (__len <= __limit)
3810 {
Howard Hinnantce48a112011-06-30 21:18:193811 _VSTD::__insertion_sort_3<_Compare>(__first, __last, __comp);
Howard Hinnant3e519522010-05-11 19:42:163812 return;
3813 }
3814 // __len > 5
3815 _RandomAccessIterator __m = __first;
3816 _RandomAccessIterator __lm1 = __last;
3817 --__lm1;
3818 unsigned __n_swaps;
3819 {
3820 difference_type __delta;
3821 if (__len >= 1000)
3822 {
3823 __delta = __len/2;
3824 __m += __delta;
3825 __delta /= 2;
Howard Hinnantce48a112011-06-30 21:18:193826 __n_swaps = _VSTD::__sort5<_Compare>(__first, __first + __delta, __m, __m+__delta, __lm1, __comp);
Howard Hinnant3e519522010-05-11 19:42:163827 }
3828 else
3829 {
3830 __delta = __len/2;
3831 __m += __delta;
Howard Hinnantce48a112011-06-30 21:18:193832 __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, __lm1, __comp);
Howard Hinnant3e519522010-05-11 19:42:163833 }
3834 }
3835 // *__m is median
3836 // partition [__first, __m) < *__m and *__m <= [__m, __last)
3837 // (this inhibits tossing elements equivalent to __m around unnecessarily)
3838 _RandomAccessIterator __i = __first;
3839 _RandomAccessIterator __j = __lm1;
3840 // j points beyond range to be tested, *__m is known to be <= *__lm1
3841 // The search going up is known to be guarded but the search coming down isn't.
3842 // Prime the downward search with a guard.
3843 if (!__comp(*__i, *__m)) // if *__first == *__m
3844 {
3845 // *__first == *__m, *__first doesn't go in first part
3846 // manually guard downward moving __j against __i
3847 while (true)
3848 {
3849 if (__i == --__j)
3850 {
3851 // *__first == *__m, *__m <= all other elements
3852 // Parition instead into [__first, __i) == *__first and *__first < [__i, __last)
3853 ++__i; // __first + 1
3854 __j = __last;
3855 if (!__comp(*__first, *--__j)) // we need a guard if *__first == *(__last-1)
3856 {
3857 while (true)
3858 {
3859 if (__i == __j)
3860 return; // [__first, __last) all equivalent elements
3861 if (__comp(*__first, *__i))
3862 {
3863 swap(*__i, *__j);
3864 ++__n_swaps;
3865 ++__i;
3866 break;
3867 }
3868 ++__i;
3869 }
3870 }
3871 // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1
3872 if (__i == __j)
3873 return;
3874 while (true)
3875 {
3876 while (!__comp(*__first, *__i))
3877 ++__i;
3878 while (__comp(*__first, *--__j))
3879 ;
3880 if (__i >= __j)
3881 break;
3882 swap(*__i, *__j);
3883 ++__n_swaps;
3884 ++__i;
3885 }
3886 // [__first, __i) == *__first and *__first < [__i, __last)
3887 // The first part is sorted, sort the secod part
Howard Hinnantce48a112011-06-30 21:18:193888 // _VSTD::__sort<_Compare>(__i, __last, __comp);
Howard Hinnant3e519522010-05-11 19:42:163889 __first = __i;
3890 goto __restart;
3891 }
3892 if (__comp(*__j, *__m))
3893 {
3894 swap(*__i, *__j);
3895 ++__n_swaps;
3896 break; // found guard for downward moving __j, now use unguarded partition
3897 }
3898 }
3899 }
3900 // It is known that *__i < *__m
3901 ++__i;
3902 // j points beyond range to be tested, *__m is known to be <= *__lm1
3903 // if not yet partitioned...
3904 if (__i < __j)
3905 {
3906 // known that *(__i - 1) < *__m
3907 // known that __i <= __m
3908 while (true)
3909 {
3910 // __m still guards upward moving __i
3911 while (__comp(*__i, *__m))
3912 ++__i;
3913 // It is now known that a guard exists for downward moving __j
3914 while (!__comp(*--__j, *__m))
3915 ;
3916 if (__i > __j)
3917 break;
3918 swap(*__i, *__j);
3919 ++__n_swaps;
3920 // It is known that __m != __j
3921 // If __m just moved, follow it
3922 if (__m == __i)
3923 __m = __j;
3924 ++__i;
3925 }
3926 }
3927 // [__first, __i) < *__m and *__m <= [__i, __last)
3928 if (__i != __m && __comp(*__m, *__i))
3929 {
3930 swap(*__i, *__m);
3931 ++__n_swaps;
3932 }
3933 // [__first, __i) < *__i and *__i <= [__i+1, __last)
3934 // If we were given a perfect partition, see if insertion sort is quick...
3935 if (__n_swaps == 0)
3936 {
Howard Hinnantce48a112011-06-30 21:18:193937 bool __fs = _VSTD::__insertion_sort_incomplete<_Compare>(__first, __i, __comp);
3938 if (_VSTD::__insertion_sort_incomplete<_Compare>(__i+1, __last, __comp))
Howard Hinnant3e519522010-05-11 19:42:163939 {
3940 if (__fs)
3941 return;
3942 __last = __i;
3943 continue;
3944 }
3945 else
3946 {
3947 if (__fs)
3948 {
3949 __first = ++__i;
3950 continue;
3951 }
3952 }
3953 }
3954 // sort smaller range with recursive call and larger with tail recursion elimination
3955 if (__i - __first < __last - __i)
3956 {
Howard Hinnantce48a112011-06-30 21:18:193957 _VSTD::__sort<_Compare>(__first, __i, __comp);
3958 // _VSTD::__sort<_Compare>(__i+1, __last, __comp);
Howard Hinnant3e519522010-05-11 19:42:163959 __first = ++__i;
3960 }
3961 else
3962 {
Howard Hinnantce48a112011-06-30 21:18:193963 _VSTD::__sort<_Compare>(__i+1, __last, __comp);
3964 // _VSTD::__sort<_Compare>(__first, __i, __comp);
Howard Hinnant3e519522010-05-11 19:42:163965 __last = __i;
3966 }
3967 }
3968}
3969
3970// This forwarder keeps the top call and the recursive calls using the same instantiation, forcing a reference _Compare
3971template <class _RandomAccessIterator, class _Compare>
3972inline _LIBCPP_INLINE_VISIBILITY
3973void
3974sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3975{
Howard Hinnant145afa12013-08-23 20:10:183976#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:163977 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3978 __debug_less<_Compare> __c(__comp);
3979 __sort<_Comp_ref>(__first, __last, __c);
Howard Hinnant145afa12013-08-23 20:10:183980#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:163981 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3982 __sort<_Comp_ref>(__first, __last, __comp);
Howard Hinnant145afa12013-08-23 20:10:183983#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:163984}
3985
3986template <class _RandomAccessIterator>
3987inline _LIBCPP_INLINE_VISIBILITY
3988void
3989sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
3990{
Howard Hinnantce48a112011-06-30 21:18:193991 _VSTD::sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnant3e519522010-05-11 19:42:163992}
3993
3994template <class _Tp>
3995inline _LIBCPP_INLINE_VISIBILITY
3996void
3997sort(_Tp** __first, _Tp** __last)
3998{
Howard Hinnantce48a112011-06-30 21:18:193999 _VSTD::sort((size_t*)__first, (size_t*)__last, __less<size_t>());
Howard Hinnant3e519522010-05-11 19:42:164000}
4001
4002template <class _Tp>
4003inline _LIBCPP_INLINE_VISIBILITY
4004void
4005sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last)
4006{
Howard Hinnantce48a112011-06-30 21:18:194007 _VSTD::sort(__first.base(), __last.base());
Howard Hinnant3e519522010-05-11 19:42:164008}
4009
Howard Hinnantf554add2011-09-14 18:33:514010template <class _Tp, class _Compare>
4011inline _LIBCPP_INLINE_VISIBILITY
4012void
4013sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last, _Compare __comp)
4014{
4015 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4016 _VSTD::sort<_Tp*, _Comp_ref>(__first.base(), __last.base(), __comp);
4017}
4018
Howard Hinnantf0544c22013-08-12 18:38:344019_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<char>&, char*>(char*, char*, __less<char>&))
4020_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&))
4021_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&))
4022_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&))
4023_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<short>&, short*>(short*, short*, __less<short>&))
4024_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&))
4025_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<int>&, int*>(int*, int*, __less<int>&))
4026_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&))
4027_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<long>&, long*>(long*, long*, __less<long>&))
4028_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&))
4029_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<long long>&, long long*>(long long*, long long*, __less<long long>&))
4030_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>&))
4031_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<float>&, float*>(float*, float*, __less<float>&))
4032_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<double>&, double*>(double*, double*, __less<double>&))
4033_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:164034
Howard Hinnantf0544c22013-08-12 18:38:344035_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<char>&, char*>(char*, char*, __less<char>&))
4036_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&))
4037_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&))
4038_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&))
4039_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<short>&, short*>(short*, short*, __less<short>&))
4040_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&))
4041_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<int>&, int*>(int*, int*, __less<int>&))
4042_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&))
4043_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<long>&, long*>(long*, long*, __less<long>&))
4044_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&))
4045_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<long long>&, long long*>(long long*, long long*, __less<long long>&))
4046_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>&))
4047_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<float>&, float*>(float*, float*, __less<float>&))
4048_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<double>&, double*>(double*, double*, __less<double>&))
4049_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:164050
Howard Hinnantf0544c22013-08-12 18:38:344051_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:164052
4053// lower_bound
4054
4055template <class _Compare, class _ForwardIterator, class _Tp>
Marshall Clowd57c03d2018-01-16 02:34:414056_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnante4383372011-10-22 20:59:454057__lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnant3e519522010-05-11 19:42:164058{
4059 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnantce48a112011-06-30 21:18:194060 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnant3e519522010-05-11 19:42:164061 while (__len != 0)
4062 {
4063 difference_type __l2 = __len / 2;
4064 _ForwardIterator __m = __first;
Howard Hinnantce48a112011-06-30 21:18:194065 _VSTD::advance(__m, __l2);
Howard Hinnante4383372011-10-22 20:59:454066 if (__comp(*__m, __value_))
Howard Hinnant3e519522010-05-11 19:42:164067 {
4068 __first = ++__m;
4069 __len -= __l2 + 1;
4070 }
4071 else
4072 __len = __l2;
4073 }
4074 return __first;
4075}
4076
4077template <class _ForwardIterator, class _Tp, class _Compare>
Marshall Clowd57c03d2018-01-16 02:34:414078inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:164079_ForwardIterator
Howard Hinnante4383372011-10-22 20:59:454080lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnant3e519522010-05-11 19:42:164081{
Howard Hinnant145afa12013-08-23 20:10:184082#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164083 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4084 __debug_less<_Compare> __c(__comp);
Howard Hinnante4383372011-10-22 20:59:454085 return __lower_bound<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant145afa12013-08-23 20:10:184086#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164087 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnante4383372011-10-22 20:59:454088 return __lower_bound<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant145afa12013-08-23 20:10:184089#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164090}
4091
4092template <class _ForwardIterator, class _Tp>
Marshall Clowd57c03d2018-01-16 02:34:414093inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:164094_ForwardIterator
Howard Hinnante4383372011-10-22 20:59:454095lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnant3e519522010-05-11 19:42:164096{
Howard Hinnante4383372011-10-22 20:59:454097 return _VSTD::lower_bound(__first, __last, __value_,
Howard Hinnant3e519522010-05-11 19:42:164098 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
4099}
4100
4101// upper_bound
4102
4103template <class _Compare, class _ForwardIterator, class _Tp>
Marshall Clowd57c03d2018-01-16 02:34:414104_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnante4383372011-10-22 20:59:454105__upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnant3e519522010-05-11 19:42:164106{
4107 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnantce48a112011-06-30 21:18:194108 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnant3e519522010-05-11 19:42:164109 while (__len != 0)
4110 {
4111 difference_type __l2 = __len / 2;
4112 _ForwardIterator __m = __first;
Howard Hinnantce48a112011-06-30 21:18:194113 _VSTD::advance(__m, __l2);
Howard Hinnante4383372011-10-22 20:59:454114 if (__comp(__value_, *__m))
Howard Hinnant3e519522010-05-11 19:42:164115 __len = __l2;
4116 else
4117 {
4118 __first = ++__m;
4119 __len -= __l2 + 1;
4120 }
4121 }
4122 return __first;
4123}
4124
4125template <class _ForwardIterator, class _Tp, class _Compare>
Marshall Clowd57c03d2018-01-16 02:34:414126inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:164127_ForwardIterator
Howard Hinnante4383372011-10-22 20:59:454128upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnant3e519522010-05-11 19:42:164129{
Howard Hinnant145afa12013-08-23 20:10:184130#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164131 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4132 __debug_less<_Compare> __c(__comp);
Howard Hinnante4383372011-10-22 20:59:454133 return __upper_bound<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant145afa12013-08-23 20:10:184134#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164135 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnante4383372011-10-22 20:59:454136 return __upper_bound<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant145afa12013-08-23 20:10:184137#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164138}
4139
4140template <class _ForwardIterator, class _Tp>
Marshall Clowd57c03d2018-01-16 02:34:414141inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:164142_ForwardIterator
Howard Hinnante4383372011-10-22 20:59:454143upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnant3e519522010-05-11 19:42:164144{
Howard Hinnante4383372011-10-22 20:59:454145 return _VSTD::upper_bound(__first, __last, __value_,
Howard Hinnant3e519522010-05-11 19:42:164146 __less<_Tp, typename iterator_traits<_ForwardIterator>::value_type>());
4147}
4148
4149// equal_range
4150
4151template <class _Compare, class _ForwardIterator, class _Tp>
Marshall Clowd57c03d2018-01-16 02:34:414152_LIBCPP_CONSTEXPR_AFTER_CXX17 pair<_ForwardIterator, _ForwardIterator>
Howard Hinnante4383372011-10-22 20:59:454153__equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnant3e519522010-05-11 19:42:164154{
4155 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnantce48a112011-06-30 21:18:194156 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnant3e519522010-05-11 19:42:164157 while (__len != 0)
4158 {
4159 difference_type __l2 = __len / 2;
4160 _ForwardIterator __m = __first;
Howard Hinnantce48a112011-06-30 21:18:194161 _VSTD::advance(__m, __l2);
Howard Hinnante4383372011-10-22 20:59:454162 if (__comp(*__m, __value_))
Howard Hinnant3e519522010-05-11 19:42:164163 {
4164 __first = ++__m;
4165 __len -= __l2 + 1;
4166 }
Howard Hinnante4383372011-10-22 20:59:454167 else if (__comp(__value_, *__m))
Howard Hinnant3e519522010-05-11 19:42:164168 {
4169 __last = __m;
4170 __len = __l2;
4171 }
4172 else
4173 {
4174 _ForwardIterator __mp1 = __m;
4175 return pair<_ForwardIterator, _ForwardIterator>
4176 (
Howard Hinnante4383372011-10-22 20:59:454177 __lower_bound<_Compare>(__first, __m, __value_, __comp),
4178 __upper_bound<_Compare>(++__mp1, __last, __value_, __comp)
Howard Hinnant3e519522010-05-11 19:42:164179 );
4180 }
4181 }
4182 return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
4183}
4184
4185template <class _ForwardIterator, class _Tp, class _Compare>
Marshall Clowd57c03d2018-01-16 02:34:414186inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:164187pair<_ForwardIterator, _ForwardIterator>
Howard Hinnante4383372011-10-22 20:59:454188equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnant3e519522010-05-11 19:42:164189{
Howard Hinnant145afa12013-08-23 20:10:184190#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164191 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4192 __debug_less<_Compare> __c(__comp);
Howard Hinnante4383372011-10-22 20:59:454193 return __equal_range<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant145afa12013-08-23 20:10:184194#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164195 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnante4383372011-10-22 20:59:454196 return __equal_range<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant145afa12013-08-23 20:10:184197#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164198}
4199
4200template <class _ForwardIterator, class _Tp>
Marshall Clowd57c03d2018-01-16 02:34:414201inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:164202pair<_ForwardIterator, _ForwardIterator>
Howard Hinnante4383372011-10-22 20:59:454203equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnant3e519522010-05-11 19:42:164204{
Howard Hinnante4383372011-10-22 20:59:454205 return _VSTD::equal_range(__first, __last, __value_,
Howard Hinnant3e519522010-05-11 19:42:164206 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
4207}
4208
4209// binary_search
4210
4211template <class _Compare, class _ForwardIterator, class _Tp>
Marshall Clowd57c03d2018-01-16 02:34:414212inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:164213bool
Howard Hinnante4383372011-10-22 20:59:454214__binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnant3e519522010-05-11 19:42:164215{
Howard Hinnante4383372011-10-22 20:59:454216 __first = __lower_bound<_Compare>(__first, __last, __value_, __comp);
4217 return __first != __last && !__comp(__value_, *__first);
Howard Hinnant3e519522010-05-11 19:42:164218}
4219
4220template <class _ForwardIterator, class _Tp, class _Compare>
Marshall Clowd57c03d2018-01-16 02:34:414221inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:164222bool
Howard Hinnante4383372011-10-22 20:59:454223binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnant3e519522010-05-11 19:42:164224{
Howard Hinnant145afa12013-08-23 20:10:184225#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164226 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4227 __debug_less<_Compare> __c(__comp);
Howard Hinnante4383372011-10-22 20:59:454228 return __binary_search<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant145afa12013-08-23 20:10:184229#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164230 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnante4383372011-10-22 20:59:454231 return __binary_search<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant145afa12013-08-23 20:10:184232#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164233}
4234
4235template <class _ForwardIterator, class _Tp>
Marshall Clowd57c03d2018-01-16 02:34:414236inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:164237bool
Howard Hinnante4383372011-10-22 20:59:454238binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnant3e519522010-05-11 19:42:164239{
Howard Hinnante4383372011-10-22 20:59:454240 return _VSTD::binary_search(__first, __last, __value_,
Howard Hinnant3e519522010-05-11 19:42:164241 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
4242}
4243
4244// merge
4245
4246template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4247_OutputIterator
4248__merge(_InputIterator1 __first1, _InputIterator1 __last1,
4249 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4250{
4251 for (; __first1 != __last1; ++__result)
4252 {
4253 if (__first2 == __last2)
Howard Hinnantce48a112011-06-30 21:18:194254 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnant3e519522010-05-11 19:42:164255 if (__comp(*__first2, *__first1))
4256 {
4257 *__result = *__first2;
4258 ++__first2;
4259 }
4260 else
4261 {
4262 *__result = *__first1;
4263 ++__first1;
4264 }
4265 }
Howard Hinnantce48a112011-06-30 21:18:194266 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnant3e519522010-05-11 19:42:164267}
4268
4269template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
4270inline _LIBCPP_INLINE_VISIBILITY
4271_OutputIterator
4272merge(_InputIterator1 __first1, _InputIterator1 __last1,
4273 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4274{
Howard Hinnant145afa12013-08-23 20:10:184275#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164276 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4277 __debug_less<_Compare> __c(__comp);
Howard Hinnantce48a112011-06-30 21:18:194278 return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant145afa12013-08-23 20:10:184279#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164280 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnantce48a112011-06-30 21:18:194281 return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant145afa12013-08-23 20:10:184282#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164283}
4284
4285template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
4286inline _LIBCPP_INLINE_VISIBILITY
4287_OutputIterator
4288merge(_InputIterator1 __first1, _InputIterator1 __last1,
4289 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
4290{
4291 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
4292 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
4293 return merge(__first1, __last1, __first2, __last2, __result, __less<__v1, __v2>());
4294}
4295
4296// inplace_merge
4297
Marshall Clowadfdae12015-07-29 16:25:454298template <class _Compare, class _InputIterator1, class _InputIterator2,
4299 class _OutputIterator>
4300void __half_inplace_merge(_InputIterator1 __first1, _InputIterator1 __last1,
4301 _InputIterator2 __first2, _InputIterator2 __last2,
4302 _OutputIterator __result, _Compare __comp)
4303{
4304 for (; __first1 != __last1; ++__result)
4305 {
4306 if (__first2 == __last2)
4307 {
4308 _VSTD::move(__first1, __last1, __result);
4309 return;
4310 }
4311
4312 if (__comp(*__first2, *__first1))
4313 {
4314 *__result = _VSTD::move(*__first2);
4315 ++__first2;
4316 }
4317 else
4318 {
4319 *__result = _VSTD::move(*__first1);
4320 ++__first1;
4321 }
4322 }
4323 // __first2 through __last2 are already in the right spot.
4324}
4325
Howard Hinnant3e519522010-05-11 19:42:164326template <class _Compare, class _BidirectionalIterator>
4327void
4328__buffered_inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4329 _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1,
4330 typename iterator_traits<_BidirectionalIterator>::difference_type __len2,
4331 typename iterator_traits<_BidirectionalIterator>::value_type* __buff)
4332{
4333 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
Howard Hinnant3e519522010-05-11 19:42:164334 __destruct_n __d(0);
4335 unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
4336 if (__len1 <= __len2)
4337 {
4338 value_type* __p = __buff;
Eric Fiselier910285b2014-10-27 19:28:204339 for (_BidirectionalIterator __i = __first; __i != __middle; __d.__incr((value_type*)0), (void) ++__i, ++__p)
Howard Hinnantce48a112011-06-30 21:18:194340 ::new(__p) value_type(_VSTD::move(*__i));
Marshall Clowadfdae12015-07-29 16:25:454341 __half_inplace_merge(__buff, __p, __middle, __last, __first, __comp);
Howard Hinnant3e519522010-05-11 19:42:164342 }
4343 else
4344 {
4345 value_type* __p = __buff;
Eric Fiselier910285b2014-10-27 19:28:204346 for (_BidirectionalIterator __i = __middle; __i != __last; __d.__incr((value_type*)0), (void) ++__i, ++__p)
Howard Hinnantce48a112011-06-30 21:18:194347 ::new(__p) value_type(_VSTD::move(*__i));
Howard Hinnant3e519522010-05-11 19:42:164348 typedef reverse_iterator<_BidirectionalIterator> _RBi;
4349 typedef reverse_iterator<value_type*> _Rv;
Aditya Kumar331fb802016-08-25 11:52:384350 __half_inplace_merge(_Rv(__p), _Rv(__buff),
Marshall Clowadfdae12015-07-29 16:25:454351 _RBi(__middle), _RBi(__first),
Marshall Clowa763b362017-08-28 23:16:134352 _RBi(__last), __invert<_Compare>(__comp));
Howard Hinnant3e519522010-05-11 19:42:164353 }
4354}
4355
4356template <class _Compare, class _BidirectionalIterator>
4357void
4358__inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4359 _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1,
4360 typename iterator_traits<_BidirectionalIterator>::difference_type __len2,
4361 typename iterator_traits<_BidirectionalIterator>::value_type* __buff, ptrdiff_t __buff_size)
4362{
Howard Hinnant3e519522010-05-11 19:42:164363 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
4364 while (true)
4365 {
4366 // if __middle == __last, we're done
4367 if (__len2 == 0)
4368 return;
Marshall Clow526e0922015-02-02 16:44:114369 if (__len1 <= __buff_size || __len2 <= __buff_size)
4370 return __buffered_inplace_merge<_Compare>
4371 (__first, __middle, __last, __comp, __len1, __len2, __buff);
Howard Hinnant3e519522010-05-11 19:42:164372 // shrink [__first, __middle) as much as possible (with no moves), returning if it shrinks to 0
Eric Fiselier910285b2014-10-27 19:28:204373 for (; true; ++__first, (void) --__len1)
Howard Hinnant3e519522010-05-11 19:42:164374 {
4375 if (__len1 == 0)
4376 return;
4377 if (__comp(*__middle, *__first))
4378 break;
4379 }
Howard Hinnant3e519522010-05-11 19:42:164380 // __first < __middle < __last
4381 // *__first > *__middle
4382 // partition [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last) such that
4383 // all elements in:
4384 // [__first, __m1) <= [__middle, __m2)
4385 // [__middle, __m2) < [__m1, __middle)
4386 // [__m1, __middle) <= [__m2, __last)
4387 // and __m1 or __m2 is in the middle of its range
4388 _BidirectionalIterator __m1; // "median" of [__first, __middle)
4389 _BidirectionalIterator __m2; // "median" of [__middle, __last)
4390 difference_type __len11; // distance(__first, __m1)
4391 difference_type __len21; // distance(__middle, __m2)
4392 // binary search smaller range
4393 if (__len1 < __len2)
4394 { // __len >= 1, __len2 >= 2
4395 __len21 = __len2 / 2;
4396 __m2 = __middle;
Howard Hinnantce48a112011-06-30 21:18:194397 _VSTD::advance(__m2, __len21);
Howard Hinnant3e519522010-05-11 19:42:164398 __m1 = __upper_bound<_Compare>(__first, __middle, *__m2, __comp);
Howard Hinnantce48a112011-06-30 21:18:194399 __len11 = _VSTD::distance(__first, __m1);
Howard Hinnant3e519522010-05-11 19:42:164400 }
4401 else
4402 {
4403 if (__len1 == 1)
4404 { // __len1 >= __len2 && __len2 > 0, therefore __len2 == 1
4405 // It is known *__first > *__middle
4406 swap(*__first, *__middle);
4407 return;
4408 }
4409 // __len1 >= 2, __len2 >= 1
4410 __len11 = __len1 / 2;
4411 __m1 = __first;
Howard Hinnantce48a112011-06-30 21:18:194412 _VSTD::advance(__m1, __len11);
Howard Hinnant3e519522010-05-11 19:42:164413 __m2 = __lower_bound<_Compare>(__middle, __last, *__m1, __comp);
Howard Hinnantce48a112011-06-30 21:18:194414 __len21 = _VSTD::distance(__middle, __m2);
Howard Hinnant3e519522010-05-11 19:42:164415 }
4416 difference_type __len12 = __len1 - __len11; // distance(__m1, __middle)
4417 difference_type __len22 = __len2 - __len21; // distance(__m2, __last)
4418 // [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last)
4419 // swap middle two partitions
Howard Hinnantce48a112011-06-30 21:18:194420 __middle = _VSTD::rotate(__m1, __middle, __m2);
Howard Hinnant3e519522010-05-11 19:42:164421 // __len12 and __len21 now have swapped meanings
4422 // merge smaller range with recurisve call and larger with tail recursion elimination
4423 if (__len11 + __len21 < __len12 + __len22)
4424 {
4425 __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size);
4426// __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size);
4427 __first = __middle;
4428 __middle = __m2;
4429 __len1 = __len12;
4430 __len2 = __len22;
4431 }
4432 else
4433 {
4434 __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size);
4435// __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size);
4436 __last = __middle;
4437 __middle = __m1;
4438 __len1 = __len11;
4439 __len2 = __len21;
4440 }
4441 }
4442}
4443
Howard Hinnant3e519522010-05-11 19:42:164444template <class _BidirectionalIterator, class _Compare>
4445inline _LIBCPP_INLINE_VISIBILITY
4446void
4447inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4448 _Compare __comp)
4449{
4450 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
4451 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
Howard Hinnantce48a112011-06-30 21:18:194452 difference_type __len1 = _VSTD::distance(__first, __middle);
4453 difference_type __len2 = _VSTD::distance(__middle, __last);
4454 difference_type __buf_size = _VSTD::min(__len1, __len2);
Marshall Clow0b48cf92015-02-02 17:35:534455 pair<value_type*, ptrdiff_t> __buf = _VSTD::get_temporary_buffer<value_type>(__buf_size);
4456 unique_ptr<value_type, __return_temporary_buffer> __h(__buf.first);
4457
Howard Hinnant145afa12013-08-23 20:10:184458#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164459 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4460 __debug_less<_Compare> __c(__comp);
Howard Hinnantce48a112011-06-30 21:18:194461 return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __c, __len1, __len2,
Howard Hinnant3e519522010-05-11 19:42:164462 __buf.first, __buf.second);
Howard Hinnant145afa12013-08-23 20:10:184463#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164464 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnantce48a112011-06-30 21:18:194465 return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __comp, __len1, __len2,
Howard Hinnant3e519522010-05-11 19:42:164466 __buf.first, __buf.second);
Howard Hinnant145afa12013-08-23 20:10:184467#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164468}
4469
4470template <class _BidirectionalIterator>
4471inline _LIBCPP_INLINE_VISIBILITY
4472void
4473inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last)
4474{
Howard Hinnantce48a112011-06-30 21:18:194475 _VSTD::inplace_merge(__first, __middle, __last,
Howard Hinnant3e519522010-05-11 19:42:164476 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
4477}
4478
4479// stable_sort
4480
4481template <class _Compare, class _InputIterator1, class _InputIterator2>
4482void
4483__merge_move_construct(_InputIterator1 __first1, _InputIterator1 __last1,
4484 _InputIterator2 __first2, _InputIterator2 __last2,
4485 typename iterator_traits<_InputIterator1>::value_type* __result, _Compare __comp)
4486{
4487 typedef typename iterator_traits<_InputIterator1>::value_type value_type;
4488 __destruct_n __d(0);
4489 unique_ptr<value_type, __destruct_n&> __h(__result, __d);
4490 for (; true; ++__result)
4491 {
4492 if (__first1 == __last1)
4493 {
4494 for (; __first2 != __last2; ++__first2, ++__result, __d.__incr((value_type*)0))
Howard Hinnantce48a112011-06-30 21:18:194495 ::new (__result) value_type(_VSTD::move(*__first2));
Howard Hinnant3e519522010-05-11 19:42:164496 __h.release();
4497 return;
4498 }
4499 if (__first2 == __last2)
4500 {
4501 for (; __first1 != __last1; ++__first1, ++__result, __d.__incr((value_type*)0))
Howard Hinnantce48a112011-06-30 21:18:194502 ::new (__result) value_type(_VSTD::move(*__first1));
Howard Hinnant3e519522010-05-11 19:42:164503 __h.release();
4504 return;
4505 }
4506 if (__comp(*__first2, *__first1))
4507 {
Howard Hinnantce48a112011-06-30 21:18:194508 ::new (__result) value_type(_VSTD::move(*__first2));
Howard Hinnant3e519522010-05-11 19:42:164509 __d.__incr((value_type*)0);
4510 ++__first2;
4511 }
4512 else
4513 {
Howard Hinnantce48a112011-06-30 21:18:194514 ::new (__result) value_type(_VSTD::move(*__first1));
Howard Hinnant3e519522010-05-11 19:42:164515 __d.__incr((value_type*)0);
4516 ++__first1;
4517 }
4518 }
4519}
4520
4521template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4522void
4523__merge_move_assign(_InputIterator1 __first1, _InputIterator1 __last1,
4524 _InputIterator2 __first2, _InputIterator2 __last2,
4525 _OutputIterator __result, _Compare __comp)
4526{
4527 for (; __first1 != __last1; ++__result)
4528 {
4529 if (__first2 == __last2)
4530 {
4531 for (; __first1 != __last1; ++__first1, ++__result)
Howard Hinnantce48a112011-06-30 21:18:194532 *__result = _VSTD::move(*__first1);
Howard Hinnant3e519522010-05-11 19:42:164533 return;
4534 }
4535 if (__comp(*__first2, *__first1))
4536 {
Howard Hinnantce48a112011-06-30 21:18:194537 *__result = _VSTD::move(*__first2);
Howard Hinnant3e519522010-05-11 19:42:164538 ++__first2;
4539 }
4540 else
4541 {
Howard Hinnantce48a112011-06-30 21:18:194542 *__result = _VSTD::move(*__first1);
Howard Hinnant3e519522010-05-11 19:42:164543 ++__first1;
4544 }
4545 }
4546 for (; __first2 != __last2; ++__first2, ++__result)
Howard Hinnantce48a112011-06-30 21:18:194547 *__result = _VSTD::move(*__first2);
Howard Hinnant3e519522010-05-11 19:42:164548}
4549
4550template <class _Compare, class _RandomAccessIterator>
4551void
4552__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4553 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4554 typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size);
4555
4556template <class _Compare, class _RandomAccessIterator>
4557void
4558__stable_sort_move(_RandomAccessIterator __first1, _RandomAccessIterator __last1, _Compare __comp,
4559 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4560 typename iterator_traits<_RandomAccessIterator>::value_type* __first2)
4561{
4562 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4563 switch (__len)
4564 {
4565 case 0:
4566 return;
4567 case 1:
Howard Hinnantce48a112011-06-30 21:18:194568 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnant3e519522010-05-11 19:42:164569 return;
4570 case 2:
Marshall Clowf951fc32018-02-06 18:58:054571 __destruct_n __d(0);
Howard Hinnant3e519522010-05-11 19:42:164572 unique_ptr<value_type, __destruct_n&> __h2(__first2, __d);
Marshall Clowf951fc32018-02-06 18:58:054573 if (__comp(*--__last1, *__first1))
Howard Hinnant3e519522010-05-11 19:42:164574 {
Howard Hinnantce48a112011-06-30 21:18:194575 ::new(__first2) value_type(_VSTD::move(*__last1));
Howard Hinnant3e519522010-05-11 19:42:164576 __d.__incr((value_type*)0);
4577 ++__first2;
Howard Hinnantce48a112011-06-30 21:18:194578 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnant3e519522010-05-11 19:42:164579 }
4580 else
4581 {
Howard Hinnantce48a112011-06-30 21:18:194582 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnant3e519522010-05-11 19:42:164583 __d.__incr((value_type*)0);
4584 ++__first2;
Howard Hinnantce48a112011-06-30 21:18:194585 ::new(__first2) value_type(_VSTD::move(*__last1));
Howard Hinnant3e519522010-05-11 19:42:164586 }
4587 __h2.release();
4588 return;
4589 }
4590 if (__len <= 8)
4591 {
4592 __insertion_sort_move<_Compare>(__first1, __last1, __first2, __comp);
4593 return;
4594 }
4595 typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2;
4596 _RandomAccessIterator __m = __first1 + __l2;
4597 __stable_sort<_Compare>(__first1, __m, __comp, __l2, __first2, __l2);
4598 __stable_sort<_Compare>(__m, __last1, __comp, __len - __l2, __first2 + __l2, __len - __l2);
4599 __merge_move_construct<_Compare>(__first1, __m, __m, __last1, __first2, __comp);
4600}
4601
4602template <class _Tp>
4603struct __stable_sort_switch
4604{
Howard Hinnantca740482010-11-19 22:17:284605 static const unsigned value = 128*is_trivially_copy_assignable<_Tp>::value;
Howard Hinnant3e519522010-05-11 19:42:164606};
4607
4608template <class _Compare, class _RandomAccessIterator>
4609void
4610__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4611 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4612 typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size)
4613{
4614 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4615 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4616 switch (__len)
4617 {
4618 case 0:
4619 case 1:
4620 return;
4621 case 2:
4622 if (__comp(*--__last, *__first))
4623 swap(*__first, *__last);
4624 return;
4625 }
4626 if (__len <= static_cast<difference_type>(__stable_sort_switch<value_type>::value))
4627 {
4628 __insertion_sort<_Compare>(__first, __last, __comp);
4629 return;
4630 }
4631 typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2;
4632 _RandomAccessIterator __m = __first + __l2;
4633 if (__len <= __buff_size)
4634 {
4635 __destruct_n __d(0);
4636 unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
4637 __stable_sort_move<_Compare>(__first, __m, __comp, __l2, __buff);
4638 __d.__set(__l2, (value_type*)0);
4639 __stable_sort_move<_Compare>(__m, __last, __comp, __len - __l2, __buff + __l2);
4640 __d.__set(__len, (value_type*)0);
4641 __merge_move_assign<_Compare>(__buff, __buff + __l2, __buff + __l2, __buff + __len, __first, __comp);
4642// __merge<_Compare>(move_iterator<value_type*>(__buff),
4643// move_iterator<value_type*>(__buff + __l2),
4644// move_iterator<_RandomAccessIterator>(__buff + __l2),
4645// move_iterator<_RandomAccessIterator>(__buff + __len),
4646// __first, __comp);
4647 return;
4648 }
4649 __stable_sort<_Compare>(__first, __m, __comp, __l2, __buff, __buff_size);
4650 __stable_sort<_Compare>(__m, __last, __comp, __len - __l2, __buff, __buff_size);
4651 __inplace_merge<_Compare>(__first, __m, __last, __comp, __l2, __len - __l2, __buff, __buff_size);
4652}
4653
4654template <class _RandomAccessIterator, class _Compare>
4655inline _LIBCPP_INLINE_VISIBILITY
4656void
4657stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4658{
4659 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4660 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4661 difference_type __len = __last - __first;
4662 pair<value_type*, ptrdiff_t> __buf(0, 0);
4663 unique_ptr<value_type, __return_temporary_buffer> __h;
4664 if (__len > static_cast<difference_type>(__stable_sort_switch<value_type>::value))
4665 {
Howard Hinnantce48a112011-06-30 21:18:194666 __buf = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnant3e519522010-05-11 19:42:164667 __h.reset(__buf.first);
4668 }
Howard Hinnant145afa12013-08-23 20:10:184669#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164670 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4671 __debug_less<_Compare> __c(__comp);
4672 __stable_sort<_Comp_ref>(__first, __last, __c, __len, __buf.first, __buf.second);
Howard Hinnant145afa12013-08-23 20:10:184673#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164674 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4675 __stable_sort<_Comp_ref>(__first, __last, __comp, __len, __buf.first, __buf.second);
Howard Hinnant145afa12013-08-23 20:10:184676#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164677}
4678
4679template <class _RandomAccessIterator>
4680inline _LIBCPP_INLINE_VISIBILITY
4681void
4682stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
4683{
Howard Hinnantce48a112011-06-30 21:18:194684 _VSTD::stable_sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnant3e519522010-05-11 19:42:164685}
4686
4687// is_heap_until
4688
4689template <class _RandomAccessIterator, class _Compare>
Marshall Clow49c76432018-01-15 16:16:324690_LIBCPP_CONSTEXPR_AFTER_CXX17 _RandomAccessIterator
Howard Hinnant3e519522010-05-11 19:42:164691is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4692{
Howard Hinnantce48a112011-06-30 21:18:194693 typedef typename _VSTD::iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnant3e519522010-05-11 19:42:164694 difference_type __len = __last - __first;
4695 difference_type __p = 0;
4696 difference_type __c = 1;
4697 _RandomAccessIterator __pp = __first;
4698 while (__c < __len)
4699 {
4700 _RandomAccessIterator __cp = __first + __c;
4701 if (__comp(*__pp, *__cp))
4702 return __cp;
4703 ++__c;
4704 ++__cp;
4705 if (__c == __len)
4706 return __last;
4707 if (__comp(*__pp, *__cp))
4708 return __cp;
4709 ++__p;
4710 ++__pp;
4711 __c = 2 * __p + 1;
4712 }
4713 return __last;
4714}
4715
Howard Hinnantb3371f62010-08-22 00:02:434716template<class _RandomAccessIterator>
Marshall Clow49c76432018-01-15 16:16:324717inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:164718_RandomAccessIterator
4719is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last)
4720{
Howard Hinnantce48a112011-06-30 21:18:194721 return _VSTD::is_heap_until(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnant3e519522010-05-11 19:42:164722}
4723
4724// is_heap
4725
4726template <class _RandomAccessIterator, class _Compare>
Marshall Clow49c76432018-01-15 16:16:324727inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:164728bool
4729is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4730{
Howard Hinnantce48a112011-06-30 21:18:194731 return _VSTD::is_heap_until(__first, __last, __comp) == __last;
Howard Hinnant3e519522010-05-11 19:42:164732}
4733
Howard Hinnantb3371f62010-08-22 00:02:434734template<class _RandomAccessIterator>
Marshall Clow49c76432018-01-15 16:16:324735inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:164736bool
4737is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4738{
Howard Hinnantce48a112011-06-30 21:18:194739 return _VSTD::is_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnant3e519522010-05-11 19:42:164740}
4741
4742// push_heap
4743
4744template <class _Compare, class _RandomAccessIterator>
4745void
David Majnemer8b512602014-07-22 06:07:094746__sift_up(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4747 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
Howard Hinnant3e519522010-05-11 19:42:164748{
Howard Hinnant3e519522010-05-11 19:42:164749 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4750 if (__len > 1)
4751 {
4752 __len = (__len - 2) / 2;
4753 _RandomAccessIterator __ptr = __first + __len;
4754 if (__comp(*__ptr, *--__last))
4755 {
Howard Hinnantce48a112011-06-30 21:18:194756 value_type __t(_VSTD::move(*__last));
Howard Hinnant3e519522010-05-11 19:42:164757 do
4758 {
Howard Hinnantce48a112011-06-30 21:18:194759 *__last = _VSTD::move(*__ptr);
Howard Hinnant3e519522010-05-11 19:42:164760 __last = __ptr;
4761 if (__len == 0)
4762 break;
4763 __len = (__len - 1) / 2;
4764 __ptr = __first + __len;
4765 } while (__comp(*__ptr, __t));
Howard Hinnantce48a112011-06-30 21:18:194766 *__last = _VSTD::move(__t);
Howard Hinnant3e519522010-05-11 19:42:164767 }
4768 }
4769}
4770
4771template <class _RandomAccessIterator, class _Compare>
4772inline _LIBCPP_INLINE_VISIBILITY
4773void
4774push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4775{
Howard Hinnant145afa12013-08-23 20:10:184776#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164777 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4778 __debug_less<_Compare> __c(__comp);
David Majnemer8b512602014-07-22 06:07:094779 __sift_up<_Comp_ref>(__first, __last, __c, __last - __first);
Howard Hinnant145afa12013-08-23 20:10:184780#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164781 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
David Majnemer8b512602014-07-22 06:07:094782 __sift_up<_Comp_ref>(__first, __last, __comp, __last - __first);
Howard Hinnant145afa12013-08-23 20:10:184783#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164784}
4785
4786template <class _RandomAccessIterator>
4787inline _LIBCPP_INLINE_VISIBILITY
4788void
4789push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4790{
Howard Hinnantce48a112011-06-30 21:18:194791 _VSTD::push_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnant3e519522010-05-11 19:42:164792}
4793
4794// pop_heap
4795
4796template <class _Compare, class _RandomAccessIterator>
David Majnemer8b512602014-07-22 06:07:094797void
Eric Fiselierfd838222016-12-23 23:37:524798__sift_down(_RandomAccessIterator __first, _RandomAccessIterator /*__last*/,
4799 _Compare __comp,
David Majnemer8b512602014-07-22 06:07:094800 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4801 _RandomAccessIterator __start)
4802{
4803 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4804 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4805 // left-child of __start is at 2 * __start + 1
4806 // right-child of __start is at 2 * __start + 2
4807 difference_type __child = __start - __first;
4808
4809 if (__len < 2 || (__len - 2) / 2 < __child)
4810 return;
4811
4812 __child = 2 * __child + 1;
4813 _RandomAccessIterator __child_i = __first + __child;
4814
4815 if ((__child + 1) < __len && __comp(*__child_i, *(__child_i + 1))) {
4816 // right-child exists and is greater than left-child
4817 ++__child_i;
4818 ++__child;
4819 }
4820
4821 // check if we are in heap-order
4822 if (__comp(*__child_i, *__start))
4823 // we are, __start is larger than it's largest child
4824 return;
4825
4826 value_type __top(_VSTD::move(*__start));
4827 do
4828 {
4829 // we are not in heap-order, swap the parent with it's largest child
4830 *__start = _VSTD::move(*__child_i);
4831 __start = __child_i;
4832
4833 if ((__len - 2) / 2 < __child)
4834 break;
4835
4836 // recompute the child based off of the updated parent
4837 __child = 2 * __child + 1;
4838 __child_i = __first + __child;
4839
4840 if ((__child + 1) < __len && __comp(*__child_i, *(__child_i + 1))) {
4841 // right-child exists and is greater than left-child
4842 ++__child_i;
4843 ++__child;
4844 }
4845
4846 // check if we are in heap-order
4847 } while (!__comp(*__child_i, __top));
4848 *__start = _VSTD::move(__top);
4849}
4850
4851template <class _Compare, class _RandomAccessIterator>
Howard Hinnant3e519522010-05-11 19:42:164852inline _LIBCPP_INLINE_VISIBILITY
4853void
4854__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4855 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
4856{
4857 if (__len > 1)
4858 {
4859 swap(*__first, *--__last);
David Majnemer8b512602014-07-22 06:07:094860 __sift_down<_Compare>(__first, __last, __comp, __len - 1, __first);
Howard Hinnant3e519522010-05-11 19:42:164861 }
4862}
4863
4864template <class _RandomAccessIterator, class _Compare>
4865inline _LIBCPP_INLINE_VISIBILITY
4866void
4867pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4868{
Howard Hinnant145afa12013-08-23 20:10:184869#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164870 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4871 __debug_less<_Compare> __c(__comp);
4872 __pop_heap<_Comp_ref>(__first, __last, __c, __last - __first);
Howard Hinnant145afa12013-08-23 20:10:184873#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164874 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4875 __pop_heap<_Comp_ref>(__first, __last, __comp, __last - __first);
Howard Hinnant145afa12013-08-23 20:10:184876#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164877}
4878
4879template <class _RandomAccessIterator>
4880inline _LIBCPP_INLINE_VISIBILITY
4881void
4882pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4883{
Howard Hinnantce48a112011-06-30 21:18:194884 _VSTD::pop_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnant3e519522010-05-11 19:42:164885}
4886
4887// make_heap
4888
4889template <class _Compare, class _RandomAccessIterator>
4890void
4891__make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4892{
4893 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4894 difference_type __n = __last - __first;
4895 if (__n > 1)
4896 {
David Majnemer8b512602014-07-22 06:07:094897 // start from the first parent, there is no need to consider children
4898 for (difference_type __start = (__n - 2) / 2; __start >= 0; --__start)
4899 {
4900 __sift_down<_Compare>(__first, __last, __comp, __n, __first + __start);
4901 }
Howard Hinnant3e519522010-05-11 19:42:164902 }
4903}
4904
4905template <class _RandomAccessIterator, class _Compare>
4906inline _LIBCPP_INLINE_VISIBILITY
4907void
4908make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4909{
Howard Hinnant145afa12013-08-23 20:10:184910#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164911 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4912 __debug_less<_Compare> __c(__comp);
4913 __make_heap<_Comp_ref>(__first, __last, __c);
Howard Hinnant145afa12013-08-23 20:10:184914#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164915 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4916 __make_heap<_Comp_ref>(__first, __last, __comp);
Howard Hinnant145afa12013-08-23 20:10:184917#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164918}
4919
4920template <class _RandomAccessIterator>
4921inline _LIBCPP_INLINE_VISIBILITY
4922void
4923make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4924{
Howard Hinnantce48a112011-06-30 21:18:194925 _VSTD::make_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnant3e519522010-05-11 19:42:164926}
4927
4928// sort_heap
4929
4930template <class _Compare, class _RandomAccessIterator>
4931void
4932__sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4933{
4934 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4935 for (difference_type __n = __last - __first; __n > 1; --__last, --__n)
4936 __pop_heap<_Compare>(__first, __last, __comp, __n);
4937}
4938
4939template <class _RandomAccessIterator, class _Compare>
4940inline _LIBCPP_INLINE_VISIBILITY
4941void
4942sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4943{
Howard Hinnant145afa12013-08-23 20:10:184944#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164945 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4946 __debug_less<_Compare> __c(__comp);
4947 __sort_heap<_Comp_ref>(__first, __last, __c);
Howard Hinnant145afa12013-08-23 20:10:184948#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164949 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4950 __sort_heap<_Comp_ref>(__first, __last, __comp);
Howard Hinnant145afa12013-08-23 20:10:184951#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164952}
4953
4954template <class _RandomAccessIterator>
4955inline _LIBCPP_INLINE_VISIBILITY
4956void
4957sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4958{
Howard Hinnantce48a112011-06-30 21:18:194959 _VSTD::sort_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnant3e519522010-05-11 19:42:164960}
4961
4962// partial_sort
4963
4964template <class _Compare, class _RandomAccessIterator>
4965void
4966__partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
4967 _Compare __comp)
4968{
4969 __make_heap<_Compare>(__first, __middle, __comp);
4970 typename iterator_traits<_RandomAccessIterator>::difference_type __len = __middle - __first;
4971 for (_RandomAccessIterator __i = __middle; __i != __last; ++__i)
4972 {
4973 if (__comp(*__i, *__first))
4974 {
4975 swap(*__i, *__first);
David Majnemer8b512602014-07-22 06:07:094976 __sift_down<_Compare>(__first, __middle, __comp, __len, __first);
Howard Hinnant3e519522010-05-11 19:42:164977 }
4978 }
4979 __sort_heap<_Compare>(__first, __middle, __comp);
4980}
4981
4982template <class _RandomAccessIterator, class _Compare>
4983inline _LIBCPP_INLINE_VISIBILITY
4984void
4985partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
4986 _Compare __comp)
4987{
Howard Hinnant145afa12013-08-23 20:10:184988#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164989 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4990 __debug_less<_Compare> __c(__comp);
4991 __partial_sort<_Comp_ref>(__first, __middle, __last, __c);
Howard Hinnant145afa12013-08-23 20:10:184992#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164993 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4994 __partial_sort<_Comp_ref>(__first, __middle, __last, __comp);
Howard Hinnant145afa12013-08-23 20:10:184995#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:164996}
4997
4998template <class _RandomAccessIterator>
4999inline _LIBCPP_INLINE_VISIBILITY
5000void
5001partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last)
5002{
Howard Hinnantce48a112011-06-30 21:18:195003 _VSTD::partial_sort(__first, __middle, __last,
Howard Hinnant3e519522010-05-11 19:42:165004 __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
5005}
5006
5007// partial_sort_copy
5008
5009template <class _Compare, class _InputIterator, class _RandomAccessIterator>
5010_RandomAccessIterator
5011__partial_sort_copy(_InputIterator __first, _InputIterator __last,
5012 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp)
5013{
5014 _RandomAccessIterator __r = __result_first;
5015 if (__r != __result_last)
5016 {
Eric Fiselier910285b2014-10-27 19:28:205017 for (; __first != __last && __r != __result_last; (void) ++__first, ++__r)
Howard Hinnant3e519522010-05-11 19:42:165018 *__r = *__first;
5019 __make_heap<_Compare>(__result_first, __r, __comp);
David Majnemer8b512602014-07-22 06:07:095020 typename iterator_traits<_RandomAccessIterator>::difference_type __len = __r - __result_first;
Howard Hinnant3e519522010-05-11 19:42:165021 for (; __first != __last; ++__first)
5022 if (__comp(*__first, *__result_first))
5023 {
5024 *__result_first = *__first;
David Majnemer8b512602014-07-22 06:07:095025 __sift_down<_Compare>(__result_first, __r, __comp, __len, __result_first);
Howard Hinnant3e519522010-05-11 19:42:165026 }
5027 __sort_heap<_Compare>(__result_first, __r, __comp);
5028 }
5029 return __r;
5030}
5031
5032template <class _InputIterator, class _RandomAccessIterator, class _Compare>
5033inline _LIBCPP_INLINE_VISIBILITY
5034_RandomAccessIterator
5035partial_sort_copy(_InputIterator __first, _InputIterator __last,
5036 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp)
5037{
Howard Hinnant145afa12013-08-23 20:10:185038#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165039 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5040 __debug_less<_Compare> __c(__comp);
5041 return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __c);
Howard Hinnant145afa12013-08-23 20:10:185042#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165043 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5044 return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __comp);
Howard Hinnant145afa12013-08-23 20:10:185045#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165046}
5047
5048template <class _InputIterator, class _RandomAccessIterator>
5049inline _LIBCPP_INLINE_VISIBILITY
5050_RandomAccessIterator
5051partial_sort_copy(_InputIterator __first, _InputIterator __last,
5052 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last)
5053{
Howard Hinnantce48a112011-06-30 21:18:195054 return _VSTD::partial_sort_copy(__first, __last, __result_first, __result_last,
Howard Hinnant3e519522010-05-11 19:42:165055 __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
5056}
5057
5058// nth_element
5059
5060template <class _Compare, class _RandomAccessIterator>
5061void
5062__nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
5063{
5064 // _Compare is known to be a reference type
5065 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
5066 const difference_type __limit = 7;
5067 while (true)
5068 {
5069 __restart:
Howard Hinnantb34b48192011-12-29 17:45:355070 if (__nth == __last)
5071 return;
Howard Hinnant3e519522010-05-11 19:42:165072 difference_type __len = __last - __first;
5073 switch (__len)
5074 {
5075 case 0:
5076 case 1:
5077 return;
5078 case 2:
5079 if (__comp(*--__last, *__first))
5080 swap(*__first, *__last);
5081 return;
5082 case 3:
5083 {
5084 _RandomAccessIterator __m = __first;
Howard Hinnantce48a112011-06-30 21:18:195085 _VSTD::__sort3<_Compare>(__first, ++__m, --__last, __comp);
Howard Hinnant3e519522010-05-11 19:42:165086 return;
5087 }
5088 }
5089 if (__len <= __limit)
5090 {
5091 __selection_sort<_Compare>(__first, __last, __comp);
5092 return;
5093 }
5094 // __len > __limit >= 3
5095 _RandomAccessIterator __m = __first + __len/2;
5096 _RandomAccessIterator __lm1 = __last;
Howard Hinnantce48a112011-06-30 21:18:195097 unsigned __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, --__lm1, __comp);
Howard Hinnant3e519522010-05-11 19:42:165098 // *__m is median
5099 // partition [__first, __m) < *__m and *__m <= [__m, __last)
5100 // (this inhibits tossing elements equivalent to __m around unnecessarily)
5101 _RandomAccessIterator __i = __first;
5102 _RandomAccessIterator __j = __lm1;
5103 // j points beyond range to be tested, *__lm1 is known to be <= *__m
5104 // The search going up is known to be guarded but the search coming down isn't.
5105 // Prime the downward search with a guard.
5106 if (!__comp(*__i, *__m)) // if *__first == *__m
5107 {
5108 // *__first == *__m, *__first doesn't go in first part
5109 // manually guard downward moving __j against __i
5110 while (true)
5111 {
5112 if (__i == --__j)
5113 {
5114 // *__first == *__m, *__m <= all other elements
5115 // Parition instead into [__first, __i) == *__first and *__first < [__i, __last)
5116 ++__i; // __first + 1
5117 __j = __last;
5118 if (!__comp(*__first, *--__j)) // we need a guard if *__first == *(__last-1)
5119 {
5120 while (true)
5121 {
5122 if (__i == __j)
5123 return; // [__first, __last) all equivalent elements
5124 if (__comp(*__first, *__i))
5125 {
5126 swap(*__i, *__j);
5127 ++__n_swaps;
5128 ++__i;
5129 break;
5130 }
5131 ++__i;
5132 }
5133 }
5134 // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1
5135 if (__i == __j)
5136 return;
5137 while (true)
5138 {
5139 while (!__comp(*__first, *__i))
5140 ++__i;
5141 while (__comp(*__first, *--__j))
5142 ;
5143 if (__i >= __j)
5144 break;
5145 swap(*__i, *__j);
5146 ++__n_swaps;
5147 ++__i;
5148 }
5149 // [__first, __i) == *__first and *__first < [__i, __last)
5150 // The first part is sorted,
5151 if (__nth < __i)
5152 return;
5153 // __nth_element the secod part
5154 // __nth_element<_Compare>(__i, __nth, __last, __comp);
5155 __first = __i;
5156 goto __restart;
5157 }
5158 if (__comp(*__j, *__m))
5159 {
5160 swap(*__i, *__j);
5161 ++__n_swaps;
5162 break; // found guard for downward moving __j, now use unguarded partition
5163 }
5164 }
5165 }
5166 ++__i;
5167 // j points beyond range to be tested, *__lm1 is known to be <= *__m
5168 // if not yet partitioned...
5169 if (__i < __j)
5170 {
5171 // known that *(__i - 1) < *__m
5172 while (true)
5173 {
5174 // __m still guards upward moving __i
5175 while (__comp(*__i, *__m))
5176 ++__i;
5177 // It is now known that a guard exists for downward moving __j
5178 while (!__comp(*--__j, *__m))
5179 ;
5180 if (__i >= __j)
5181 break;
5182 swap(*__i, *__j);
5183 ++__n_swaps;
5184 // It is known that __m != __j
5185 // If __m just moved, follow it
5186 if (__m == __i)
5187 __m = __j;
5188 ++__i;
5189 }
5190 }
5191 // [__first, __i) < *__m and *__m <= [__i, __last)
5192 if (__i != __m && __comp(*__m, *__i))
5193 {
5194 swap(*__i, *__m);
5195 ++__n_swaps;
5196 }
5197 // [__first, __i) < *__i and *__i <= [__i+1, __last)
5198 if (__nth == __i)
5199 return;
5200 if (__n_swaps == 0)
5201 {
5202 // We were given a perfectly partitioned sequence. Coincidence?
5203 if (__nth < __i)
5204 {
5205 // Check for [__first, __i) already sorted
5206 __j = __m = __first;
5207 while (++__j != __i)
5208 {
5209 if (__comp(*__j, *__m))
5210 // not yet sorted, so sort
5211 goto not_sorted;
5212 __m = __j;
5213 }
5214 // [__first, __i) sorted
5215 return;
5216 }
5217 else
5218 {
5219 // Check for [__i, __last) already sorted
5220 __j = __m = __i;
5221 while (++__j != __last)
5222 {
5223 if (__comp(*__j, *__m))
5224 // not yet sorted, so sort
5225 goto not_sorted;
5226 __m = __j;
5227 }
5228 // [__i, __last) sorted
5229 return;
5230 }
5231 }
5232not_sorted:
5233 // __nth_element on range containing __nth
5234 if (__nth < __i)
5235 {
5236 // __nth_element<_Compare>(__first, __nth, __i, __comp);
5237 __last = __i;
5238 }
5239 else
5240 {
5241 // __nth_element<_Compare>(__i+1, __nth, __last, __comp);
5242 __first = ++__i;
5243 }
5244 }
5245}
5246
5247template <class _RandomAccessIterator, class _Compare>
5248inline _LIBCPP_INLINE_VISIBILITY
5249void
5250nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
5251{
Howard Hinnant145afa12013-08-23 20:10:185252#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165253 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5254 __debug_less<_Compare> __c(__comp);
5255 __nth_element<_Comp_ref>(__first, __nth, __last, __c);
Howard Hinnant145afa12013-08-23 20:10:185256#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165257 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5258 __nth_element<_Comp_ref>(__first, __nth, __last, __comp);
Howard Hinnant145afa12013-08-23 20:10:185259#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165260}
5261
5262template <class _RandomAccessIterator>
5263inline _LIBCPP_INLINE_VISIBILITY
5264void
5265nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last)
5266{
Howard Hinnantce48a112011-06-30 21:18:195267 _VSTD::nth_element(__first, __nth, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnant3e519522010-05-11 19:42:165268}
5269
5270// includes
5271
5272template <class _Compare, class _InputIterator1, class _InputIterator2>
Marshall Clow8da1a482018-01-22 23:10:405273_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Howard Hinnant3e519522010-05-11 19:42:165274__includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
5275 _Compare __comp)
5276{
5277 for (; __first2 != __last2; ++__first1)
5278 {
5279 if (__first1 == __last1 || __comp(*__first2, *__first1))
5280 return false;
5281 if (!__comp(*__first1, *__first2))
5282 ++__first2;
5283 }
5284 return true;
5285}
5286
5287template <class _InputIterator1, class _InputIterator2, class _Compare>
Marshall Clow8da1a482018-01-22 23:10:405288inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:165289bool
5290includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
5291 _Compare __comp)
5292{
Howard Hinnant145afa12013-08-23 20:10:185293#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165294 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5295 __debug_less<_Compare> __c(__comp);
5296 return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __c);
Howard Hinnant145afa12013-08-23 20:10:185297#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165298 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5299 return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
Howard Hinnant145afa12013-08-23 20:10:185300#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165301}
5302
5303template <class _InputIterator1, class _InputIterator2>
Marshall Clow8da1a482018-01-22 23:10:405304inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:165305bool
5306includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2)
5307{
Howard Hinnantce48a112011-06-30 21:18:195308 return _VSTD::includes(__first1, __last1, __first2, __last2,
Howard Hinnant3e519522010-05-11 19:42:165309 __less<typename iterator_traits<_InputIterator1>::value_type,
5310 typename iterator_traits<_InputIterator2>::value_type>());
5311}
5312
5313// set_union
5314
5315template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5316_OutputIterator
5317__set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5318 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5319{
5320 for (; __first1 != __last1; ++__result)
5321 {
5322 if (__first2 == __last2)
Howard Hinnantce48a112011-06-30 21:18:195323 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnant3e519522010-05-11 19:42:165324 if (__comp(*__first2, *__first1))
5325 {
5326 *__result = *__first2;
5327 ++__first2;
5328 }
5329 else
5330 {
Howard Hinnant3e519522010-05-11 19:42:165331 if (!__comp(*__first1, *__first2))
5332 ++__first2;
Marshall Clow05da5b02017-10-30 15:50:005333 *__result = *__first1;
Howard Hinnant3e519522010-05-11 19:42:165334 ++__first1;
5335 }
5336 }
Howard Hinnantce48a112011-06-30 21:18:195337 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnant3e519522010-05-11 19:42:165338}
5339
5340template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5341inline _LIBCPP_INLINE_VISIBILITY
5342_OutputIterator
5343set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5344 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5345{
Howard Hinnant145afa12013-08-23 20:10:185346#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165347 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5348 __debug_less<_Compare> __c(__comp);
5349 return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant145afa12013-08-23 20:10:185350#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165351 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5352 return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant145afa12013-08-23 20:10:185353#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165354}
5355
5356template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5357inline _LIBCPP_INLINE_VISIBILITY
5358_OutputIterator
5359set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5360 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5361{
Howard Hinnantce48a112011-06-30 21:18:195362 return _VSTD::set_union(__first1, __last1, __first2, __last2, __result,
Howard Hinnant3e519522010-05-11 19:42:165363 __less<typename iterator_traits<_InputIterator1>::value_type,
5364 typename iterator_traits<_InputIterator2>::value_type>());
5365}
5366
5367// set_intersection
5368
5369template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
Marshall Clow8da1a482018-01-22 23:10:405370_LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator
Howard Hinnant3e519522010-05-11 19:42:165371__set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5372 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5373{
5374 while (__first1 != __last1 && __first2 != __last2)
5375 {
5376 if (__comp(*__first1, *__first2))
5377 ++__first1;
5378 else
5379 {
5380 if (!__comp(*__first2, *__first1))
5381 {
5382 *__result = *__first1;
5383 ++__result;
5384 ++__first1;
5385 }
5386 ++__first2;
5387 }
5388 }
5389 return __result;
5390}
5391
5392template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
Marshall Clow8da1a482018-01-22 23:10:405393inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:165394_OutputIterator
5395set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5396 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5397{
Howard Hinnant145afa12013-08-23 20:10:185398#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165399 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5400 __debug_less<_Compare> __c(__comp);
5401 return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant145afa12013-08-23 20:10:185402#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165403 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5404 return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant145afa12013-08-23 20:10:185405#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165406}
5407
5408template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
Marshall Clow8da1a482018-01-22 23:10:405409inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:165410_OutputIterator
5411set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5412 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5413{
Howard Hinnantce48a112011-06-30 21:18:195414 return _VSTD::set_intersection(__first1, __last1, __first2, __last2, __result,
Howard Hinnant3e519522010-05-11 19:42:165415 __less<typename iterator_traits<_InputIterator1>::value_type,
5416 typename iterator_traits<_InputIterator2>::value_type>());
5417}
5418
5419// set_difference
5420
5421template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5422_OutputIterator
5423__set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5424 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5425{
5426 while (__first1 != __last1)
5427 {
5428 if (__first2 == __last2)
Howard Hinnantce48a112011-06-30 21:18:195429 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnant3e519522010-05-11 19:42:165430 if (__comp(*__first1, *__first2))
5431 {
5432 *__result = *__first1;
5433 ++__result;
5434 ++__first1;
5435 }
5436 else
5437 {
5438 if (!__comp(*__first2, *__first1))
5439 ++__first1;
5440 ++__first2;
5441 }
5442 }
5443 return __result;
5444}
5445
5446template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5447inline _LIBCPP_INLINE_VISIBILITY
5448_OutputIterator
5449set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5450 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5451{
Howard Hinnant145afa12013-08-23 20:10:185452#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165453 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5454 __debug_less<_Compare> __c(__comp);
5455 return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant145afa12013-08-23 20:10:185456#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165457 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5458 return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant145afa12013-08-23 20:10:185459#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165460}
5461
5462template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5463inline _LIBCPP_INLINE_VISIBILITY
5464_OutputIterator
5465set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5466 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5467{
Howard Hinnantce48a112011-06-30 21:18:195468 return _VSTD::set_difference(__first1, __last1, __first2, __last2, __result,
Howard Hinnant3e519522010-05-11 19:42:165469 __less<typename iterator_traits<_InputIterator1>::value_type,
5470 typename iterator_traits<_InputIterator2>::value_type>());
5471}
5472
5473// set_symmetric_difference
5474
5475template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5476_OutputIterator
5477__set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5478 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5479{
5480 while (__first1 != __last1)
5481 {
5482 if (__first2 == __last2)
Howard Hinnantce48a112011-06-30 21:18:195483 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnant3e519522010-05-11 19:42:165484 if (__comp(*__first1, *__first2))
5485 {
5486 *__result = *__first1;
5487 ++__result;
5488 ++__first1;
5489 }
5490 else
5491 {
5492 if (__comp(*__first2, *__first1))
5493 {
5494 *__result = *__first2;
5495 ++__result;
5496 }
5497 else
5498 ++__first1;
5499 ++__first2;
5500 }
5501 }
Howard Hinnantce48a112011-06-30 21:18:195502 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnant3e519522010-05-11 19:42:165503}
5504
5505template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5506inline _LIBCPP_INLINE_VISIBILITY
5507_OutputIterator
5508set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5509 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5510{
Howard Hinnant145afa12013-08-23 20:10:185511#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165512 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5513 __debug_less<_Compare> __c(__comp);
5514 return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant145afa12013-08-23 20:10:185515#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165516 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5517 return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant145afa12013-08-23 20:10:185518#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165519}
5520
5521template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5522inline _LIBCPP_INLINE_VISIBILITY
5523_OutputIterator
5524set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5525 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5526{
Howard Hinnantce48a112011-06-30 21:18:195527 return _VSTD::set_symmetric_difference(__first1, __last1, __first2, __last2, __result,
Howard Hinnant3e519522010-05-11 19:42:165528 __less<typename iterator_traits<_InputIterator1>::value_type,
5529 typename iterator_traits<_InputIterator2>::value_type>());
5530}
5531
5532// lexicographical_compare
5533
5534template <class _Compare, class _InputIterator1, class _InputIterator2>
Marshall Clow1b9a4ff2018-01-22 20:44:335535_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Howard Hinnant3e519522010-05-11 19:42:165536__lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5537 _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
5538{
Eric Fiselier910285b2014-10-27 19:28:205539 for (; __first2 != __last2; ++__first1, (void) ++__first2)
Howard Hinnant3e519522010-05-11 19:42:165540 {
5541 if (__first1 == __last1 || __comp(*__first1, *__first2))
5542 return true;
5543 if (__comp(*__first2, *__first1))
5544 return false;
5545 }
5546 return false;
5547}
5548
5549template <class _InputIterator1, class _InputIterator2, class _Compare>
Marshall Clow1b9a4ff2018-01-22 20:44:335550inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:165551bool
5552lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5553 _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
5554{
Howard Hinnant145afa12013-08-23 20:10:185555#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165556 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5557 __debug_less<_Compare> __c(__comp);
5558 return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __c);
Howard Hinnant145afa12013-08-23 20:10:185559#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165560 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5561 return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
Howard Hinnant145afa12013-08-23 20:10:185562#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165563}
5564
5565template <class _InputIterator1, class _InputIterator2>
Marshall Clow1b9a4ff2018-01-22 20:44:335566inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnant3e519522010-05-11 19:42:165567bool
5568lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5569 _InputIterator2 __first2, _InputIterator2 __last2)
5570{
Howard Hinnantce48a112011-06-30 21:18:195571 return _VSTD::lexicographical_compare(__first1, __last1, __first2, __last2,
Howard Hinnant3e519522010-05-11 19:42:165572 __less<typename iterator_traits<_InputIterator1>::value_type,
5573 typename iterator_traits<_InputIterator2>::value_type>());
5574}
5575
5576// next_permutation
5577
5578template <class _Compare, class _BidirectionalIterator>
5579bool
5580__next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5581{
5582 _BidirectionalIterator __i = __last;
5583 if (__first == __last || __first == --__i)
5584 return false;
5585 while (true)
5586 {
5587 _BidirectionalIterator __ip1 = __i;
5588 if (__comp(*--__i, *__ip1))
5589 {
5590 _BidirectionalIterator __j = __last;
5591 while (!__comp(*__i, *--__j))
5592 ;
5593 swap(*__i, *__j);
Howard Hinnantce48a112011-06-30 21:18:195594 _VSTD::reverse(__ip1, __last);
Howard Hinnant3e519522010-05-11 19:42:165595 return true;
5596 }
5597 if (__i == __first)
5598 {
Howard Hinnantce48a112011-06-30 21:18:195599 _VSTD::reverse(__first, __last);
Howard Hinnant3e519522010-05-11 19:42:165600 return false;
5601 }
5602 }
5603}
5604
5605template <class _BidirectionalIterator, class _Compare>
5606inline _LIBCPP_INLINE_VISIBILITY
5607bool
5608next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5609{
Howard Hinnant145afa12013-08-23 20:10:185610#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165611 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5612 __debug_less<_Compare> __c(__comp);
5613 return __next_permutation<_Comp_ref>(__first, __last, __c);
Howard Hinnant145afa12013-08-23 20:10:185614#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165615 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5616 return __next_permutation<_Comp_ref>(__first, __last, __comp);
Howard Hinnant145afa12013-08-23 20:10:185617#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165618}
5619
5620template <class _BidirectionalIterator>
5621inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb3371f62010-08-22 00:02:435622bool
Howard Hinnant3e519522010-05-11 19:42:165623next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
5624{
Howard Hinnantce48a112011-06-30 21:18:195625 return _VSTD::next_permutation(__first, __last,
Howard Hinnant3e519522010-05-11 19:42:165626 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
5627}
5628
5629// prev_permutation
5630
5631template <class _Compare, class _BidirectionalIterator>
5632bool
5633__prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5634{
5635 _BidirectionalIterator __i = __last;
5636 if (__first == __last || __first == --__i)
5637 return false;
5638 while (true)
5639 {
5640 _BidirectionalIterator __ip1 = __i;
5641 if (__comp(*__ip1, *--__i))
5642 {
5643 _BidirectionalIterator __j = __last;
5644 while (!__comp(*--__j, *__i))
5645 ;
5646 swap(*__i, *__j);
Howard Hinnantce48a112011-06-30 21:18:195647 _VSTD::reverse(__ip1, __last);
Howard Hinnant3e519522010-05-11 19:42:165648 return true;
5649 }
5650 if (__i == __first)
5651 {
Howard Hinnantce48a112011-06-30 21:18:195652 _VSTD::reverse(__first, __last);
Howard Hinnant3e519522010-05-11 19:42:165653 return false;
5654 }
5655 }
5656}
5657
5658template <class _BidirectionalIterator, class _Compare>
5659inline _LIBCPP_INLINE_VISIBILITY
5660bool
5661prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5662{
Howard Hinnant145afa12013-08-23 20:10:185663#ifdef _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165664 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5665 __debug_less<_Compare> __c(__comp);
5666 return __prev_permutation<_Comp_ref>(__first, __last, __c);
Howard Hinnant145afa12013-08-23 20:10:185667#else // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165668 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5669 return __prev_permutation<_Comp_ref>(__first, __last, __comp);
Howard Hinnant145afa12013-08-23 20:10:185670#endif // _LIBCPP_DEBUG
Howard Hinnant3e519522010-05-11 19:42:165671}
5672
5673template <class _BidirectionalIterator>
5674inline _LIBCPP_INLINE_VISIBILITY
5675bool
5676prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
5677{
Howard Hinnantce48a112011-06-30 21:18:195678 return _VSTD::prev_permutation(__first, __last,
Howard Hinnant3e519522010-05-11 19:42:165679 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
5680}
5681
Howard Hinnant3e519522010-05-11 19:42:165682_LIBCPP_END_NAMESPACE_STD
5683
Eric Fiseliera016efb2017-05-31 22:07:495684_LIBCPP_POP_MACROS
5685
Howard Hinnant3e519522010-05-11 19:42:165686#endif // _LIBCPP_ALGORITHM