blob: 9f425cf9937bc7bd0af2c729fdefae596aa7264d [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001// -*- C++ -*-
2//===-------------------------- algorithm ---------------------------------===//
3//
Howard Hinnantc566dc32010-05-11 21:36:01 +00004// The LLVM Compiler Infrastructure
Howard Hinnantc51e1022010-05-11 19:42:16 +00005//
Howard Hinnantee11c312010-11-16 22:09:02 +00006// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantc51e1022010-05-11 19:42:16 +00008//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_ALGORITHM
12#define _LIBCPP_ALGORITHM
13
14/*
15 algorithm synopsis
16
17#include <initializer_list>
18
19namespace std
20{
21
22template <class InputIterator, class Predicate>
Marshall Clowd607fdb2018-01-15 17:20:36 +000023 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000024 all_of(InputIterator first, InputIterator last, Predicate pred);
25
26template <class InputIterator, class Predicate>
Marshall Clowd607fdb2018-01-15 17:20:36 +000027 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000028 any_of(InputIterator first, InputIterator last, Predicate pred);
29
30template <class InputIterator, class Predicate>
Marshall Clowd607fdb2018-01-15 17:20:36 +000031 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000032 none_of(InputIterator first, InputIterator last, Predicate pred);
33
34template <class InputIterator, class Function>
Marshall Clow5492c8a2018-01-22 20:44:33 +000035 constexpr Function // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000036 for_each(InputIterator first, InputIterator last, Function f);
37
Marshall Clowde0169c2017-05-25 02:29:54 +000038template<class InputIterator, class Size, class Function>
Marshall Clow5492c8a2018-01-22 20:44:33 +000039 constexpr InputIterator // constexpr in C++20
40 for_each_n(InputIterator first, Size n, Function f); // C++17
Marshall Clowde0169c2017-05-25 02:29:54 +000041
Howard Hinnantc51e1022010-05-11 19:42:16 +000042template <class InputIterator, class T>
Marshall Clowee0161e2018-01-15 19:26:05 +000043 constexpr InputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000044 find(InputIterator first, InputIterator last, const T& value);
45
46template <class InputIterator, class Predicate>
Marshall Clowee0161e2018-01-15 19:26:05 +000047 constexpr InputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000048 find_if(InputIterator first, InputIterator last, Predicate pred);
49
50template<class InputIterator, class Predicate>
Marshall Clowee0161e2018-01-15 19:26:05 +000051 InputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000052 find_if_not(InputIterator first, InputIterator last, Predicate pred);
53
54template <class ForwardIterator1, class ForwardIterator2>
Marshall Clowee0161e2018-01-15 19:26:05 +000055 ForwardIterator1 // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000056 find_end(ForwardIterator1 first1, ForwardIterator1 last1,
57 ForwardIterator2 first2, ForwardIterator2 last2);
58
59template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
Marshall Clowee0161e2018-01-15 19:26:05 +000060 ForwardIterator1 // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000061 find_end(ForwardIterator1 first1, ForwardIterator1 last1,
62 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
63
64template <class ForwardIterator1, class ForwardIterator2>
Marshall Clowee0161e2018-01-15 19:26:05 +000065 constexpr ForwardIterator1 // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000066 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
67 ForwardIterator2 first2, ForwardIterator2 last2);
68
69template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
Marshall Clowee0161e2018-01-15 19:26:05 +000070 constexpr ForwardIterator1 // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000071 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
72 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
73
74template <class ForwardIterator>
Marshall Clowee0161e2018-01-15 19:26:05 +000075 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000076 adjacent_find(ForwardIterator first, ForwardIterator last);
77
78template <class ForwardIterator, class BinaryPredicate>
Marshall Clowee0161e2018-01-15 19:26:05 +000079 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000080 adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
81
82template <class InputIterator, class T>
Marshall Clow3c0558f2018-01-15 19:40:34 +000083 constexpr typename iterator_traits<InputIterator>::difference_type // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000084 count(InputIterator first, InputIterator last, const T& value);
85
86template <class InputIterator, class Predicate>
Marshall Clow3c0558f2018-01-15 19:40:34 +000087 constexpr typename iterator_traits<InputIterator>::difference_type // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000088 count_if(InputIterator first, InputIterator last, Predicate pred);
89
90template <class InputIterator1, class InputIterator2>
Marshall Clow30bf3022018-01-16 02:04:10 +000091 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000092 mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
93
Marshall Clow96b42b22013-05-09 21:14:23 +000094template <class InputIterator1, class InputIterator2>
Marshall Clow30bf3022018-01-16 02:04:10 +000095 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20
Aditya Kumar3a0179a2016-08-25 11:52:38 +000096 mismatch(InputIterator1 first1, InputIterator1 last1,
Marshall Clow96b42b22013-05-09 21:14:23 +000097 InputIterator2 first2, InputIterator2 last2); // **C++14**
98
Howard Hinnantc51e1022010-05-11 19:42:16 +000099template <class InputIterator1, class InputIterator2, class BinaryPredicate>
Marshall Clow30bf3022018-01-16 02:04:10 +0000100 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000101 mismatch(InputIterator1 first1, InputIterator1 last1,
102 InputIterator2 first2, BinaryPredicate pred);
103
Marshall Clow96b42b22013-05-09 21:14:23 +0000104template <class InputIterator1, class InputIterator2, class BinaryPredicate>
Marshall Clow30bf3022018-01-16 02:04:10 +0000105 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20
Marshall Clow96b42b22013-05-09 21:14:23 +0000106 mismatch(InputIterator1 first1, InputIterator1 last1,
107 InputIterator2 first2, InputIterator2 last2,
108 BinaryPredicate pred); // **C++14**
109
Howard Hinnantc51e1022010-05-11 19:42:16 +0000110template <class InputIterator1, class InputIterator2>
Marshall Clow30bf3022018-01-16 02:04:10 +0000111 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000112 equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
113
Marshall Clow96b42b22013-05-09 21:14:23 +0000114template <class InputIterator1, class InputIterator2>
Marshall Clow30bf3022018-01-16 02:04:10 +0000115 constexpr bool // constexpr in C++20
Aditya Kumar3a0179a2016-08-25 11:52:38 +0000116 equal(InputIterator1 first1, InputIterator1 last1,
Marshall Clow96b42b22013-05-09 21:14:23 +0000117 InputIterator2 first2, InputIterator2 last2); // **C++14**
118
Howard Hinnantc51e1022010-05-11 19:42:16 +0000119template <class InputIterator1, class InputIterator2, class BinaryPredicate>
Marshall Clow30bf3022018-01-16 02:04:10 +0000120 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000121 equal(InputIterator1 first1, InputIterator1 last1,
122 InputIterator2 first2, BinaryPredicate pred);
123
Marshall Clow96b42b22013-05-09 21:14:23 +0000124template <class InputIterator1, class InputIterator2, class BinaryPredicate>
Marshall Clow30bf3022018-01-16 02:04:10 +0000125 constexpr bool // constexpr in C++20
Marshall Clow96b42b22013-05-09 21:14:23 +0000126 equal(InputIterator1 first1, InputIterator1 last1,
127 InputIterator2 first2, InputIterator2 last2,
128 BinaryPredicate pred); // **C++14**
129
Howard Hinnantc51e1022010-05-11 19:42:16 +0000130template<class ForwardIterator1, class ForwardIterator2>
Marshall Clow96d050a2018-01-15 16:16:32 +0000131 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000132 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
133 ForwardIterator2 first2);
134
Marshall Clow96b42b22013-05-09 21:14:23 +0000135template<class ForwardIterator1, class ForwardIterator2>
Marshall Clow96d050a2018-01-15 16:16:32 +0000136 constexpr bool // constexpr in C++20
Marshall Clow96b42b22013-05-09 21:14:23 +0000137 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
138 ForwardIterator2 first2, ForwardIterator2 last2); // **C++14**
139
Howard Hinnantc51e1022010-05-11 19:42:16 +0000140template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
Marshall Clow96d050a2018-01-15 16:16:32 +0000141 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000142 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
143 ForwardIterator2 first2, BinaryPredicate pred);
144
Marshall Clow96b42b22013-05-09 21:14:23 +0000145template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
Marshall Clow96d050a2018-01-15 16:16:32 +0000146 constexpr bool // constexpr in C++20
Marshall Clow96b42b22013-05-09 21:14:23 +0000147 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
148 ForwardIterator2 first2, ForwardIterator2 last2,
149 BinaryPredicate pred); // **C++14**
150
Howard Hinnantc51e1022010-05-11 19:42:16 +0000151template <class ForwardIterator1, class ForwardIterator2>
Marshall Clow323fc5b2018-01-16 15:48:27 +0000152 constexpr ForwardIterator1 // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000153 search(ForwardIterator1 first1, ForwardIterator1 last1,
154 ForwardIterator2 first2, ForwardIterator2 last2);
155
156template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
Marshall Clow323fc5b2018-01-16 15:48:27 +0000157 constexpr ForwardIterator1 // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000158 search(ForwardIterator1 first1, ForwardIterator1 last1,
159 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
160
161template <class ForwardIterator, class Size, class T>
Marshall Clow323fc5b2018-01-16 15:48:27 +0000162 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000163 search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value);
164
165template <class ForwardIterator, class Size, class T, class BinaryPredicate>
Marshall Clow323fc5b2018-01-16 15:48:27 +0000166 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000167 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 Clow31427c62018-01-19 17:45:39 +0000197 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000198 transform(InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op);
199
200template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation>
Marshall Clow31427c62018-01-19 17:45:39 +0000201 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000202 transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2,
203 OutputIterator result, BinaryOperation binary_op);
204
205template <class ForwardIterator, class T>
Marshall Clow01bbbd22018-01-19 18:07:29 +0000206 constexpr void // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000207 replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value);
208
209template <class ForwardIterator, class Predicate, class T>
Marshall Clow01bbbd22018-01-19 18:07:29 +0000210 constexpr void // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000211 replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value);
212
213template <class InputIterator, class OutputIterator, class T>
Marshall Clow01bbbd22018-01-19 18:07:29 +0000214 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000215 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 Clow01bbbd22018-01-19 18:07:29 +0000219 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000220 replace_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value);
221
222template <class ForwardIterator, class T>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +0000223 constexpr void // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000224 fill(ForwardIterator first, ForwardIterator last, const T& value);
225
226template <class OutputIterator, class Size, class T>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +0000227 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000228 fill_n(OutputIterator first, Size n, const T& value);
229
230template <class ForwardIterator, class Generator>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +0000231 constexpr void // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000232 generate(ForwardIterator first, ForwardIterator last, Generator gen);
233
234template <class OutputIterator, class Size, class Generator>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +0000235 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000236 generate_n(OutputIterator first, Size n, Generator gen);
237
238template <class ForwardIterator, class T>
Marshall Clow7c0fbd82018-01-22 21:43:04 +0000239 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000240 remove(ForwardIterator first, ForwardIterator last, const T& value);
241
242template <class ForwardIterator, class Predicate>
Marshall Clow7c0fbd82018-01-22 21:43:04 +0000243 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000244 remove_if(ForwardIterator first, ForwardIterator last, Predicate pred);
245
246template <class InputIterator, class OutputIterator, class T>
Marshall Clow7c0fbd82018-01-22 21:43:04 +0000247 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000248 remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value);
249
250template <class InputIterator, class OutputIterator, class Predicate>
Marshall Clow7c0fbd82018-01-22 21:43:04 +0000251 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000252 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 Clow7c0fbd82018-01-22 21:43:04 +0000275 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000276 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 Clowfac06e52017-03-23 13:43:37 +0000288 random_shuffle(RandomAccessIterator first, RandomAccessIterator last); // deprecated in C++14, removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000289
290template <class RandomAccessIterator, class RandomNumberGenerator>
291 void
Marshall Clow83f35392014-03-03 06:14:19 +0000292 random_shuffle(RandomAccessIterator first, RandomAccessIterator last,
Marshall Clowfac06e52017-03-23 13:43:37 +0000293 RandomNumberGenerator& rand); // deprecated in C++14, removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000294
Eric Fiselier1208fcd2016-08-28 22:14:37 +0000295template<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 Hinnant578ac0f2010-05-26 17:49:34 +0000301template<class RandomAccessIterator, class UniformRandomNumberGenerator>
302 void shuffle(RandomAccessIterator first, RandomAccessIterator last,
Howard Hinnanta5e71782010-11-18 01:47:02 +0000303 UniformRandomNumberGenerator&& g);
Howard Hinnant578ac0f2010-05-26 17:49:34 +0000304
Howard Hinnantc51e1022010-05-11 19:42:16 +0000305template <class InputIterator, class Predicate>
Marshall Clow96d050a2018-01-15 16:16:32 +0000306 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000307 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 Clow5492c8a2018-01-22 20:44:33 +0000315 constexpr pair<OutputIterator1, OutputIterator2> // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000316 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 Clowe00916c2018-01-16 02:34:41 +0000325 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000326 partition_point(ForwardIterator first, ForwardIterator last, Predicate pred);
327
328template <class ForwardIterator>
Marshall Clow96d050a2018-01-15 16:16:32 +0000329 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000330 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 Clow3c0558f2018-01-15 19:40:34 +0000337 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000338 is_sorted_until(ForwardIterator first, ForwardIterator last);
339
340template <class ForwardIterator, class Compare>
Marshall Clow3c0558f2018-01-15 19:40:34 +0000341 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000342 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 Clowe00916c2018-01-16 02:34:41 +0000387 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000388 lower_bound(ForwardIterator first, ForwardIterator last, const T& value);
389
390template <class ForwardIterator, class T, class Compare>
Marshall Clowe00916c2018-01-16 02:34:41 +0000391 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000392 lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
393
394template <class ForwardIterator, class T>
Marshall Clowe00916c2018-01-16 02:34:41 +0000395 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000396 upper_bound(ForwardIterator first, ForwardIterator last, const T& value);
397
398template <class ForwardIterator, class T, class Compare>
Marshall Clowe00916c2018-01-16 02:34:41 +0000399 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000400 upper_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
401
402template <class ForwardIterator, class T>
Marshall Clowe00916c2018-01-16 02:34:41 +0000403 constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000404 equal_range(ForwardIterator first, ForwardIterator last, const T& value);
405
406template <class ForwardIterator, class T, class Compare>
Marshall Clowe00916c2018-01-16 02:34:41 +0000407 constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000408 equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
409
410template <class ForwardIterator, class T>
Marshall Clowe00916c2018-01-16 02:34:41 +0000411 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000412 binary_search(ForwardIterator first, ForwardIterator last, const T& value);
413
414template <class ForwardIterator, class T, class Compare>
Marshall Clowc0b7f972018-01-22 23:10:40 +0000415 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000416 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 Clowc0b7f972018-01-22 23:10:40 +0000437 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000438 includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
439
440template <class InputIterator1, class InputIterator2, class Compare>
Marshall Clowc0b7f972018-01-22 23:10:40 +0000441 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000442 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 Clowc0b7f972018-01-22 23:10:40 +0000455 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000456 set_intersection(InputIterator1 first1, InputIterator1 last1,
457 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
458
459template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
Marshall Clowc0b7f972018-01-22 23:10:40 +0000460 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000461 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 Hinnant3b6579a2010-08-22 00:02:43 +0000516template <class RandomAccessIterator>
Marshall Clow96d050a2018-01-15 16:16:32 +0000517 constexpr bool // constexpr in C++20
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000518 is_heap(RandomAccessIterator first, RandomAccessiterator last);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000519
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000520template <class RandomAccessIterator, class Compare>
Marshall Clow96d050a2018-01-15 16:16:32 +0000521 constexpr bool // constexpr in C++20
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000522 is_heap(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000523
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000524template <class RandomAccessIterator>
Marshall Clow96d050a2018-01-15 16:16:32 +0000525 constexpr RandomAccessIterator // constexpr in C++20
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000526 is_heap_until(RandomAccessIterator first, RandomAccessiterator last);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000527
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000528template <class RandomAccessIterator, class Compare>
Marshall Clow96d050a2018-01-15 16:16:32 +0000529 constexpr RandomAccessIterator // constexpr in C++20
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000530 is_heap_until(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000531
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000532template <class ForwardIterator>
533 ForwardIterator
Marshall Clow9e173072015-05-10 13:53:31 +0000534 min_element(ForwardIterator first, ForwardIterator last); // constexpr in C++14
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000535
536template <class ForwardIterator, class Compare>
537 ForwardIterator
Marshall Clow9e173072015-05-10 13:53:31 +0000538 min_element(ForwardIterator first, ForwardIterator last, Compare comp); // constexpr in C++14
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000539
Howard Hinnantc51e1022010-05-11 19:42:16 +0000540template <class T>
541 const T&
Marshall Clowe9dca072014-02-19 16:51:35 +0000542 min(const T& a, const T& b); // constexpr in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000543
544template <class T, class Compare>
545 const T&
Marshall Clowe9dca072014-02-19 16:51:35 +0000546 min(const T& a, const T& b, Compare comp); // constexpr in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000547
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000548template<class T>
549 T
Marshall Clowe9dca072014-02-19 16:51:35 +0000550 min(initializer_list<T> t); // constexpr in C++14
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000551
552template<class T, class Compare>
553 T
Marshall Clowe9dca072014-02-19 16:51:35 +0000554 min(initializer_list<T> t, Compare comp); // constexpr in C++14
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000555
Marshall Clow3e18d0e2016-03-07 22:43:49 +0000556template<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 Hinnantb120e7a2010-08-21 20:10:01 +0000562template <class ForwardIterator>
563 ForwardIterator
Marshall Clow9e173072015-05-10 13:53:31 +0000564 max_element(ForwardIterator first, ForwardIterator last); // constexpr in C++14
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000565
566template <class ForwardIterator, class Compare>
567 ForwardIterator
Marshall Clow9e173072015-05-10 13:53:31 +0000568 max_element(ForwardIterator first, ForwardIterator last, Compare comp); // constexpr in C++14
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000569
Howard Hinnantc51e1022010-05-11 19:42:16 +0000570template <class T>
571 const T&
Marshall Clowe9dca072014-02-19 16:51:35 +0000572 max(const T& a, const T& b); // constexpr in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000573
574template <class T, class Compare>
575 const T&
Marshall Clowe9dca072014-02-19 16:51:35 +0000576 max(const T& a, const T& b, Compare comp); // constexpr in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000577
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000578template<class T>
579 T
Marshall Clowe9dca072014-02-19 16:51:35 +0000580 max(initializer_list<T> t); // constexpr in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000581
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000582template<class T, class Compare>
583 T
Marshall Clowe9dca072014-02-19 16:51:35 +0000584 max(initializer_list<T> t, Compare comp); // constexpr in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000585
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000586template<class ForwardIterator>
587 pair<ForwardIterator, ForwardIterator>
Marshall Clow9e173072015-05-10 13:53:31 +0000588 minmax_element(ForwardIterator first, ForwardIterator last); // constexpr in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000589
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000590template<class ForwardIterator, class Compare>
591 pair<ForwardIterator, ForwardIterator>
Marshall Clow9e173072015-05-10 13:53:31 +0000592 minmax_element(ForwardIterator first, ForwardIterator last, Compare comp); // constexpr in C++14
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000593
594template<class T>
595 pair<const T&, const T&>
Marshall Clowe9dca072014-02-19 16:51:35 +0000596 minmax(const T& a, const T& b); // constexpr in C++14
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000597
598template<class T, class Compare>
599 pair<const T&, const T&>
Marshall Clowe9dca072014-02-19 16:51:35 +0000600 minmax(const T& a, const T& b, Compare comp); // constexpr in C++14
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000601
602template<class T>
603 pair<T, T>
Marshall Clowe9dca072014-02-19 16:51:35 +0000604 minmax(initializer_list<T> t); // constexpr in C++14
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000605
606template<class T, class Compare>
607 pair<T, T>
Marshall Clowe9dca072014-02-19 16:51:35 +0000608 minmax(initializer_list<T> t, Compare comp); // constexpr in C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000609
610template <class InputIterator1, class InputIterator2>
Marshall Clow5492c8a2018-01-22 20:44:33 +0000611 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000612 lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
613
614template <class InputIterator1, class InputIterator2, class Compare>
Marshall Clow5492c8a2018-01-22 20:44:33 +0000615 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000616 lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
617 InputIterator2 first2, InputIterator2 last2, Compare comp);
618
619template <class BidirectionalIterator>
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000620 bool
Howard Hinnantc51e1022010-05-11 19:42:16 +0000621 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 Fiselier6bfed252016-04-21 23:38:59 +0000643#include <utility> // needed to provide swap_ranges.
Howard Hinnantc51e1022010-05-11 19:42:16 +0000644#include <memory>
Marshall Clowa40686b2018-01-08 19:18:00 +0000645#include <functional>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000646#include <iterator>
Howard Hinnant60e5cf42012-07-26 17:09:09 +0000647#include <cstddef>
Marshall Clowbf32ec92018-08-17 16:07:48 +0000648#include <bit>
Marshall Clow0a1e7502018-09-12 19:41:40 +0000649#include <version>
Howard Hinnantea382952013-08-14 18:00:20 +0000650
Eric Fiselier14b6de92014-08-10 23:53:08 +0000651#include <__debug>
652
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000653#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000654#pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000655#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000656
Eric Fiselierf4433a32017-05-31 22:07:49 +0000657_LIBCPP_PUSH_MACROS
658#include <__undef_macros>
659
660
Howard Hinnantc51e1022010-05-11 19:42:16 +0000661_LIBCPP_BEGIN_NAMESPACE_STD
662
Marshall Clowe9dca072014-02-19 16:51:35 +0000663// I'd like to replace these with _VSTD::equal_to<void>, but can't because:
664// * That only works with C++14 and later, and
665// * We haven't included <functional> here.
Howard Hinnantc51e1022010-05-11 19:42:16 +0000666template <class _T1, class _T2 = _T1>
667struct __equal_to
668{
Marshall Clow1f695172018-07-14 04:15:19 +0000669 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
670 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(const _T1& __x, const _T2& __y) const {return __x == __y;}
671 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(const _T2& __x, const _T1& __y) const {return __x == __y;}
672 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(const _T2& __x, const _T2& __y) const {return __x == __y;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000673};
674
675template <class _T1>
676struct __equal_to<_T1, _T1>
677{
Marshall Clowe9dca072014-02-19 16:51:35 +0000678 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
679 bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000680};
681
682template <class _T1>
683struct __equal_to<const _T1, _T1>
684{
Marshall Clowe9dca072014-02-19 16:51:35 +0000685 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
686 bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000687};
688
689template <class _T1>
690struct __equal_to<_T1, const _T1>
691{
Marshall Clowe9dca072014-02-19 16:51:35 +0000692 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
693 bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000694};
695
696template <class _T1, class _T2 = _T1>
697struct __less
698{
Aditya Kumar3a0179a2016-08-25 11:52:38 +0000699 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Marshall Clowe9dca072014-02-19 16:51:35 +0000700 bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
701
702 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
703 bool operator()(const _T1& __x, const _T2& __y) const {return __x < __y;}
704
705 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
706 bool operator()(const _T2& __x, const _T1& __y) const {return __x < __y;}
707
708 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
709 bool operator()(const _T2& __x, const _T2& __y) const {return __x < __y;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000710};
711
712template <class _T1>
713struct __less<_T1, _T1>
714{
Marshall Clowe9dca072014-02-19 16:51:35 +0000715 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
716 bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000717};
718
719template <class _T1>
720struct __less<const _T1, _T1>
721{
Marshall Clowe9dca072014-02-19 16:51:35 +0000722 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
723 bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000724};
725
726template <class _T1>
727struct __less<_T1, const _T1>
728{
Marshall Clowe9dca072014-02-19 16:51:35 +0000729 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
730 bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000731};
732
733template <class _Predicate>
Marshall Clow738d1042017-08-28 23:16:13 +0000734class __invert // invert the sense of a comparison
Howard Hinnantc51e1022010-05-11 19:42:16 +0000735{
736private:
737 _Predicate __p_;
738public:
Marshall Clow738d1042017-08-28 23:16:13 +0000739 _LIBCPP_INLINE_VISIBILITY __invert() {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000740
741 _LIBCPP_INLINE_VISIBILITY
Marshall Clow738d1042017-08-28 23:16:13 +0000742 explicit __invert(_Predicate __p) : __p_(__p) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000743
744 template <class _T1>
745 _LIBCPP_INLINE_VISIBILITY
746 bool operator()(const _T1& __x) {return !__p_(__x);}
747
748 template <class _T1, class _T2>
749 _LIBCPP_INLINE_VISIBILITY
Marshall Clow738d1042017-08-28 23:16:13 +0000750 bool operator()(const _T1& __x, const _T2& __y) {return __p_(__y, __x);}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000751};
752
Howard Hinnant6148a9b2013-08-23 20:10:18 +0000753#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000754
755template <class _Compare>
756struct __debug_less
757{
758 _Compare __comp_;
759 __debug_less(_Compare& __c) : __comp_(__c) {}
Eric Fiselier32adec82016-07-19 23:27:18 +0000760
Howard Hinnantc51e1022010-05-11 19:42:16 +0000761 template <class _Tp, class _Up>
762 bool operator()(const _Tp& __x, const _Up& __y)
763 {
764 bool __r = __comp_(__x, __y);
765 if (__r)
Eric Fiselier32adec82016-07-19 23:27:18 +0000766 __do_compare_assert(0, __y, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000767 return __r;
768 }
Eric Fiselier32adec82016-07-19 23:27:18 +0000769
770 template <class _LHS, class _RHS>
771 inline _LIBCPP_INLINE_VISIBILITY
772 decltype((void)_VSTD::declval<_Compare&>()(
773 _VSTD::declval<_LHS const&>(), _VSTD::declval<_RHS const&>()))
774 __do_compare_assert(int, _LHS const& __l, _RHS const& __r) {
775 _LIBCPP_ASSERT(!__comp_(__l, __r),
776 "Comparator does not induce a strict weak ordering");
777 }
778
779 template <class _LHS, class _RHS>
780 inline _LIBCPP_INLINE_VISIBILITY
781 void __do_compare_assert(long, _LHS const&, _RHS const&) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000782};
783
Howard Hinnant6148a9b2013-08-23 20:10:18 +0000784#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000785
786// all_of
787
788template <class _InputIterator, class _Predicate>
Marshall Clowd607fdb2018-01-15 17:20:36 +0000789inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000790bool
791all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
792{
793 for (; __first != __last; ++__first)
794 if (!__pred(*__first))
795 return false;
796 return true;
797}
798
799// any_of
800
801template <class _InputIterator, class _Predicate>
Marshall Clowd607fdb2018-01-15 17:20:36 +0000802inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000803bool
804any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
805{
806 for (; __first != __last; ++__first)
807 if (__pred(*__first))
808 return true;
809 return false;
810}
811
812// none_of
813
814template <class _InputIterator, class _Predicate>
Marshall Clowd607fdb2018-01-15 17:20:36 +0000815inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000816bool
817none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
818{
819 for (; __first != __last; ++__first)
820 if (__pred(*__first))
821 return false;
822 return true;
823}
824
825// for_each
826
827template <class _InputIterator, class _Function>
Marshall Clow5492c8a2018-01-22 20:44:33 +0000828inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000829_Function
830for_each(_InputIterator __first, _InputIterator __last, _Function __f)
831{
832 for (; __first != __last; ++__first)
833 __f(*__first);
Marshall Clow78dbe462016-11-14 18:22:19 +0000834 return __f;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000835}
836
Marshall Clowc588fd62017-05-25 13:40:57 +0000837#if _LIBCPP_STD_VER > 14
Marshall Clowde0169c2017-05-25 02:29:54 +0000838// for_each_n
839
840template <class _InputIterator, class _Size, class _Function>
Marshall Clow5492c8a2018-01-22 20:44:33 +0000841inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clowde0169c2017-05-25 02:29:54 +0000842_InputIterator
843for_each_n(_InputIterator __first, _Size __orig_n, _Function __f)
844{
845 typedef decltype(__convert_to_integral(__orig_n)) _IntegralSize;
846 _IntegralSize __n = __orig_n;
847 while (__n > 0)
848 {
849 __f(*__first);
850 ++__first;
851 --__n;
852 }
853 return __first;
854}
Marshall Clowc588fd62017-05-25 13:40:57 +0000855#endif
Marshall Clowde0169c2017-05-25 02:29:54 +0000856
Howard Hinnantc51e1022010-05-11 19:42:16 +0000857// find
858
859template <class _InputIterator, class _Tp>
Marshall Clow96d050a2018-01-15 16:16:32 +0000860inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000861_InputIterator
Howard Hinnantbf074022011-10-22 20:59:45 +0000862find(_InputIterator __first, _InputIterator __last, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000863{
864 for (; __first != __last; ++__first)
Howard Hinnantbf074022011-10-22 20:59:45 +0000865 if (*__first == __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000866 break;
867 return __first;
868}
869
870// find_if
871
872template <class _InputIterator, class _Predicate>
Marshall Clow96d050a2018-01-15 16:16:32 +0000873inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000874_InputIterator
875find_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
876{
877 for (; __first != __last; ++__first)
878 if (__pred(*__first))
879 break;
880 return __first;
881}
882
883// find_if_not
884
885template<class _InputIterator, class _Predicate>
Marshall Clowee0161e2018-01-15 19:26:05 +0000886inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000887_InputIterator
888find_if_not(_InputIterator __first, _InputIterator __last, _Predicate __pred)
889{
890 for (; __first != __last; ++__first)
891 if (!__pred(*__first))
892 break;
893 return __first;
894}
895
896// find_end
897
898template <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
Marshall Clowee0161e2018-01-15 19:26:05 +0000899_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator1
Howard Hinnantc51e1022010-05-11 19:42:16 +0000900__find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
901 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred,
902 forward_iterator_tag, forward_iterator_tag)
903{
904 // modeled after search algorithm
905 _ForwardIterator1 __r = __last1; // __last1 is the "default" answer
906 if (__first2 == __last2)
907 return __r;
908 while (true)
909 {
910 while (true)
911 {
912 if (__first1 == __last1) // if source exhausted return last correct answer
913 return __r; // (or __last1 if never found)
914 if (__pred(*__first1, *__first2))
915 break;
916 ++__first1;
917 }
918 // *__first1 matches *__first2, now match elements after here
919 _ForwardIterator1 __m1 = __first1;
920 _ForwardIterator2 __m2 = __first2;
921 while (true)
922 {
923 if (++__m2 == __last2)
924 { // Pattern exhaused, record answer and search for another one
925 __r = __first1;
926 ++__first1;
927 break;
928 }
929 if (++__m1 == __last1) // Source exhausted, return last answer
930 return __r;
931 if (!__pred(*__m1, *__m2)) // mismatch, restart with a new __first
932 {
933 ++__first1;
934 break;
935 } // else there is a match, check next elements
936 }
937 }
938}
939
940template <class _BinaryPredicate, class _BidirectionalIterator1, class _BidirectionalIterator2>
Marshall Clowee0161e2018-01-15 19:26:05 +0000941_LIBCPP_CONSTEXPR_AFTER_CXX17 _BidirectionalIterator1
Howard Hinnantc51e1022010-05-11 19:42:16 +0000942__find_end(_BidirectionalIterator1 __first1, _BidirectionalIterator1 __last1,
943 _BidirectionalIterator2 __first2, _BidirectionalIterator2 __last2, _BinaryPredicate __pred,
944 bidirectional_iterator_tag, bidirectional_iterator_tag)
945{
946 // modeled after search algorithm (in reverse)
947 if (__first2 == __last2)
948 return __last1; // Everything matches an empty sequence
949 _BidirectionalIterator1 __l1 = __last1;
950 _BidirectionalIterator2 __l2 = __last2;
951 --__l2;
952 while (true)
953 {
954 // Find last element in sequence 1 that matchs *(__last2-1), with a mininum of loop checks
955 while (true)
956 {
957 if (__first1 == __l1) // return __last1 if no element matches *__first2
958 return __last1;
959 if (__pred(*--__l1, *__l2))
960 break;
961 }
962 // *__l1 matches *__l2, now match elements before here
963 _BidirectionalIterator1 __m1 = __l1;
964 _BidirectionalIterator2 __m2 = __l2;
965 while (true)
966 {
967 if (__m2 == __first2) // If pattern exhausted, __m1 is the answer (works for 1 element pattern)
968 return __m1;
969 if (__m1 == __first1) // Otherwise if source exhaused, pattern not found
970 return __last1;
971 if (!__pred(*--__m1, *--__m2)) // if there is a mismatch, restart with a new __l1
972 {
973 break;
974 } // else there is a match, check next elements
975 }
976 }
977}
978
979template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
Marshall Clowedfd25a2014-06-10 18:51:55 +0000980_LIBCPP_CONSTEXPR_AFTER_CXX11 _RandomAccessIterator1
Howard Hinnantc51e1022010-05-11 19:42:16 +0000981__find_end(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
982 _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
983 random_access_iterator_tag, random_access_iterator_tag)
984{
985 // Take advantage of knowing source and pattern lengths. Stop short when source is smaller than pattern
986 typename iterator_traits<_RandomAccessIterator2>::difference_type __len2 = __last2 - __first2;
987 if (__len2 == 0)
988 return __last1;
989 typename iterator_traits<_RandomAccessIterator1>::difference_type __len1 = __last1 - __first1;
990 if (__len1 < __len2)
991 return __last1;
992 const _RandomAccessIterator1 __s = __first1 + (__len2 - 1); // End of pattern match can't go before here
993 _RandomAccessIterator1 __l1 = __last1;
994 _RandomAccessIterator2 __l2 = __last2;
995 --__l2;
996 while (true)
997 {
998 while (true)
999 {
1000 if (__s == __l1)
1001 return __last1;
1002 if (__pred(*--__l1, *__l2))
1003 break;
1004 }
1005 _RandomAccessIterator1 __m1 = __l1;
1006 _RandomAccessIterator2 __m2 = __l2;
1007 while (true)
1008 {
1009 if (__m2 == __first2)
1010 return __m1;
1011 // no need to check range on __m1 because __s guarantees we have enough source
1012 if (!__pred(*--__m1, *--__m2))
1013 {
1014 break;
1015 }
1016 }
1017 }
1018}
1019
1020template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Marshall Clowee0161e2018-01-15 19:26:05 +00001021inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001022_ForwardIterator1
1023find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1024 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1025{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001026 return _VSTD::__find_end<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001027 (__first1, __last1, __first2, __last2, __pred,
1028 typename iterator_traits<_ForwardIterator1>::iterator_category(),
1029 typename iterator_traits<_ForwardIterator2>::iterator_category());
1030}
1031
1032template <class _ForwardIterator1, class _ForwardIterator2>
Marshall Clowee0161e2018-01-15 19:26:05 +00001033inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001034_ForwardIterator1
1035find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1036 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1037{
1038 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1039 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001040 return _VSTD::find_end(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001041}
1042
1043// find_first_of
1044
1045template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Marshall Clowedfd25a2014-06-10 18:51:55 +00001046_LIBCPP_CONSTEXPR_AFTER_CXX11 _ForwardIterator1
1047__find_first_of_ce(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001048 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1049{
1050 for (; __first1 != __last1; ++__first1)
1051 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
1052 if (__pred(*__first1, *__j))
1053 return __first1;
1054 return __last1;
1055}
1056
Marshall Clowedfd25a2014-06-10 18:51:55 +00001057
1058template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Marshall Clowee0161e2018-01-15 19:26:05 +00001059inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clowedfd25a2014-06-10 18:51:55 +00001060_ForwardIterator1
1061find_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1062 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1063{
1064 return _VSTD::__find_first_of_ce(__first1, __last1, __first2, __last2, __pred);
1065}
1066
Howard Hinnantc51e1022010-05-11 19:42:16 +00001067template <class _ForwardIterator1, class _ForwardIterator2>
Marshall Clowee0161e2018-01-15 19:26:05 +00001068inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001069_ForwardIterator1
1070find_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1071 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1072{
1073 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1074 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Marshall Clowedfd25a2014-06-10 18:51:55 +00001075 return _VSTD::__find_first_of_ce(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001076}
1077
1078// adjacent_find
1079
1080template <class _ForwardIterator, class _BinaryPredicate>
Marshall Clowee0161e2018-01-15 19:26:05 +00001081inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001082_ForwardIterator
1083adjacent_find(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred)
1084{
1085 if (__first != __last)
1086 {
1087 _ForwardIterator __i = __first;
1088 while (++__i != __last)
1089 {
1090 if (__pred(*__first, *__i))
1091 return __first;
1092 __first = __i;
1093 }
1094 }
1095 return __last;
1096}
1097
1098template <class _ForwardIterator>
Marshall Clowee0161e2018-01-15 19:26:05 +00001099inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001100_ForwardIterator
1101adjacent_find(_ForwardIterator __first, _ForwardIterator __last)
1102{
1103 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001104 return _VSTD::adjacent_find(__first, __last, __equal_to<__v>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001105}
1106
1107// count
1108
1109template <class _InputIterator, class _Tp>
Marshall Clow3c0558f2018-01-15 19:40:34 +00001110inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001111typename iterator_traits<_InputIterator>::difference_type
Howard Hinnantbf074022011-10-22 20:59:45 +00001112count(_InputIterator __first, _InputIterator __last, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001113{
1114 typename iterator_traits<_InputIterator>::difference_type __r(0);
1115 for (; __first != __last; ++__first)
Howard Hinnantbf074022011-10-22 20:59:45 +00001116 if (*__first == __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001117 ++__r;
1118 return __r;
1119}
1120
1121// count_if
1122
1123template <class _InputIterator, class _Predicate>
Marshall Clow3c0558f2018-01-15 19:40:34 +00001124inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001125typename iterator_traits<_InputIterator>::difference_type
1126count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
1127{
1128 typename iterator_traits<_InputIterator>::difference_type __r(0);
1129 for (; __first != __last; ++__first)
1130 if (__pred(*__first))
1131 ++__r;
1132 return __r;
1133}
1134
1135// mismatch
1136
1137template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
Marshall Clow30bf3022018-01-16 02:04:10 +00001138inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001139pair<_InputIterator1, _InputIterator2>
1140mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1141 _InputIterator2 __first2, _BinaryPredicate __pred)
1142{
Marshall Clow2932e512014-09-16 20:40:05 +00001143 for (; __first1 != __last1; ++__first1, (void) ++__first2)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001144 if (!__pred(*__first1, *__first2))
1145 break;
1146 return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
1147}
1148
1149template <class _InputIterator1, class _InputIterator2>
Marshall Clow30bf3022018-01-16 02:04:10 +00001150inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001151pair<_InputIterator1, _InputIterator2>
1152mismatch(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2)
1153{
1154 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1155 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001156 return _VSTD::mismatch(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001157}
1158
Marshall Clow96b42b22013-05-09 21:14:23 +00001159#if _LIBCPP_STD_VER > 11
1160template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
Marshall Clow30bf3022018-01-16 02:04:10 +00001161inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow96b42b22013-05-09 21:14:23 +00001162pair<_InputIterator1, _InputIterator2>
1163mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1164 _InputIterator2 __first2, _InputIterator2 __last2,
1165 _BinaryPredicate __pred)
1166{
Marshall Clow2932e512014-09-16 20:40:05 +00001167 for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void) ++__first2)
Marshall Clow96b42b22013-05-09 21:14:23 +00001168 if (!__pred(*__first1, *__first2))
1169 break;
1170 return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
1171}
1172
1173template <class _InputIterator1, class _InputIterator2>
Marshall Clow30bf3022018-01-16 02:04:10 +00001174inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow96b42b22013-05-09 21:14:23 +00001175pair<_InputIterator1, _InputIterator2>
1176mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1177 _InputIterator2 __first2, _InputIterator2 __last2)
1178{
1179 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1180 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
1181 return _VSTD::mismatch(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
1182}
1183#endif
1184
Howard Hinnantc51e1022010-05-11 19:42:16 +00001185// equal
1186
1187template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
Marshall Clow30bf3022018-01-16 02:04:10 +00001188inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001189bool
1190equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _BinaryPredicate __pred)
1191{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00001192 for (; __first1 != __last1; ++__first1, (void) ++__first2)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001193 if (!__pred(*__first1, *__first2))
1194 return false;
1195 return true;
1196}
1197
1198template <class _InputIterator1, class _InputIterator2>
Marshall Clow30bf3022018-01-16 02:04:10 +00001199inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001200bool
1201equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2)
1202{
1203 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1204 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001205 return _VSTD::equal(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001206}
1207
Marshall Clow96b42b22013-05-09 21:14:23 +00001208#if _LIBCPP_STD_VER > 11
1209template <class _BinaryPredicate, class _InputIterator1, class _InputIterator2>
Marshall Clow30bf3022018-01-16 02:04:10 +00001210inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow96b42b22013-05-09 21:14:23 +00001211bool
Aditya Kumar3a0179a2016-08-25 11:52:38 +00001212__equal(_InputIterator1 __first1, _InputIterator1 __last1,
Marshall Clow96b42b22013-05-09 21:14:23 +00001213 _InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred,
1214 input_iterator_tag, input_iterator_tag )
1215{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00001216 for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void) ++__first2)
Marshall Clow96b42b22013-05-09 21:14:23 +00001217 if (!__pred(*__first1, *__first2))
1218 return false;
1219 return __first1 == __last1 && __first2 == __last2;
1220}
1221
1222template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
Marshall Clow30bf3022018-01-16 02:04:10 +00001223inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow96b42b22013-05-09 21:14:23 +00001224bool
Aditya Kumar3a0179a2016-08-25 11:52:38 +00001225__equal(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
1226 _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
Marshall Clow96b42b22013-05-09 21:14:23 +00001227 random_access_iterator_tag, random_access_iterator_tag )
1228{
1229 if ( _VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2))
1230 return false;
1231 return _VSTD::equal<_RandomAccessIterator1, _RandomAccessIterator2,
1232 typename add_lvalue_reference<_BinaryPredicate>::type>
1233 (__first1, __last1, __first2, __pred );
1234}
1235
1236template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
Marshall Clow30bf3022018-01-16 02:04:10 +00001237inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow96b42b22013-05-09 21:14:23 +00001238bool
Aditya Kumar3a0179a2016-08-25 11:52:38 +00001239equal(_InputIterator1 __first1, _InputIterator1 __last1,
Marshall Clow96b42b22013-05-09 21:14:23 +00001240 _InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred )
1241{
1242 return _VSTD::__equal<typename add_lvalue_reference<_BinaryPredicate>::type>
Aditya Kumar3a0179a2016-08-25 11:52:38 +00001243 (__first1, __last1, __first2, __last2, __pred,
Marshall Clow96b42b22013-05-09 21:14:23 +00001244 typename iterator_traits<_InputIterator1>::iterator_category(),
1245 typename iterator_traits<_InputIterator2>::iterator_category());
1246}
1247
1248template <class _InputIterator1, class _InputIterator2>
Marshall Clow30bf3022018-01-16 02:04:10 +00001249inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow96b42b22013-05-09 21:14:23 +00001250bool
Aditya Kumar3a0179a2016-08-25 11:52:38 +00001251equal(_InputIterator1 __first1, _InputIterator1 __last1,
Marshall Clow96b42b22013-05-09 21:14:23 +00001252 _InputIterator2 __first2, _InputIterator2 __last2)
1253{
1254 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1255 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
1256 return _VSTD::__equal(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>(),
1257 typename iterator_traits<_InputIterator1>::iterator_category(),
1258 typename iterator_traits<_InputIterator2>::iterator_category());
1259}
1260#endif
1261
Howard Hinnantc51e1022010-05-11 19:42:16 +00001262// is_permutation
1263
1264template<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Marshall Clow96d050a2018-01-15 16:16:32 +00001265_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Howard Hinnantc51e1022010-05-11 19:42:16 +00001266is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1267 _ForwardIterator2 __first2, _BinaryPredicate __pred)
1268{
Marshall Clow96d050a2018-01-15 16:16:32 +00001269// shorten sequences as much as possible by lopping of any equal prefix
Eric Fiseliera09a3b42014-10-27 19:28:20 +00001270 for (; __first1 != __last1; ++__first1, (void) ++__first2)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001271 if (!__pred(*__first1, *__first2))
Marshall Clow96d050a2018-01-15 16:16:32 +00001272 break;
1273 if (__first1 == __last1)
1274 return true;
1275
1276// __first1 != __last1 && *__first1 != *__first2
Howard Hinnantc51e1022010-05-11 19:42:16 +00001277 typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001278 _D1 __l1 = _VSTD::distance(__first1, __last1);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001279 if (__l1 == _D1(1))
1280 return false;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001281 _ForwardIterator2 __last2 = _VSTD::next(__first2, __l1);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001282 // For each element in [f1, l1) see if there are the same number of
1283 // equal elements in [f2, l2)
1284 for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i)
1285 {
Marshall Clow96d050a2018-01-15 16:16:32 +00001286 // Have we already counted the number of *__i in [f1, l1)?
Peter Collingbournea5b451b2018-01-26 21:23:27 +00001287 _ForwardIterator1 __match = __first1;
1288 for (; __match != __i; ++__match)
1289 if (__pred(*__match, *__i))
1290 break;
1291 if (__match == __i) {
Howard Hinnantc51e1022010-05-11 19:42:16 +00001292 // Count number of *__i in [f2, l2)
1293 _D1 __c2 = 0;
1294 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
1295 if (__pred(*__i, *__j))
1296 ++__c2;
1297 if (__c2 == 0)
1298 return false;
1299 // Count number of *__i in [__i, l1) (we can start with 1)
1300 _D1 __c1 = 1;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001301 for (_ForwardIterator1 __j = _VSTD::next(__i); __j != __last1; ++__j)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001302 if (__pred(*__i, *__j))
1303 ++__c1;
1304 if (__c1 != __c2)
1305 return false;
1306 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001307 }
1308 return true;
1309}
1310
1311template<class _ForwardIterator1, class _ForwardIterator2>
Marshall Clow96d050a2018-01-15 16:16:32 +00001312inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001313bool
1314is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1315 _ForwardIterator2 __first2)
1316{
1317 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1318 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001319 return _VSTD::is_permutation(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001320}
1321
Marshall Clow96b42b22013-05-09 21:14:23 +00001322#if _LIBCPP_STD_VER > 11
1323template<class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
Marshall Clow96d050a2018-01-15 16:16:32 +00001324_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Marshall Clow96b42b22013-05-09 21:14:23 +00001325__is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
Aditya Kumar3a0179a2016-08-25 11:52:38 +00001326 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
Marshall Clow96b42b22013-05-09 21:14:23 +00001327 _BinaryPredicate __pred,
1328 forward_iterator_tag, forward_iterator_tag )
1329{
Marshall Clow96d050a2018-01-15 16:16:32 +00001330// shorten sequences as much as possible by lopping of any equal prefix
Eric Fiselier14673892014-10-27 20:26:25 +00001331 for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void) ++__first2)
Marshall Clow96b42b22013-05-09 21:14:23 +00001332 if (!__pred(*__first1, *__first2))
Marshall Clow96d050a2018-01-15 16:16:32 +00001333 break;
1334 if (__first1 == __last1)
Marshall Clow01bbbd22018-01-19 18:07:29 +00001335 return __first2 == __last2;
Marshall Clow96d050a2018-01-15 16:16:32 +00001336 else if (__first2 == __last2)
Marshall Clow01bbbd22018-01-19 18:07:29 +00001337 return false;
Marshall Clow96d050a2018-01-15 16:16:32 +00001338
Marshall Clow96b42b22013-05-09 21:14:23 +00001339 typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1;
1340 _D1 __l1 = _VSTD::distance(__first1, __last1);
1341
1342 typedef typename iterator_traits<_ForwardIterator2>::difference_type _D2;
Marshall Clow42b967c2013-05-10 00:16:10 +00001343 _D2 __l2 = _VSTD::distance(__first2, __last2);
Marshall Clow96b42b22013-05-09 21:14:23 +00001344 if (__l1 != __l2)
1345 return false;
1346
1347 // For each element in [f1, l1) see if there are the same number of
1348 // equal elements in [f2, l2)
1349 for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i)
1350 {
Marshall Clow96d050a2018-01-15 16:16:32 +00001351 // Have we already counted the number of *__i in [f1, l1)?
Peter Collingbournea5b451b2018-01-26 21:23:27 +00001352 _ForwardIterator1 __match = __first1;
1353 for (; __match != __i; ++__match)
1354 if (__pred(*__match, *__i))
1355 break;
1356 if (__match == __i) {
Marshall Clow96b42b22013-05-09 21:14:23 +00001357 // Count number of *__i in [f2, l2)
1358 _D1 __c2 = 0;
1359 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
1360 if (__pred(*__i, *__j))
1361 ++__c2;
1362 if (__c2 == 0)
1363 return false;
1364 // Count number of *__i in [__i, l1) (we can start with 1)
1365 _D1 __c1 = 1;
1366 for (_ForwardIterator1 __j = _VSTD::next(__i); __j != __last1; ++__j)
1367 if (__pred(*__i, *__j))
1368 ++__c1;
1369 if (__c1 != __c2)
1370 return false;
1371 }
Marshall Clow96b42b22013-05-09 21:14:23 +00001372 }
1373 return true;
1374}
1375
1376template<class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
Marshall Clow96d050a2018-01-15 16:16:32 +00001377_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Marshall Clow96b42b22013-05-09 21:14:23 +00001378__is_permutation(_RandomAccessIterator1 __first1, _RandomAccessIterator2 __last1,
Aditya Kumar3a0179a2016-08-25 11:52:38 +00001379 _RandomAccessIterator1 __first2, _RandomAccessIterator2 __last2,
Marshall Clow96b42b22013-05-09 21:14:23 +00001380 _BinaryPredicate __pred,
1381 random_access_iterator_tag, random_access_iterator_tag )
1382{
1383 if ( _VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2))
1384 return false;
1385 return _VSTD::is_permutation<_RandomAccessIterator1, _RandomAccessIterator2,
1386 typename add_lvalue_reference<_BinaryPredicate>::type>
1387 (__first1, __last1, __first2, __pred );
1388}
1389
1390template<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Marshall Clow96d050a2018-01-15 16:16:32 +00001391inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow96b42b22013-05-09 21:14:23 +00001392bool
1393is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1394 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
1395 _BinaryPredicate __pred )
1396{
1397 return _VSTD::__is_permutation<typename add_lvalue_reference<_BinaryPredicate>::type>
1398 (__first1, __last1, __first2, __last2, __pred,
1399 typename iterator_traits<_ForwardIterator1>::iterator_category(),
1400 typename iterator_traits<_ForwardIterator2>::iterator_category());
1401}
1402
1403template<class _ForwardIterator1, class _ForwardIterator2>
Marshall Clow96d050a2018-01-15 16:16:32 +00001404inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow96b42b22013-05-09 21:14:23 +00001405bool
1406is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1407 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1408{
1409 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1410 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
1411 return _VSTD::__is_permutation(__first1, __last1, __first2, __last2,
1412 __equal_to<__v1, __v2>(),
1413 typename iterator_traits<_ForwardIterator1>::iterator_category(),
1414 typename iterator_traits<_ForwardIterator2>::iterator_category());
1415}
1416#endif
1417
Howard Hinnantc51e1022010-05-11 19:42:16 +00001418// search
Marshall Clowa40686b2018-01-08 19:18:00 +00001419// __search is in <functional>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001420
1421template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Marshall Clow323fc5b2018-01-16 15:48:27 +00001422inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001423_ForwardIterator1
1424search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1425 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1426{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001427 return _VSTD::__search<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001428 (__first1, __last1, __first2, __last2, __pred,
Marshall Clowaf8be6c2016-03-08 15:12:52 +00001429 typename iterator_traits<_ForwardIterator1>::iterator_category(),
1430 typename iterator_traits<_ForwardIterator2>::iterator_category())
1431 .first;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001432}
1433
1434template <class _ForwardIterator1, class _ForwardIterator2>
Marshall Clow323fc5b2018-01-16 15:48:27 +00001435inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001436_ForwardIterator1
1437search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1438 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1439{
Marshall Clowaf8be6c2016-03-08 15:12:52 +00001440 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1441 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001442 return _VSTD::search(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001443}
1444
Marshall Clowa40686b2018-01-08 19:18:00 +00001445
1446#if _LIBCPP_STD_VER > 14
1447template <class _ForwardIterator, class _Searcher>
Marshall Clow323fc5b2018-01-16 15:48:27 +00001448_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clowa40686b2018-01-08 19:18:00 +00001449_ForwardIterator search(_ForwardIterator __f, _ForwardIterator __l, const _Searcher &__s)
1450{ return __s(__f, __l).first; }
1451#endif
1452
Howard Hinnantc51e1022010-05-11 19:42:16 +00001453// search_n
1454
1455template <class _BinaryPredicate, class _ForwardIterator, class _Size, class _Tp>
Marshall Clow323fc5b2018-01-16 15:48:27 +00001456_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00001457__search_n(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnantbf074022011-10-22 20:59:45 +00001458 _Size __count, const _Tp& __value_, _BinaryPredicate __pred, forward_iterator_tag)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001459{
1460 if (__count <= 0)
1461 return __first;
1462 while (true)
1463 {
Howard Hinnantbf074022011-10-22 20:59:45 +00001464 // Find first element in sequence that matchs __value_, with a mininum of loop checks
Howard Hinnantc51e1022010-05-11 19:42:16 +00001465 while (true)
1466 {
Howard Hinnantbf074022011-10-22 20:59:45 +00001467 if (__first == __last) // return __last if no element matches __value_
Howard Hinnantc51e1022010-05-11 19:42:16 +00001468 return __last;
Howard Hinnantbf074022011-10-22 20:59:45 +00001469 if (__pred(*__first, __value_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001470 break;
1471 ++__first;
1472 }
Howard Hinnantbf074022011-10-22 20:59:45 +00001473 // *__first matches __value_, now match elements after here
Howard Hinnantc51e1022010-05-11 19:42:16 +00001474 _ForwardIterator __m = __first;
1475 _Size __c(0);
1476 while (true)
1477 {
1478 if (++__c == __count) // If pattern exhausted, __first is the answer (works for 1 element pattern)
1479 return __first;
1480 if (++__m == __last) // Otherwise if source exhaused, pattern not found
1481 return __last;
Howard Hinnantbf074022011-10-22 20:59:45 +00001482 if (!__pred(*__m, __value_)) // if there is a mismatch, restart with a new __first
Howard Hinnantc51e1022010-05-11 19:42:16 +00001483 {
1484 __first = __m;
1485 ++__first;
1486 break;
1487 } // else there is a match, check next elements
1488 }
1489 }
1490}
1491
1492template <class _BinaryPredicate, class _RandomAccessIterator, class _Size, class _Tp>
Marshall Clow323fc5b2018-01-16 15:48:27 +00001493_LIBCPP_CONSTEXPR_AFTER_CXX17 _RandomAccessIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00001494__search_n(_RandomAccessIterator __first, _RandomAccessIterator __last,
Howard Hinnantbf074022011-10-22 20:59:45 +00001495 _Size __count, const _Tp& __value_, _BinaryPredicate __pred, random_access_iterator_tag)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001496{
1497 if (__count <= 0)
1498 return __first;
1499 _Size __len = static_cast<_Size>(__last - __first);
1500 if (__len < __count)
1501 return __last;
1502 const _RandomAccessIterator __s = __last - (__count - 1); // Start of pattern match can't go beyond here
1503 while (true)
1504 {
Howard Hinnantbf074022011-10-22 20:59:45 +00001505 // Find first element in sequence that matchs __value_, with a mininum of loop checks
Howard Hinnantc51e1022010-05-11 19:42:16 +00001506 while (true)
1507 {
Howard Hinnantbede4c32013-04-04 15:40:48 +00001508 if (__first >= __s) // return __last if no element matches __value_
Howard Hinnantc51e1022010-05-11 19:42:16 +00001509 return __last;
Howard Hinnantbf074022011-10-22 20:59:45 +00001510 if (__pred(*__first, __value_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001511 break;
1512 ++__first;
1513 }
Howard Hinnantbf074022011-10-22 20:59:45 +00001514 // *__first matches __value_, now match elements after here
Howard Hinnantc51e1022010-05-11 19:42:16 +00001515 _RandomAccessIterator __m = __first;
1516 _Size __c(0);
1517 while (true)
1518 {
1519 if (++__c == __count) // If pattern exhausted, __first is the answer (works for 1 element pattern)
1520 return __first;
1521 ++__m; // no need to check range on __m because __s guarantees we have enough source
Howard Hinnantbf074022011-10-22 20:59:45 +00001522 if (!__pred(*__m, __value_)) // if there is a mismatch, restart with a new __first
Howard Hinnantc51e1022010-05-11 19:42:16 +00001523 {
1524 __first = __m;
1525 ++__first;
1526 break;
1527 } // else there is a match, check next elements
1528 }
1529 }
1530}
1531
1532template <class _ForwardIterator, class _Size, class _Tp, class _BinaryPredicate>
Marshall Clow323fc5b2018-01-16 15:48:27 +00001533inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001534_ForwardIterator
1535search_n(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnantbf074022011-10-22 20:59:45 +00001536 _Size __count, const _Tp& __value_, _BinaryPredicate __pred)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001537{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001538 return _VSTD::__search_n<typename add_lvalue_reference<_BinaryPredicate>::type>
Eric Fiselier97ec07d2015-02-10 16:46:42 +00001539 (__first, __last, __convert_to_integral(__count), __value_, __pred,
1540 typename iterator_traits<_ForwardIterator>::iterator_category());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001541}
1542
1543template <class _ForwardIterator, class _Size, class _Tp>
Marshall Clow323fc5b2018-01-16 15:48:27 +00001544inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001545_ForwardIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00001546search_n(_ForwardIterator __first, _ForwardIterator __last, _Size __count, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001547{
1548 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Eric Fiselier97ec07d2015-02-10 16:46:42 +00001549 return _VSTD::search_n(__first, __last, __convert_to_integral(__count),
1550 __value_, __equal_to<__v, _Tp>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001551}
1552
1553// copy
Howard Hinnantc51e1022010-05-11 19:42:16 +00001554template <class _Iter>
1555inline _LIBCPP_INLINE_VISIBILITY
1556_Iter
1557__unwrap_iter(_Iter __i)
1558{
1559 return __i;
1560}
1561
1562template <class _Tp>
Marshall Clow88880de2017-05-25 14:20:26 +00001563inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001564typename enable_if
1565<
Howard Hinnanta9a897e2010-11-19 22:17:28 +00001566 is_trivially_copy_assignable<_Tp>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001567 _Tp*
1568>::type
1569__unwrap_iter(move_iterator<_Tp*> __i)
1570{
1571 return __i.base();
1572}
1573
Howard Hinnant8ea98242013-08-23 17:37:05 +00001574#if _LIBCPP_DEBUG_LEVEL < 2
1575
Howard Hinnantc51e1022010-05-11 19:42:16 +00001576template <class _Tp>
Marshall Clowae4f8312018-07-13 16:35:26 +00001577inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001578typename enable_if
1579<
Howard Hinnanta9a897e2010-11-19 22:17:28 +00001580 is_trivially_copy_assignable<_Tp>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001581 _Tp*
1582>::type
1583__unwrap_iter(__wrap_iter<_Tp*> __i)
1584{
1585 return __i.base();
1586}
1587
Eric Fiselier38badb82016-12-28 05:35:32 +00001588#else
1589
1590template <class _Tp>
Marshall Clowae4f8312018-07-13 16:35:26 +00001591inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
Eric Fiselier38badb82016-12-28 05:35:32 +00001592typename enable_if
1593<
1594 is_trivially_copy_assignable<_Tp>::value,
1595 __wrap_iter<_Tp*>
1596>::type
1597__unwrap_iter(__wrap_iter<_Tp*> __i)
1598{
1599 return __i;
1600}
1601
Howard Hinnant8ea98242013-08-23 17:37:05 +00001602#endif // _LIBCPP_DEBUG_LEVEL < 2
1603
Howard Hinnantc51e1022010-05-11 19:42:16 +00001604template <class _InputIterator, class _OutputIterator>
1605inline _LIBCPP_INLINE_VISIBILITY
1606_OutputIterator
1607__copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1608{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00001609 for (; __first != __last; ++__first, (void) ++__result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001610 *__result = *__first;
1611 return __result;
1612}
1613
1614template <class _Tp, class _Up>
1615inline _LIBCPP_INLINE_VISIBILITY
1616typename enable_if
1617<
1618 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnanta9a897e2010-11-19 22:17:28 +00001619 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001620 _Up*
1621>::type
1622__copy(_Tp* __first, _Tp* __last, _Up* __result)
1623{
1624 const size_t __n = static_cast<size_t>(__last - __first);
Marshall Clowc3ef9622015-06-02 13:52:16 +00001625 if (__n > 0)
1626 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001627 return __result + __n;
1628}
1629
1630template <class _InputIterator, class _OutputIterator>
1631inline _LIBCPP_INLINE_VISIBILITY
1632_OutputIterator
1633copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1634{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001635 return _VSTD::__copy(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001636}
1637
1638// copy_backward
1639
Howard Hinnant7f229bc2013-02-06 21:03:39 +00001640template <class _BidirectionalIterator, class _OutputIterator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001641inline _LIBCPP_INLINE_VISIBILITY
1642_OutputIterator
Howard Hinnant7f229bc2013-02-06 21:03:39 +00001643__copy_backward(_BidirectionalIterator __first, _BidirectionalIterator __last, _OutputIterator __result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001644{
1645 while (__first != __last)
1646 *--__result = *--__last;
1647 return __result;
1648}
1649
1650template <class _Tp, class _Up>
1651inline _LIBCPP_INLINE_VISIBILITY
1652typename enable_if
1653<
1654 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnanta9a897e2010-11-19 22:17:28 +00001655 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001656 _Up*
1657>::type
1658__copy_backward(_Tp* __first, _Tp* __last, _Up* __result)
1659{
1660 const size_t __n = static_cast<size_t>(__last - __first);
Marshall Clowc3ef9622015-06-02 13:52:16 +00001661 if (__n > 0)
1662 {
1663 __result -= __n;
1664 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
1665 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001666 return __result;
1667}
1668
1669template <class _BidirectionalIterator1, class _BidirectionalIterator2>
1670inline _LIBCPP_INLINE_VISIBILITY
1671_BidirectionalIterator2
1672copy_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
1673 _BidirectionalIterator2 __result)
1674{
Eric Fiselier6003c772016-12-23 23:37:52 +00001675 return _VSTD::__copy_backward(__unwrap_iter(__first),
1676 __unwrap_iter(__last),
1677 __unwrap_iter(__result));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001678}
1679
1680// copy_if
1681
1682template<class _InputIterator, class _OutputIterator, class _Predicate>
1683inline _LIBCPP_INLINE_VISIBILITY
1684_OutputIterator
1685copy_if(_InputIterator __first, _InputIterator __last,
1686 _OutputIterator __result, _Predicate __pred)
1687{
1688 for (; __first != __last; ++__first)
1689 {
1690 if (__pred(*__first))
1691 {
1692 *__result = *__first;
1693 ++__result;
1694 }
1695 }
1696 return __result;
1697}
1698
1699// copy_n
1700
1701template<class _InputIterator, class _Size, class _OutputIterator>
1702inline _LIBCPP_INLINE_VISIBILITY
1703typename enable_if
1704<
1705 __is_input_iterator<_InputIterator>::value &&
1706 !__is_random_access_iterator<_InputIterator>::value,
1707 _OutputIterator
1708>::type
Eric Fiselier97ec07d2015-02-10 16:46:42 +00001709copy_n(_InputIterator __first, _Size __orig_n, _OutputIterator __result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001710{
Eric Fiselier97ec07d2015-02-10 16:46:42 +00001711 typedef decltype(__convert_to_integral(__orig_n)) _IntegralSize;
1712 _IntegralSize __n = __orig_n;
Howard Hinnantcbc5dc02011-02-27 20:55:39 +00001713 if (__n > 0)
1714 {
Howard Hinnantc51e1022010-05-11 19:42:16 +00001715 *__result = *__first;
Howard Hinnantcbc5dc02011-02-27 20:55:39 +00001716 ++__result;
1717 for (--__n; __n > 0; --__n)
1718 {
1719 ++__first;
1720 *__result = *__first;
1721 ++__result;
1722 }
1723 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001724 return __result;
1725}
1726
1727template<class _InputIterator, class _Size, class _OutputIterator>
1728inline _LIBCPP_INLINE_VISIBILITY
1729typename enable_if
1730<
1731 __is_random_access_iterator<_InputIterator>::value,
1732 _OutputIterator
1733>::type
Eric Fiselier97ec07d2015-02-10 16:46:42 +00001734copy_n(_InputIterator __first, _Size __orig_n, _OutputIterator __result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001735{
Eric Fiselier97ec07d2015-02-10 16:46:42 +00001736 typedef decltype(__convert_to_integral(__orig_n)) _IntegralSize;
1737 _IntegralSize __n = __orig_n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001738 return _VSTD::copy(__first, __first + __n, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001739}
1740
1741// move
1742
1743template <class _InputIterator, class _OutputIterator>
1744inline _LIBCPP_INLINE_VISIBILITY
1745_OutputIterator
1746__move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1747{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00001748 for (; __first != __last; ++__first, (void) ++__result)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001749 *__result = _VSTD::move(*__first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001750 return __result;
1751}
1752
1753template <class _Tp, class _Up>
1754inline _LIBCPP_INLINE_VISIBILITY
1755typename enable_if
1756<
1757 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnanta9a897e2010-11-19 22:17:28 +00001758 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001759 _Up*
1760>::type
1761__move(_Tp* __first, _Tp* __last, _Up* __result)
1762{
1763 const size_t __n = static_cast<size_t>(__last - __first);
Marshall Clowc3ef9622015-06-02 13:52:16 +00001764 if (__n > 0)
1765 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001766 return __result + __n;
1767}
1768
1769template <class _InputIterator, class _OutputIterator>
1770inline _LIBCPP_INLINE_VISIBILITY
1771_OutputIterator
1772move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1773{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001774 return _VSTD::__move(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001775}
1776
1777// move_backward
1778
1779template <class _InputIterator, class _OutputIterator>
1780inline _LIBCPP_INLINE_VISIBILITY
1781_OutputIterator
1782__move_backward(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1783{
1784 while (__first != __last)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001785 *--__result = _VSTD::move(*--__last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001786 return __result;
1787}
1788
1789template <class _Tp, class _Up>
1790inline _LIBCPP_INLINE_VISIBILITY
1791typename enable_if
1792<
1793 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnanta9a897e2010-11-19 22:17:28 +00001794 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001795 _Up*
1796>::type
1797__move_backward(_Tp* __first, _Tp* __last, _Up* __result)
1798{
1799 const size_t __n = static_cast<size_t>(__last - __first);
Marshall Clowc3ef9622015-06-02 13:52:16 +00001800 if (__n > 0)
1801 {
1802 __result -= __n;
1803 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
1804 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001805 return __result;
1806}
1807
1808template <class _BidirectionalIterator1, class _BidirectionalIterator2>
1809inline _LIBCPP_INLINE_VISIBILITY
1810_BidirectionalIterator2
1811move_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
1812 _BidirectionalIterator2 __result)
1813{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001814 return _VSTD::__move_backward(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001815}
1816
1817// iter_swap
1818
Howard Hinnantdbfd4b42011-05-27 15:04:19 +00001819// moved to <type_traits> for better swap / noexcept support
Howard Hinnantc51e1022010-05-11 19:42:16 +00001820
1821// transform
1822
1823template <class _InputIterator, class _OutputIterator, class _UnaryOperation>
Marshall Clow31427c62018-01-19 17:45:39 +00001824inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001825_OutputIterator
1826transform(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _UnaryOperation __op)
1827{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00001828 for (; __first != __last; ++__first, (void) ++__result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001829 *__result = __op(*__first);
1830 return __result;
1831}
1832
1833template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _BinaryOperation>
Marshall Clow31427c62018-01-19 17:45:39 +00001834inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001835_OutputIterator
1836transform(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2,
1837 _OutputIterator __result, _BinaryOperation __binary_op)
1838{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00001839 for (; __first1 != __last1; ++__first1, (void) ++__first2, ++__result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001840 *__result = __binary_op(*__first1, *__first2);
1841 return __result;
1842}
1843
1844// replace
1845
1846template <class _ForwardIterator, class _Tp>
Marshall Clow01bbbd22018-01-19 18:07:29 +00001847inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001848void
1849replace(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __old_value, const _Tp& __new_value)
1850{
1851 for (; __first != __last; ++__first)
1852 if (*__first == __old_value)
1853 *__first = __new_value;
1854}
1855
1856// replace_if
1857
1858template <class _ForwardIterator, class _Predicate, class _Tp>
Marshall Clow01bbbd22018-01-19 18:07:29 +00001859inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001860void
1861replace_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, const _Tp& __new_value)
1862{
1863 for (; __first != __last; ++__first)
1864 if (__pred(*__first))
1865 *__first = __new_value;
1866}
1867
1868// replace_copy
1869
1870template <class _InputIterator, class _OutputIterator, class _Tp>
Marshall Clow01bbbd22018-01-19 18:07:29 +00001871inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001872_OutputIterator
1873replace_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
1874 const _Tp& __old_value, const _Tp& __new_value)
1875{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00001876 for (; __first != __last; ++__first, (void) ++__result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001877 if (*__first == __old_value)
1878 *__result = __new_value;
1879 else
1880 *__result = *__first;
1881 return __result;
1882}
1883
1884// replace_copy_if
1885
1886template <class _InputIterator, class _OutputIterator, class _Predicate, class _Tp>
Marshall Clow01bbbd22018-01-19 18:07:29 +00001887inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001888_OutputIterator
1889replace_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
1890 _Predicate __pred, const _Tp& __new_value)
1891{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00001892 for (; __first != __last; ++__first, (void) ++__result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001893 if (__pred(*__first))
1894 *__result = __new_value;
1895 else
1896 *__result = *__first;
1897 return __result;
1898}
1899
1900// fill_n
1901
1902template <class _OutputIterator, class _Size, class _Tp>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00001903inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001904_OutputIterator
Howard Hinnant0ad1c122013-08-01 17:29:28 +00001905__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001906{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00001907 for (; __n > 0; ++__first, (void) --__n)
Howard Hinnantbf074022011-10-22 20:59:45 +00001908 *__first = __value_;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001909 return __first;
1910}
1911
Howard Hinnantc51e1022010-05-11 19:42:16 +00001912template <class _OutputIterator, class _Size, class _Tp>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00001913inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001914_OutputIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00001915fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001916{
Eric Fiselier97ec07d2015-02-10 16:46:42 +00001917 return _VSTD::__fill_n(__first, __convert_to_integral(__n), __value_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001918}
1919
1920// fill
1921
1922template <class _ForwardIterator, class _Tp>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00001923inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001924void
Howard Hinnantbf074022011-10-22 20:59:45 +00001925__fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, forward_iterator_tag)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001926{
1927 for (; __first != __last; ++__first)
Howard Hinnantbf074022011-10-22 20:59:45 +00001928 *__first = __value_;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001929}
1930
1931template <class _RandomAccessIterator, class _Tp>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00001932inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001933void
Howard Hinnantbf074022011-10-22 20:59:45 +00001934__fill(_RandomAccessIterator __first, _RandomAccessIterator __last, const _Tp& __value_, random_access_iterator_tag)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001935{
Howard Hinnantbf074022011-10-22 20:59:45 +00001936 _VSTD::fill_n(__first, __last - __first, __value_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001937}
1938
1939template <class _ForwardIterator, class _Tp>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00001940inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001941void
Howard Hinnantbf074022011-10-22 20:59:45 +00001942fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001943{
Howard Hinnantbf074022011-10-22 20:59:45 +00001944 _VSTD::__fill(__first, __last, __value_, typename iterator_traits<_ForwardIterator>::iterator_category());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001945}
1946
1947// generate
1948
1949template <class _ForwardIterator, class _Generator>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00001950inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001951void
1952generate(_ForwardIterator __first, _ForwardIterator __last, _Generator __gen)
1953{
1954 for (; __first != __last; ++__first)
1955 *__first = __gen();
1956}
1957
1958// generate_n
1959
1960template <class _OutputIterator, class _Size, class _Generator>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00001961inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001962_OutputIterator
Eric Fiselier97ec07d2015-02-10 16:46:42 +00001963generate_n(_OutputIterator __first, _Size __orig_n, _Generator __gen)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001964{
Eric Fiselier97ec07d2015-02-10 16:46:42 +00001965 typedef decltype(__convert_to_integral(__orig_n)) _IntegralSize;
1966 _IntegralSize __n = __orig_n;
Eric Fiseliera09a3b42014-10-27 19:28:20 +00001967 for (; __n > 0; ++__first, (void) --__n)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001968 *__first = __gen();
1969 return __first;
1970}
1971
1972// remove
1973
1974template <class _ForwardIterator, class _Tp>
Marshall Clow7c0fbd82018-01-22 21:43:04 +00001975_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00001976remove(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001977{
Howard Hinnantbf074022011-10-22 20:59:45 +00001978 __first = _VSTD::find(__first, __last, __value_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001979 if (__first != __last)
1980 {
1981 _ForwardIterator __i = __first;
1982 while (++__i != __last)
1983 {
Howard Hinnantbf074022011-10-22 20:59:45 +00001984 if (!(*__i == __value_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001985 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001986 *__first = _VSTD::move(*__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001987 ++__first;
1988 }
1989 }
1990 }
1991 return __first;
1992}
1993
1994// remove_if
1995
1996template <class _ForwardIterator, class _Predicate>
Marshall Clow7c0fbd82018-01-22 21:43:04 +00001997_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00001998remove_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
1999{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002000 __first = _VSTD::find_if<_ForwardIterator, typename add_lvalue_reference<_Predicate>::type>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002001 (__first, __last, __pred);
2002 if (__first != __last)
2003 {
2004 _ForwardIterator __i = __first;
2005 while (++__i != __last)
2006 {
2007 if (!__pred(*__i))
2008 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002009 *__first = _VSTD::move(*__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002010 ++__first;
2011 }
2012 }
2013 }
2014 return __first;
2015}
2016
2017// remove_copy
2018
2019template <class _InputIterator, class _OutputIterator, class _Tp>
Marshall Clow7c0fbd82018-01-22 21:43:04 +00002020inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002021_OutputIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00002022remove_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002023{
2024 for (; __first != __last; ++__first)
2025 {
Howard Hinnantbf074022011-10-22 20:59:45 +00002026 if (!(*__first == __value_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002027 {
2028 *__result = *__first;
2029 ++__result;
2030 }
2031 }
2032 return __result;
2033}
2034
2035// remove_copy_if
2036
2037template <class _InputIterator, class _OutputIterator, class _Predicate>
Marshall Clow7c0fbd82018-01-22 21:43:04 +00002038inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002039_OutputIterator
2040remove_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Predicate __pred)
2041{
2042 for (; __first != __last; ++__first)
2043 {
2044 if (!__pred(*__first))
2045 {
2046 *__result = *__first;
2047 ++__result;
2048 }
2049 }
2050 return __result;
2051}
2052
2053// unique
2054
2055template <class _ForwardIterator, class _BinaryPredicate>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002056_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00002057unique(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred)
2058{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002059 __first = _VSTD::adjacent_find<_ForwardIterator, typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002060 (__first, __last, __pred);
2061 if (__first != __last)
2062 {
2063 // ... a a ? ...
2064 // f i
2065 _ForwardIterator __i = __first;
2066 for (++__i; ++__i != __last;)
2067 if (!__pred(*__first, *__i))
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002068 *++__first = _VSTD::move(*__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002069 ++__first;
2070 }
2071 return __first;
2072}
2073
2074template <class _ForwardIterator>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002075inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002076_ForwardIterator
2077unique(_ForwardIterator __first, _ForwardIterator __last)
2078{
2079 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002080 return _VSTD::unique(__first, __last, __equal_to<__v>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002081}
2082
2083// unique_copy
2084
2085template <class _BinaryPredicate, class _InputIterator, class _OutputIterator>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002086_LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00002087__unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred,
2088 input_iterator_tag, output_iterator_tag)
2089{
2090 if (__first != __last)
2091 {
2092 typename iterator_traits<_InputIterator>::value_type __t(*__first);
2093 *__result = __t;
2094 ++__result;
2095 while (++__first != __last)
2096 {
2097 if (!__pred(__t, *__first))
2098 {
2099 __t = *__first;
2100 *__result = __t;
2101 ++__result;
2102 }
2103 }
2104 }
2105 return __result;
2106}
2107
2108template <class _BinaryPredicate, class _ForwardIterator, class _OutputIterator>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002109_LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00002110__unique_copy(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result, _BinaryPredicate __pred,
2111 forward_iterator_tag, output_iterator_tag)
2112{
2113 if (__first != __last)
2114 {
2115 _ForwardIterator __i = __first;
2116 *__result = *__i;
2117 ++__result;
2118 while (++__first != __last)
2119 {
2120 if (!__pred(*__i, *__first))
2121 {
2122 *__result = *__first;
2123 ++__result;
2124 __i = __first;
2125 }
2126 }
2127 }
2128 return __result;
2129}
2130
2131template <class _BinaryPredicate, class _InputIterator, class _ForwardIterator>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002132_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00002133__unique_copy(_InputIterator __first, _InputIterator __last, _ForwardIterator __result, _BinaryPredicate __pred,
2134 input_iterator_tag, forward_iterator_tag)
2135{
2136 if (__first != __last)
2137 {
2138 *__result = *__first;
2139 while (++__first != __last)
2140 if (!__pred(*__result, *__first))
2141 *++__result = *__first;
2142 ++__result;
2143 }
2144 return __result;
2145}
2146
Howard Hinnantc51e1022010-05-11 19:42:16 +00002147template <class _InputIterator, class _OutputIterator, class _BinaryPredicate>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002148inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002149_OutputIterator
2150unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred)
2151{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002152 return _VSTD::__unique_copy<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002153 (__first, __last, __result, __pred,
2154 typename iterator_traits<_InputIterator>::iterator_category(),
2155 typename iterator_traits<_OutputIterator>::iterator_category());
2156}
2157
2158template <class _InputIterator, class _OutputIterator>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002159inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002160_OutputIterator
2161unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
2162{
2163 typedef typename iterator_traits<_InputIterator>::value_type __v;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002164 return _VSTD::unique_copy(__first, __last, __result, __equal_to<__v>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002165}
2166
2167// reverse
2168
2169template <class _BidirectionalIterator>
2170inline _LIBCPP_INLINE_VISIBILITY
2171void
2172__reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirectional_iterator_tag)
2173{
2174 while (__first != __last)
2175 {
2176 if (__first == --__last)
2177 break;
Marshall Clow2ad71042015-11-02 21:34:25 +00002178 _VSTD::iter_swap(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002179 ++__first;
2180 }
2181}
2182
2183template <class _RandomAccessIterator>
2184inline _LIBCPP_INLINE_VISIBILITY
2185void
2186__reverse(_RandomAccessIterator __first, _RandomAccessIterator __last, random_access_iterator_tag)
2187{
2188 if (__first != __last)
2189 for (; __first < --__last; ++__first)
Marshall Clow2ad71042015-11-02 21:34:25 +00002190 _VSTD::iter_swap(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002191}
2192
2193template <class _BidirectionalIterator>
2194inline _LIBCPP_INLINE_VISIBILITY
2195void
2196reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
2197{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002198 _VSTD::__reverse(__first, __last, typename iterator_traits<_BidirectionalIterator>::iterator_category());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002199}
2200
2201// reverse_copy
2202
2203template <class _BidirectionalIterator, class _OutputIterator>
Marshall Clow7c0fbd82018-01-22 21:43:04 +00002204inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002205_OutputIterator
2206reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last, _OutputIterator __result)
2207{
2208 for (; __first != __last; ++__result)
2209 *__result = *--__last;
2210 return __result;
2211}
2212
2213// rotate
2214
2215template <class _ForwardIterator>
2216_ForwardIterator
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002217__rotate_left(_ForwardIterator __first, _ForwardIterator __last)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002218{
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002219 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
2220 value_type __tmp = _VSTD::move(*__first);
2221 _ForwardIterator __lm1 = _VSTD::move(_VSTD::next(__first), __last, __first);
2222 *__lm1 = _VSTD::move(__tmp);
2223 return __lm1;
2224}
2225
2226template <class _BidirectionalIterator>
2227_BidirectionalIterator
2228__rotate_right(_BidirectionalIterator __first, _BidirectionalIterator __last)
2229{
2230 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
2231 _BidirectionalIterator __lm1 = _VSTD::prev(__last);
2232 value_type __tmp = _VSTD::move(*__lm1);
2233 _BidirectionalIterator __fp1 = _VSTD::move_backward(__first, __lm1, __last);
2234 *__first = _VSTD::move(__tmp);
2235 return __fp1;
2236}
2237
2238template <class _ForwardIterator>
2239_ForwardIterator
2240__rotate_forward(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last)
2241{
Howard Hinnantc51e1022010-05-11 19:42:16 +00002242 _ForwardIterator __i = __middle;
2243 while (true)
2244 {
2245 swap(*__first, *__i);
2246 ++__first;
2247 if (++__i == __last)
2248 break;
2249 if (__first == __middle)
2250 __middle = __i;
2251 }
2252 _ForwardIterator __r = __first;
2253 if (__first != __middle)
2254 {
2255 __i = __middle;
2256 while (true)
2257 {
2258 swap(*__first, *__i);
2259 ++__first;
2260 if (++__i == __last)
2261 {
2262 if (__first == __middle)
2263 break;
2264 __i = __middle;
2265 }
2266 else if (__first == __middle)
2267 __middle = __i;
2268 }
2269 }
2270 return __r;
2271}
2272
2273template<typename _Integral>
2274inline _LIBCPP_INLINE_VISIBILITY
2275_Integral
Marshall Clowb8bfc2c2016-07-26 14:29:45 +00002276__algo_gcd(_Integral __x, _Integral __y)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002277{
2278 do
2279 {
2280 _Integral __t = __x % __y;
2281 __x = __y;
2282 __y = __t;
2283 } while (__y);
2284 return __x;
2285}
2286
2287template<typename _RandomAccessIterator>
2288_RandomAccessIterator
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002289__rotate_gcd(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002290{
2291 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
2292 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002293
Howard Hinnantc51e1022010-05-11 19:42:16 +00002294 const difference_type __m1 = __middle - __first;
2295 const difference_type __m2 = __last - __middle;
2296 if (__m1 == __m2)
2297 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002298 _VSTD::swap_ranges(__first, __middle, __middle);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002299 return __middle;
2300 }
Marshall Clowb8bfc2c2016-07-26 14:29:45 +00002301 const difference_type __g = _VSTD::__algo_gcd(__m1, __m2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002302 for (_RandomAccessIterator __p = __first + __g; __p != __first;)
2303 {
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002304 value_type __t(_VSTD::move(*--__p));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002305 _RandomAccessIterator __p1 = __p;
2306 _RandomAccessIterator __p2 = __p1 + __m1;
2307 do
2308 {
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002309 *__p1 = _VSTD::move(*__p2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002310 __p1 = __p2;
2311 const difference_type __d = __last - __p2;
2312 if (__m1 < __d)
2313 __p2 += __m1;
2314 else
2315 __p2 = __first + (__m1 - __d);
2316 } while (__p2 != __p);
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002317 *__p1 = _VSTD::move(__t);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002318 }
2319 return __first + __m2;
2320}
2321
2322template <class _ForwardIterator>
2323inline _LIBCPP_INLINE_VISIBILITY
2324_ForwardIterator
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002325__rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last,
2326 _VSTD::forward_iterator_tag)
2327{
2328 typedef typename _VSTD::iterator_traits<_ForwardIterator>::value_type value_type;
2329 if (_VSTD::is_trivially_move_assignable<value_type>::value)
2330 {
2331 if (_VSTD::next(__first) == __middle)
2332 return _VSTD::__rotate_left(__first, __last);
2333 }
2334 return _VSTD::__rotate_forward(__first, __middle, __last);
2335}
2336
2337template <class _BidirectionalIterator>
2338inline _LIBCPP_INLINE_VISIBILITY
2339_BidirectionalIterator
2340__rotate(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
2341 _VSTD::bidirectional_iterator_tag)
2342{
2343 typedef typename _VSTD::iterator_traits<_BidirectionalIterator>::value_type value_type;
2344 if (_VSTD::is_trivially_move_assignable<value_type>::value)
2345 {
2346 if (_VSTD::next(__first) == __middle)
2347 return _VSTD::__rotate_left(__first, __last);
2348 if (_VSTD::next(__middle) == __last)
2349 return _VSTD::__rotate_right(__first, __last);
2350 }
2351 return _VSTD::__rotate_forward(__first, __middle, __last);
2352}
2353
2354template <class _RandomAccessIterator>
2355inline _LIBCPP_INLINE_VISIBILITY
2356_RandomAccessIterator
2357__rotate(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
2358 _VSTD::random_access_iterator_tag)
2359{
2360 typedef typename _VSTD::iterator_traits<_RandomAccessIterator>::value_type value_type;
2361 if (_VSTD::is_trivially_move_assignable<value_type>::value)
2362 {
2363 if (_VSTD::next(__first) == __middle)
2364 return _VSTD::__rotate_left(__first, __last);
2365 if (_VSTD::next(__middle) == __last)
2366 return _VSTD::__rotate_right(__first, __last);
2367 return _VSTD::__rotate_gcd(__first, __middle, __last);
2368 }
2369 return _VSTD::__rotate_forward(__first, __middle, __last);
2370}
2371
2372template <class _ForwardIterator>
2373inline _LIBCPP_INLINE_VISIBILITY
2374_ForwardIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00002375rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last)
2376{
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002377 if (__first == __middle)
2378 return __last;
2379 if (__middle == __last)
2380 return __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002381 return _VSTD::__rotate(__first, __middle, __last,
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002382 typename _VSTD::iterator_traits<_ForwardIterator>::iterator_category());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002383}
2384
2385// rotate_copy
2386
2387template <class _ForwardIterator, class _OutputIterator>
2388inline _LIBCPP_INLINE_VISIBILITY
2389_OutputIterator
2390rotate_copy(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last, _OutputIterator __result)
2391{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002392 return _VSTD::copy(__first, __middle, _VSTD::copy(__middle, __last, __result));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002393}
2394
Howard Hinnantc51e1022010-05-11 19:42:16 +00002395// min_element
2396
2397template <class _ForwardIterator, class _Compare>
Marshall Clowe9dca072014-02-19 16:51:35 +00002398inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantc51e1022010-05-11 19:42:16 +00002399_ForwardIterator
Marshall Clow9e173072015-05-10 13:53:31 +00002400min_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002401{
Eric Fiselierf8ecd942018-08-22 17:47:13 +00002402 static_assert(__is_forward_iterator<_ForwardIterator>::value,
2403 "std::min_element requires a ForwardIterator");
Howard Hinnantc51e1022010-05-11 19:42:16 +00002404 if (__first != __last)
2405 {
2406 _ForwardIterator __i = __first;
2407 while (++__i != __last)
2408 if (__comp(*__i, *__first))
2409 __first = __i;
2410 }
2411 return __first;
2412}
2413
2414template <class _ForwardIterator>
Marshall Clow9e173072015-05-10 13:53:31 +00002415inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantc51e1022010-05-11 19:42:16 +00002416_ForwardIterator
2417min_element(_ForwardIterator __first, _ForwardIterator __last)
2418{
Marshall Clow9e173072015-05-10 13:53:31 +00002419 return _VSTD::min_element(__first, __last,
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002420 __less<typename iterator_traits<_ForwardIterator>::value_type>());
2421}
2422
2423// min
2424
2425template <class _Tp, class _Compare>
Marshall Clowe9dca072014-02-19 16:51:35 +00002426inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002427const _Tp&
2428min(const _Tp& __a, const _Tp& __b, _Compare __comp)
2429{
2430 return __comp(__b, __a) ? __b : __a;
2431}
2432
2433template <class _Tp>
Marshall Clowe9dca072014-02-19 16:51:35 +00002434inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002435const _Tp&
2436min(const _Tp& __a, const _Tp& __b)
2437{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002438 return _VSTD::min(__a, __b, __less<_Tp>());
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002439}
2440
Eric Fiselier93dd1372017-04-18 23:26:47 +00002441#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002442
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002443template<class _Tp, class _Compare>
Marshall Clowe9dca072014-02-19 16:51:35 +00002444inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002445_Tp
2446min(initializer_list<_Tp> __t, _Compare __comp)
2447{
Marshall Clow9e173072015-05-10 13:53:31 +00002448 return *_VSTD::min_element(__t.begin(), __t.end(), __comp);
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002449}
2450
2451template<class _Tp>
Marshall Clowe9dca072014-02-19 16:51:35 +00002452inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002453_Tp
2454min(initializer_list<_Tp> __t)
2455{
Marshall Clow9e173072015-05-10 13:53:31 +00002456 return *_VSTD::min_element(__t.begin(), __t.end(), __less<_Tp>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002457}
2458
Eric Fiselier93dd1372017-04-18 23:26:47 +00002459#endif // _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002460
Howard Hinnantc51e1022010-05-11 19:42:16 +00002461// max_element
2462
2463template <class _ForwardIterator, class _Compare>
Marshall Clowe9dca072014-02-19 16:51:35 +00002464inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantc51e1022010-05-11 19:42:16 +00002465_ForwardIterator
Marshall Clow9e173072015-05-10 13:53:31 +00002466max_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002467{
Eric Fiselierf8ecd942018-08-22 17:47:13 +00002468 static_assert(__is_forward_iterator<_ForwardIterator>::value,
2469 "std::max_element requires a ForwardIterator");
Howard Hinnantc51e1022010-05-11 19:42:16 +00002470 if (__first != __last)
2471 {
2472 _ForwardIterator __i = __first;
2473 while (++__i != __last)
2474 if (__comp(*__first, *__i))
2475 __first = __i;
2476 }
2477 return __first;
2478}
2479
Marshall Clowe9dca072014-02-19 16:51:35 +00002480
Howard Hinnantc51e1022010-05-11 19:42:16 +00002481template <class _ForwardIterator>
Marshall Clow9e173072015-05-10 13:53:31 +00002482inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantc51e1022010-05-11 19:42:16 +00002483_ForwardIterator
2484max_element(_ForwardIterator __first, _ForwardIterator __last)
2485{
Marshall Clow9e173072015-05-10 13:53:31 +00002486 return _VSTD::max_element(__first, __last,
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002487 __less<typename iterator_traits<_ForwardIterator>::value_type>());
2488}
2489
2490// max
2491
2492template <class _Tp, class _Compare>
Marshall Clowe9dca072014-02-19 16:51:35 +00002493inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002494const _Tp&
2495max(const _Tp& __a, const _Tp& __b, _Compare __comp)
2496{
2497 return __comp(__a, __b) ? __b : __a;
2498}
2499
2500template <class _Tp>
Marshall Clowe9dca072014-02-19 16:51:35 +00002501inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002502const _Tp&
2503max(const _Tp& __a, const _Tp& __b)
2504{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002505 return _VSTD::max(__a, __b, __less<_Tp>());
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002506}
2507
Eric Fiselier93dd1372017-04-18 23:26:47 +00002508#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002509
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002510template<class _Tp, class _Compare>
Marshall Clowe9dca072014-02-19 16:51:35 +00002511inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002512_Tp
2513max(initializer_list<_Tp> __t, _Compare __comp)
2514{
Marshall Clow9e173072015-05-10 13:53:31 +00002515 return *_VSTD::max_element(__t.begin(), __t.end(), __comp);
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002516}
2517
2518template<class _Tp>
Marshall Clowe9dca072014-02-19 16:51:35 +00002519inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002520_Tp
2521max(initializer_list<_Tp> __t)
2522{
Marshall Clow9e173072015-05-10 13:53:31 +00002523 return *_VSTD::max_element(__t.begin(), __t.end(), __less<_Tp>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002524}
2525
Eric Fiselier93dd1372017-04-18 23:26:47 +00002526#endif // _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002527
Marshall Clow3e18d0e2016-03-07 22:43:49 +00002528#if _LIBCPP_STD_VER > 14
2529// clamp
2530template<class _Tp, class _Compare>
2531inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
2532const _Tp&
2533clamp(const _Tp& __v, const _Tp& __lo, const _Tp& __hi, _Compare __comp)
2534{
2535 _LIBCPP_ASSERT(!__comp(__hi, __lo), "Bad bounds passed to std::clamp");
2536 return __comp(__v, __lo) ? __lo : __comp(__hi, __v) ? __hi : __v;
2537
2538}
2539
2540template<class _Tp>
2541inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
2542const _Tp&
2543clamp(const _Tp& __v, const _Tp& __lo, const _Tp& __hi)
2544{
2545 return _VSTD::clamp(__v, __lo, __hi, __less<_Tp>());
2546}
2547#endif
2548
Howard Hinnantc51e1022010-05-11 19:42:16 +00002549// minmax_element
2550
2551template <class _ForwardIterator, class _Compare>
Marshall Clow9e173072015-05-10 13:53:31 +00002552_LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantc51e1022010-05-11 19:42:16 +00002553std::pair<_ForwardIterator, _ForwardIterator>
2554minmax_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
2555{
Eric Fiselierf8ecd942018-08-22 17:47:13 +00002556 static_assert(__is_forward_iterator<_ForwardIterator>::value,
2557 "std::minmax_element requires a ForwardIterator");
Howard Hinnantc51e1022010-05-11 19:42:16 +00002558 std::pair<_ForwardIterator, _ForwardIterator> __result(__first, __first);
2559 if (__first != __last)
2560 {
2561 if (++__first != __last)
2562 {
2563 if (__comp(*__first, *__result.first))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002564 __result.first = __first;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002565 else
2566 __result.second = __first;
2567 while (++__first != __last)
2568 {
2569 _ForwardIterator __i = __first;
2570 if (++__first == __last)
2571 {
2572 if (__comp(*__i, *__result.first))
2573 __result.first = __i;
2574 else if (!__comp(*__i, *__result.second))
2575 __result.second = __i;
2576 break;
2577 }
2578 else
2579 {
2580 if (__comp(*__first, *__i))
2581 {
2582 if (__comp(*__first, *__result.first))
2583 __result.first = __first;
2584 if (!__comp(*__i, *__result.second))
2585 __result.second = __i;
2586 }
2587 else
2588 {
2589 if (__comp(*__i, *__result.first))
2590 __result.first = __i;
2591 if (!__comp(*__first, *__result.second))
2592 __result.second = __first;
2593 }
2594 }
2595 }
2596 }
2597 }
2598 return __result;
2599}
2600
2601template <class _ForwardIterator>
Marshall Clow9e173072015-05-10 13:53:31 +00002602inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantc51e1022010-05-11 19:42:16 +00002603std::pair<_ForwardIterator, _ForwardIterator>
2604minmax_element(_ForwardIterator __first, _ForwardIterator __last)
2605{
Marshall Clowe9dca072014-02-19 16:51:35 +00002606 return _VSTD::minmax_element(__first, __last,
2607 __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002608}
2609
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002610// minmax
2611
2612template<class _Tp, class _Compare>
Marshall Clowe9dca072014-02-19 16:51:35 +00002613inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002614pair<const _Tp&, const _Tp&>
2615minmax(const _Tp& __a, const _Tp& __b, _Compare __comp)
2616{
2617 return __comp(__b, __a) ? pair<const _Tp&, const _Tp&>(__b, __a) :
2618 pair<const _Tp&, const _Tp&>(__a, __b);
2619}
2620
2621template<class _Tp>
Marshall Clowe9dca072014-02-19 16:51:35 +00002622inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002623pair<const _Tp&, const _Tp&>
2624minmax(const _Tp& __a, const _Tp& __b)
2625{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002626 return _VSTD::minmax(__a, __b, __less<_Tp>());
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002627}
2628
Eric Fiselier93dd1372017-04-18 23:26:47 +00002629#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002630
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002631template<class _Tp, class _Compare>
Marshall Clowe9dca072014-02-19 16:51:35 +00002632inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002633pair<_Tp, _Tp>
2634minmax(initializer_list<_Tp> __t, _Compare __comp)
2635{
Marshall Clowe9dca072014-02-19 16:51:35 +00002636 typedef typename initializer_list<_Tp>::const_iterator _Iter;
2637 _Iter __first = __t.begin();
2638 _Iter __last = __t.end();
Marshall Clow447713a2015-02-11 15:41:34 +00002639 std::pair<_Tp, _Tp> __result(*__first, *__first);
Marshall Clowe9dca072014-02-19 16:51:35 +00002640
2641 ++__first;
2642 if (__t.size() % 2 == 0)
2643 {
2644 if (__comp(*__first, __result.first))
2645 __result.first = *__first;
2646 else
2647 __result.second = *__first;
2648 ++__first;
2649 }
Aditya Kumar3a0179a2016-08-25 11:52:38 +00002650
Marshall Clowe9dca072014-02-19 16:51:35 +00002651 while (__first != __last)
2652 {
2653 _Tp __prev = *__first++;
Marshall Clow447713a2015-02-11 15:41:34 +00002654 if (__comp(*__first, __prev)) {
2655 if ( __comp(*__first, __result.first)) __result.first = *__first;
2656 if (!__comp(__prev, __result.second)) __result.second = __prev;
Marshall Clowe9dca072014-02-19 16:51:35 +00002657 }
2658 else {
Marshall Clow447713a2015-02-11 15:41:34 +00002659 if ( __comp(__prev, __result.first)) __result.first = __prev;
2660 if (!__comp(*__first, __result.second)) __result.second = *__first;
Marshall Clowe9dca072014-02-19 16:51:35 +00002661 }
Aditya Kumar3a0179a2016-08-25 11:52:38 +00002662
Marshall Clowe9dca072014-02-19 16:51:35 +00002663 __first++;
2664 }
2665 return __result;
2666}
2667
2668template<class _Tp>
2669inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
2670pair<_Tp, _Tp>
2671minmax(initializer_list<_Tp> __t)
2672{
2673 return _VSTD::minmax(__t, __less<_Tp>());
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002674}
2675
Eric Fiselier93dd1372017-04-18 23:26:47 +00002676#endif // _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002677
Howard Hinnantc51e1022010-05-11 19:42:16 +00002678// random_shuffle
2679
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002680// __independent_bits_engine
2681
Howard Hinnantc834c512011-11-29 18:15:50 +00002682template <unsigned long long _Xp, size_t _Rp>
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002683struct __log2_imp
Howard Hinnantc51e1022010-05-11 19:42:16 +00002684{
Howard Hinnantc834c512011-11-29 18:15:50 +00002685 static const size_t value = _Xp & ((unsigned long long)(1) << _Rp) ? _Rp
2686 : __log2_imp<_Xp, _Rp - 1>::value;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002687};
2688
Howard Hinnantc834c512011-11-29 18:15:50 +00002689template <unsigned long long _Xp>
2690struct __log2_imp<_Xp, 0>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002691{
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002692 static const size_t value = 0;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002693};
2694
Howard Hinnantc834c512011-11-29 18:15:50 +00002695template <size_t _Rp>
2696struct __log2_imp<0, _Rp>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002697{
Howard Hinnantc834c512011-11-29 18:15:50 +00002698 static const size_t value = _Rp + 1;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002699};
2700
Eric Fiselier4638fca2017-05-31 21:20:18 +00002701template <class _UIntType, _UIntType _Xp>
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002702struct __log2
Howard Hinnantc51e1022010-05-11 19:42:16 +00002703{
Howard Hinnantc834c512011-11-29 18:15:50 +00002704 static const size_t value = __log2_imp<_Xp,
Eric Fiselier4638fca2017-05-31 21:20:18 +00002705 sizeof(_UIntType) * __CHAR_BIT__ - 1>::value;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002706};
2707
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002708template<class _Engine, class _UIntType>
2709class __independent_bits_engine
Howard Hinnantc51e1022010-05-11 19:42:16 +00002710{
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002711public:
2712 // types
2713 typedef _UIntType result_type;
2714
2715private:
2716 typedef typename _Engine::result_type _Engine_result_type;
2717 typedef typename conditional
2718 <
2719 sizeof(_Engine_result_type) <= sizeof(result_type),
2720 result_type,
2721 _Engine_result_type
2722 >::type _Working_result_type;
2723
2724 _Engine& __e_;
2725 size_t __w_;
2726 size_t __w0_;
2727 size_t __n_;
2728 size_t __n0_;
2729 _Working_result_type __y0_;
2730 _Working_result_type __y1_;
2731 _Engine_result_type __mask0_;
2732 _Engine_result_type __mask1_;
2733
Eric Fiselier93dd1372017-04-18 23:26:47 +00002734#ifdef _LIBCPP_CXX03_LANG
Howard Hinnantc834c512011-11-29 18:15:50 +00002735 static const _Working_result_type _Rp = _Engine::_Max - _Engine::_Min
Howard Hinnant5a646852012-04-02 21:00:45 +00002736 + _Working_result_type(1);
2737#else
2738 static _LIBCPP_CONSTEXPR const _Working_result_type _Rp = _Engine::max() - _Engine::min()
2739 + _Working_result_type(1);
2740#endif
2741 static _LIBCPP_CONSTEXPR const size_t __m = __log2<_Working_result_type, _Rp>::value;
2742 static _LIBCPP_CONSTEXPR const size_t _WDt = numeric_limits<_Working_result_type>::digits;
2743 static _LIBCPP_CONSTEXPR const size_t _EDt = numeric_limits<_Engine_result_type>::digits;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002744
2745public:
2746 // constructors and seeding functions
2747 __independent_bits_engine(_Engine& __e, size_t __w);
2748
2749 // generating functions
Howard Hinnantc834c512011-11-29 18:15:50 +00002750 result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>());}
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002751
2752private:
Marshall Clowfe778582017-09-20 19:38:43 +00002753 result_type __eval(false_type);
2754 result_type __eval(true_type);
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002755};
2756
2757template<class _Engine, class _UIntType>
2758__independent_bits_engine<_Engine, _UIntType>
2759 ::__independent_bits_engine(_Engine& __e, size_t __w)
2760 : __e_(__e),
2761 __w_(__w)
2762{
2763 __n_ = __w_ / __m + (__w_ % __m != 0);
2764 __w0_ = __w_ / __n_;
Howard Hinnantc834c512011-11-29 18:15:50 +00002765 if (_Rp == 0)
2766 __y0_ = _Rp;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002767 else if (__w0_ < _WDt)
Howard Hinnantc834c512011-11-29 18:15:50 +00002768 __y0_ = (_Rp >> __w0_) << __w0_;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002769 else
2770 __y0_ = 0;
Howard Hinnantc834c512011-11-29 18:15:50 +00002771 if (_Rp - __y0_ > __y0_ / __n_)
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002772 {
2773 ++__n_;
2774 __w0_ = __w_ / __n_;
2775 if (__w0_ < _WDt)
Howard Hinnantc834c512011-11-29 18:15:50 +00002776 __y0_ = (_Rp >> __w0_) << __w0_;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002777 else
2778 __y0_ = 0;
2779 }
2780 __n0_ = __n_ - __w_ % __n_;
2781 if (__w0_ < _WDt - 1)
Howard Hinnantc834c512011-11-29 18:15:50 +00002782 __y1_ = (_Rp >> (__w0_ + 1)) << (__w0_ + 1);
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002783 else
2784 __y1_ = 0;
2785 __mask0_ = __w0_ > 0 ? _Engine_result_type(~0) >> (_EDt - __w0_) :
2786 _Engine_result_type(0);
2787 __mask1_ = __w0_ < _EDt - 1 ?
2788 _Engine_result_type(~0) >> (_EDt - (__w0_ + 1)) :
2789 _Engine_result_type(~0);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002790}
2791
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002792template<class _Engine, class _UIntType>
2793inline
2794_UIntType
Marshall Clowfe778582017-09-20 19:38:43 +00002795__independent_bits_engine<_Engine, _UIntType>::__eval(false_type)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002796{
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002797 return static_cast<result_type>(__e_() & __mask0_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002798}
2799
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002800template<class _Engine, class _UIntType>
2801_UIntType
Marshall Clowfe778582017-09-20 19:38:43 +00002802__independent_bits_engine<_Engine, _UIntType>::__eval(true_type)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002803{
Marshall Clowafc48592017-09-20 17:34:11 +00002804 const size_t _WRt = numeric_limits<result_type>::digits;
Howard Hinnantc834c512011-11-29 18:15:50 +00002805 result_type _Sp = 0;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002806 for (size_t __k = 0; __k < __n0_; ++__k)
2807 {
2808 _Engine_result_type __u;
2809 do
2810 {
2811 __u = __e_() - _Engine::min();
2812 } while (__u >= __y0_);
Marshall Clowafc48592017-09-20 17:34:11 +00002813 if (__w0_ < _WRt)
Howard Hinnantc834c512011-11-29 18:15:50 +00002814 _Sp <<= __w0_;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002815 else
Howard Hinnantc834c512011-11-29 18:15:50 +00002816 _Sp = 0;
2817 _Sp += __u & __mask0_;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002818 }
2819 for (size_t __k = __n0_; __k < __n_; ++__k)
2820 {
2821 _Engine_result_type __u;
2822 do
2823 {
2824 __u = __e_() - _Engine::min();
2825 } while (__u >= __y1_);
Marshall Clowafc48592017-09-20 17:34:11 +00002826 if (__w0_ < _WRt - 1)
Howard Hinnantc834c512011-11-29 18:15:50 +00002827 _Sp <<= __w0_ + 1;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002828 else
Howard Hinnantc834c512011-11-29 18:15:50 +00002829 _Sp = 0;
2830 _Sp += __u & __mask1_;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002831 }
Howard Hinnantc834c512011-11-29 18:15:50 +00002832 return _Sp;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002833}
2834
2835// uniform_int_distribution
2836
2837template<class _IntType = int>
2838class uniform_int_distribution
2839{
2840public:
2841 // types
2842 typedef _IntType result_type;
2843
2844 class param_type
2845 {
2846 result_type __a_;
2847 result_type __b_;
2848 public:
2849 typedef uniform_int_distribution distribution_type;
2850
2851 explicit param_type(result_type __a = 0,
2852 result_type __b = numeric_limits<result_type>::max())
2853 : __a_(__a), __b_(__b) {}
2854
2855 result_type a() const {return __a_;}
2856 result_type b() const {return __b_;}
2857
2858 friend bool operator==(const param_type& __x, const param_type& __y)
2859 {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;}
2860 friend bool operator!=(const param_type& __x, const param_type& __y)
2861 {return !(__x == __y);}
2862 };
2863
2864private:
2865 param_type __p_;
2866
2867public:
2868 // constructors and reset functions
2869 explicit uniform_int_distribution(result_type __a = 0,
2870 result_type __b = numeric_limits<result_type>::max())
2871 : __p_(param_type(__a, __b)) {}
2872 explicit uniform_int_distribution(const param_type& __p) : __p_(__p) {}
2873 void reset() {}
2874
2875 // generating functions
2876 template<class _URNG> result_type operator()(_URNG& __g)
2877 {return (*this)(__g, __p_);}
2878 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
2879
2880 // property functions
2881 result_type a() const {return __p_.a();}
2882 result_type b() const {return __p_.b();}
2883
2884 param_type param() const {return __p_;}
2885 void param(const param_type& __p) {__p_ = __p;}
2886
2887 result_type min() const {return a();}
2888 result_type max() const {return b();}
2889
2890 friend bool operator==(const uniform_int_distribution& __x,
2891 const uniform_int_distribution& __y)
2892 {return __x.__p_ == __y.__p_;}
2893 friend bool operator!=(const uniform_int_distribution& __x,
2894 const uniform_int_distribution& __y)
2895 {return !(__x == __y);}
2896};
2897
2898template<class _IntType>
2899template<class _URNG>
2900typename uniform_int_distribution<_IntType>::result_type
2901uniform_int_distribution<_IntType>::operator()(_URNG& __g, const param_type& __p)
Marshall Clowf79f4402018-10-08 20:20:34 +00002902_LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002903{
2904 typedef typename conditional<sizeof(result_type) <= sizeof(uint32_t),
2905 uint32_t, uint64_t>::type _UIntType;
Marshall Clowf79f4402018-10-08 20:20:34 +00002906 const _UIntType _Rp = _UIntType(__p.b()) - _UIntType(__p.a()) + _UIntType(1);
Howard Hinnantc834c512011-11-29 18:15:50 +00002907 if (_Rp == 1)
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002908 return __p.a();
2909 const size_t _Dt = numeric_limits<_UIntType>::digits;
2910 typedef __independent_bits_engine<_URNG, _UIntType> _Eng;
Howard Hinnantc834c512011-11-29 18:15:50 +00002911 if (_Rp == 0)
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002912 return static_cast<result_type>(_Eng(__g, _Dt)());
Howard Hinnantc834c512011-11-29 18:15:50 +00002913 size_t __w = _Dt - __clz(_Rp) - 1;
Marshall Clow40aada52015-07-30 18:26:34 +00002914 if ((_Rp & (std::numeric_limits<_UIntType>::max() >> (_Dt - __w))) != 0)
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002915 ++__w;
2916 _Eng __e(__g, __w);
2917 _UIntType __u;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002918 do
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002919 {
2920 __u = __e();
Howard Hinnantc834c512011-11-29 18:15:50 +00002921 } while (__u >= _Rp);
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002922 return static_cast<result_type>(__u + __p.a());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002923}
2924
Eric Fiselierf5fb27c2017-04-03 23:23:44 +00002925#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_RANDOM_SHUFFLE) \
2926 || defined(_LIBCPP_BUILDING_LIBRARY)
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00002927class _LIBCPP_TYPE_VIS __rs_default;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002928
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00002929_LIBCPP_FUNC_VIS __rs_default __rs_get();
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002930
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00002931class _LIBCPP_TYPE_VIS __rs_default
Howard Hinnantc51e1022010-05-11 19:42:16 +00002932{
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002933 static unsigned __c_;
2934
2935 __rs_default();
2936public:
Marshall Clow9903c5b2013-02-07 22:12:02 +00002937 typedef uint_fast32_t result_type;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002938
2939 static const result_type _Min = 0;
2940 static const result_type _Max = 0xFFFFFFFF;
2941
2942 __rs_default(const __rs_default&);
2943 ~__rs_default();
2944
2945 result_type operator()();
2946
Howard Hinnant664183b2012-04-02 00:40:41 +00002947 static _LIBCPP_CONSTEXPR result_type min() {return _Min;}
2948 static _LIBCPP_CONSTEXPR result_type max() {return _Max;}
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002949
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00002950 friend _LIBCPP_FUNC_VIS __rs_default __rs_get();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002951};
2952
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00002953_LIBCPP_FUNC_VIS __rs_default __rs_get();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002954
2955template <class _RandomAccessIterator>
Louis Dionne481a2662018-09-23 18:35:00 +00002956_LIBCPP_DEPRECATED_IN_CXX14 void
Howard Hinnantc51e1022010-05-11 19:42:16 +00002957random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
2958{
2959 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnantc834c512011-11-29 18:15:50 +00002960 typedef uniform_int_distribution<ptrdiff_t> _Dp;
2961 typedef typename _Dp::param_type _Pp;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002962 difference_type __d = __last - __first;
2963 if (__d > 1)
2964 {
Howard Hinnantc834c512011-11-29 18:15:50 +00002965 _Dp __uid;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002966 __rs_default __g = __rs_get();
2967 for (--__last, --__d; __first < __last; ++__first, --__d)
Howard Hinnantc9bc02c2010-10-22 15:26:39 +00002968 {
Howard Hinnantc834c512011-11-29 18:15:50 +00002969 difference_type __i = __uid(__g, _Pp(0, __d));
Howard Hinnantc9bc02c2010-10-22 15:26:39 +00002970 if (__i != difference_type(0))
2971 swap(*__first, *(__first + __i));
2972 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002973 }
2974}
2975
2976template <class _RandomAccessIterator, class _RandomNumberGenerator>
Louis Dionne481a2662018-09-23 18:35:00 +00002977_LIBCPP_DEPRECATED_IN_CXX14 void
Howard Hinnantc51e1022010-05-11 19:42:16 +00002978random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
Eric Fiselier93dd1372017-04-18 23:26:47 +00002979#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002980 _RandomNumberGenerator&& __rand)
2981#else
2982 _RandomNumberGenerator& __rand)
2983#endif
2984{
2985 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
2986 difference_type __d = __last - __first;
2987 if (__d > 1)
2988 {
2989 for (--__last; __first < __last; ++__first, --__d)
Howard Hinnantc9bc02c2010-10-22 15:26:39 +00002990 {
2991 difference_type __i = __rand(__d);
Marshall Clow5bdfc232018-09-11 18:33:45 +00002992 if (__i != difference_type(0))
Marshall Clowf79f4402018-10-08 20:20:34 +00002993 swap(*__first, *(__first + __i));
Howard Hinnantc9bc02c2010-10-22 15:26:39 +00002994 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002995 }
2996}
Marshall Clowfac06e52017-03-23 13:43:37 +00002997#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002998
Eric Fiselier1208fcd2016-08-28 22:14:37 +00002999template <class _PopulationIterator, class _SampleIterator, class _Distance,
3000 class _UniformRandomNumberGenerator>
3001_LIBCPP_INLINE_VISIBILITY
3002_SampleIterator __sample(_PopulationIterator __first,
Alexander Richardsonc9637642017-11-14 11:14:25 +00003003 _PopulationIterator __last, _SampleIterator __output_iter,
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003004 _Distance __n,
3005 _UniformRandomNumberGenerator & __g,
3006 input_iterator_tag) {
3007
3008 _Distance __k = 0;
3009 for (; __first != __last && __k < __n; ++__first, (void)++__k)
Alexander Richardsonc9637642017-11-14 11:14:25 +00003010 __output_iter[__k] = *__first;
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003011 _Distance __sz = __k;
3012 for (; __first != __last; ++__first, (void)++__k) {
3013 _Distance __r = _VSTD::uniform_int_distribution<_Distance>(0, __k)(__g);
3014 if (__r < __sz)
Alexander Richardsonc9637642017-11-14 11:14:25 +00003015 __output_iter[__r] = *__first;
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003016 }
Alexander Richardsonc9637642017-11-14 11:14:25 +00003017 return __output_iter + _VSTD::min(__n, __k);
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003018}
3019
3020template <class _PopulationIterator, class _SampleIterator, class _Distance,
3021 class _UniformRandomNumberGenerator>
3022_LIBCPP_INLINE_VISIBILITY
3023_SampleIterator __sample(_PopulationIterator __first,
Alexander Richardsonc9637642017-11-14 11:14:25 +00003024 _PopulationIterator __last, _SampleIterator __output_iter,
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003025 _Distance __n,
3026 _UniformRandomNumberGenerator& __g,
3027 forward_iterator_tag) {
3028 _Distance __unsampled_sz = _VSTD::distance(__first, __last);
3029 for (__n = _VSTD::min(__n, __unsampled_sz); __n != 0; ++__first) {
3030 _Distance __r =
3031 _VSTD::uniform_int_distribution<_Distance>(0, --__unsampled_sz)(__g);
3032 if (__r < __n) {
Alexander Richardsonc9637642017-11-14 11:14:25 +00003033 *__output_iter++ = *__first;
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003034 --__n;
3035 }
3036 }
Alexander Richardsonc9637642017-11-14 11:14:25 +00003037 return __output_iter;
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003038}
3039
3040template <class _PopulationIterator, class _SampleIterator, class _Distance,
3041 class _UniformRandomNumberGenerator>
3042_LIBCPP_INLINE_VISIBILITY
3043_SampleIterator __sample(_PopulationIterator __first,
Alexander Richardsonc9637642017-11-14 11:14:25 +00003044 _PopulationIterator __last, _SampleIterator __output_iter,
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003045 _Distance __n, _UniformRandomNumberGenerator& __g) {
3046 typedef typename iterator_traits<_PopulationIterator>::iterator_category
3047 _PopCategory;
3048 typedef typename iterator_traits<_PopulationIterator>::difference_type
3049 _Difference;
3050 static_assert(__is_forward_iterator<_PopulationIterator>::value ||
3051 __is_random_access_iterator<_SampleIterator>::value,
3052 "SampleIterator must meet the requirements of RandomAccessIterator");
3053 typedef typename common_type<_Distance, _Difference>::type _CommonType;
3054 _LIBCPP_ASSERT(__n >= 0, "N must be a positive number.");
3055 return _VSTD::__sample(
Alexander Richardsonc9637642017-11-14 11:14:25 +00003056 __first, __last, __output_iter, _CommonType(__n),
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003057 __g, _PopCategory());
3058}
3059
3060#if _LIBCPP_STD_VER > 14
3061template <class _PopulationIterator, class _SampleIterator, class _Distance,
3062 class _UniformRandomNumberGenerator>
3063inline _LIBCPP_INLINE_VISIBILITY
3064_SampleIterator sample(_PopulationIterator __first,
Alexander Richardsonc9637642017-11-14 11:14:25 +00003065 _PopulationIterator __last, _SampleIterator __output_iter,
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003066 _Distance __n, _UniformRandomNumberGenerator&& __g) {
Alexander Richardsonc9637642017-11-14 11:14:25 +00003067 return _VSTD::__sample(__first, __last, __output_iter, __n, __g);
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003068}
3069#endif // _LIBCPP_STD_VER > 14
3070
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003071template<class _RandomAccessIterator, class _UniformRandomNumberGenerator>
3072 void shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
Eric Fiselier93dd1372017-04-18 23:26:47 +00003073#ifndef _LIBCPP_CXX03_LANG
Howard Hinnanta5e71782010-11-18 01:47:02 +00003074 _UniformRandomNumberGenerator&& __g)
3075#else
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003076 _UniformRandomNumberGenerator& __g)
Howard Hinnanta5e71782010-11-18 01:47:02 +00003077#endif
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003078{
3079 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnantc834c512011-11-29 18:15:50 +00003080 typedef uniform_int_distribution<ptrdiff_t> _Dp;
3081 typedef typename _Dp::param_type _Pp;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003082 difference_type __d = __last - __first;
3083 if (__d > 1)
3084 {
Howard Hinnantc834c512011-11-29 18:15:50 +00003085 _Dp __uid;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003086 for (--__last, --__d; __first < __last; ++__first, --__d)
Howard Hinnantc9bc02c2010-10-22 15:26:39 +00003087 {
Howard Hinnantc834c512011-11-29 18:15:50 +00003088 difference_type __i = __uid(__g, _Pp(0, __d));
Howard Hinnantc9bc02c2010-10-22 15:26:39 +00003089 if (__i != difference_type(0))
3090 swap(*__first, *(__first + __i));
3091 }
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003092 }
3093}
3094
Howard Hinnantc51e1022010-05-11 19:42:16 +00003095template <class _InputIterator, class _Predicate>
Marshall Clow96d050a2018-01-15 16:16:32 +00003096_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Howard Hinnantc51e1022010-05-11 19:42:16 +00003097is_partitioned(_InputIterator __first, _InputIterator __last, _Predicate __pred)
3098{
3099 for (; __first != __last; ++__first)
3100 if (!__pred(*__first))
3101 break;
Marshall Clow3562ed72015-02-02 18:16:35 +00003102 if ( __first == __last )
3103 return true;
3104 ++__first;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003105 for (; __first != __last; ++__first)
3106 if (__pred(*__first))
3107 return false;
3108 return true;
3109}
3110
3111// partition
3112
3113template <class _Predicate, class _ForwardIterator>
3114_ForwardIterator
3115__partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, forward_iterator_tag)
3116{
3117 while (true)
3118 {
3119 if (__first == __last)
3120 return __first;
3121 if (!__pred(*__first))
3122 break;
3123 ++__first;
3124 }
3125 for (_ForwardIterator __p = __first; ++__p != __last;)
3126 {
3127 if (__pred(*__p))
3128 {
3129 swap(*__first, *__p);
3130 ++__first;
3131 }
3132 }
3133 return __first;
3134}
3135
3136template <class _Predicate, class _BidirectionalIterator>
3137_BidirectionalIterator
3138__partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3139 bidirectional_iterator_tag)
3140{
3141 while (true)
3142 {
3143 while (true)
3144 {
3145 if (__first == __last)
3146 return __first;
3147 if (!__pred(*__first))
3148 break;
3149 ++__first;
3150 }
3151 do
3152 {
3153 if (__first == --__last)
3154 return __first;
3155 } while (!__pred(*__last));
3156 swap(*__first, *__last);
3157 ++__first;
3158 }
3159}
3160
3161template <class _ForwardIterator, class _Predicate>
3162inline _LIBCPP_INLINE_VISIBILITY
3163_ForwardIterator
3164partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
3165{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003166 return _VSTD::__partition<typename add_lvalue_reference<_Predicate>::type>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003167 (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
3168}
3169
3170// partition_copy
3171
3172template <class _InputIterator, class _OutputIterator1,
3173 class _OutputIterator2, class _Predicate>
Marshall Clow5492c8a2018-01-22 20:44:33 +00003174_LIBCPP_CONSTEXPR_AFTER_CXX17 pair<_OutputIterator1, _OutputIterator2>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003175partition_copy(_InputIterator __first, _InputIterator __last,
3176 _OutputIterator1 __out_true, _OutputIterator2 __out_false,
3177 _Predicate __pred)
3178{
3179 for (; __first != __last; ++__first)
3180 {
3181 if (__pred(*__first))
3182 {
3183 *__out_true = *__first;
3184 ++__out_true;
3185 }
3186 else
3187 {
3188 *__out_false = *__first;
3189 ++__out_false;
3190 }
3191 }
3192 return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false);
3193}
3194
3195// partition_point
3196
3197template<class _ForwardIterator, class _Predicate>
Marshall Clowcb3c8262018-01-15 17:53:34 +00003198_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00003199partition_point(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
3200{
3201 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003202 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003203 while (__len != 0)
3204 {
Louis Dionne3a109332018-11-01 21:24:32 +00003205 difference_type __l2 = __len / 2;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003206 _ForwardIterator __m = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003207 _VSTD::advance(__m, __l2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003208 if (__pred(*__m))
3209 {
3210 __first = ++__m;
3211 __len -= __l2 + 1;
3212 }
3213 else
3214 __len = __l2;
3215 }
3216 return __first;
3217}
3218
3219// stable_partition
3220
3221template <class _Predicate, class _ForwardIterator, class _Distance, class _Pair>
3222_ForwardIterator
3223__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
3224 _Distance __len, _Pair __p, forward_iterator_tag __fit)
3225{
3226 // *__first is known to be false
3227 // __len >= 1
3228 if (__len == 1)
3229 return __first;
3230 if (__len == 2)
3231 {
3232 _ForwardIterator __m = __first;
3233 if (__pred(*++__m))
3234 {
3235 swap(*__first, *__m);
3236 return __m;
3237 }
3238 return __first;
3239 }
3240 if (__len <= __p.second)
3241 { // The buffer is big enough to use
3242 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
3243 __destruct_n __d(0);
3244 unique_ptr<value_type, __destruct_n&> __h(__p.first, __d);
3245 // Move the falses into the temporary buffer, and the trues to the front of the line
3246 // Update __first to always point to the end of the trues
3247 value_type* __t = __p.first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003248 ::new(__t) value_type(_VSTD::move(*__first));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003249 __d.__incr((value_type*)0);
3250 ++__t;
3251 _ForwardIterator __i = __first;
3252 while (++__i != __last)
3253 {
3254 if (__pred(*__i))
3255 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003256 *__first = _VSTD::move(*__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003257 ++__first;
3258 }
3259 else
3260 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003261 ::new(__t) value_type(_VSTD::move(*__i));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003262 __d.__incr((value_type*)0);
3263 ++__t;
3264 }
3265 }
3266 // All trues now at start of range, all falses in buffer
3267 // Move falses back into range, but don't mess up __first which points to first false
3268 __i = __first;
3269 for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003270 *__i = _VSTD::move(*__t2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003271 // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer
3272 return __first;
3273 }
3274 // Else not enough buffer, do in place
3275 // __len >= 3
3276 _ForwardIterator __m = __first;
3277 _Distance __len2 = __len / 2; // __len2 >= 2
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003278 _VSTD::advance(__m, __len2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003279 // recurse on [__first, __m), *__first know to be false
3280 // F?????????????????
3281 // f m l
3282 typedef typename add_lvalue_reference<_Predicate>::type _PredRef;
3283 _ForwardIterator __first_false = __stable_partition<_PredRef>(__first, __m, __pred, __len2, __p, __fit);
3284 // TTTFFFFF??????????
3285 // f ff m l
3286 // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true
3287 _ForwardIterator __m1 = __m;
3288 _ForwardIterator __second_false = __last;
3289 _Distance __len_half = __len - __len2;
3290 while (__pred(*__m1))
3291 {
3292 if (++__m1 == __last)
3293 goto __second_half_done;
3294 --__len_half;
3295 }
3296 // TTTFFFFFTTTF??????
3297 // f ff m m1 l
3298 __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __fit);
3299__second_half_done:
3300 // TTTFFFFFTTTTTFFFFF
3301 // f ff m sf l
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003302 return _VSTD::rotate(__first_false, __m, __second_false);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003303 // TTTTTTTTFFFFFFFFFF
3304 // |
3305}
3306
3307struct __return_temporary_buffer
3308{
3309 template <class _Tp>
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003310 _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) const {_VSTD::return_temporary_buffer(__p);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00003311};
3312
3313template <class _Predicate, class _ForwardIterator>
3314_ForwardIterator
3315__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
3316 forward_iterator_tag)
3317{
3318 const unsigned __alloc_limit = 3; // might want to make this a function of trivial assignment
3319 // Either prove all true and return __first or point to first false
3320 while (true)
3321 {
3322 if (__first == __last)
3323 return __first;
3324 if (!__pred(*__first))
3325 break;
3326 ++__first;
3327 }
3328 // We now have a reduced range [__first, __last)
3329 // *__first is known to be false
3330 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
3331 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003332 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003333 pair<value_type*, ptrdiff_t> __p(0, 0);
3334 unique_ptr<value_type, __return_temporary_buffer> __h;
3335 if (__len >= __alloc_limit)
3336 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003337 __p = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003338 __h.reset(__p.first);
3339 }
3340 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
3341 (__first, __last, __pred, __len, __p, forward_iterator_tag());
3342}
3343
3344template <class _Predicate, class _BidirectionalIterator, class _Distance, class _Pair>
3345_BidirectionalIterator
3346__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3347 _Distance __len, _Pair __p, bidirectional_iterator_tag __bit)
3348{
3349 // *__first is known to be false
3350 // *__last is known to be true
3351 // __len >= 2
3352 if (__len == 2)
3353 {
3354 swap(*__first, *__last);
3355 return __last;
3356 }
3357 if (__len == 3)
3358 {
3359 _BidirectionalIterator __m = __first;
3360 if (__pred(*++__m))
3361 {
3362 swap(*__first, *__m);
3363 swap(*__m, *__last);
3364 return __last;
3365 }
3366 swap(*__m, *__last);
3367 swap(*__first, *__m);
3368 return __m;
3369 }
3370 if (__len <= __p.second)
3371 { // The buffer is big enough to use
3372 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3373 __destruct_n __d(0);
3374 unique_ptr<value_type, __destruct_n&> __h(__p.first, __d);
3375 // Move the falses into the temporary buffer, and the trues to the front of the line
3376 // Update __first to always point to the end of the trues
3377 value_type* __t = __p.first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003378 ::new(__t) value_type(_VSTD::move(*__first));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003379 __d.__incr((value_type*)0);
3380 ++__t;
3381 _BidirectionalIterator __i = __first;
3382 while (++__i != __last)
3383 {
3384 if (__pred(*__i))
3385 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003386 *__first = _VSTD::move(*__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003387 ++__first;
3388 }
3389 else
3390 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003391 ::new(__t) value_type(_VSTD::move(*__i));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003392 __d.__incr((value_type*)0);
3393 ++__t;
3394 }
3395 }
3396 // move *__last, known to be true
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003397 *__first = _VSTD::move(*__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003398 __i = ++__first;
3399 // All trues now at start of range, all falses in buffer
3400 // Move falses back into range, but don't mess up __first which points to first false
3401 for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003402 *__i = _VSTD::move(*__t2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003403 // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer
3404 return __first;
3405 }
3406 // Else not enough buffer, do in place
3407 // __len >= 4
3408 _BidirectionalIterator __m = __first;
3409 _Distance __len2 = __len / 2; // __len2 >= 2
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003410 _VSTD::advance(__m, __len2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003411 // recurse on [__first, __m-1], except reduce __m-1 until *(__m-1) is true, *__first know to be false
3412 // F????????????????T
3413 // f m l
3414 _BidirectionalIterator __m1 = __m;
3415 _BidirectionalIterator __first_false = __first;
3416 _Distance __len_half = __len2;
3417 while (!__pred(*--__m1))
3418 {
3419 if (__m1 == __first)
3420 goto __first_half_done;
3421 --__len_half;
3422 }
3423 // F???TFFF?????????T
3424 // f m1 m l
3425 typedef typename add_lvalue_reference<_Predicate>::type _PredRef;
3426 __first_false = __stable_partition<_PredRef>(__first, __m1, __pred, __len_half, __p, __bit);
3427__first_half_done:
3428 // TTTFFFFF?????????T
3429 // f ff m l
3430 // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true
3431 __m1 = __m;
3432 _BidirectionalIterator __second_false = __last;
3433 ++__second_false;
3434 __len_half = __len - __len2;
3435 while (__pred(*__m1))
3436 {
3437 if (++__m1 == __last)
3438 goto __second_half_done;
3439 --__len_half;
3440 }
3441 // TTTFFFFFTTTF?????T
3442 // f ff m m1 l
3443 __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __bit);
3444__second_half_done:
3445 // TTTFFFFFTTTTTFFFFF
3446 // f ff m sf l
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003447 return _VSTD::rotate(__first_false, __m, __second_false);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003448 // TTTTTTTTFFFFFFFFFF
3449 // |
3450}
3451
3452template <class _Predicate, class _BidirectionalIterator>
3453_BidirectionalIterator
3454__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3455 bidirectional_iterator_tag)
3456{
3457 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
3458 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3459 const difference_type __alloc_limit = 4; // might want to make this a function of trivial assignment
3460 // Either prove all true and return __first or point to first false
3461 while (true)
3462 {
3463 if (__first == __last)
3464 return __first;
3465 if (!__pred(*__first))
3466 break;
3467 ++__first;
3468 }
3469 // __first points to first false, everything prior to __first is already set.
3470 // Either prove [__first, __last) is all false and return __first, or point __last to last true
3471 do
3472 {
3473 if (__first == --__last)
3474 return __first;
3475 } while (!__pred(*__last));
3476 // We now have a reduced range [__first, __last]
3477 // *__first is known to be false
3478 // *__last is known to be true
3479 // __len >= 2
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003480 difference_type __len = _VSTD::distance(__first, __last) + 1;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003481 pair<value_type*, ptrdiff_t> __p(0, 0);
3482 unique_ptr<value_type, __return_temporary_buffer> __h;
3483 if (__len >= __alloc_limit)
3484 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003485 __p = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003486 __h.reset(__p.first);
3487 }
3488 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
3489 (__first, __last, __pred, __len, __p, bidirectional_iterator_tag());
3490}
3491
3492template <class _ForwardIterator, class _Predicate>
3493inline _LIBCPP_INLINE_VISIBILITY
3494_ForwardIterator
3495stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
3496{
3497 return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
3498 (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
3499}
3500
3501// is_sorted_until
3502
3503template <class _ForwardIterator, class _Compare>
Marshall Clow96d050a2018-01-15 16:16:32 +00003504_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00003505is_sorted_until(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
3506{
3507 if (__first != __last)
3508 {
3509 _ForwardIterator __i = __first;
3510 while (++__i != __last)
3511 {
3512 if (__comp(*__i, *__first))
3513 return __i;
3514 __first = __i;
3515 }
3516 }
3517 return __last;
3518}
3519
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003520template<class _ForwardIterator>
Marshall Clow96d050a2018-01-15 16:16:32 +00003521inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00003522_ForwardIterator
3523is_sorted_until(_ForwardIterator __first, _ForwardIterator __last)
3524{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003525 return _VSTD::is_sorted_until(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003526}
3527
3528// is_sorted
3529
3530template <class _ForwardIterator, class _Compare>
Marshall Clow96d050a2018-01-15 16:16:32 +00003531inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00003532bool
3533is_sorted(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
3534{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003535 return _VSTD::is_sorted_until(__first, __last, __comp) == __last;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003536}
3537
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003538template<class _ForwardIterator>
Marshall Clow96d050a2018-01-15 16:16:32 +00003539inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00003540bool
3541is_sorted(_ForwardIterator __first, _ForwardIterator __last)
3542{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003543 return _VSTD::is_sorted(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003544}
3545
3546// sort
3547
3548// stable, 2-3 compares, 0-2 swaps
3549
3550template <class _Compare, class _ForwardIterator>
3551unsigned
3552__sort3(_ForwardIterator __x, _ForwardIterator __y, _ForwardIterator __z, _Compare __c)
3553{
3554 unsigned __r = 0;
3555 if (!__c(*__y, *__x)) // if x <= y
3556 {
3557 if (!__c(*__z, *__y)) // if y <= z
3558 return __r; // x <= y && y <= z
3559 // x <= y && y > z
3560 swap(*__y, *__z); // x <= z && y < z
3561 __r = 1;
3562 if (__c(*__y, *__x)) // if x > y
3563 {
3564 swap(*__x, *__y); // x < y && y <= z
3565 __r = 2;
3566 }
3567 return __r; // x <= y && y < z
3568 }
3569 if (__c(*__z, *__y)) // x > y, if y > z
3570 {
3571 swap(*__x, *__z); // x < y && y < z
3572 __r = 1;
3573 return __r;
3574 }
3575 swap(*__x, *__y); // x > y && y <= z
3576 __r = 1; // x < y && x <= z
3577 if (__c(*__z, *__y)) // if y > z
3578 {
3579 swap(*__y, *__z); // x <= y && y < z
3580 __r = 2;
3581 }
3582 return __r;
3583} // x <= y && y <= z
3584
3585// stable, 3-6 compares, 0-5 swaps
3586
3587template <class _Compare, class _ForwardIterator>
3588unsigned
3589__sort4(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3,
3590 _ForwardIterator __x4, _Compare __c)
3591{
3592 unsigned __r = __sort3<_Compare>(__x1, __x2, __x3, __c);
3593 if (__c(*__x4, *__x3))
3594 {
3595 swap(*__x3, *__x4);
3596 ++__r;
3597 if (__c(*__x3, *__x2))
3598 {
3599 swap(*__x2, *__x3);
3600 ++__r;
3601 if (__c(*__x2, *__x1))
3602 {
3603 swap(*__x1, *__x2);
3604 ++__r;
3605 }
3606 }
3607 }
3608 return __r;
3609}
3610
3611// stable, 4-10 compares, 0-9 swaps
3612
3613template <class _Compare, class _ForwardIterator>
Louis Dionne9e70e362018-11-21 16:24:46 +00003614_LIBCPP_HIDDEN
Howard Hinnantc51e1022010-05-11 19:42:16 +00003615unsigned
3616__sort5(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3,
3617 _ForwardIterator __x4, _ForwardIterator __x5, _Compare __c)
3618{
3619 unsigned __r = __sort4<_Compare>(__x1, __x2, __x3, __x4, __c);
3620 if (__c(*__x5, *__x4))
3621 {
3622 swap(*__x4, *__x5);
3623 ++__r;
3624 if (__c(*__x4, *__x3))
3625 {
3626 swap(*__x3, *__x4);
3627 ++__r;
3628 if (__c(*__x3, *__x2))
3629 {
3630 swap(*__x2, *__x3);
3631 ++__r;
3632 if (__c(*__x2, *__x1))
3633 {
3634 swap(*__x1, *__x2);
3635 ++__r;
3636 }
3637 }
3638 }
3639 }
3640 return __r;
3641}
3642
3643// Assumes size > 0
3644template <class _Compare, class _BirdirectionalIterator>
3645void
3646__selection_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp)
3647{
3648 _BirdirectionalIterator __lm1 = __last;
3649 for (--__lm1; __first != __lm1; ++__first)
3650 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003651 _BirdirectionalIterator __i = _VSTD::min_element<_BirdirectionalIterator,
Howard Hinnantc51e1022010-05-11 19:42:16 +00003652 typename add_lvalue_reference<_Compare>::type>
3653 (__first, __last, __comp);
3654 if (__i != __first)
3655 swap(*__first, *__i);
3656 }
3657}
3658
3659template <class _Compare, class _BirdirectionalIterator>
3660void
3661__insertion_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp)
3662{
3663 typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type;
3664 if (__first != __last)
3665 {
3666 _BirdirectionalIterator __i = __first;
3667 for (++__i; __i != __last; ++__i)
3668 {
3669 _BirdirectionalIterator __j = __i;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003670 value_type __t(_VSTD::move(*__j));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003671 for (_BirdirectionalIterator __k = __i; __k != __first && __comp(__t, *--__k); --__j)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003672 *__j = _VSTD::move(*__k);
3673 *__j = _VSTD::move(__t);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003674 }
3675 }
3676}
3677
3678template <class _Compare, class _RandomAccessIterator>
3679void
3680__insertion_sort_3(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3681{
3682 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3683 _RandomAccessIterator __j = __first+2;
3684 __sort3<_Compare>(__first, __first+1, __j, __comp);
3685 for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
3686 {
3687 if (__comp(*__i, *__j))
3688 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003689 value_type __t(_VSTD::move(*__i));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003690 _RandomAccessIterator __k = __j;
3691 __j = __i;
3692 do
3693 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003694 *__j = _VSTD::move(*__k);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003695 __j = __k;
3696 } while (__j != __first && __comp(__t, *--__k));
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003697 *__j = _VSTD::move(__t);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003698 }
3699 __j = __i;
3700 }
3701}
3702
3703template <class _Compare, class _RandomAccessIterator>
3704bool
3705__insertion_sort_incomplete(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3706{
3707 switch (__last - __first)
3708 {
3709 case 0:
3710 case 1:
3711 return true;
3712 case 2:
3713 if (__comp(*--__last, *__first))
3714 swap(*__first, *__last);
3715 return true;
3716 case 3:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003717 _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003718 return true;
3719 case 4:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003720 _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003721 return true;
3722 case 5:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003723 _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003724 return true;
3725 }
3726 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3727 _RandomAccessIterator __j = __first+2;
3728 __sort3<_Compare>(__first, __first+1, __j, __comp);
3729 const unsigned __limit = 8;
3730 unsigned __count = 0;
3731 for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
3732 {
3733 if (__comp(*__i, *__j))
3734 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003735 value_type __t(_VSTD::move(*__i));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003736 _RandomAccessIterator __k = __j;
3737 __j = __i;
3738 do
3739 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003740 *__j = _VSTD::move(*__k);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003741 __j = __k;
3742 } while (__j != __first && __comp(__t, *--__k));
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003743 *__j = _VSTD::move(__t);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003744 if (++__count == __limit)
3745 return ++__i == __last;
3746 }
3747 __j = __i;
3748 }
3749 return true;
3750}
3751
3752template <class _Compare, class _BirdirectionalIterator>
3753void
3754__insertion_sort_move(_BirdirectionalIterator __first1, _BirdirectionalIterator __last1,
3755 typename iterator_traits<_BirdirectionalIterator>::value_type* __first2, _Compare __comp)
3756{
3757 typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type;
3758 if (__first1 != __last1)
3759 {
3760 __destruct_n __d(0);
3761 unique_ptr<value_type, __destruct_n&> __h(__first2, __d);
3762 value_type* __last2 = __first2;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003763 ::new(__last2) value_type(_VSTD::move(*__first1));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003764 __d.__incr((value_type*)0);
3765 for (++__last2; ++__first1 != __last1; ++__last2)
3766 {
3767 value_type* __j2 = __last2;
3768 value_type* __i2 = __j2;
3769 if (__comp(*__first1, *--__i2))
3770 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003771 ::new(__j2) value_type(_VSTD::move(*__i2));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003772 __d.__incr((value_type*)0);
3773 for (--__j2; __i2 != __first2 && __comp(*__first1, *--__i2); --__j2)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003774 *__j2 = _VSTD::move(*__i2);
3775 *__j2 = _VSTD::move(*__first1);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003776 }
3777 else
3778 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003779 ::new(__j2) value_type(_VSTD::move(*__first1));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003780 __d.__incr((value_type*)0);
3781 }
3782 }
3783 __h.release();
3784 }
3785}
3786
3787template <class _Compare, class _RandomAccessIterator>
3788void
3789__sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3790{
3791 // _Compare is known to be a reference type
3792 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
3793 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
Howard Hinnanta9a897e2010-11-19 22:17:28 +00003794 const difference_type __limit = is_trivially_copy_constructible<value_type>::value &&
3795 is_trivially_copy_assignable<value_type>::value ? 30 : 6;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003796 while (true)
3797 {
3798 __restart:
3799 difference_type __len = __last - __first;
3800 switch (__len)
3801 {
3802 case 0:
3803 case 1:
3804 return;
3805 case 2:
3806 if (__comp(*--__last, *__first))
3807 swap(*__first, *__last);
3808 return;
3809 case 3:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003810 _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003811 return;
3812 case 4:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003813 _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003814 return;
3815 case 5:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003816 _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003817 return;
3818 }
3819 if (__len <= __limit)
3820 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003821 _VSTD::__insertion_sort_3<_Compare>(__first, __last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003822 return;
3823 }
3824 // __len > 5
3825 _RandomAccessIterator __m = __first;
3826 _RandomAccessIterator __lm1 = __last;
3827 --__lm1;
3828 unsigned __n_swaps;
3829 {
3830 difference_type __delta;
3831 if (__len >= 1000)
3832 {
3833 __delta = __len/2;
3834 __m += __delta;
3835 __delta /= 2;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003836 __n_swaps = _VSTD::__sort5<_Compare>(__first, __first + __delta, __m, __m+__delta, __lm1, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003837 }
3838 else
3839 {
3840 __delta = __len/2;
3841 __m += __delta;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003842 __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, __lm1, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003843 }
3844 }
3845 // *__m is median
3846 // partition [__first, __m) < *__m and *__m <= [__m, __last)
3847 // (this inhibits tossing elements equivalent to __m around unnecessarily)
3848 _RandomAccessIterator __i = __first;
3849 _RandomAccessIterator __j = __lm1;
3850 // j points beyond range to be tested, *__m is known to be <= *__lm1
3851 // The search going up is known to be guarded but the search coming down isn't.
3852 // Prime the downward search with a guard.
3853 if (!__comp(*__i, *__m)) // if *__first == *__m
3854 {
3855 // *__first == *__m, *__first doesn't go in first part
3856 // manually guard downward moving __j against __i
3857 while (true)
3858 {
3859 if (__i == --__j)
3860 {
3861 // *__first == *__m, *__m <= all other elements
3862 // Parition instead into [__first, __i) == *__first and *__first < [__i, __last)
3863 ++__i; // __first + 1
3864 __j = __last;
3865 if (!__comp(*__first, *--__j)) // we need a guard if *__first == *(__last-1)
3866 {
3867 while (true)
3868 {
3869 if (__i == __j)
3870 return; // [__first, __last) all equivalent elements
3871 if (__comp(*__first, *__i))
3872 {
3873 swap(*__i, *__j);
3874 ++__n_swaps;
3875 ++__i;
3876 break;
3877 }
3878 ++__i;
3879 }
3880 }
3881 // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1
3882 if (__i == __j)
3883 return;
3884 while (true)
3885 {
3886 while (!__comp(*__first, *__i))
3887 ++__i;
3888 while (__comp(*__first, *--__j))
3889 ;
3890 if (__i >= __j)
3891 break;
3892 swap(*__i, *__j);
3893 ++__n_swaps;
3894 ++__i;
3895 }
3896 // [__first, __i) == *__first and *__first < [__i, __last)
3897 // The first part is sorted, sort the secod part
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003898 // _VSTD::__sort<_Compare>(__i, __last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003899 __first = __i;
3900 goto __restart;
3901 }
3902 if (__comp(*__j, *__m))
3903 {
3904 swap(*__i, *__j);
3905 ++__n_swaps;
3906 break; // found guard for downward moving __j, now use unguarded partition
3907 }
3908 }
3909 }
3910 // It is known that *__i < *__m
3911 ++__i;
3912 // j points beyond range to be tested, *__m is known to be <= *__lm1
3913 // if not yet partitioned...
3914 if (__i < __j)
3915 {
3916 // known that *(__i - 1) < *__m
3917 // known that __i <= __m
3918 while (true)
3919 {
3920 // __m still guards upward moving __i
3921 while (__comp(*__i, *__m))
3922 ++__i;
3923 // It is now known that a guard exists for downward moving __j
3924 while (!__comp(*--__j, *__m))
3925 ;
3926 if (__i > __j)
3927 break;
3928 swap(*__i, *__j);
3929 ++__n_swaps;
3930 // It is known that __m != __j
3931 // If __m just moved, follow it
3932 if (__m == __i)
3933 __m = __j;
3934 ++__i;
3935 }
3936 }
3937 // [__first, __i) < *__m and *__m <= [__i, __last)
3938 if (__i != __m && __comp(*__m, *__i))
3939 {
3940 swap(*__i, *__m);
3941 ++__n_swaps;
3942 }
3943 // [__first, __i) < *__i and *__i <= [__i+1, __last)
3944 // If we were given a perfect partition, see if insertion sort is quick...
3945 if (__n_swaps == 0)
3946 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003947 bool __fs = _VSTD::__insertion_sort_incomplete<_Compare>(__first, __i, __comp);
3948 if (_VSTD::__insertion_sort_incomplete<_Compare>(__i+1, __last, __comp))
Howard Hinnantc51e1022010-05-11 19:42:16 +00003949 {
3950 if (__fs)
3951 return;
3952 __last = __i;
3953 continue;
3954 }
3955 else
3956 {
3957 if (__fs)
3958 {
3959 __first = ++__i;
3960 continue;
3961 }
3962 }
3963 }
3964 // sort smaller range with recursive call and larger with tail recursion elimination
3965 if (__i - __first < __last - __i)
3966 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003967 _VSTD::__sort<_Compare>(__first, __i, __comp);
3968 // _VSTD::__sort<_Compare>(__i+1, __last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003969 __first = ++__i;
3970 }
3971 else
3972 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003973 _VSTD::__sort<_Compare>(__i+1, __last, __comp);
3974 // _VSTD::__sort<_Compare>(__first, __i, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003975 __last = __i;
3976 }
3977 }
3978}
3979
3980// This forwarder keeps the top call and the recursive calls using the same instantiation, forcing a reference _Compare
3981template <class _RandomAccessIterator, class _Compare>
3982inline _LIBCPP_INLINE_VISIBILITY
3983void
3984sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3985{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00003986#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003987 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3988 __debug_less<_Compare> __c(__comp);
3989 __sort<_Comp_ref>(__first, __last, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00003990#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003991 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3992 __sort<_Comp_ref>(__first, __last, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00003993#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003994}
3995
3996template <class _RandomAccessIterator>
3997inline _LIBCPP_INLINE_VISIBILITY
3998void
3999sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
4000{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004001 _VSTD::sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004002}
4003
4004template <class _Tp>
4005inline _LIBCPP_INLINE_VISIBILITY
4006void
4007sort(_Tp** __first, _Tp** __last)
4008{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004009 _VSTD::sort((size_t*)__first, (size_t*)__last, __less<size_t>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004010}
4011
4012template <class _Tp>
4013inline _LIBCPP_INLINE_VISIBILITY
4014void
4015sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last)
4016{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004017 _VSTD::sort(__first.base(), __last.base());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004018}
4019
Howard Hinnant27e0e772011-09-14 18:33:51 +00004020template <class _Tp, class _Compare>
4021inline _LIBCPP_INLINE_VISIBILITY
4022void
4023sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last, _Compare __comp)
4024{
4025 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4026 _VSTD::sort<_Tp*, _Comp_ref>(__first.base(), __last.base(), __comp);
4027}
4028
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00004029_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<char>&, char*>(char*, char*, __less<char>&))
4030_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&))
4031_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&))
4032_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&))
4033_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<short>&, short*>(short*, short*, __less<short>&))
4034_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&))
4035_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<int>&, int*>(int*, int*, __less<int>&))
4036_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&))
4037_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<long>&, long*>(long*, long*, __less<long>&))
4038_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&))
4039_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<long long>&, long long*>(long long*, long long*, __less<long long>&))
4040_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>&))
4041_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<float>&, float*>(float*, float*, __less<float>&))
4042_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<double>&, double*>(double*, double*, __less<double>&))
4043_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<long double>&, long double*>(long double*, long double*, __less<long double>&))
Howard Hinnantc51e1022010-05-11 19:42:16 +00004044
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00004045_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<char>&, char*>(char*, char*, __less<char>&))
4046_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&))
4047_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&))
4048_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&))
4049_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<short>&, short*>(short*, short*, __less<short>&))
4050_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&))
4051_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<int>&, int*>(int*, int*, __less<int>&))
4052_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&))
4053_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<long>&, long*>(long*, long*, __less<long>&))
4054_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&))
4055_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<long long>&, long long*>(long long*, long long*, __less<long long>&))
4056_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>&))
4057_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<float>&, float*>(float*, float*, __less<float>&))
4058_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<double>&, double*>(double*, double*, __less<double>&))
4059_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<long double>&, long double*>(long double*, long double*, __less<long double>&))
Howard Hinnantc51e1022010-05-11 19:42:16 +00004060
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00004061_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS unsigned __sort5<__less<long double>&, long double*>(long double*, long double*, long double*, long double*, long double*, __less<long double>&))
Howard Hinnantc51e1022010-05-11 19:42:16 +00004062
4063// lower_bound
4064
4065template <class _Compare, class _ForwardIterator, class _Tp>
Marshall Clowe00916c2018-01-16 02:34:41 +00004066_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00004067__lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004068{
4069 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004070 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004071 while (__len != 0)
4072 {
Louis Dionne3a109332018-11-01 21:24:32 +00004073 difference_type __l2 = __len / 2;
Howard Hinnantc51e1022010-05-11 19:42:16 +00004074 _ForwardIterator __m = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004075 _VSTD::advance(__m, __l2);
Howard Hinnantbf074022011-10-22 20:59:45 +00004076 if (__comp(*__m, __value_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00004077 {
4078 __first = ++__m;
4079 __len -= __l2 + 1;
4080 }
4081 else
4082 __len = __l2;
4083 }
4084 return __first;
4085}
4086
4087template <class _ForwardIterator, class _Tp, class _Compare>
Marshall Clowe00916c2018-01-16 02:34:41 +00004088inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004089_ForwardIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00004090lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004091{
Howard Hinnantc51e1022010-05-11 19:42:16 +00004092 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnantbf074022011-10-22 20:59:45 +00004093 return __lower_bound<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004094}
4095
4096template <class _ForwardIterator, class _Tp>
Marshall Clowe00916c2018-01-16 02:34:41 +00004097inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004098_ForwardIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00004099lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004100{
Howard Hinnantbf074022011-10-22 20:59:45 +00004101 return _VSTD::lower_bound(__first, __last, __value_,
Howard Hinnantc51e1022010-05-11 19:42:16 +00004102 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
4103}
4104
4105// upper_bound
4106
4107template <class _Compare, class _ForwardIterator, class _Tp>
Marshall Clowe00916c2018-01-16 02:34:41 +00004108_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00004109__upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004110{
4111 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004112 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004113 while (__len != 0)
4114 {
Louis Dionne3a109332018-11-01 21:24:32 +00004115 difference_type __l2 = __len / 2;
Howard Hinnantc51e1022010-05-11 19:42:16 +00004116 _ForwardIterator __m = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004117 _VSTD::advance(__m, __l2);
Howard Hinnantbf074022011-10-22 20:59:45 +00004118 if (__comp(__value_, *__m))
Howard Hinnantc51e1022010-05-11 19:42:16 +00004119 __len = __l2;
4120 else
4121 {
4122 __first = ++__m;
4123 __len -= __l2 + 1;
4124 }
4125 }
4126 return __first;
4127}
4128
4129template <class _ForwardIterator, class _Tp, class _Compare>
Marshall Clowe00916c2018-01-16 02:34:41 +00004130inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004131_ForwardIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00004132upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004133{
Howard Hinnantc51e1022010-05-11 19:42:16 +00004134 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnantbf074022011-10-22 20:59:45 +00004135 return __upper_bound<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004136}
4137
4138template <class _ForwardIterator, class _Tp>
Marshall Clowe00916c2018-01-16 02:34:41 +00004139inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004140_ForwardIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00004141upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004142{
Howard Hinnantbf074022011-10-22 20:59:45 +00004143 return _VSTD::upper_bound(__first, __last, __value_,
Howard Hinnantc51e1022010-05-11 19:42:16 +00004144 __less<_Tp, typename iterator_traits<_ForwardIterator>::value_type>());
4145}
4146
4147// equal_range
4148
4149template <class _Compare, class _ForwardIterator, class _Tp>
Marshall Clowe00916c2018-01-16 02:34:41 +00004150_LIBCPP_CONSTEXPR_AFTER_CXX17 pair<_ForwardIterator, _ForwardIterator>
Howard Hinnantbf074022011-10-22 20:59:45 +00004151__equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004152{
4153 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004154 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004155 while (__len != 0)
4156 {
Louis Dionne3a109332018-11-01 21:24:32 +00004157 difference_type __l2 = __len / 2;
Howard Hinnantc51e1022010-05-11 19:42:16 +00004158 _ForwardIterator __m = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004159 _VSTD::advance(__m, __l2);
Howard Hinnantbf074022011-10-22 20:59:45 +00004160 if (__comp(*__m, __value_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00004161 {
4162 __first = ++__m;
4163 __len -= __l2 + 1;
4164 }
Howard Hinnantbf074022011-10-22 20:59:45 +00004165 else if (__comp(__value_, *__m))
Howard Hinnantc51e1022010-05-11 19:42:16 +00004166 {
4167 __last = __m;
4168 __len = __l2;
4169 }
4170 else
4171 {
4172 _ForwardIterator __mp1 = __m;
4173 return pair<_ForwardIterator, _ForwardIterator>
4174 (
Howard Hinnantbf074022011-10-22 20:59:45 +00004175 __lower_bound<_Compare>(__first, __m, __value_, __comp),
4176 __upper_bound<_Compare>(++__mp1, __last, __value_, __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004177 );
4178 }
4179 }
4180 return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
4181}
4182
4183template <class _ForwardIterator, class _Tp, class _Compare>
Marshall Clowe00916c2018-01-16 02:34:41 +00004184inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004185pair<_ForwardIterator, _ForwardIterator>
Howard Hinnantbf074022011-10-22 20:59:45 +00004186equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004187{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004188#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004189 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4190 __debug_less<_Compare> __c(__comp);
Howard Hinnantbf074022011-10-22 20:59:45 +00004191 return __equal_range<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004192#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004193 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnantbf074022011-10-22 20:59:45 +00004194 return __equal_range<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004195#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004196}
4197
4198template <class _ForwardIterator, class _Tp>
Marshall Clowe00916c2018-01-16 02:34:41 +00004199inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004200pair<_ForwardIterator, _ForwardIterator>
Howard Hinnantbf074022011-10-22 20:59:45 +00004201equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004202{
Howard Hinnantbf074022011-10-22 20:59:45 +00004203 return _VSTD::equal_range(__first, __last, __value_,
Howard Hinnantc51e1022010-05-11 19:42:16 +00004204 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
4205}
4206
4207// binary_search
4208
4209template <class _Compare, class _ForwardIterator, class _Tp>
Marshall Clowe00916c2018-01-16 02:34:41 +00004210inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004211bool
Howard Hinnantbf074022011-10-22 20:59:45 +00004212__binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004213{
Howard Hinnantbf074022011-10-22 20:59:45 +00004214 __first = __lower_bound<_Compare>(__first, __last, __value_, __comp);
4215 return __first != __last && !__comp(__value_, *__first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004216}
4217
4218template <class _ForwardIterator, class _Tp, class _Compare>
Marshall Clowe00916c2018-01-16 02:34:41 +00004219inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004220bool
Howard Hinnantbf074022011-10-22 20:59:45 +00004221binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004222{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004223#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004224 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4225 __debug_less<_Compare> __c(__comp);
Howard Hinnantbf074022011-10-22 20:59:45 +00004226 return __binary_search<_Comp_ref>(__first, __last, __value_, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004227#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004228 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnantbf074022011-10-22 20:59:45 +00004229 return __binary_search<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004230#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004231}
4232
4233template <class _ForwardIterator, class _Tp>
Marshall Clowe00916c2018-01-16 02:34:41 +00004234inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004235bool
Howard Hinnantbf074022011-10-22 20:59:45 +00004236binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004237{
Howard Hinnantbf074022011-10-22 20:59:45 +00004238 return _VSTD::binary_search(__first, __last, __value_,
Howard Hinnantc51e1022010-05-11 19:42:16 +00004239 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
4240}
4241
4242// merge
4243
4244template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4245_OutputIterator
4246__merge(_InputIterator1 __first1, _InputIterator1 __last1,
4247 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4248{
4249 for (; __first1 != __last1; ++__result)
4250 {
4251 if (__first2 == __last2)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004252 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004253 if (__comp(*__first2, *__first1))
4254 {
4255 *__result = *__first2;
4256 ++__first2;
4257 }
4258 else
4259 {
4260 *__result = *__first1;
4261 ++__first1;
4262 }
4263 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004264 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004265}
4266
4267template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
4268inline _LIBCPP_INLINE_VISIBILITY
4269_OutputIterator
4270merge(_InputIterator1 __first1, _InputIterator1 __last1,
4271 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4272{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004273#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004274 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4275 __debug_less<_Compare> __c(__comp);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004276 return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004277#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004278 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004279 return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004280#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004281}
4282
4283template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
4284inline _LIBCPP_INLINE_VISIBILITY
4285_OutputIterator
4286merge(_InputIterator1 __first1, _InputIterator1 __last1,
4287 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
4288{
4289 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
4290 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
4291 return merge(__first1, __last1, __first2, __last2, __result, __less<__v1, __v2>());
4292}
4293
4294// inplace_merge
4295
Marshall Clow1bc51102015-07-29 16:25:45 +00004296template <class _Compare, class _InputIterator1, class _InputIterator2,
4297 class _OutputIterator>
4298void __half_inplace_merge(_InputIterator1 __first1, _InputIterator1 __last1,
4299 _InputIterator2 __first2, _InputIterator2 __last2,
4300 _OutputIterator __result, _Compare __comp)
4301{
4302 for (; __first1 != __last1; ++__result)
4303 {
4304 if (__first2 == __last2)
4305 {
4306 _VSTD::move(__first1, __last1, __result);
4307 return;
4308 }
4309
4310 if (__comp(*__first2, *__first1))
4311 {
4312 *__result = _VSTD::move(*__first2);
4313 ++__first2;
4314 }
4315 else
4316 {
4317 *__result = _VSTD::move(*__first1);
4318 ++__first1;
4319 }
4320 }
4321 // __first2 through __last2 are already in the right spot.
4322}
4323
Howard Hinnantc51e1022010-05-11 19:42:16 +00004324template <class _Compare, class _BidirectionalIterator>
4325void
4326__buffered_inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4327 _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1,
4328 typename iterator_traits<_BidirectionalIterator>::difference_type __len2,
4329 typename iterator_traits<_BidirectionalIterator>::value_type* __buff)
4330{
4331 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00004332 __destruct_n __d(0);
4333 unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
4334 if (__len1 <= __len2)
4335 {
4336 value_type* __p = __buff;
Eric Fiseliera09a3b42014-10-27 19:28:20 +00004337 for (_BidirectionalIterator __i = __first; __i != __middle; __d.__incr((value_type*)0), (void) ++__i, ++__p)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004338 ::new(__p) value_type(_VSTD::move(*__i));
Marshall Clow1bc51102015-07-29 16:25:45 +00004339 __half_inplace_merge(__buff, __p, __middle, __last, __first, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004340 }
4341 else
4342 {
4343 value_type* __p = __buff;
Eric Fiseliera09a3b42014-10-27 19:28:20 +00004344 for (_BidirectionalIterator __i = __middle; __i != __last; __d.__incr((value_type*)0), (void) ++__i, ++__p)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004345 ::new(__p) value_type(_VSTD::move(*__i));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004346 typedef reverse_iterator<_BidirectionalIterator> _RBi;
4347 typedef reverse_iterator<value_type*> _Rv;
Aditya Kumar3a0179a2016-08-25 11:52:38 +00004348 __half_inplace_merge(_Rv(__p), _Rv(__buff),
Marshall Clow1bc51102015-07-29 16:25:45 +00004349 _RBi(__middle), _RBi(__first),
Marshall Clow738d1042017-08-28 23:16:13 +00004350 _RBi(__last), __invert<_Compare>(__comp));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004351 }
4352}
4353
4354template <class _Compare, class _BidirectionalIterator>
4355void
4356__inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4357 _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1,
4358 typename iterator_traits<_BidirectionalIterator>::difference_type __len2,
4359 typename iterator_traits<_BidirectionalIterator>::value_type* __buff, ptrdiff_t __buff_size)
4360{
Howard Hinnantc51e1022010-05-11 19:42:16 +00004361 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
4362 while (true)
4363 {
4364 // if __middle == __last, we're done
4365 if (__len2 == 0)
4366 return;
Marshall Clow8eff8232015-02-02 16:44:11 +00004367 if (__len1 <= __buff_size || __len2 <= __buff_size)
4368 return __buffered_inplace_merge<_Compare>
4369 (__first, __middle, __last, __comp, __len1, __len2, __buff);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004370 // shrink [__first, __middle) as much as possible (with no moves), returning if it shrinks to 0
Eric Fiseliera09a3b42014-10-27 19:28:20 +00004371 for (; true; ++__first, (void) --__len1)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004372 {
4373 if (__len1 == 0)
4374 return;
4375 if (__comp(*__middle, *__first))
4376 break;
4377 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00004378 // __first < __middle < __last
4379 // *__first > *__middle
4380 // partition [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last) such that
4381 // all elements in:
4382 // [__first, __m1) <= [__middle, __m2)
4383 // [__middle, __m2) < [__m1, __middle)
4384 // [__m1, __middle) <= [__m2, __last)
4385 // and __m1 or __m2 is in the middle of its range
4386 _BidirectionalIterator __m1; // "median" of [__first, __middle)
4387 _BidirectionalIterator __m2; // "median" of [__middle, __last)
4388 difference_type __len11; // distance(__first, __m1)
4389 difference_type __len21; // distance(__middle, __m2)
4390 // binary search smaller range
4391 if (__len1 < __len2)
4392 { // __len >= 1, __len2 >= 2
4393 __len21 = __len2 / 2;
4394 __m2 = __middle;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004395 _VSTD::advance(__m2, __len21);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004396 __m1 = __upper_bound<_Compare>(__first, __middle, *__m2, __comp);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004397 __len11 = _VSTD::distance(__first, __m1);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004398 }
4399 else
4400 {
4401 if (__len1 == 1)
4402 { // __len1 >= __len2 && __len2 > 0, therefore __len2 == 1
4403 // It is known *__first > *__middle
4404 swap(*__first, *__middle);
4405 return;
4406 }
4407 // __len1 >= 2, __len2 >= 1
4408 __len11 = __len1 / 2;
4409 __m1 = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004410 _VSTD::advance(__m1, __len11);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004411 __m2 = __lower_bound<_Compare>(__middle, __last, *__m1, __comp);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004412 __len21 = _VSTD::distance(__middle, __m2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004413 }
4414 difference_type __len12 = __len1 - __len11; // distance(__m1, __middle)
4415 difference_type __len22 = __len2 - __len21; // distance(__m2, __last)
4416 // [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last)
4417 // swap middle two partitions
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004418 __middle = _VSTD::rotate(__m1, __middle, __m2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004419 // __len12 and __len21 now have swapped meanings
4420 // merge smaller range with recurisve call and larger with tail recursion elimination
4421 if (__len11 + __len21 < __len12 + __len22)
4422 {
4423 __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size);
4424// __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size);
4425 __first = __middle;
4426 __middle = __m2;
4427 __len1 = __len12;
4428 __len2 = __len22;
4429 }
4430 else
4431 {
4432 __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size);
4433// __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size);
4434 __last = __middle;
4435 __middle = __m1;
4436 __len1 = __len11;
4437 __len2 = __len21;
4438 }
4439 }
4440}
4441
Howard Hinnantc51e1022010-05-11 19:42:16 +00004442template <class _BidirectionalIterator, class _Compare>
4443inline _LIBCPP_INLINE_VISIBILITY
4444void
4445inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4446 _Compare __comp)
4447{
4448 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
4449 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004450 difference_type __len1 = _VSTD::distance(__first, __middle);
4451 difference_type __len2 = _VSTD::distance(__middle, __last);
4452 difference_type __buf_size = _VSTD::min(__len1, __len2);
Marshall Clow488f19f2015-02-02 17:35:53 +00004453 pair<value_type*, ptrdiff_t> __buf = _VSTD::get_temporary_buffer<value_type>(__buf_size);
4454 unique_ptr<value_type, __return_temporary_buffer> __h(__buf.first);
4455
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004456#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004457 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4458 __debug_less<_Compare> __c(__comp);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004459 return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __c, __len1, __len2,
Howard Hinnantc51e1022010-05-11 19:42:16 +00004460 __buf.first, __buf.second);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004461#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004462 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004463 return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __comp, __len1, __len2,
Howard Hinnantc51e1022010-05-11 19:42:16 +00004464 __buf.first, __buf.second);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004465#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004466}
4467
4468template <class _BidirectionalIterator>
4469inline _LIBCPP_INLINE_VISIBILITY
4470void
4471inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last)
4472{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004473 _VSTD::inplace_merge(__first, __middle, __last,
Howard Hinnantc51e1022010-05-11 19:42:16 +00004474 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
4475}
4476
4477// stable_sort
4478
4479template <class _Compare, class _InputIterator1, class _InputIterator2>
4480void
4481__merge_move_construct(_InputIterator1 __first1, _InputIterator1 __last1,
4482 _InputIterator2 __first2, _InputIterator2 __last2,
4483 typename iterator_traits<_InputIterator1>::value_type* __result, _Compare __comp)
4484{
4485 typedef typename iterator_traits<_InputIterator1>::value_type value_type;
4486 __destruct_n __d(0);
4487 unique_ptr<value_type, __destruct_n&> __h(__result, __d);
4488 for (; true; ++__result)
4489 {
4490 if (__first1 == __last1)
4491 {
4492 for (; __first2 != __last2; ++__first2, ++__result, __d.__incr((value_type*)0))
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004493 ::new (__result) value_type(_VSTD::move(*__first2));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004494 __h.release();
4495 return;
4496 }
4497 if (__first2 == __last2)
4498 {
4499 for (; __first1 != __last1; ++__first1, ++__result, __d.__incr((value_type*)0))
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004500 ::new (__result) value_type(_VSTD::move(*__first1));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004501 __h.release();
4502 return;
4503 }
4504 if (__comp(*__first2, *__first1))
4505 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004506 ::new (__result) value_type(_VSTD::move(*__first2));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004507 __d.__incr((value_type*)0);
4508 ++__first2;
4509 }
4510 else
4511 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004512 ::new (__result) value_type(_VSTD::move(*__first1));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004513 __d.__incr((value_type*)0);
4514 ++__first1;
4515 }
4516 }
4517}
4518
4519template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4520void
4521__merge_move_assign(_InputIterator1 __first1, _InputIterator1 __last1,
4522 _InputIterator2 __first2, _InputIterator2 __last2,
4523 _OutputIterator __result, _Compare __comp)
4524{
4525 for (; __first1 != __last1; ++__result)
4526 {
4527 if (__first2 == __last2)
4528 {
4529 for (; __first1 != __last1; ++__first1, ++__result)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004530 *__result = _VSTD::move(*__first1);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004531 return;
4532 }
4533 if (__comp(*__first2, *__first1))
4534 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004535 *__result = _VSTD::move(*__first2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004536 ++__first2;
4537 }
4538 else
4539 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004540 *__result = _VSTD::move(*__first1);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004541 ++__first1;
4542 }
4543 }
4544 for (; __first2 != __last2; ++__first2, ++__result)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004545 *__result = _VSTD::move(*__first2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004546}
4547
4548template <class _Compare, class _RandomAccessIterator>
4549void
4550__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4551 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4552 typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size);
4553
4554template <class _Compare, class _RandomAccessIterator>
4555void
4556__stable_sort_move(_RandomAccessIterator __first1, _RandomAccessIterator __last1, _Compare __comp,
4557 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4558 typename iterator_traits<_RandomAccessIterator>::value_type* __first2)
4559{
4560 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4561 switch (__len)
4562 {
4563 case 0:
4564 return;
4565 case 1:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004566 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004567 return;
4568 case 2:
Marshall Clow32043ac2018-02-06 18:58:05 +00004569 __destruct_n __d(0);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004570 unique_ptr<value_type, __destruct_n&> __h2(__first2, __d);
Marshall Clow32043ac2018-02-06 18:58:05 +00004571 if (__comp(*--__last1, *__first1))
Howard Hinnantc51e1022010-05-11 19:42:16 +00004572 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004573 ::new(__first2) value_type(_VSTD::move(*__last1));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004574 __d.__incr((value_type*)0);
4575 ++__first2;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004576 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004577 }
4578 else
4579 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004580 ::new(__first2) value_type(_VSTD::move(*__first1));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004581 __d.__incr((value_type*)0);
4582 ++__first2;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004583 ::new(__first2) value_type(_VSTD::move(*__last1));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004584 }
4585 __h2.release();
4586 return;
4587 }
4588 if (__len <= 8)
4589 {
4590 __insertion_sort_move<_Compare>(__first1, __last1, __first2, __comp);
4591 return;
4592 }
4593 typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2;
4594 _RandomAccessIterator __m = __first1 + __l2;
4595 __stable_sort<_Compare>(__first1, __m, __comp, __l2, __first2, __l2);
4596 __stable_sort<_Compare>(__m, __last1, __comp, __len - __l2, __first2 + __l2, __len - __l2);
4597 __merge_move_construct<_Compare>(__first1, __m, __m, __last1, __first2, __comp);
4598}
4599
4600template <class _Tp>
4601struct __stable_sort_switch
4602{
Howard Hinnanta9a897e2010-11-19 22:17:28 +00004603 static const unsigned value = 128*is_trivially_copy_assignable<_Tp>::value;
Howard Hinnantc51e1022010-05-11 19:42:16 +00004604};
4605
4606template <class _Compare, class _RandomAccessIterator>
4607void
4608__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4609 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4610 typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size)
4611{
4612 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4613 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4614 switch (__len)
4615 {
4616 case 0:
4617 case 1:
4618 return;
4619 case 2:
4620 if (__comp(*--__last, *__first))
4621 swap(*__first, *__last);
4622 return;
4623 }
4624 if (__len <= static_cast<difference_type>(__stable_sort_switch<value_type>::value))
4625 {
4626 __insertion_sort<_Compare>(__first, __last, __comp);
4627 return;
4628 }
4629 typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2;
4630 _RandomAccessIterator __m = __first + __l2;
4631 if (__len <= __buff_size)
4632 {
4633 __destruct_n __d(0);
4634 unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
4635 __stable_sort_move<_Compare>(__first, __m, __comp, __l2, __buff);
4636 __d.__set(__l2, (value_type*)0);
4637 __stable_sort_move<_Compare>(__m, __last, __comp, __len - __l2, __buff + __l2);
4638 __d.__set(__len, (value_type*)0);
4639 __merge_move_assign<_Compare>(__buff, __buff + __l2, __buff + __l2, __buff + __len, __first, __comp);
4640// __merge<_Compare>(move_iterator<value_type*>(__buff),
4641// move_iterator<value_type*>(__buff + __l2),
4642// move_iterator<_RandomAccessIterator>(__buff + __l2),
4643// move_iterator<_RandomAccessIterator>(__buff + __len),
4644// __first, __comp);
4645 return;
4646 }
4647 __stable_sort<_Compare>(__first, __m, __comp, __l2, __buff, __buff_size);
4648 __stable_sort<_Compare>(__m, __last, __comp, __len - __l2, __buff, __buff_size);
4649 __inplace_merge<_Compare>(__first, __m, __last, __comp, __l2, __len - __l2, __buff, __buff_size);
4650}
4651
4652template <class _RandomAccessIterator, class _Compare>
4653inline _LIBCPP_INLINE_VISIBILITY
4654void
4655stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4656{
4657 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4658 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4659 difference_type __len = __last - __first;
4660 pair<value_type*, ptrdiff_t> __buf(0, 0);
4661 unique_ptr<value_type, __return_temporary_buffer> __h;
4662 if (__len > static_cast<difference_type>(__stable_sort_switch<value_type>::value))
4663 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004664 __buf = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004665 __h.reset(__buf.first);
4666 }
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004667#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004668 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4669 __debug_less<_Compare> __c(__comp);
4670 __stable_sort<_Comp_ref>(__first, __last, __c, __len, __buf.first, __buf.second);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004671#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004672 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4673 __stable_sort<_Comp_ref>(__first, __last, __comp, __len, __buf.first, __buf.second);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004674#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004675}
4676
4677template <class _RandomAccessIterator>
4678inline _LIBCPP_INLINE_VISIBILITY
4679void
4680stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
4681{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004682 _VSTD::stable_sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004683}
4684
4685// is_heap_until
4686
4687template <class _RandomAccessIterator, class _Compare>
Marshall Clow96d050a2018-01-15 16:16:32 +00004688_LIBCPP_CONSTEXPR_AFTER_CXX17 _RandomAccessIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00004689is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4690{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004691 typedef typename _VSTD::iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00004692 difference_type __len = __last - __first;
4693 difference_type __p = 0;
4694 difference_type __c = 1;
4695 _RandomAccessIterator __pp = __first;
4696 while (__c < __len)
4697 {
4698 _RandomAccessIterator __cp = __first + __c;
4699 if (__comp(*__pp, *__cp))
4700 return __cp;
4701 ++__c;
4702 ++__cp;
4703 if (__c == __len)
4704 return __last;
4705 if (__comp(*__pp, *__cp))
4706 return __cp;
4707 ++__p;
4708 ++__pp;
4709 __c = 2 * __p + 1;
4710 }
4711 return __last;
4712}
4713
Howard Hinnant3b6579a2010-08-22 00:02:43 +00004714template<class _RandomAccessIterator>
Marshall Clow96d050a2018-01-15 16:16:32 +00004715inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004716_RandomAccessIterator
4717is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last)
4718{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004719 return _VSTD::is_heap_until(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004720}
4721
4722// is_heap
4723
4724template <class _RandomAccessIterator, class _Compare>
Marshall Clow96d050a2018-01-15 16:16:32 +00004725inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004726bool
4727is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4728{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004729 return _VSTD::is_heap_until(__first, __last, __comp) == __last;
Howard Hinnantc51e1022010-05-11 19:42:16 +00004730}
4731
Howard Hinnant3b6579a2010-08-22 00:02:43 +00004732template<class _RandomAccessIterator>
Marshall Clow96d050a2018-01-15 16:16:32 +00004733inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004734bool
4735is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4736{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004737 return _VSTD::is_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004738}
4739
4740// push_heap
4741
4742template <class _Compare, class _RandomAccessIterator>
4743void
David Majnemer4468d562014-07-22 06:07:09 +00004744__sift_up(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4745 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004746{
Howard Hinnantc51e1022010-05-11 19:42:16 +00004747 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4748 if (__len > 1)
4749 {
4750 __len = (__len - 2) / 2;
4751 _RandomAccessIterator __ptr = __first + __len;
4752 if (__comp(*__ptr, *--__last))
4753 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004754 value_type __t(_VSTD::move(*__last));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004755 do
4756 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004757 *__last = _VSTD::move(*__ptr);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004758 __last = __ptr;
4759 if (__len == 0)
4760 break;
4761 __len = (__len - 1) / 2;
4762 __ptr = __first + __len;
4763 } while (__comp(*__ptr, __t));
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004764 *__last = _VSTD::move(__t);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004765 }
4766 }
4767}
4768
4769template <class _RandomAccessIterator, class _Compare>
4770inline _LIBCPP_INLINE_VISIBILITY
4771void
4772push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4773{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004774#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004775 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4776 __debug_less<_Compare> __c(__comp);
David Majnemer4468d562014-07-22 06:07:09 +00004777 __sift_up<_Comp_ref>(__first, __last, __c, __last - __first);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004778#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004779 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
David Majnemer4468d562014-07-22 06:07:09 +00004780 __sift_up<_Comp_ref>(__first, __last, __comp, __last - __first);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004781#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004782}
4783
4784template <class _RandomAccessIterator>
4785inline _LIBCPP_INLINE_VISIBILITY
4786void
4787push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4788{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004789 _VSTD::push_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004790}
4791
4792// pop_heap
4793
4794template <class _Compare, class _RandomAccessIterator>
David Majnemer4468d562014-07-22 06:07:09 +00004795void
Eric Fiselier6003c772016-12-23 23:37:52 +00004796__sift_down(_RandomAccessIterator __first, _RandomAccessIterator /*__last*/,
4797 _Compare __comp,
David Majnemer4468d562014-07-22 06:07:09 +00004798 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4799 _RandomAccessIterator __start)
4800{
4801 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4802 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4803 // left-child of __start is at 2 * __start + 1
4804 // right-child of __start is at 2 * __start + 2
4805 difference_type __child = __start - __first;
4806
4807 if (__len < 2 || (__len - 2) / 2 < __child)
4808 return;
4809
4810 __child = 2 * __child + 1;
4811 _RandomAccessIterator __child_i = __first + __child;
4812
4813 if ((__child + 1) < __len && __comp(*__child_i, *(__child_i + 1))) {
4814 // right-child exists and is greater than left-child
4815 ++__child_i;
4816 ++__child;
4817 }
4818
4819 // check if we are in heap-order
4820 if (__comp(*__child_i, *__start))
4821 // we are, __start is larger than it's largest child
4822 return;
4823
4824 value_type __top(_VSTD::move(*__start));
4825 do
4826 {
4827 // we are not in heap-order, swap the parent with it's largest child
4828 *__start = _VSTD::move(*__child_i);
4829 __start = __child_i;
4830
4831 if ((__len - 2) / 2 < __child)
4832 break;
4833
4834 // recompute the child based off of the updated parent
4835 __child = 2 * __child + 1;
4836 __child_i = __first + __child;
4837
4838 if ((__child + 1) < __len && __comp(*__child_i, *(__child_i + 1))) {
4839 // right-child exists and is greater than left-child
4840 ++__child_i;
4841 ++__child;
4842 }
4843
4844 // check if we are in heap-order
4845 } while (!__comp(*__child_i, __top));
4846 *__start = _VSTD::move(__top);
4847}
4848
4849template <class _Compare, class _RandomAccessIterator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00004850inline _LIBCPP_INLINE_VISIBILITY
4851void
4852__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4853 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
4854{
4855 if (__len > 1)
4856 {
4857 swap(*__first, *--__last);
David Majnemer4468d562014-07-22 06:07:09 +00004858 __sift_down<_Compare>(__first, __last, __comp, __len - 1, __first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004859 }
4860}
4861
4862template <class _RandomAccessIterator, class _Compare>
4863inline _LIBCPP_INLINE_VISIBILITY
4864void
4865pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4866{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004867#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004868 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4869 __debug_less<_Compare> __c(__comp);
4870 __pop_heap<_Comp_ref>(__first, __last, __c, __last - __first);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004871#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004872 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4873 __pop_heap<_Comp_ref>(__first, __last, __comp, __last - __first);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004874#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004875}
4876
4877template <class _RandomAccessIterator>
4878inline _LIBCPP_INLINE_VISIBILITY
4879void
4880pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4881{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004882 _VSTD::pop_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004883}
4884
4885// make_heap
4886
4887template <class _Compare, class _RandomAccessIterator>
4888void
4889__make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4890{
4891 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4892 difference_type __n = __last - __first;
4893 if (__n > 1)
4894 {
David Majnemer4468d562014-07-22 06:07:09 +00004895 // start from the first parent, there is no need to consider children
4896 for (difference_type __start = (__n - 2) / 2; __start >= 0; --__start)
4897 {
4898 __sift_down<_Compare>(__first, __last, __comp, __n, __first + __start);
4899 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00004900 }
4901}
4902
4903template <class _RandomAccessIterator, class _Compare>
4904inline _LIBCPP_INLINE_VISIBILITY
4905void
4906make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4907{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004908#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004909 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4910 __debug_less<_Compare> __c(__comp);
4911 __make_heap<_Comp_ref>(__first, __last, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004912#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004913 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4914 __make_heap<_Comp_ref>(__first, __last, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004915#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004916}
4917
4918template <class _RandomAccessIterator>
4919inline _LIBCPP_INLINE_VISIBILITY
4920void
4921make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4922{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004923 _VSTD::make_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004924}
4925
4926// sort_heap
4927
4928template <class _Compare, class _RandomAccessIterator>
4929void
4930__sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4931{
4932 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4933 for (difference_type __n = __last - __first; __n > 1; --__last, --__n)
4934 __pop_heap<_Compare>(__first, __last, __comp, __n);
4935}
4936
4937template <class _RandomAccessIterator, class _Compare>
4938inline _LIBCPP_INLINE_VISIBILITY
4939void
4940sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4941{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004942#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004943 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4944 __debug_less<_Compare> __c(__comp);
4945 __sort_heap<_Comp_ref>(__first, __last, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004946#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004947 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4948 __sort_heap<_Comp_ref>(__first, __last, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004949#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004950}
4951
4952template <class _RandomAccessIterator>
4953inline _LIBCPP_INLINE_VISIBILITY
4954void
4955sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4956{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004957 _VSTD::sort_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004958}
4959
4960// partial_sort
4961
4962template <class _Compare, class _RandomAccessIterator>
4963void
4964__partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
4965 _Compare __comp)
4966{
4967 __make_heap<_Compare>(__first, __middle, __comp);
4968 typename iterator_traits<_RandomAccessIterator>::difference_type __len = __middle - __first;
4969 for (_RandomAccessIterator __i = __middle; __i != __last; ++__i)
4970 {
4971 if (__comp(*__i, *__first))
4972 {
4973 swap(*__i, *__first);
David Majnemer4468d562014-07-22 06:07:09 +00004974 __sift_down<_Compare>(__first, __middle, __comp, __len, __first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004975 }
4976 }
4977 __sort_heap<_Compare>(__first, __middle, __comp);
4978}
4979
4980template <class _RandomAccessIterator, class _Compare>
4981inline _LIBCPP_INLINE_VISIBILITY
4982void
4983partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
4984 _Compare __comp)
4985{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004986#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004987 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4988 __debug_less<_Compare> __c(__comp);
4989 __partial_sort<_Comp_ref>(__first, __middle, __last, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004990#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004991 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4992 __partial_sort<_Comp_ref>(__first, __middle, __last, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00004993#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004994}
4995
4996template <class _RandomAccessIterator>
4997inline _LIBCPP_INLINE_VISIBILITY
4998void
4999partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last)
5000{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005001 _VSTD::partial_sort(__first, __middle, __last,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005002 __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
5003}
5004
5005// partial_sort_copy
5006
5007template <class _Compare, class _InputIterator, class _RandomAccessIterator>
5008_RandomAccessIterator
5009__partial_sort_copy(_InputIterator __first, _InputIterator __last,
5010 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp)
5011{
5012 _RandomAccessIterator __r = __result_first;
5013 if (__r != __result_last)
5014 {
Eric Fiseliera09a3b42014-10-27 19:28:20 +00005015 for (; __first != __last && __r != __result_last; (void) ++__first, ++__r)
Howard Hinnantc51e1022010-05-11 19:42:16 +00005016 *__r = *__first;
5017 __make_heap<_Compare>(__result_first, __r, __comp);
David Majnemer4468d562014-07-22 06:07:09 +00005018 typename iterator_traits<_RandomAccessIterator>::difference_type __len = __r - __result_first;
Howard Hinnantc51e1022010-05-11 19:42:16 +00005019 for (; __first != __last; ++__first)
5020 if (__comp(*__first, *__result_first))
5021 {
5022 *__result_first = *__first;
David Majnemer4468d562014-07-22 06:07:09 +00005023 __sift_down<_Compare>(__result_first, __r, __comp, __len, __result_first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005024 }
5025 __sort_heap<_Compare>(__result_first, __r, __comp);
5026 }
5027 return __r;
5028}
5029
5030template <class _InputIterator, class _RandomAccessIterator, class _Compare>
5031inline _LIBCPP_INLINE_VISIBILITY
5032_RandomAccessIterator
5033partial_sort_copy(_InputIterator __first, _InputIterator __last,
5034 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp)
5035{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005036#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005037 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5038 __debug_less<_Compare> __c(__comp);
5039 return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005040#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005041 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5042 return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005043#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005044}
5045
5046template <class _InputIterator, class _RandomAccessIterator>
5047inline _LIBCPP_INLINE_VISIBILITY
5048_RandomAccessIterator
5049partial_sort_copy(_InputIterator __first, _InputIterator __last,
5050 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last)
5051{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005052 return _VSTD::partial_sort_copy(__first, __last, __result_first, __result_last,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005053 __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
5054}
5055
5056// nth_element
5057
5058template <class _Compare, class _RandomAccessIterator>
5059void
5060__nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
5061{
5062 // _Compare is known to be a reference type
5063 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
5064 const difference_type __limit = 7;
5065 while (true)
5066 {
5067 __restart:
Howard Hinnant2fa038c2011-12-29 17:45:35 +00005068 if (__nth == __last)
5069 return;
Howard Hinnantc51e1022010-05-11 19:42:16 +00005070 difference_type __len = __last - __first;
5071 switch (__len)
5072 {
5073 case 0:
5074 case 1:
5075 return;
5076 case 2:
5077 if (__comp(*--__last, *__first))
5078 swap(*__first, *__last);
5079 return;
5080 case 3:
5081 {
5082 _RandomAccessIterator __m = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005083 _VSTD::__sort3<_Compare>(__first, ++__m, --__last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005084 return;
5085 }
5086 }
5087 if (__len <= __limit)
5088 {
5089 __selection_sort<_Compare>(__first, __last, __comp);
5090 return;
5091 }
5092 // __len > __limit >= 3
5093 _RandomAccessIterator __m = __first + __len/2;
5094 _RandomAccessIterator __lm1 = __last;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005095 unsigned __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, --__lm1, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005096 // *__m is median
5097 // partition [__first, __m) < *__m and *__m <= [__m, __last)
5098 // (this inhibits tossing elements equivalent to __m around unnecessarily)
5099 _RandomAccessIterator __i = __first;
5100 _RandomAccessIterator __j = __lm1;
5101 // j points beyond range to be tested, *__lm1 is known to be <= *__m
5102 // The search going up is known to be guarded but the search coming down isn't.
5103 // Prime the downward search with a guard.
5104 if (!__comp(*__i, *__m)) // if *__first == *__m
5105 {
5106 // *__first == *__m, *__first doesn't go in first part
5107 // manually guard downward moving __j against __i
5108 while (true)
5109 {
5110 if (__i == --__j)
5111 {
5112 // *__first == *__m, *__m <= all other elements
5113 // Parition instead into [__first, __i) == *__first and *__first < [__i, __last)
5114 ++__i; // __first + 1
5115 __j = __last;
5116 if (!__comp(*__first, *--__j)) // we need a guard if *__first == *(__last-1)
5117 {
5118 while (true)
5119 {
5120 if (__i == __j)
5121 return; // [__first, __last) all equivalent elements
5122 if (__comp(*__first, *__i))
5123 {
5124 swap(*__i, *__j);
5125 ++__n_swaps;
5126 ++__i;
5127 break;
5128 }
5129 ++__i;
5130 }
5131 }
5132 // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1
5133 if (__i == __j)
5134 return;
5135 while (true)
5136 {
5137 while (!__comp(*__first, *__i))
5138 ++__i;
5139 while (__comp(*__first, *--__j))
5140 ;
5141 if (__i >= __j)
5142 break;
5143 swap(*__i, *__j);
5144 ++__n_swaps;
5145 ++__i;
5146 }
5147 // [__first, __i) == *__first and *__first < [__i, __last)
5148 // The first part is sorted,
5149 if (__nth < __i)
5150 return;
5151 // __nth_element the secod part
5152 // __nth_element<_Compare>(__i, __nth, __last, __comp);
5153 __first = __i;
5154 goto __restart;
5155 }
5156 if (__comp(*__j, *__m))
5157 {
5158 swap(*__i, *__j);
5159 ++__n_swaps;
5160 break; // found guard for downward moving __j, now use unguarded partition
5161 }
5162 }
5163 }
5164 ++__i;
5165 // j points beyond range to be tested, *__lm1 is known to be <= *__m
5166 // if not yet partitioned...
5167 if (__i < __j)
5168 {
5169 // known that *(__i - 1) < *__m
5170 while (true)
5171 {
5172 // __m still guards upward moving __i
5173 while (__comp(*__i, *__m))
5174 ++__i;
5175 // It is now known that a guard exists for downward moving __j
5176 while (!__comp(*--__j, *__m))
5177 ;
5178 if (__i >= __j)
5179 break;
5180 swap(*__i, *__j);
5181 ++__n_swaps;
5182 // It is known that __m != __j
5183 // If __m just moved, follow it
5184 if (__m == __i)
5185 __m = __j;
5186 ++__i;
5187 }
5188 }
5189 // [__first, __i) < *__m and *__m <= [__i, __last)
5190 if (__i != __m && __comp(*__m, *__i))
5191 {
5192 swap(*__i, *__m);
5193 ++__n_swaps;
5194 }
5195 // [__first, __i) < *__i and *__i <= [__i+1, __last)
5196 if (__nth == __i)
5197 return;
5198 if (__n_swaps == 0)
5199 {
5200 // We were given a perfectly partitioned sequence. Coincidence?
5201 if (__nth < __i)
5202 {
5203 // Check for [__first, __i) already sorted
5204 __j = __m = __first;
5205 while (++__j != __i)
5206 {
5207 if (__comp(*__j, *__m))
5208 // not yet sorted, so sort
5209 goto not_sorted;
5210 __m = __j;
5211 }
5212 // [__first, __i) sorted
5213 return;
5214 }
5215 else
5216 {
5217 // Check for [__i, __last) already sorted
5218 __j = __m = __i;
5219 while (++__j != __last)
5220 {
5221 if (__comp(*__j, *__m))
5222 // not yet sorted, so sort
5223 goto not_sorted;
5224 __m = __j;
5225 }
5226 // [__i, __last) sorted
5227 return;
5228 }
5229 }
5230not_sorted:
5231 // __nth_element on range containing __nth
5232 if (__nth < __i)
5233 {
5234 // __nth_element<_Compare>(__first, __nth, __i, __comp);
5235 __last = __i;
5236 }
5237 else
5238 {
5239 // __nth_element<_Compare>(__i+1, __nth, __last, __comp);
5240 __first = ++__i;
5241 }
5242 }
5243}
5244
5245template <class _RandomAccessIterator, class _Compare>
5246inline _LIBCPP_INLINE_VISIBILITY
5247void
5248nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
5249{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005250#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005251 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5252 __debug_less<_Compare> __c(__comp);
5253 __nth_element<_Comp_ref>(__first, __nth, __last, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005254#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005255 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5256 __nth_element<_Comp_ref>(__first, __nth, __last, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005257#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005258}
5259
5260template <class _RandomAccessIterator>
5261inline _LIBCPP_INLINE_VISIBILITY
5262void
5263nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last)
5264{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005265 _VSTD::nth_element(__first, __nth, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00005266}
5267
5268// includes
5269
5270template <class _Compare, class _InputIterator1, class _InputIterator2>
Marshall Clowc0b7f972018-01-22 23:10:40 +00005271_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Howard Hinnantc51e1022010-05-11 19:42:16 +00005272__includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
5273 _Compare __comp)
5274{
5275 for (; __first2 != __last2; ++__first1)
5276 {
5277 if (__first1 == __last1 || __comp(*__first2, *__first1))
5278 return false;
5279 if (!__comp(*__first1, *__first2))
5280 ++__first2;
5281 }
5282 return true;
5283}
5284
5285template <class _InputIterator1, class _InputIterator2, class _Compare>
Marshall Clowc0b7f972018-01-22 23:10:40 +00005286inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00005287bool
5288includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
5289 _Compare __comp)
5290{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005291#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005292 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5293 __debug_less<_Compare> __c(__comp);
5294 return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005295#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005296 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5297 return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005298#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005299}
5300
5301template <class _InputIterator1, class _InputIterator2>
Marshall Clowc0b7f972018-01-22 23:10:40 +00005302inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00005303bool
5304includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2)
5305{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005306 return _VSTD::includes(__first1, __last1, __first2, __last2,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005307 __less<typename iterator_traits<_InputIterator1>::value_type,
5308 typename iterator_traits<_InputIterator2>::value_type>());
5309}
5310
5311// set_union
5312
5313template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5314_OutputIterator
5315__set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5316 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5317{
5318 for (; __first1 != __last1; ++__result)
5319 {
5320 if (__first2 == __last2)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005321 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005322 if (__comp(*__first2, *__first1))
5323 {
5324 *__result = *__first2;
5325 ++__first2;
5326 }
5327 else
5328 {
Howard Hinnantc51e1022010-05-11 19:42:16 +00005329 if (!__comp(*__first1, *__first2))
5330 ++__first2;
Marshall Clowb4687412017-10-30 15:50:00 +00005331 *__result = *__first1;
Howard Hinnantc51e1022010-05-11 19:42:16 +00005332 ++__first1;
5333 }
5334 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005335 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005336}
5337
5338template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5339inline _LIBCPP_INLINE_VISIBILITY
5340_OutputIterator
5341set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5342 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5343{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005344#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005345 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5346 __debug_less<_Compare> __c(__comp);
5347 return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005348#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005349 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5350 return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005351#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005352}
5353
5354template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5355inline _LIBCPP_INLINE_VISIBILITY
5356_OutputIterator
5357set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5358 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5359{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005360 return _VSTD::set_union(__first1, __last1, __first2, __last2, __result,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005361 __less<typename iterator_traits<_InputIterator1>::value_type,
5362 typename iterator_traits<_InputIterator2>::value_type>());
5363}
5364
5365// set_intersection
5366
5367template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
Marshall Clowc0b7f972018-01-22 23:10:40 +00005368_LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00005369__set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5370 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5371{
5372 while (__first1 != __last1 && __first2 != __last2)
5373 {
5374 if (__comp(*__first1, *__first2))
5375 ++__first1;
5376 else
5377 {
5378 if (!__comp(*__first2, *__first1))
5379 {
5380 *__result = *__first1;
5381 ++__result;
5382 ++__first1;
5383 }
5384 ++__first2;
5385 }
5386 }
5387 return __result;
5388}
5389
5390template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
Marshall Clowc0b7f972018-01-22 23:10:40 +00005391inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00005392_OutputIterator
5393set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5394 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5395{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005396#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005397 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5398 __debug_less<_Compare> __c(__comp);
5399 return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005400#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005401 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5402 return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005403#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005404}
5405
5406template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
Marshall Clowc0b7f972018-01-22 23:10:40 +00005407inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00005408_OutputIterator
5409set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5410 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5411{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005412 return _VSTD::set_intersection(__first1, __last1, __first2, __last2, __result,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005413 __less<typename iterator_traits<_InputIterator1>::value_type,
5414 typename iterator_traits<_InputIterator2>::value_type>());
5415}
5416
5417// set_difference
5418
5419template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5420_OutputIterator
5421__set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5422 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5423{
5424 while (__first1 != __last1)
5425 {
5426 if (__first2 == __last2)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005427 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005428 if (__comp(*__first1, *__first2))
5429 {
5430 *__result = *__first1;
5431 ++__result;
5432 ++__first1;
5433 }
5434 else
5435 {
5436 if (!__comp(*__first2, *__first1))
5437 ++__first1;
5438 ++__first2;
5439 }
5440 }
5441 return __result;
5442}
5443
5444template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5445inline _LIBCPP_INLINE_VISIBILITY
5446_OutputIterator
5447set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5448 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5449{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005450#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005451 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5452 __debug_less<_Compare> __c(__comp);
5453 return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005454#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005455 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5456 return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005457#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005458}
5459
5460template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5461inline _LIBCPP_INLINE_VISIBILITY
5462_OutputIterator
5463set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5464 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5465{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005466 return _VSTD::set_difference(__first1, __last1, __first2, __last2, __result,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005467 __less<typename iterator_traits<_InputIterator1>::value_type,
5468 typename iterator_traits<_InputIterator2>::value_type>());
5469}
5470
5471// set_symmetric_difference
5472
5473template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5474_OutputIterator
5475__set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5476 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5477{
5478 while (__first1 != __last1)
5479 {
5480 if (__first2 == __last2)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005481 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005482 if (__comp(*__first1, *__first2))
5483 {
5484 *__result = *__first1;
5485 ++__result;
5486 ++__first1;
5487 }
5488 else
5489 {
5490 if (__comp(*__first2, *__first1))
5491 {
5492 *__result = *__first2;
5493 ++__result;
5494 }
5495 else
5496 ++__first1;
5497 ++__first2;
5498 }
5499 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005500 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005501}
5502
5503template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5504inline _LIBCPP_INLINE_VISIBILITY
5505_OutputIterator
5506set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5507 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5508{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005509#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005510 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5511 __debug_less<_Compare> __c(__comp);
5512 return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005513#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005514 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5515 return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005516#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005517}
5518
5519template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5520inline _LIBCPP_INLINE_VISIBILITY
5521_OutputIterator
5522set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5523 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5524{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005525 return _VSTD::set_symmetric_difference(__first1, __last1, __first2, __last2, __result,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005526 __less<typename iterator_traits<_InputIterator1>::value_type,
5527 typename iterator_traits<_InputIterator2>::value_type>());
5528}
5529
5530// lexicographical_compare
5531
5532template <class _Compare, class _InputIterator1, class _InputIterator2>
Marshall Clow5492c8a2018-01-22 20:44:33 +00005533_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Howard Hinnantc51e1022010-05-11 19:42:16 +00005534__lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5535 _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
5536{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00005537 for (; __first2 != __last2; ++__first1, (void) ++__first2)
Howard Hinnantc51e1022010-05-11 19:42:16 +00005538 {
5539 if (__first1 == __last1 || __comp(*__first1, *__first2))
5540 return true;
5541 if (__comp(*__first2, *__first1))
5542 return false;
5543 }
5544 return false;
5545}
5546
5547template <class _InputIterator1, class _InputIterator2, class _Compare>
Marshall Clow5492c8a2018-01-22 20:44:33 +00005548inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00005549bool
5550lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5551 _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
5552{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005553#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005554 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5555 __debug_less<_Compare> __c(__comp);
5556 return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005557#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005558 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5559 return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005560#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005561}
5562
5563template <class _InputIterator1, class _InputIterator2>
Marshall Clow5492c8a2018-01-22 20:44:33 +00005564inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00005565bool
5566lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5567 _InputIterator2 __first2, _InputIterator2 __last2)
5568{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005569 return _VSTD::lexicographical_compare(__first1, __last1, __first2, __last2,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005570 __less<typename iterator_traits<_InputIterator1>::value_type,
5571 typename iterator_traits<_InputIterator2>::value_type>());
5572}
5573
5574// next_permutation
5575
5576template <class _Compare, class _BidirectionalIterator>
5577bool
5578__next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5579{
5580 _BidirectionalIterator __i = __last;
5581 if (__first == __last || __first == --__i)
5582 return false;
5583 while (true)
5584 {
5585 _BidirectionalIterator __ip1 = __i;
5586 if (__comp(*--__i, *__ip1))
5587 {
5588 _BidirectionalIterator __j = __last;
5589 while (!__comp(*__i, *--__j))
5590 ;
5591 swap(*__i, *__j);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005592 _VSTD::reverse(__ip1, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005593 return true;
5594 }
5595 if (__i == __first)
5596 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005597 _VSTD::reverse(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005598 return false;
5599 }
5600 }
5601}
5602
5603template <class _BidirectionalIterator, class _Compare>
5604inline _LIBCPP_INLINE_VISIBILITY
5605bool
5606next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5607{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005608#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005609 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5610 __debug_less<_Compare> __c(__comp);
5611 return __next_permutation<_Comp_ref>(__first, __last, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005612#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005613 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5614 return __next_permutation<_Comp_ref>(__first, __last, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005615#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005616}
5617
5618template <class _BidirectionalIterator>
5619inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3b6579a2010-08-22 00:02:43 +00005620bool
Howard Hinnantc51e1022010-05-11 19:42:16 +00005621next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
5622{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005623 return _VSTD::next_permutation(__first, __last,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005624 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
5625}
5626
5627// prev_permutation
5628
5629template <class _Compare, class _BidirectionalIterator>
5630bool
5631__prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5632{
5633 _BidirectionalIterator __i = __last;
5634 if (__first == __last || __first == --__i)
5635 return false;
5636 while (true)
5637 {
5638 _BidirectionalIterator __ip1 = __i;
5639 if (__comp(*__ip1, *--__i))
5640 {
5641 _BidirectionalIterator __j = __last;
5642 while (!__comp(*--__j, *__i))
5643 ;
5644 swap(*__i, *__j);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005645 _VSTD::reverse(__ip1, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005646 return true;
5647 }
5648 if (__i == __first)
5649 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005650 _VSTD::reverse(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005651 return false;
5652 }
5653 }
5654}
5655
5656template <class _BidirectionalIterator, class _Compare>
5657inline _LIBCPP_INLINE_VISIBILITY
5658bool
5659prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5660{
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005661#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005662 typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5663 __debug_less<_Compare> __c(__comp);
5664 return __prev_permutation<_Comp_ref>(__first, __last, __c);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005665#else // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005666 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5667 return __prev_permutation<_Comp_ref>(__first, __last, __comp);
Howard Hinnant6148a9b2013-08-23 20:10:18 +00005668#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +00005669}
5670
5671template <class _BidirectionalIterator>
5672inline _LIBCPP_INLINE_VISIBILITY
5673bool
5674prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
5675{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005676 return _VSTD::prev_permutation(__first, __last,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005677 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
5678}
5679
Howard Hinnantc51e1022010-05-11 19:42:16 +00005680_LIBCPP_END_NAMESPACE_STD
5681
Eric Fiselierf4433a32017-05-31 22:07:49 +00005682_LIBCPP_POP_MACROS
5683
Howard Hinnantc51e1022010-05-11 19:42:16 +00005684#endif // _LIBCPP_ALGORITHM