blob: da55e5e9add0e2d0f92635d689c72b3860a847a2 [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001// -*- C++ -*-
2//===-------------------------- algorithm ---------------------------------===//
3//
Chandler Carruthd2012102019-01-19 10:56:40 +00004// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Howard Hinnantc51e1022010-05-11 19:42:16 +00007//
8//===----------------------------------------------------------------------===//
9
10#ifndef _LIBCPP_ALGORITHM
11#define _LIBCPP_ALGORITHM
12
13/*
14 algorithm synopsis
15
16#include <initializer_list>
17
18namespace std
19{
20
21template <class InputIterator, class Predicate>
Marshall Clowd607fdb2018-01-15 17:20:36 +000022 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000023 all_of(InputIterator first, InputIterator last, Predicate pred);
24
25template <class InputIterator, class Predicate>
Marshall Clowd607fdb2018-01-15 17:20:36 +000026 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000027 any_of(InputIterator first, InputIterator last, Predicate pred);
28
29template <class InputIterator, class Predicate>
Marshall Clowd607fdb2018-01-15 17:20:36 +000030 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000031 none_of(InputIterator first, InputIterator last, Predicate pred);
32
33template <class InputIterator, class Function>
Marshall Clow5492c8a2018-01-22 20:44:33 +000034 constexpr Function // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000035 for_each(InputIterator first, InputIterator last, Function f);
36
Marshall Clowde0169c2017-05-25 02:29:54 +000037template<class InputIterator, class Size, class Function>
Marshall Clow5492c8a2018-01-22 20:44:33 +000038 constexpr InputIterator // constexpr in C++20
39 for_each_n(InputIterator first, Size n, Function f); // C++17
Marshall Clowde0169c2017-05-25 02:29:54 +000040
Howard Hinnantc51e1022010-05-11 19:42:16 +000041template <class InputIterator, class T>
Marshall Clowee0161e2018-01-15 19:26:05 +000042 constexpr InputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000043 find(InputIterator first, InputIterator last, const T& value);
44
45template <class InputIterator, class Predicate>
Marshall Clowee0161e2018-01-15 19:26:05 +000046 constexpr InputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000047 find_if(InputIterator first, InputIterator last, Predicate pred);
48
49template<class InputIterator, class Predicate>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -050050 constexpr InputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000051 find_if_not(InputIterator first, InputIterator last, Predicate pred);
52
53template <class ForwardIterator1, class ForwardIterator2>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -050054 constexpr ForwardIterator1 // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000055 find_end(ForwardIterator1 first1, ForwardIterator1 last1,
56 ForwardIterator2 first2, ForwardIterator2 last2);
57
58template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -050059 constexpr ForwardIterator1 // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000060 find_end(ForwardIterator1 first1, ForwardIterator1 last1,
61 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
62
63template <class ForwardIterator1, class ForwardIterator2>
Marshall Clowee0161e2018-01-15 19:26:05 +000064 constexpr ForwardIterator1 // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000065 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
66 ForwardIterator2 first2, ForwardIterator2 last2);
67
68template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
Marshall Clowee0161e2018-01-15 19:26:05 +000069 constexpr ForwardIterator1 // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000070 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
71 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
72
73template <class ForwardIterator>
Marshall Clowee0161e2018-01-15 19:26:05 +000074 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000075 adjacent_find(ForwardIterator first, ForwardIterator last);
76
77template <class ForwardIterator, class BinaryPredicate>
Marshall Clowee0161e2018-01-15 19:26:05 +000078 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000079 adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
80
81template <class InputIterator, class T>
Marshall Clow3c0558f2018-01-15 19:40:34 +000082 constexpr typename iterator_traits<InputIterator>::difference_type // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000083 count(InputIterator first, InputIterator last, const T& value);
84
85template <class InputIterator, class Predicate>
Marshall Clow3c0558f2018-01-15 19:40:34 +000086 constexpr typename iterator_traits<InputIterator>::difference_type // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000087 count_if(InputIterator first, InputIterator last, Predicate pred);
88
89template <class InputIterator1, class InputIterator2>
Marshall Clow30bf3022018-01-16 02:04:10 +000090 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000091 mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
92
Marshall Clow96b42b22013-05-09 21:14:23 +000093template <class InputIterator1, class InputIterator2>
Marshall Clow30bf3022018-01-16 02:04:10 +000094 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20
Aditya Kumar3a0179a2016-08-25 11:52:38 +000095 mismatch(InputIterator1 first1, InputIterator1 last1,
Marshall Clow96b42b22013-05-09 21:14:23 +000096 InputIterator2 first2, InputIterator2 last2); // **C++14**
97
Howard Hinnantc51e1022010-05-11 19:42:16 +000098template <class InputIterator1, class InputIterator2, class BinaryPredicate>
Marshall Clow30bf3022018-01-16 02:04:10 +000099 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000100 mismatch(InputIterator1 first1, InputIterator1 last1,
101 InputIterator2 first2, BinaryPredicate pred);
102
Marshall Clow96b42b22013-05-09 21:14:23 +0000103template <class InputIterator1, class InputIterator2, class BinaryPredicate>
Marshall Clow30bf3022018-01-16 02:04:10 +0000104 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20
Marshall Clow96b42b22013-05-09 21:14:23 +0000105 mismatch(InputIterator1 first1, InputIterator1 last1,
106 InputIterator2 first2, InputIterator2 last2,
107 BinaryPredicate pred); // **C++14**
108
Howard Hinnantc51e1022010-05-11 19:42:16 +0000109template <class InputIterator1, class InputIterator2>
Marshall Clow30bf3022018-01-16 02:04:10 +0000110 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000111 equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
112
Marshall Clow96b42b22013-05-09 21:14:23 +0000113template <class InputIterator1, class InputIterator2>
Marshall Clow30bf3022018-01-16 02:04:10 +0000114 constexpr bool // constexpr in C++20
Aditya Kumar3a0179a2016-08-25 11:52:38 +0000115 equal(InputIterator1 first1, InputIterator1 last1,
Marshall Clow96b42b22013-05-09 21:14:23 +0000116 InputIterator2 first2, InputIterator2 last2); // **C++14**
117
Howard Hinnantc51e1022010-05-11 19:42:16 +0000118template <class InputIterator1, class InputIterator2, class BinaryPredicate>
Marshall Clow30bf3022018-01-16 02:04:10 +0000119 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000120 equal(InputIterator1 first1, InputIterator1 last1,
121 InputIterator2 first2, BinaryPredicate pred);
122
Marshall Clow96b42b22013-05-09 21:14:23 +0000123template <class InputIterator1, class InputIterator2, class BinaryPredicate>
Marshall Clow30bf3022018-01-16 02:04:10 +0000124 constexpr bool // constexpr in C++20
Marshall Clow96b42b22013-05-09 21:14:23 +0000125 equal(InputIterator1 first1, InputIterator1 last1,
126 InputIterator2 first2, InputIterator2 last2,
127 BinaryPredicate pred); // **C++14**
128
Howard Hinnantc51e1022010-05-11 19:42:16 +0000129template<class ForwardIterator1, class ForwardIterator2>
Marshall Clow96d050a2018-01-15 16:16:32 +0000130 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000131 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
132 ForwardIterator2 first2);
133
Marshall Clow96b42b22013-05-09 21:14:23 +0000134template<class ForwardIterator1, class ForwardIterator2>
Marshall Clow96d050a2018-01-15 16:16:32 +0000135 constexpr bool // constexpr in C++20
Marshall Clow96b42b22013-05-09 21:14:23 +0000136 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
137 ForwardIterator2 first2, ForwardIterator2 last2); // **C++14**
138
Howard Hinnantc51e1022010-05-11 19:42:16 +0000139template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
Marshall Clow96d050a2018-01-15 16:16:32 +0000140 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000141 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
142 ForwardIterator2 first2, BinaryPredicate pred);
143
Marshall Clow96b42b22013-05-09 21:14:23 +0000144template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
Marshall Clow96d050a2018-01-15 16:16:32 +0000145 constexpr bool // constexpr in C++20
Marshall Clow96b42b22013-05-09 21:14:23 +0000146 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
147 ForwardIterator2 first2, ForwardIterator2 last2,
148 BinaryPredicate pred); // **C++14**
149
Howard Hinnantc51e1022010-05-11 19:42:16 +0000150template <class ForwardIterator1, class ForwardIterator2>
Marshall Clow323fc5b2018-01-16 15:48:27 +0000151 constexpr ForwardIterator1 // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000152 search(ForwardIterator1 first1, ForwardIterator1 last1,
153 ForwardIterator2 first2, ForwardIterator2 last2);
154
155template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
Marshall Clow323fc5b2018-01-16 15:48:27 +0000156 constexpr ForwardIterator1 // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000157 search(ForwardIterator1 first1, ForwardIterator1 last1,
158 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
159
160template <class ForwardIterator, class Size, class T>
Marshall Clow323fc5b2018-01-16 15:48:27 +0000161 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000162 search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value);
163
164template <class ForwardIterator, class Size, class T, class BinaryPredicate>
Marshall Clow323fc5b2018-01-16 15:48:27 +0000165 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000166 search_n(ForwardIterator first, ForwardIterator last,
167 Size count, const T& value, BinaryPredicate pred);
168
169template <class InputIterator, class OutputIterator>
Louis Dionne65b433b2019-11-06 12:02:41 +0000170 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000171 copy(InputIterator first, InputIterator last, OutputIterator result);
172
173template<class InputIterator, class OutputIterator, class Predicate>
Louis Dionne65b433b2019-11-06 12:02:41 +0000174 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000175 copy_if(InputIterator first, InputIterator last,
176 OutputIterator result, Predicate pred);
177
178template<class InputIterator, class Size, class OutputIterator>
Louis Dionne65b433b2019-11-06 12:02:41 +0000179 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000180 copy_n(InputIterator first, Size n, OutputIterator result);
181
182template <class BidirectionalIterator1, class BidirectionalIterator2>
Louis Dionne65b433b2019-11-06 12:02:41 +0000183 constexpr BidirectionalIterator2 // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000184 copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last,
185 BidirectionalIterator2 result);
186
187template <class ForwardIterator1, class ForwardIterator2>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500188 constexpr ForwardIterator2 // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000189 swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2);
190
191template <class ForwardIterator1, class ForwardIterator2>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500192 constexpr void // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000193 iter_swap(ForwardIterator1 a, ForwardIterator2 b);
194
195template <class InputIterator, class OutputIterator, class UnaryOperation>
Marshall Clow31427c62018-01-19 17:45:39 +0000196 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000197 transform(InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op);
198
199template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation>
Marshall Clow31427c62018-01-19 17:45:39 +0000200 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000201 transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2,
202 OutputIterator result, BinaryOperation binary_op);
203
204template <class ForwardIterator, class T>
Marshall Clow01bbbd22018-01-19 18:07:29 +0000205 constexpr void // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000206 replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value);
207
208template <class ForwardIterator, class Predicate, class T>
Marshall Clow01bbbd22018-01-19 18:07:29 +0000209 constexpr void // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000210 replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value);
211
212template <class InputIterator, class OutputIterator, class T>
Marshall Clow01bbbd22018-01-19 18:07:29 +0000213 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000214 replace_copy(InputIterator first, InputIterator last, OutputIterator result,
215 const T& old_value, const T& new_value);
216
217template <class InputIterator, class OutputIterator, class Predicate, class T>
Marshall Clow01bbbd22018-01-19 18:07:29 +0000218 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000219 replace_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value);
220
221template <class ForwardIterator, class T>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +0000222 constexpr void // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000223 fill(ForwardIterator first, ForwardIterator last, const T& value);
224
225template <class OutputIterator, class Size, class T>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +0000226 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000227 fill_n(OutputIterator first, Size n, const T& value);
228
229template <class ForwardIterator, class Generator>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +0000230 constexpr void // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000231 generate(ForwardIterator first, ForwardIterator last, Generator gen);
232
233template <class OutputIterator, class Size, class Generator>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +0000234 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000235 generate_n(OutputIterator first, Size n, Generator gen);
236
237template <class ForwardIterator, class T>
Marshall Clow7c0fbd82018-01-22 21:43:04 +0000238 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000239 remove(ForwardIterator first, ForwardIterator last, const T& value);
240
241template <class ForwardIterator, class Predicate>
Marshall Clow7c0fbd82018-01-22 21:43:04 +0000242 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000243 remove_if(ForwardIterator first, ForwardIterator last, Predicate pred);
244
245template <class InputIterator, class OutputIterator, class T>
Marshall Clow7c0fbd82018-01-22 21:43:04 +0000246 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000247 remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value);
248
249template <class InputIterator, class OutputIterator, class Predicate>
Marshall Clow7c0fbd82018-01-22 21:43:04 +0000250 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000251 remove_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred);
252
253template <class ForwardIterator>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500254 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000255 unique(ForwardIterator first, ForwardIterator last);
256
257template <class ForwardIterator, class BinaryPredicate>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500258 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000259 unique(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
260
261template <class InputIterator, class OutputIterator>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500262 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000263 unique_copy(InputIterator first, InputIterator last, OutputIterator result);
264
265template <class InputIterator, class OutputIterator, class BinaryPredicate>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500266 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000267 unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate pred);
268
269template <class BidirectionalIterator>
270 void
271 reverse(BidirectionalIterator first, BidirectionalIterator last);
272
273template <class BidirectionalIterator, class OutputIterator>
Marshall Clow7c0fbd82018-01-22 21:43:04 +0000274 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000275 reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result);
276
277template <class ForwardIterator>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500278 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000279 rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last);
280
281template <class ForwardIterator, class OutputIterator>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500282 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000283 rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result);
284
285template <class RandomAccessIterator>
286 void
Marshall Clowfac06e52017-03-23 13:43:37 +0000287 random_shuffle(RandomAccessIterator first, RandomAccessIterator last); // deprecated in C++14, removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000288
289template <class RandomAccessIterator, class RandomNumberGenerator>
290 void
Marshall Clow83f35392014-03-03 06:14:19 +0000291 random_shuffle(RandomAccessIterator first, RandomAccessIterator last,
Marshall Clowfac06e52017-03-23 13:43:37 +0000292 RandomNumberGenerator& rand); // deprecated in C++14, removed in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000293
Eric Fiselier1208fcd2016-08-28 22:14:37 +0000294template<class PopulationIterator, class SampleIterator,
295 class Distance, class UniformRandomBitGenerator>
296 SampleIterator sample(PopulationIterator first, PopulationIterator last,
297 SampleIterator out, Distance n,
298 UniformRandomBitGenerator&& g); // C++17
299
Howard Hinnant578ac0f2010-05-26 17:49:34 +0000300template<class RandomAccessIterator, class UniformRandomNumberGenerator>
301 void shuffle(RandomAccessIterator first, RandomAccessIterator last,
Howard Hinnanta5e71782010-11-18 01:47:02 +0000302 UniformRandomNumberGenerator&& g);
Howard Hinnant578ac0f2010-05-26 17:49:34 +0000303
Howard Hinnantc51e1022010-05-11 19:42:16 +0000304template <class InputIterator, class Predicate>
Marshall Clow96d050a2018-01-15 16:16:32 +0000305 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000306 is_partitioned(InputIterator first, InputIterator last, Predicate pred);
307
308template <class ForwardIterator, class Predicate>
309 ForwardIterator
310 partition(ForwardIterator first, ForwardIterator last, Predicate pred);
311
312template <class InputIterator, class OutputIterator1,
313 class OutputIterator2, class Predicate>
Marshall Clow5492c8a2018-01-22 20:44:33 +0000314 constexpr pair<OutputIterator1, OutputIterator2> // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000315 partition_copy(InputIterator first, InputIterator last,
316 OutputIterator1 out_true, OutputIterator2 out_false,
317 Predicate pred);
318
319template <class ForwardIterator, class Predicate>
320 ForwardIterator
321 stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred);
322
323template<class ForwardIterator, class Predicate>
Marshall Clowe00916c2018-01-16 02:34:41 +0000324 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000325 partition_point(ForwardIterator first, ForwardIterator last, Predicate pred);
326
327template <class ForwardIterator>
Marshall Clow96d050a2018-01-15 16:16:32 +0000328 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000329 is_sorted(ForwardIterator first, ForwardIterator last);
330
331template <class ForwardIterator, class Compare>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500332 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000333 is_sorted(ForwardIterator first, ForwardIterator last, Compare comp);
334
335template<class ForwardIterator>
Marshall Clow3c0558f2018-01-15 19:40:34 +0000336 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000337 is_sorted_until(ForwardIterator first, ForwardIterator last);
338
339template <class ForwardIterator, class Compare>
Marshall Clow3c0558f2018-01-15 19:40:34 +0000340 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000341 is_sorted_until(ForwardIterator first, ForwardIterator last, Compare comp);
342
343template <class RandomAccessIterator>
344 void
345 sort(RandomAccessIterator first, RandomAccessIterator last);
346
347template <class RandomAccessIterator, class Compare>
348 void
349 sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
350
351template <class RandomAccessIterator>
352 void
353 stable_sort(RandomAccessIterator first, RandomAccessIterator last);
354
355template <class RandomAccessIterator, class Compare>
356 void
357 stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
358
359template <class RandomAccessIterator>
360 void
361 partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last);
362
363template <class RandomAccessIterator, class Compare>
364 void
365 partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp);
366
367template <class InputIterator, class RandomAccessIterator>
368 RandomAccessIterator
369 partial_sort_copy(InputIterator first, InputIterator last,
370 RandomAccessIterator result_first, RandomAccessIterator result_last);
371
372template <class InputIterator, class RandomAccessIterator, class Compare>
373 RandomAccessIterator
374 partial_sort_copy(InputIterator first, InputIterator last,
375 RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp);
376
377template <class RandomAccessIterator>
378 void
379 nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last);
380
381template <class RandomAccessIterator, class Compare>
382 void
383 nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp);
384
385template <class ForwardIterator, class T>
Marshall Clowe00916c2018-01-16 02:34:41 +0000386 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000387 lower_bound(ForwardIterator first, ForwardIterator last, const T& value);
388
389template <class ForwardIterator, class T, class Compare>
Marshall Clowe00916c2018-01-16 02:34:41 +0000390 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000391 lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
392
393template <class ForwardIterator, class T>
Marshall Clowe00916c2018-01-16 02:34:41 +0000394 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000395 upper_bound(ForwardIterator first, ForwardIterator last, const T& value);
396
397template <class ForwardIterator, class T, class Compare>
Marshall Clowe00916c2018-01-16 02:34:41 +0000398 constexpr ForwardIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000399 upper_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
400
401template <class ForwardIterator, class T>
Marshall Clowe00916c2018-01-16 02:34:41 +0000402 constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000403 equal_range(ForwardIterator first, ForwardIterator last, const T& value);
404
405template <class ForwardIterator, class T, class Compare>
Marshall Clowe00916c2018-01-16 02:34:41 +0000406 constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000407 equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
408
409template <class ForwardIterator, class T>
Marshall Clowe00916c2018-01-16 02:34:41 +0000410 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000411 binary_search(ForwardIterator first, ForwardIterator last, const T& value);
412
413template <class ForwardIterator, class T, class Compare>
Marshall Clowc0b7f972018-01-22 23:10:40 +0000414 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000415 binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
416
417template <class InputIterator1, class InputIterator2, class OutputIterator>
Arthur O'Dwyer5afc5692020-12-04 13:47:12 -0500418 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000419 merge(InputIterator1 first1, InputIterator1 last1,
420 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
421
422template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
Arthur O'Dwyer5afc5692020-12-04 13:47:12 -0500423 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000424 merge(InputIterator1 first1, InputIterator1 last1,
425 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
426
427template <class BidirectionalIterator>
428 void
429 inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last);
430
431template <class BidirectionalIterator, class Compare>
432 void
433 inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp);
434
435template <class InputIterator1, class InputIterator2>
Marshall Clowc0b7f972018-01-22 23:10:40 +0000436 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000437 includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
438
439template <class InputIterator1, class InputIterator2, class Compare>
Marshall Clowc0b7f972018-01-22 23:10:40 +0000440 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000441 includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp);
442
443template <class InputIterator1, class InputIterator2, class OutputIterator>
Arthur O'Dwyer5afc5692020-12-04 13:47:12 -0500444 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000445 set_union(InputIterator1 first1, InputIterator1 last1,
446 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
447
448template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
Arthur O'Dwyer5afc5692020-12-04 13:47:12 -0500449 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000450 set_union(InputIterator1 first1, InputIterator1 last1,
451 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
452
453template <class InputIterator1, class InputIterator2, class OutputIterator>
Marshall Clowc0b7f972018-01-22 23:10:40 +0000454 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000455 set_intersection(InputIterator1 first1, InputIterator1 last1,
456 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
457
458template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
Marshall Clowc0b7f972018-01-22 23:10:40 +0000459 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000460 set_intersection(InputIterator1 first1, InputIterator1 last1,
461 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
462
463template <class InputIterator1, class InputIterator2, class OutputIterator>
Arthur O'Dwyer5afc5692020-12-04 13:47:12 -0500464 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000465 set_difference(InputIterator1 first1, InputIterator1 last1,
466 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
467
468template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
Arthur O'Dwyer5afc5692020-12-04 13:47:12 -0500469 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000470 set_difference(InputIterator1 first1, InputIterator1 last1,
471 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
472
473template <class InputIterator1, class InputIterator2, class OutputIterator>
Arthur O'Dwyer5afc5692020-12-04 13:47:12 -0500474 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000475 set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
476 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
477
478template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
Arthur O'Dwyer5afc5692020-12-04 13:47:12 -0500479 constexpr OutputIterator // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000480 set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
481 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
482
483template <class RandomAccessIterator>
484 void
485 push_heap(RandomAccessIterator first, RandomAccessIterator last);
486
487template <class RandomAccessIterator, class Compare>
488 void
489 push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
490
491template <class RandomAccessIterator>
492 void
493 pop_heap(RandomAccessIterator first, RandomAccessIterator last);
494
495template <class RandomAccessIterator, class Compare>
496 void
497 pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
498
499template <class RandomAccessIterator>
500 void
501 make_heap(RandomAccessIterator first, RandomAccessIterator last);
502
503template <class RandomAccessIterator, class Compare>
504 void
505 make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
506
507template <class RandomAccessIterator>
508 void
509 sort_heap(RandomAccessIterator first, RandomAccessIterator last);
510
511template <class RandomAccessIterator, class Compare>
512 void
513 sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
514
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000515template <class RandomAccessIterator>
Marshall Clow96d050a2018-01-15 16:16:32 +0000516 constexpr bool // constexpr in C++20
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000517 is_heap(RandomAccessIterator first, RandomAccessiterator last);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000518
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000519template <class RandomAccessIterator, class Compare>
Marshall Clow96d050a2018-01-15 16:16:32 +0000520 constexpr bool // constexpr in C++20
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000521 is_heap(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000522
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000523template <class RandomAccessIterator>
Marshall Clow96d050a2018-01-15 16:16:32 +0000524 constexpr RandomAccessIterator // constexpr in C++20
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000525 is_heap_until(RandomAccessIterator first, RandomAccessiterator last);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000526
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000527template <class RandomAccessIterator, class Compare>
Marshall Clow96d050a2018-01-15 16:16:32 +0000528 constexpr RandomAccessIterator // constexpr in C++20
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000529 is_heap_until(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000530
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000531template <class ForwardIterator>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500532 constexpr ForwardIterator // constexpr in C++14
533 min_element(ForwardIterator first, ForwardIterator last);
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000534
535template <class ForwardIterator, class Compare>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500536 constexpr ForwardIterator // constexpr in C++14
537 min_element(ForwardIterator first, ForwardIterator last, Compare comp);
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000538
Howard Hinnantc51e1022010-05-11 19:42:16 +0000539template <class T>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500540 constexpr const T& // constexpr in C++14
541 min(const T& a, const T& b);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000542
543template <class T, class Compare>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500544 constexpr const T& // constexpr in C++14
545 min(const T& a, const T& b, Compare comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000546
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000547template<class T>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500548 constexpr T // constexpr in C++14
549 min(initializer_list<T> t);
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000550
551template<class T, class Compare>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500552 constexpr T // constexpr in C++14
553 min(initializer_list<T> t, Compare comp);
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000554
Marshall Clow3e18d0e2016-03-07 22:43:49 +0000555template<class T>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500556 constexpr const T& clamp(const T& v, const T& lo, const T& hi); // C++17
Marshall Clow3e18d0e2016-03-07 22:43:49 +0000557
558template<class T, class Compare>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500559 constexpr const T& clamp(const T& v, const T& lo, const T& hi, Compare comp); // C++17
Marshall Clow3e18d0e2016-03-07 22:43:49 +0000560
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000561template <class ForwardIterator>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500562 constexpr ForwardIterator // constexpr in C++14
563 max_element(ForwardIterator first, ForwardIterator last);
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000564
565template <class ForwardIterator, class Compare>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500566 constexpr ForwardIterator // constexpr in C++14
567 max_element(ForwardIterator first, ForwardIterator last, Compare comp);
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000568
Howard Hinnantc51e1022010-05-11 19:42:16 +0000569template <class T>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500570 constexpr const T& // constexpr in C++14
571 max(const T& a, const T& b);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000572
573template <class T, class Compare>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500574 constexpr const T& // constexpr in C++14
575 max(const T& a, const T& b, Compare comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000576
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000577template<class T>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500578 constexpr T // constexpr in C++14
579 max(initializer_list<T> t);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000580
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000581template<class T, class Compare>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500582 constexpr T // constexpr in C++14
583 max(initializer_list<T> t, Compare comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000584
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000585template<class ForwardIterator>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500586 constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++14
587 minmax_element(ForwardIterator first, ForwardIterator last);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000588
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000589template<class ForwardIterator, class Compare>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500590 constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++14
591 minmax_element(ForwardIterator first, ForwardIterator last, Compare comp);
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000592
593template<class T>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500594 constexpr pair<const T&, const T&> // constexpr in C++14
595 minmax(const T& a, const T& b);
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000596
597template<class T, class Compare>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500598 constexpr pair<const T&, const T&> // constexpr in C++14
599 minmax(const T& a, const T& b, Compare comp);
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000600
601template<class T>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500602 constexpr pair<T, T> // constexpr in C++14
603 minmax(initializer_list<T> t);
Howard Hinnantb120e7a2010-08-21 20:10:01 +0000604
605template<class T, class Compare>
Arthur O'Dwyer20353a72020-12-02 20:02:18 -0500606 constexpr pair<T, T> // constexpr in C++14
607 minmax(initializer_list<T> t, Compare comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000608
609template <class InputIterator1, class InputIterator2>
Marshall Clow5492c8a2018-01-22 20:44:33 +0000610 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000611 lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
612
613template <class InputIterator1, class InputIterator2, class Compare>
Marshall Clow5492c8a2018-01-22 20:44:33 +0000614 constexpr bool // constexpr in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000615 lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
616 InputIterator2 first2, InputIterator2 last2, Compare comp);
617
618template <class BidirectionalIterator>
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000619 bool
Howard Hinnantc51e1022010-05-11 19:42:16 +0000620 next_permutation(BidirectionalIterator first, BidirectionalIterator last);
621
622template <class BidirectionalIterator, class Compare>
623 bool
624 next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
625
626template <class BidirectionalIterator>
627 bool
628 prev_permutation(BidirectionalIterator first, BidirectionalIterator last);
629
630template <class BidirectionalIterator, class Compare>
631 bool
632 prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
633
634} // std
635
636*/
637
638#include <__config>
639#include <initializer_list>
640#include <type_traits>
641#include <cstring>
Eric Fiselier6bfed252016-04-21 23:38:59 +0000642#include <utility> // needed to provide swap_ranges.
Howard Hinnantc51e1022010-05-11 19:42:16 +0000643#include <memory>
Marshall Clowa40686b2018-01-08 19:18:00 +0000644#include <functional>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000645#include <iterator>
Howard Hinnant60e5cf42012-07-26 17:09:09 +0000646#include <cstddef>
Marshall Clowbf32ec92018-08-17 16:07:48 +0000647#include <bit>
Marshall Clow0a1e7502018-09-12 19:41:40 +0000648#include <version>
Howard Hinnantea382952013-08-14 18:00:20 +0000649
Eric Fiselier14b6de92014-08-10 23:53:08 +0000650#include <__debug>
651
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000652#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000653#pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000654#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000655
Eric Fiselierf4433a32017-05-31 22:07:49 +0000656_LIBCPP_PUSH_MACROS
657#include <__undef_macros>
658
659
Howard Hinnantc51e1022010-05-11 19:42:16 +0000660_LIBCPP_BEGIN_NAMESPACE_STD
661
Marshall Clowe9dca072014-02-19 16:51:35 +0000662// I'd like to replace these with _VSTD::equal_to<void>, but can't because:
663// * That only works with C++14 and later, and
664// * We haven't included <functional> here.
Howard Hinnantc51e1022010-05-11 19:42:16 +0000665template <class _T1, class _T2 = _T1>
666struct __equal_to
667{
Marshall Clow1f695172018-07-14 04:15:19 +0000668 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
669 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(const _T1& __x, const _T2& __y) const {return __x == __y;}
670 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(const _T2& __x, const _T1& __y) const {return __x == __y;}
671 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(const _T2& __x, const _T2& __y) const {return __x == __y;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000672};
673
674template <class _T1>
675struct __equal_to<_T1, _T1>
676{
Marshall Clowe9dca072014-02-19 16:51:35 +0000677 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
678 bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000679};
680
681template <class _T1>
682struct __equal_to<const _T1, _T1>
683{
Marshall Clowe9dca072014-02-19 16:51:35 +0000684 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
685 bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000686};
687
688template <class _T1>
689struct __equal_to<_T1, const _T1>
690{
Marshall Clowe9dca072014-02-19 16:51:35 +0000691 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
692 bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000693};
694
695template <class _T1, class _T2 = _T1>
696struct __less
697{
Aditya Kumar3a0179a2016-08-25 11:52:38 +0000698 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Marshall Clowe9dca072014-02-19 16:51:35 +0000699 bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
700
701 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
702 bool operator()(const _T1& __x, const _T2& __y) const {return __x < __y;}
703
704 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
705 bool operator()(const _T2& __x, const _T1& __y) const {return __x < __y;}
706
707 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
708 bool operator()(const _T2& __x, const _T2& __y) const {return __x < __y;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000709};
710
711template <class _T1>
712struct __less<_T1, _T1>
713{
Marshall Clowe9dca072014-02-19 16:51:35 +0000714 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
715 bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000716};
717
718template <class _T1>
719struct __less<const _T1, _T1>
720{
Marshall Clowe9dca072014-02-19 16:51:35 +0000721 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
722 bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000723};
724
725template <class _T1>
726struct __less<_T1, const _T1>
727{
Marshall Clowe9dca072014-02-19 16:51:35 +0000728 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
729 bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000730};
731
732template <class _Predicate>
Marshall Clow738d1042017-08-28 23:16:13 +0000733class __invert // invert the sense of a comparison
Howard Hinnantc51e1022010-05-11 19:42:16 +0000734{
735private:
736 _Predicate __p_;
737public:
Marshall Clow738d1042017-08-28 23:16:13 +0000738 _LIBCPP_INLINE_VISIBILITY __invert() {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000739
740 _LIBCPP_INLINE_VISIBILITY
Marshall Clow738d1042017-08-28 23:16:13 +0000741 explicit __invert(_Predicate __p) : __p_(__p) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000742
743 template <class _T1>
744 _LIBCPP_INLINE_VISIBILITY
745 bool operator()(const _T1& __x) {return !__p_(__x);}
746
747 template <class _T1, class _T2>
748 _LIBCPP_INLINE_VISIBILITY
Marshall Clow738d1042017-08-28 23:16:13 +0000749 bool operator()(const _T1& __x, const _T2& __y) {return __p_(__y, __x);}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000750};
751
Louis Dionnedda14512018-12-17 16:04:39 +0000752// Perform division by two quickly for positive integers (llvm.org/PR39129)
753
754template <typename _Integral>
755_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
756typename enable_if
757<
758 is_integral<_Integral>::value,
759 _Integral
760>::type
761__half_positive(_Integral __value)
762{
763 return static_cast<_Integral>(static_cast<typename make_unsigned<_Integral>::type>(__value) / 2);
764}
765
766template <typename _Tp>
767_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
768typename enable_if
769<
770 !is_integral<_Tp>::value,
771 _Tp
772>::type
773__half_positive(_Tp __value)
774{
775 return __value / 2;
776}
777
Howard Hinnant6148a9b2013-08-23 20:10:18 +0000778#ifdef _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000779
780template <class _Compare>
781struct __debug_less
782{
Eric Fiselier7ceab7b2019-04-12 05:18:19 +0000783 _Compare &__comp_;
784 _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000785 __debug_less(_Compare& __c) : __comp_(__c) {}
Eric Fiselier32adec82016-07-19 23:27:18 +0000786
Howard Hinnantc51e1022010-05-11 19:42:16 +0000787 template <class _Tp, class _Up>
Thomas Andersona371b732019-04-19 00:52:54 +0000788 _LIBCPP_CONSTEXPR_AFTER_CXX17
Thomas Andersond364ec92019-04-15 17:02:15 +0000789 bool operator()(const _Tp& __x, const _Up& __y)
790 {
791 bool __r = __comp_(__x, __y);
792 if (__r)
793 __do_compare_assert(0, __y, __x);
794 return __r;
795 }
796
797 template <class _Tp, class _Up>
Eric Fiselier7ceab7b2019-04-12 05:18:19 +0000798 _LIBCPP_CONSTEXPR_AFTER_CXX17
Eric Fiselier6dfe5232019-03-08 22:58:59 +0000799 bool operator()(_Tp& __x, _Up& __y)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000800 {
801 bool __r = __comp_(__x, __y);
802 if (__r)
Eric Fiselier32adec82016-07-19 23:27:18 +0000803 __do_compare_assert(0, __y, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000804 return __r;
805 }
Eric Fiselier32adec82016-07-19 23:27:18 +0000806
807 template <class _LHS, class _RHS>
Eric Fiselier7ceab7b2019-04-12 05:18:19 +0000808 _LIBCPP_CONSTEXPR_AFTER_CXX17
Eric Fiselier32adec82016-07-19 23:27:18 +0000809 inline _LIBCPP_INLINE_VISIBILITY
810 decltype((void)_VSTD::declval<_Compare&>()(
Eric Fiselier6dfe5232019-03-08 22:58:59 +0000811 _VSTD::declval<_LHS &>(), _VSTD::declval<_RHS &>()))
812 __do_compare_assert(int, _LHS & __l, _RHS & __r) {
Eric Fiselier32adec82016-07-19 23:27:18 +0000813 _LIBCPP_ASSERT(!__comp_(__l, __r),
814 "Comparator does not induce a strict weak ordering");
815 }
816
817 template <class _LHS, class _RHS>
Eric Fiselier7ceab7b2019-04-12 05:18:19 +0000818 _LIBCPP_CONSTEXPR_AFTER_CXX17
Eric Fiselier32adec82016-07-19 23:27:18 +0000819 inline _LIBCPP_INLINE_VISIBILITY
Eric Fiselier6dfe5232019-03-08 22:58:59 +0000820 void __do_compare_assert(long, _LHS &, _RHS &) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000821};
822
Eric Fiselier6dfe5232019-03-08 22:58:59 +0000823#endif // _LIBCPP_DEBUG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000824
Eric Fiselier7ceab7b2019-04-12 05:18:19 +0000825template <class _Comp>
826struct __comp_ref_type {
827 // Pass the comparator by lvalue reference. Or in debug mode, using a
828 // debugging wrapper that stores a reference.
829#ifndef _LIBCPP_DEBUG
830 typedef typename add_lvalue_reference<_Comp>::type type;
831#else
832 typedef __debug_less<_Comp> type;
833#endif
834};
835
Howard Hinnantc51e1022010-05-11 19:42:16 +0000836// all_of
837
838template <class _InputIterator, class _Predicate>
Nico Weber471b10a2019-04-03 18:13:08 +0000839_LIBCPP_NODISCARD_EXT inline
840_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000841bool
842all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
843{
844 for (; __first != __last; ++__first)
845 if (!__pred(*__first))
846 return false;
847 return true;
848}
849
850// any_of
851
852template <class _InputIterator, class _Predicate>
Nico Weber471b10a2019-04-03 18:13:08 +0000853_LIBCPP_NODISCARD_EXT inline
854_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000855bool
856any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
857{
858 for (; __first != __last; ++__first)
859 if (__pred(*__first))
860 return true;
861 return false;
862}
863
864// none_of
865
866template <class _InputIterator, class _Predicate>
Nico Weber471b10a2019-04-03 18:13:08 +0000867_LIBCPP_NODISCARD_EXT inline
868_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000869bool
870none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
871{
872 for (; __first != __last; ++__first)
873 if (__pred(*__first))
874 return false;
875 return true;
876}
877
878// for_each
879
880template <class _InputIterator, class _Function>
Marshall Clow5492c8a2018-01-22 20:44:33 +0000881inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000882_Function
883for_each(_InputIterator __first, _InputIterator __last, _Function __f)
884{
885 for (; __first != __last; ++__first)
886 __f(*__first);
Marshall Clow78dbe462016-11-14 18:22:19 +0000887 return __f;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000888}
889
Marshall Clowc588fd62017-05-25 13:40:57 +0000890#if _LIBCPP_STD_VER > 14
Marshall Clowde0169c2017-05-25 02:29:54 +0000891// for_each_n
892
893template <class _InputIterator, class _Size, class _Function>
Marshall Clow5492c8a2018-01-22 20:44:33 +0000894inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clowde0169c2017-05-25 02:29:54 +0000895_InputIterator
896for_each_n(_InputIterator __first, _Size __orig_n, _Function __f)
897{
Arthur O'Dwyer6e9069c2020-12-07 23:42:47 -0500898 typedef decltype(_VSTD::__convert_to_integral(__orig_n)) _IntegralSize;
Marshall Clowde0169c2017-05-25 02:29:54 +0000899 _IntegralSize __n = __orig_n;
900 while (__n > 0)
901 {
902 __f(*__first);
903 ++__first;
904 --__n;
905 }
906 return __first;
907}
Marshall Clowc588fd62017-05-25 13:40:57 +0000908#endif
Marshall Clowde0169c2017-05-25 02:29:54 +0000909
Howard Hinnantc51e1022010-05-11 19:42:16 +0000910// find
911
912template <class _InputIterator, class _Tp>
Nico Weber471b10a2019-04-03 18:13:08 +0000913_LIBCPP_NODISCARD_EXT inline
914_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000915_InputIterator
Howard Hinnantbf074022011-10-22 20:59:45 +0000916find(_InputIterator __first, _InputIterator __last, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000917{
918 for (; __first != __last; ++__first)
Howard Hinnantbf074022011-10-22 20:59:45 +0000919 if (*__first == __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000920 break;
921 return __first;
922}
923
924// find_if
925
926template <class _InputIterator, class _Predicate>
Nico Weber471b10a2019-04-03 18:13:08 +0000927_LIBCPP_NODISCARD_EXT inline
928_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000929_InputIterator
930find_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
931{
932 for (; __first != __last; ++__first)
933 if (__pred(*__first))
934 break;
935 return __first;
936}
937
938// find_if_not
939
940template<class _InputIterator, class _Predicate>
Nico Weber471b10a2019-04-03 18:13:08 +0000941_LIBCPP_NODISCARD_EXT inline
942_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000943_InputIterator
944find_if_not(_InputIterator __first, _InputIterator __last, _Predicate __pred)
945{
946 for (; __first != __last; ++__first)
947 if (!__pred(*__first))
948 break;
949 return __first;
950}
951
952// find_end
953
954template <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
Marshall Clowee0161e2018-01-15 19:26:05 +0000955_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator1
Howard Hinnantc51e1022010-05-11 19:42:16 +0000956__find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
957 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred,
958 forward_iterator_tag, forward_iterator_tag)
959{
960 // modeled after search algorithm
961 _ForwardIterator1 __r = __last1; // __last1 is the "default" answer
962 if (__first2 == __last2)
963 return __r;
964 while (true)
965 {
966 while (true)
967 {
968 if (__first1 == __last1) // if source exhausted return last correct answer
969 return __r; // (or __last1 if never found)
970 if (__pred(*__first1, *__first2))
971 break;
972 ++__first1;
973 }
974 // *__first1 matches *__first2, now match elements after here
975 _ForwardIterator1 __m1 = __first1;
976 _ForwardIterator2 __m2 = __first2;
977 while (true)
978 {
979 if (++__m2 == __last2)
980 { // Pattern exhaused, record answer and search for another one
981 __r = __first1;
982 ++__first1;
983 break;
984 }
985 if (++__m1 == __last1) // Source exhausted, return last answer
986 return __r;
987 if (!__pred(*__m1, *__m2)) // mismatch, restart with a new __first
988 {
989 ++__first1;
990 break;
991 } // else there is a match, check next elements
992 }
993 }
994}
995
996template <class _BinaryPredicate, class _BidirectionalIterator1, class _BidirectionalIterator2>
Marshall Clowee0161e2018-01-15 19:26:05 +0000997_LIBCPP_CONSTEXPR_AFTER_CXX17 _BidirectionalIterator1
Howard Hinnantc51e1022010-05-11 19:42:16 +0000998__find_end(_BidirectionalIterator1 __first1, _BidirectionalIterator1 __last1,
999 _BidirectionalIterator2 __first2, _BidirectionalIterator2 __last2, _BinaryPredicate __pred,
1000 bidirectional_iterator_tag, bidirectional_iterator_tag)
1001{
1002 // modeled after search algorithm (in reverse)
1003 if (__first2 == __last2)
1004 return __last1; // Everything matches an empty sequence
1005 _BidirectionalIterator1 __l1 = __last1;
1006 _BidirectionalIterator2 __l2 = __last2;
1007 --__l2;
1008 while (true)
1009 {
1010 // Find last element in sequence 1 that matchs *(__last2-1), with a mininum of loop checks
1011 while (true)
1012 {
1013 if (__first1 == __l1) // return __last1 if no element matches *__first2
1014 return __last1;
1015 if (__pred(*--__l1, *__l2))
1016 break;
1017 }
1018 // *__l1 matches *__l2, now match elements before here
1019 _BidirectionalIterator1 __m1 = __l1;
1020 _BidirectionalIterator2 __m2 = __l2;
1021 while (true)
1022 {
1023 if (__m2 == __first2) // If pattern exhausted, __m1 is the answer (works for 1 element pattern)
1024 return __m1;
1025 if (__m1 == __first1) // Otherwise if source exhaused, pattern not found
1026 return __last1;
1027 if (!__pred(*--__m1, *--__m2)) // if there is a mismatch, restart with a new __l1
1028 {
1029 break;
1030 } // else there is a match, check next elements
1031 }
1032 }
1033}
1034
1035template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
Marshall Clowedfd25a2014-06-10 18:51:55 +00001036_LIBCPP_CONSTEXPR_AFTER_CXX11 _RandomAccessIterator1
Howard Hinnantc51e1022010-05-11 19:42:16 +00001037__find_end(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
1038 _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
1039 random_access_iterator_tag, random_access_iterator_tag)
1040{
1041 // Take advantage of knowing source and pattern lengths. Stop short when source is smaller than pattern
1042 typename iterator_traits<_RandomAccessIterator2>::difference_type __len2 = __last2 - __first2;
1043 if (__len2 == 0)
1044 return __last1;
1045 typename iterator_traits<_RandomAccessIterator1>::difference_type __len1 = __last1 - __first1;
1046 if (__len1 < __len2)
1047 return __last1;
1048 const _RandomAccessIterator1 __s = __first1 + (__len2 - 1); // End of pattern match can't go before here
1049 _RandomAccessIterator1 __l1 = __last1;
1050 _RandomAccessIterator2 __l2 = __last2;
1051 --__l2;
1052 while (true)
1053 {
1054 while (true)
1055 {
1056 if (__s == __l1)
1057 return __last1;
1058 if (__pred(*--__l1, *__l2))
1059 break;
1060 }
1061 _RandomAccessIterator1 __m1 = __l1;
1062 _RandomAccessIterator2 __m2 = __l2;
1063 while (true)
1064 {
1065 if (__m2 == __first2)
1066 return __m1;
1067 // no need to check range on __m1 because __s guarantees we have enough source
1068 if (!__pred(*--__m1, *--__m2))
1069 {
1070 break;
1071 }
1072 }
1073 }
1074}
1075
1076template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Nico Weber471b10a2019-04-03 18:13:08 +00001077_LIBCPP_NODISCARD_EXT inline
1078_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001079_ForwardIterator1
1080find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1081 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1082{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001083 return _VSTD::__find_end<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001084 (__first1, __last1, __first2, __last2, __pred,
1085 typename iterator_traits<_ForwardIterator1>::iterator_category(),
1086 typename iterator_traits<_ForwardIterator2>::iterator_category());
1087}
1088
1089template <class _ForwardIterator1, class _ForwardIterator2>
Nico Weber471b10a2019-04-03 18:13:08 +00001090_LIBCPP_NODISCARD_EXT inline
1091_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001092_ForwardIterator1
1093find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1094 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1095{
1096 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1097 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001098 return _VSTD::find_end(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001099}
1100
1101// find_first_of
1102
1103template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Marshall Clowedfd25a2014-06-10 18:51:55 +00001104_LIBCPP_CONSTEXPR_AFTER_CXX11 _ForwardIterator1
1105__find_first_of_ce(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001106 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1107{
1108 for (; __first1 != __last1; ++__first1)
1109 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
1110 if (__pred(*__first1, *__j))
1111 return __first1;
1112 return __last1;
1113}
1114
Marshall Clowedfd25a2014-06-10 18:51:55 +00001115
1116template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Nico Weber471b10a2019-04-03 18:13:08 +00001117_LIBCPP_NODISCARD_EXT inline
1118_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clowedfd25a2014-06-10 18:51:55 +00001119_ForwardIterator1
1120find_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1121 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1122{
1123 return _VSTD::__find_first_of_ce(__first1, __last1, __first2, __last2, __pred);
1124}
1125
Howard Hinnantc51e1022010-05-11 19:42:16 +00001126template <class _ForwardIterator1, class _ForwardIterator2>
Nico Weber471b10a2019-04-03 18:13:08 +00001127_LIBCPP_NODISCARD_EXT inline
1128_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001129_ForwardIterator1
1130find_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1131 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1132{
1133 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1134 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Marshall Clowedfd25a2014-06-10 18:51:55 +00001135 return _VSTD::__find_first_of_ce(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001136}
1137
1138// adjacent_find
1139
1140template <class _ForwardIterator, class _BinaryPredicate>
Nico Weber471b10a2019-04-03 18:13:08 +00001141_LIBCPP_NODISCARD_EXT inline
1142_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001143_ForwardIterator
1144adjacent_find(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred)
1145{
1146 if (__first != __last)
1147 {
1148 _ForwardIterator __i = __first;
1149 while (++__i != __last)
1150 {
1151 if (__pred(*__first, *__i))
1152 return __first;
1153 __first = __i;
1154 }
1155 }
1156 return __last;
1157}
1158
1159template <class _ForwardIterator>
Nico Weber471b10a2019-04-03 18:13:08 +00001160_LIBCPP_NODISCARD_EXT inline
1161_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001162_ForwardIterator
1163adjacent_find(_ForwardIterator __first, _ForwardIterator __last)
1164{
1165 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001166 return _VSTD::adjacent_find(__first, __last, __equal_to<__v>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001167}
1168
1169// count
1170
1171template <class _InputIterator, class _Tp>
Nico Weber471b10a2019-04-03 18:13:08 +00001172_LIBCPP_NODISCARD_EXT inline
1173_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001174typename iterator_traits<_InputIterator>::difference_type
Howard Hinnantbf074022011-10-22 20:59:45 +00001175count(_InputIterator __first, _InputIterator __last, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001176{
1177 typename iterator_traits<_InputIterator>::difference_type __r(0);
1178 for (; __first != __last; ++__first)
Howard Hinnantbf074022011-10-22 20:59:45 +00001179 if (*__first == __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001180 ++__r;
1181 return __r;
1182}
1183
1184// count_if
1185
1186template <class _InputIterator, class _Predicate>
Nico Weber471b10a2019-04-03 18:13:08 +00001187_LIBCPP_NODISCARD_EXT inline
1188_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001189typename iterator_traits<_InputIterator>::difference_type
1190count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
1191{
1192 typename iterator_traits<_InputIterator>::difference_type __r(0);
1193 for (; __first != __last; ++__first)
1194 if (__pred(*__first))
1195 ++__r;
1196 return __r;
1197}
1198
1199// mismatch
1200
1201template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
Nico Weber471b10a2019-04-03 18:13:08 +00001202_LIBCPP_NODISCARD_EXT inline
1203_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001204pair<_InputIterator1, _InputIterator2>
1205mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1206 _InputIterator2 __first2, _BinaryPredicate __pred)
1207{
Marshall Clow2932e512014-09-16 20:40:05 +00001208 for (; __first1 != __last1; ++__first1, (void) ++__first2)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001209 if (!__pred(*__first1, *__first2))
1210 break;
1211 return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
1212}
1213
1214template <class _InputIterator1, class _InputIterator2>
Nico Weber471b10a2019-04-03 18:13:08 +00001215_LIBCPP_NODISCARD_EXT inline
1216_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001217pair<_InputIterator1, _InputIterator2>
1218mismatch(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2)
1219{
1220 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1221 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001222 return _VSTD::mismatch(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001223}
1224
Marshall Clow96b42b22013-05-09 21:14:23 +00001225#if _LIBCPP_STD_VER > 11
1226template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
Nico Weber471b10a2019-04-03 18:13:08 +00001227_LIBCPP_NODISCARD_EXT inline
1228_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow96b42b22013-05-09 21:14:23 +00001229pair<_InputIterator1, _InputIterator2>
1230mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1231 _InputIterator2 __first2, _InputIterator2 __last2,
1232 _BinaryPredicate __pred)
1233{
Marshall Clow2932e512014-09-16 20:40:05 +00001234 for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void) ++__first2)
Marshall Clow96b42b22013-05-09 21:14:23 +00001235 if (!__pred(*__first1, *__first2))
1236 break;
1237 return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
1238}
1239
1240template <class _InputIterator1, class _InputIterator2>
Nico Weber471b10a2019-04-03 18:13:08 +00001241_LIBCPP_NODISCARD_EXT inline
1242_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow96b42b22013-05-09 21:14:23 +00001243pair<_InputIterator1, _InputIterator2>
1244mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1245 _InputIterator2 __first2, _InputIterator2 __last2)
1246{
1247 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1248 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
1249 return _VSTD::mismatch(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
1250}
1251#endif
1252
Howard Hinnantc51e1022010-05-11 19:42:16 +00001253// equal
1254
1255template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
Nico Weber471b10a2019-04-03 18:13:08 +00001256_LIBCPP_NODISCARD_EXT inline
1257_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001258bool
1259equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _BinaryPredicate __pred)
1260{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00001261 for (; __first1 != __last1; ++__first1, (void) ++__first2)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001262 if (!__pred(*__first1, *__first2))
1263 return false;
1264 return true;
1265}
1266
1267template <class _InputIterator1, class _InputIterator2>
Nico Weber471b10a2019-04-03 18:13:08 +00001268_LIBCPP_NODISCARD_EXT inline
1269_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001270bool
1271equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2)
1272{
1273 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1274 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001275 return _VSTD::equal(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001276}
1277
Marshall Clow96b42b22013-05-09 21:14:23 +00001278#if _LIBCPP_STD_VER > 11
1279template <class _BinaryPredicate, class _InputIterator1, class _InputIterator2>
Marshall Clow30bf3022018-01-16 02:04:10 +00001280inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow96b42b22013-05-09 21:14:23 +00001281bool
Aditya Kumar3a0179a2016-08-25 11:52:38 +00001282__equal(_InputIterator1 __first1, _InputIterator1 __last1,
Marshall Clow96b42b22013-05-09 21:14:23 +00001283 _InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred,
1284 input_iterator_tag, input_iterator_tag )
1285{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00001286 for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void) ++__first2)
Marshall Clow96b42b22013-05-09 21:14:23 +00001287 if (!__pred(*__first1, *__first2))
1288 return false;
1289 return __first1 == __last1 && __first2 == __last2;
1290}
1291
1292template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
Marshall Clow30bf3022018-01-16 02:04:10 +00001293inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow96b42b22013-05-09 21:14:23 +00001294bool
Aditya Kumar3a0179a2016-08-25 11:52:38 +00001295__equal(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
1296 _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
Marshall Clow96b42b22013-05-09 21:14:23 +00001297 random_access_iterator_tag, random_access_iterator_tag )
1298{
1299 if ( _VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2))
1300 return false;
1301 return _VSTD::equal<_RandomAccessIterator1, _RandomAccessIterator2,
1302 typename add_lvalue_reference<_BinaryPredicate>::type>
1303 (__first1, __last1, __first2, __pred );
1304}
1305
1306template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
Nico Weber471b10a2019-04-03 18:13:08 +00001307_LIBCPP_NODISCARD_EXT inline
1308_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow96b42b22013-05-09 21:14:23 +00001309bool
Aditya Kumar3a0179a2016-08-25 11:52:38 +00001310equal(_InputIterator1 __first1, _InputIterator1 __last1,
Marshall Clow96b42b22013-05-09 21:14:23 +00001311 _InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred )
1312{
1313 return _VSTD::__equal<typename add_lvalue_reference<_BinaryPredicate>::type>
Aditya Kumar3a0179a2016-08-25 11:52:38 +00001314 (__first1, __last1, __first2, __last2, __pred,
Marshall Clow96b42b22013-05-09 21:14:23 +00001315 typename iterator_traits<_InputIterator1>::iterator_category(),
1316 typename iterator_traits<_InputIterator2>::iterator_category());
1317}
1318
1319template <class _InputIterator1, class _InputIterator2>
Nico Weber471b10a2019-04-03 18:13:08 +00001320_LIBCPP_NODISCARD_EXT inline
1321_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow96b42b22013-05-09 21:14:23 +00001322bool
Aditya Kumar3a0179a2016-08-25 11:52:38 +00001323equal(_InputIterator1 __first1, _InputIterator1 __last1,
Marshall Clow96b42b22013-05-09 21:14:23 +00001324 _InputIterator2 __first2, _InputIterator2 __last2)
1325{
1326 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1327 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
1328 return _VSTD::__equal(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>(),
1329 typename iterator_traits<_InputIterator1>::iterator_category(),
1330 typename iterator_traits<_InputIterator2>::iterator_category());
1331}
1332#endif
1333
Howard Hinnantc51e1022010-05-11 19:42:16 +00001334// is_permutation
1335
1336template<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Nico Weber471b10a2019-04-03 18:13:08 +00001337_LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Howard Hinnantc51e1022010-05-11 19:42:16 +00001338is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1339 _ForwardIterator2 __first2, _BinaryPredicate __pred)
1340{
Marshall Clow96d050a2018-01-15 16:16:32 +00001341// shorten sequences as much as possible by lopping of any equal prefix
Eric Fiseliera09a3b42014-10-27 19:28:20 +00001342 for (; __first1 != __last1; ++__first1, (void) ++__first2)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001343 if (!__pred(*__first1, *__first2))
Marshall Clow96d050a2018-01-15 16:16:32 +00001344 break;
1345 if (__first1 == __last1)
1346 return true;
1347
1348// __first1 != __last1 && *__first1 != *__first2
Howard Hinnantc51e1022010-05-11 19:42:16 +00001349 typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001350 _D1 __l1 = _VSTD::distance(__first1, __last1);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001351 if (__l1 == _D1(1))
1352 return false;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001353 _ForwardIterator2 __last2 = _VSTD::next(__first2, __l1);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001354 // For each element in [f1, l1) see if there are the same number of
1355 // equal elements in [f2, l2)
1356 for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i)
1357 {
Marshall Clow96d050a2018-01-15 16:16:32 +00001358 // Have we already counted the number of *__i in [f1, l1)?
Peter Collingbournea5b451b2018-01-26 21:23:27 +00001359 _ForwardIterator1 __match = __first1;
1360 for (; __match != __i; ++__match)
1361 if (__pred(*__match, *__i))
1362 break;
1363 if (__match == __i) {
Howard Hinnantc51e1022010-05-11 19:42:16 +00001364 // Count number of *__i in [f2, l2)
1365 _D1 __c2 = 0;
1366 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
1367 if (__pred(*__i, *__j))
1368 ++__c2;
1369 if (__c2 == 0)
1370 return false;
1371 // Count number of *__i in [__i, l1) (we can start with 1)
1372 _D1 __c1 = 1;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001373 for (_ForwardIterator1 __j = _VSTD::next(__i); __j != __last1; ++__j)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001374 if (__pred(*__i, *__j))
1375 ++__c1;
1376 if (__c1 != __c2)
1377 return false;
1378 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001379 }
1380 return true;
1381}
1382
1383template<class _ForwardIterator1, class _ForwardIterator2>
Nico Weber471b10a2019-04-03 18:13:08 +00001384_LIBCPP_NODISCARD_EXT inline
1385_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001386bool
1387is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1388 _ForwardIterator2 __first2)
1389{
1390 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1391 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001392 return _VSTD::is_permutation(__first1, __last1, __first2, __equal_to<__v1, __v2>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001393}
1394
Marshall Clow96b42b22013-05-09 21:14:23 +00001395#if _LIBCPP_STD_VER > 11
1396template<class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
Marshall Clow96d050a2018-01-15 16:16:32 +00001397_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Marshall Clow96b42b22013-05-09 21:14:23 +00001398__is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
Aditya Kumar3a0179a2016-08-25 11:52:38 +00001399 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
Marshall Clow96b42b22013-05-09 21:14:23 +00001400 _BinaryPredicate __pred,
1401 forward_iterator_tag, forward_iterator_tag )
1402{
Marshall Clow96d050a2018-01-15 16:16:32 +00001403// shorten sequences as much as possible by lopping of any equal prefix
Eric Fiselier14673892014-10-27 20:26:25 +00001404 for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void) ++__first2)
Marshall Clow96b42b22013-05-09 21:14:23 +00001405 if (!__pred(*__first1, *__first2))
Marshall Clow96d050a2018-01-15 16:16:32 +00001406 break;
1407 if (__first1 == __last1)
Marshall Clow01bbbd22018-01-19 18:07:29 +00001408 return __first2 == __last2;
Marshall Clow96d050a2018-01-15 16:16:32 +00001409 else if (__first2 == __last2)
Marshall Clow01bbbd22018-01-19 18:07:29 +00001410 return false;
Marshall Clow96d050a2018-01-15 16:16:32 +00001411
Marshall Clow96b42b22013-05-09 21:14:23 +00001412 typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1;
1413 _D1 __l1 = _VSTD::distance(__first1, __last1);
1414
1415 typedef typename iterator_traits<_ForwardIterator2>::difference_type _D2;
Marshall Clow42b967c2013-05-10 00:16:10 +00001416 _D2 __l2 = _VSTD::distance(__first2, __last2);
Marshall Clow96b42b22013-05-09 21:14:23 +00001417 if (__l1 != __l2)
1418 return false;
1419
1420 // For each element in [f1, l1) see if there are the same number of
1421 // equal elements in [f2, l2)
1422 for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i)
1423 {
Marshall Clow96d050a2018-01-15 16:16:32 +00001424 // Have we already counted the number of *__i in [f1, l1)?
Peter Collingbournea5b451b2018-01-26 21:23:27 +00001425 _ForwardIterator1 __match = __first1;
1426 for (; __match != __i; ++__match)
1427 if (__pred(*__match, *__i))
1428 break;
1429 if (__match == __i) {
Marshall Clow96b42b22013-05-09 21:14:23 +00001430 // Count number of *__i in [f2, l2)
1431 _D1 __c2 = 0;
1432 for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
1433 if (__pred(*__i, *__j))
1434 ++__c2;
1435 if (__c2 == 0)
1436 return false;
1437 // Count number of *__i in [__i, l1) (we can start with 1)
1438 _D1 __c1 = 1;
1439 for (_ForwardIterator1 __j = _VSTD::next(__i); __j != __last1; ++__j)
1440 if (__pred(*__i, *__j))
1441 ++__c1;
1442 if (__c1 != __c2)
1443 return false;
1444 }
Marshall Clow96b42b22013-05-09 21:14:23 +00001445 }
1446 return true;
1447}
1448
1449template<class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
Marshall Clow96d050a2018-01-15 16:16:32 +00001450_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Marshall Clow96b42b22013-05-09 21:14:23 +00001451__is_permutation(_RandomAccessIterator1 __first1, _RandomAccessIterator2 __last1,
Aditya Kumar3a0179a2016-08-25 11:52:38 +00001452 _RandomAccessIterator1 __first2, _RandomAccessIterator2 __last2,
Marshall Clow96b42b22013-05-09 21:14:23 +00001453 _BinaryPredicate __pred,
1454 random_access_iterator_tag, random_access_iterator_tag )
1455{
1456 if ( _VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2))
1457 return false;
1458 return _VSTD::is_permutation<_RandomAccessIterator1, _RandomAccessIterator2,
1459 typename add_lvalue_reference<_BinaryPredicate>::type>
1460 (__first1, __last1, __first2, __pred );
1461}
1462
1463template<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Nico Weber471b10a2019-04-03 18:13:08 +00001464_LIBCPP_NODISCARD_EXT inline
1465_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow96b42b22013-05-09 21:14:23 +00001466bool
1467is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1468 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
1469 _BinaryPredicate __pred )
1470{
1471 return _VSTD::__is_permutation<typename add_lvalue_reference<_BinaryPredicate>::type>
1472 (__first1, __last1, __first2, __last2, __pred,
1473 typename iterator_traits<_ForwardIterator1>::iterator_category(),
1474 typename iterator_traits<_ForwardIterator2>::iterator_category());
1475}
1476
1477template<class _ForwardIterator1, class _ForwardIterator2>
Nico Weber471b10a2019-04-03 18:13:08 +00001478_LIBCPP_NODISCARD_EXT inline
1479_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clow96b42b22013-05-09 21:14:23 +00001480bool
1481is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1482 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1483{
1484 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1485 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
1486 return _VSTD::__is_permutation(__first1, __last1, __first2, __last2,
1487 __equal_to<__v1, __v2>(),
1488 typename iterator_traits<_ForwardIterator1>::iterator_category(),
1489 typename iterator_traits<_ForwardIterator2>::iterator_category());
1490}
1491#endif
1492
Howard Hinnantc51e1022010-05-11 19:42:16 +00001493// search
Marshall Clowa40686b2018-01-08 19:18:00 +00001494// __search is in <functional>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001495
1496template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
Nico Weber471b10a2019-04-03 18:13:08 +00001497_LIBCPP_NODISCARD_EXT inline
1498_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001499_ForwardIterator1
1500search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1501 _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1502{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001503 return _VSTD::__search<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001504 (__first1, __last1, __first2, __last2, __pred,
Marshall Clowaf8be6c2016-03-08 15:12:52 +00001505 typename iterator_traits<_ForwardIterator1>::iterator_category(),
1506 typename iterator_traits<_ForwardIterator2>::iterator_category())
1507 .first;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001508}
1509
1510template <class _ForwardIterator1, class _ForwardIterator2>
Nico Weber471b10a2019-04-03 18:13:08 +00001511_LIBCPP_NODISCARD_EXT inline
1512_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001513_ForwardIterator1
1514search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1515 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1516{
Marshall Clowaf8be6c2016-03-08 15:12:52 +00001517 typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1518 typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001519 return _VSTD::search(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001520}
1521
Marshall Clowa40686b2018-01-08 19:18:00 +00001522
1523#if _LIBCPP_STD_VER > 14
1524template <class _ForwardIterator, class _Searcher>
Nico Weber471b10a2019-04-03 18:13:08 +00001525_LIBCPP_NODISCARD_EXT _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Marshall Clowa40686b2018-01-08 19:18:00 +00001526_ForwardIterator search(_ForwardIterator __f, _ForwardIterator __l, const _Searcher &__s)
1527{ return __s(__f, __l).first; }
1528#endif
1529
Howard Hinnantc51e1022010-05-11 19:42:16 +00001530// search_n
1531
1532template <class _BinaryPredicate, class _ForwardIterator, class _Size, class _Tp>
Marshall Clow323fc5b2018-01-16 15:48:27 +00001533_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00001534__search_n(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnantbf074022011-10-22 20:59:45 +00001535 _Size __count, const _Tp& __value_, _BinaryPredicate __pred, forward_iterator_tag)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001536{
1537 if (__count <= 0)
1538 return __first;
1539 while (true)
1540 {
Howard Hinnantbf074022011-10-22 20:59:45 +00001541 // Find first element in sequence that matchs __value_, with a mininum of loop checks
Howard Hinnantc51e1022010-05-11 19:42:16 +00001542 while (true)
1543 {
Howard Hinnantbf074022011-10-22 20:59:45 +00001544 if (__first == __last) // return __last if no element matches __value_
Howard Hinnantc51e1022010-05-11 19:42:16 +00001545 return __last;
Howard Hinnantbf074022011-10-22 20:59:45 +00001546 if (__pred(*__first, __value_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001547 break;
1548 ++__first;
1549 }
Howard Hinnantbf074022011-10-22 20:59:45 +00001550 // *__first matches __value_, now match elements after here
Howard Hinnantc51e1022010-05-11 19:42:16 +00001551 _ForwardIterator __m = __first;
1552 _Size __c(0);
1553 while (true)
1554 {
1555 if (++__c == __count) // If pattern exhausted, __first is the answer (works for 1 element pattern)
1556 return __first;
1557 if (++__m == __last) // Otherwise if source exhaused, pattern not found
1558 return __last;
Howard Hinnantbf074022011-10-22 20:59:45 +00001559 if (!__pred(*__m, __value_)) // if there is a mismatch, restart with a new __first
Howard Hinnantc51e1022010-05-11 19:42:16 +00001560 {
1561 __first = __m;
1562 ++__first;
1563 break;
1564 } // else there is a match, check next elements
1565 }
1566 }
1567}
1568
1569template <class _BinaryPredicate, class _RandomAccessIterator, class _Size, class _Tp>
Marshall Clow323fc5b2018-01-16 15:48:27 +00001570_LIBCPP_CONSTEXPR_AFTER_CXX17 _RandomAccessIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00001571__search_n(_RandomAccessIterator __first, _RandomAccessIterator __last,
Howard Hinnantbf074022011-10-22 20:59:45 +00001572 _Size __count, const _Tp& __value_, _BinaryPredicate __pred, random_access_iterator_tag)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001573{
1574 if (__count <= 0)
1575 return __first;
1576 _Size __len = static_cast<_Size>(__last - __first);
1577 if (__len < __count)
1578 return __last;
1579 const _RandomAccessIterator __s = __last - (__count - 1); // Start of pattern match can't go beyond here
1580 while (true)
1581 {
Howard Hinnantbf074022011-10-22 20:59:45 +00001582 // Find first element in sequence that matchs __value_, with a mininum of loop checks
Howard Hinnantc51e1022010-05-11 19:42:16 +00001583 while (true)
1584 {
Howard Hinnantbede4c32013-04-04 15:40:48 +00001585 if (__first >= __s) // return __last if no element matches __value_
Howard Hinnantc51e1022010-05-11 19:42:16 +00001586 return __last;
Howard Hinnantbf074022011-10-22 20:59:45 +00001587 if (__pred(*__first, __value_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001588 break;
1589 ++__first;
1590 }
Howard Hinnantbf074022011-10-22 20:59:45 +00001591 // *__first matches __value_, now match elements after here
Howard Hinnantc51e1022010-05-11 19:42:16 +00001592 _RandomAccessIterator __m = __first;
1593 _Size __c(0);
1594 while (true)
1595 {
1596 if (++__c == __count) // If pattern exhausted, __first is the answer (works for 1 element pattern)
1597 return __first;
1598 ++__m; // no need to check range on __m because __s guarantees we have enough source
Howard Hinnantbf074022011-10-22 20:59:45 +00001599 if (!__pred(*__m, __value_)) // if there is a mismatch, restart with a new __first
Howard Hinnantc51e1022010-05-11 19:42:16 +00001600 {
1601 __first = __m;
1602 ++__first;
1603 break;
1604 } // else there is a match, check next elements
1605 }
1606 }
1607}
1608
1609template <class _ForwardIterator, class _Size, class _Tp, class _BinaryPredicate>
Nico Weber471b10a2019-04-03 18:13:08 +00001610_LIBCPP_NODISCARD_EXT inline
1611_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001612_ForwardIterator
1613search_n(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnantbf074022011-10-22 20:59:45 +00001614 _Size __count, const _Tp& __value_, _BinaryPredicate __pred)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001615{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001616 return _VSTD::__search_n<typename add_lvalue_reference<_BinaryPredicate>::type>
Arthur O'Dwyer6e9069c2020-12-07 23:42:47 -05001617 (__first, __last, _VSTD::__convert_to_integral(__count), __value_, __pred,
Eric Fiselier97ec07d2015-02-10 16:46:42 +00001618 typename iterator_traits<_ForwardIterator>::iterator_category());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001619}
1620
1621template <class _ForwardIterator, class _Size, class _Tp>
Nico Weber471b10a2019-04-03 18:13:08 +00001622_LIBCPP_NODISCARD_EXT inline
1623_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001624_ForwardIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00001625search_n(_ForwardIterator __first, _ForwardIterator __last, _Size __count, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001626{
1627 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Arthur O'Dwyer6e9069c2020-12-07 23:42:47 -05001628 return _VSTD::search_n(__first, __last, _VSTD::__convert_to_integral(__count),
Eric Fiselier97ec07d2015-02-10 16:46:42 +00001629 __value_, __equal_to<__v, _Tp>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001630}
1631
1632// copy
Howard Hinnantc51e1022010-05-11 19:42:16 +00001633template <class _Iter>
zoecarverd0279de2020-09-14 18:11:08 -04001634inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Howard Hinnantc51e1022010-05-11 19:42:16 +00001635_Iter
1636__unwrap_iter(_Iter __i)
1637{
1638 return __i;
1639}
1640
1641template <class _Tp>
zoecarverd0279de2020-09-14 18:11:08 -04001642inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Howard Hinnantc51e1022010-05-11 19:42:16 +00001643typename enable_if
1644<
Howard Hinnanta9a897e2010-11-19 22:17:28 +00001645 is_trivially_copy_assignable<_Tp>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001646 _Tp*
1647>::type
1648__unwrap_iter(move_iterator<_Tp*> __i)
1649{
1650 return __i.base();
1651}
1652
Howard Hinnant8ea98242013-08-23 17:37:05 +00001653#if _LIBCPP_DEBUG_LEVEL < 2
1654
Howard Hinnantc51e1022010-05-11 19:42:16 +00001655template <class _Tp>
zoecarverd0279de2020-09-14 18:11:08 -04001656inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Howard Hinnantc51e1022010-05-11 19:42:16 +00001657typename enable_if
1658<
Howard Hinnanta9a897e2010-11-19 22:17:28 +00001659 is_trivially_copy_assignable<_Tp>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001660 _Tp*
1661>::type
1662__unwrap_iter(__wrap_iter<_Tp*> __i)
1663{
1664 return __i.base();
1665}
1666
Marshall Clowbae96ac2019-02-06 16:10:25 +00001667template <class _Tp>
zoecarverd0279de2020-09-14 18:11:08 -04001668inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Marshall Clowbae96ac2019-02-06 16:10:25 +00001669typename enable_if
1670<
1671 is_trivially_copy_assignable<_Tp>::value,
1672 const _Tp*
1673>::type
1674__unwrap_iter(__wrap_iter<const _Tp*> __i)
1675{
1676 return __i.base();
1677}
1678
Eric Fiselier38badb82016-12-28 05:35:32 +00001679#else
1680
1681template <class _Tp>
zoecarverd0279de2020-09-14 18:11:08 -04001682inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Eric Fiselier38badb82016-12-28 05:35:32 +00001683typename enable_if
1684<
1685 is_trivially_copy_assignable<_Tp>::value,
1686 __wrap_iter<_Tp*>
1687>::type
1688__unwrap_iter(__wrap_iter<_Tp*> __i)
1689{
1690 return __i;
1691}
1692
Howard Hinnant8ea98242013-08-23 17:37:05 +00001693#endif // _LIBCPP_DEBUG_LEVEL < 2
1694
Howard Hinnantc51e1022010-05-11 19:42:16 +00001695template <class _InputIterator, class _OutputIterator>
Louis Dionne65b433b2019-11-06 12:02:41 +00001696inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001697_OutputIterator
Louis Dionne65b433b2019-11-06 12:02:41 +00001698__copy_constexpr(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001699{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00001700 for (; __first != __last; ++__first, (void) ++__result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001701 *__result = *__first;
1702 return __result;
1703}
1704
Louis Dionne65b433b2019-11-06 12:02:41 +00001705template <class _InputIterator, class _OutputIterator>
1706inline _LIBCPP_INLINE_VISIBILITY
1707_OutputIterator
1708__copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1709{
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05001710 return _VSTD::__copy_constexpr(__first, __last, __result);
Louis Dionne65b433b2019-11-06 12:02:41 +00001711}
1712
Howard Hinnantc51e1022010-05-11 19:42:16 +00001713template <class _Tp, class _Up>
1714inline _LIBCPP_INLINE_VISIBILITY
1715typename enable_if
1716<
1717 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnanta9a897e2010-11-19 22:17:28 +00001718 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001719 _Up*
1720>::type
1721__copy(_Tp* __first, _Tp* __last, _Up* __result)
1722{
1723 const size_t __n = static_cast<size_t>(__last - __first);
Marshall Clowc3ef9622015-06-02 13:52:16 +00001724 if (__n > 0)
1725 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001726 return __result + __n;
1727}
1728
1729template <class _InputIterator, class _OutputIterator>
Arthur O'Dwyer14606d12020-11-23 12:44:41 -05001730inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001731_OutputIterator
1732copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1733{
Louis Dionne65b433b2019-11-06 12:02:41 +00001734 if (__libcpp_is_constant_evaluated()) {
1735 return _VSTD::__copy_constexpr(
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05001736 _VSTD::__unwrap_iter(__first), _VSTD::__unwrap_iter(__last), _VSTD::__unwrap_iter(__result));
Louis Dionne65b433b2019-11-06 12:02:41 +00001737 } else {
1738 return _VSTD::__copy(
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05001739 _VSTD::__unwrap_iter(__first), _VSTD::__unwrap_iter(__last), _VSTD::__unwrap_iter(__result));
Louis Dionne65b433b2019-11-06 12:02:41 +00001740 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001741}
1742
1743// copy_backward
1744
Howard Hinnant7f229bc2013-02-06 21:03:39 +00001745template <class _BidirectionalIterator, class _OutputIterator>
Louis Dionne65b433b2019-11-06 12:02:41 +00001746inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
1747_OutputIterator
1748__copy_backward_constexpr(_BidirectionalIterator __first, _BidirectionalIterator __last, _OutputIterator __result)
1749{
1750 while (__first != __last)
1751 *--__result = *--__last;
1752 return __result;
1753}
1754
1755template <class _BidirectionalIterator, class _OutputIterator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001756inline _LIBCPP_INLINE_VISIBILITY
1757_OutputIterator
Howard Hinnant7f229bc2013-02-06 21:03:39 +00001758__copy_backward(_BidirectionalIterator __first, _BidirectionalIterator __last, _OutputIterator __result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001759{
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05001760 return _VSTD::__copy_backward_constexpr(__first, __last, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001761}
1762
1763template <class _Tp, class _Up>
1764inline _LIBCPP_INLINE_VISIBILITY
1765typename enable_if
1766<
1767 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnanta9a897e2010-11-19 22:17:28 +00001768 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001769 _Up*
1770>::type
1771__copy_backward(_Tp* __first, _Tp* __last, _Up* __result)
1772{
1773 const size_t __n = static_cast<size_t>(__last - __first);
Marshall Clowc3ef9622015-06-02 13:52:16 +00001774 if (__n > 0)
1775 {
1776 __result -= __n;
1777 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
1778 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001779 return __result;
1780}
1781
1782template <class _BidirectionalIterator1, class _BidirectionalIterator2>
Arthur O'Dwyer14606d12020-11-23 12:44:41 -05001783inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001784_BidirectionalIterator2
1785copy_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
1786 _BidirectionalIterator2 __result)
1787{
Louis Dionne65b433b2019-11-06 12:02:41 +00001788 if (__libcpp_is_constant_evaluated()) {
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05001789 return _VSTD::__copy_backward_constexpr(_VSTD::__unwrap_iter(__first),
1790 _VSTD::__unwrap_iter(__last),
1791 _VSTD::__unwrap_iter(__result));
Louis Dionne65b433b2019-11-06 12:02:41 +00001792 } else {
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05001793 return _VSTD::__copy_backward(_VSTD::__unwrap_iter(__first),
1794 _VSTD::__unwrap_iter(__last),
1795 _VSTD::__unwrap_iter(__result));
Louis Dionne65b433b2019-11-06 12:02:41 +00001796 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001797}
1798
1799// copy_if
1800
1801template<class _InputIterator, class _OutputIterator, class _Predicate>
Louis Dionne65b433b2019-11-06 12:02:41 +00001802inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001803_OutputIterator
1804copy_if(_InputIterator __first, _InputIterator __last,
1805 _OutputIterator __result, _Predicate __pred)
1806{
1807 for (; __first != __last; ++__first)
1808 {
1809 if (__pred(*__first))
1810 {
1811 *__result = *__first;
1812 ++__result;
1813 }
1814 }
1815 return __result;
1816}
1817
1818// copy_n
1819
1820template<class _InputIterator, class _Size, class _OutputIterator>
Arthur O'Dwyer14606d12020-11-23 12:44:41 -05001821inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001822typename enable_if
1823<
Eric Fiseliercd5a6772019-11-18 01:46:58 -05001824 __is_cpp17_input_iterator<_InputIterator>::value &&
1825 !__is_cpp17_random_access_iterator<_InputIterator>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001826 _OutputIterator
1827>::type
Eric Fiselier97ec07d2015-02-10 16:46:42 +00001828copy_n(_InputIterator __first, _Size __orig_n, _OutputIterator __result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001829{
Arthur O'Dwyer6e9069c2020-12-07 23:42:47 -05001830 typedef decltype(_VSTD::__convert_to_integral(__orig_n)) _IntegralSize;
Eric Fiselier97ec07d2015-02-10 16:46:42 +00001831 _IntegralSize __n = __orig_n;
Howard Hinnantcbc5dc02011-02-27 20:55:39 +00001832 if (__n > 0)
1833 {
Howard Hinnantc51e1022010-05-11 19:42:16 +00001834 *__result = *__first;
Howard Hinnantcbc5dc02011-02-27 20:55:39 +00001835 ++__result;
1836 for (--__n; __n > 0; --__n)
1837 {
1838 ++__first;
1839 *__result = *__first;
1840 ++__result;
1841 }
1842 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001843 return __result;
1844}
1845
1846template<class _InputIterator, class _Size, class _OutputIterator>
Arthur O'Dwyer14606d12020-11-23 12:44:41 -05001847inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001848typename enable_if
1849<
Eric Fiseliercd5a6772019-11-18 01:46:58 -05001850 __is_cpp17_random_access_iterator<_InputIterator>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001851 _OutputIterator
1852>::type
Eric Fiselier97ec07d2015-02-10 16:46:42 +00001853copy_n(_InputIterator __first, _Size __orig_n, _OutputIterator __result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001854{
Arthur O'Dwyer6e9069c2020-12-07 23:42:47 -05001855 typedef decltype(_VSTD::__convert_to_integral(__orig_n)) _IntegralSize;
Eric Fiselier97ec07d2015-02-10 16:46:42 +00001856 _IntegralSize __n = __orig_n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001857 return _VSTD::copy(__first, __first + __n, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001858}
1859
1860// move
1861
zoecarverd0279de2020-09-14 18:11:08 -04001862// __move_constexpr exists so that __move doesn't call itself when delegating to the constexpr
1863// version of __move.
Howard Hinnantc51e1022010-05-11 19:42:16 +00001864template <class _InputIterator, class _OutputIterator>
zoecarverd0279de2020-09-14 18:11:08 -04001865inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
Howard Hinnantc51e1022010-05-11 19:42:16 +00001866_OutputIterator
zoecarverd0279de2020-09-14 18:11:08 -04001867__move_constexpr(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001868{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00001869 for (; __first != __last; ++__first, (void) ++__result)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001870 *__result = _VSTD::move(*__first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001871 return __result;
1872}
1873
zoecarverd0279de2020-09-14 18:11:08 -04001874template <class _InputIterator, class _OutputIterator>
1875inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
1876_OutputIterator
1877__move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1878{
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05001879 return _VSTD::__move_constexpr(__first, __last, __result);
zoecarverd0279de2020-09-14 18:11:08 -04001880}
1881
Howard Hinnantc51e1022010-05-11 19:42:16 +00001882template <class _Tp, class _Up>
zoecarverd0279de2020-09-14 18:11:08 -04001883inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
Howard Hinnantc51e1022010-05-11 19:42:16 +00001884typename enable_if
1885<
1886 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnanta9a897e2010-11-19 22:17:28 +00001887 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001888 _Up*
1889>::type
1890__move(_Tp* __first, _Tp* __last, _Up* __result)
1891{
zoecarverd0279de2020-09-14 18:11:08 -04001892 if (__libcpp_is_constant_evaluated())
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05001893 return _VSTD::__move_constexpr(__first, __last, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001894 const size_t __n = static_cast<size_t>(__last - __first);
Marshall Clowc3ef9622015-06-02 13:52:16 +00001895 if (__n > 0)
1896 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001897 return __result + __n;
1898}
1899
1900template <class _InputIterator, class _OutputIterator>
zoecarverd0279de2020-09-14 18:11:08 -04001901inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001902_OutputIterator
1903move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1904{
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05001905 return _VSTD::__move(_VSTD::__unwrap_iter(__first), _VSTD::__unwrap_iter(__last), _VSTD::__unwrap_iter(__result));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001906}
1907
1908// move_backward
1909
zoecarverd0279de2020-09-14 18:11:08 -04001910// __move_backward_constexpr exists so that __move_backward doesn't call itself when delegating to
1911// the constexpr version of __move_backward.
Howard Hinnantc51e1022010-05-11 19:42:16 +00001912template <class _InputIterator, class _OutputIterator>
zoecarverd0279de2020-09-14 18:11:08 -04001913inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
Howard Hinnantc51e1022010-05-11 19:42:16 +00001914_OutputIterator
zoecarverd0279de2020-09-14 18:11:08 -04001915__move_backward_constexpr(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001916{
1917 while (__first != __last)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001918 *--__result = _VSTD::move(*--__last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001919 return __result;
1920}
1921
zoecarverd0279de2020-09-14 18:11:08 -04001922template <class _InputIterator, class _OutputIterator>
1923inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
1924_OutputIterator
1925__move_backward(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1926{
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05001927 return _VSTD::__move_backward_constexpr(__first, __last, __result);
zoecarverd0279de2020-09-14 18:11:08 -04001928}
1929
Howard Hinnantc51e1022010-05-11 19:42:16 +00001930template <class _Tp, class _Up>
zoecarverd0279de2020-09-14 18:11:08 -04001931inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
Howard Hinnantc51e1022010-05-11 19:42:16 +00001932typename enable_if
1933<
1934 is_same<typename remove_const<_Tp>::type, _Up>::value &&
Howard Hinnanta9a897e2010-11-19 22:17:28 +00001935 is_trivially_copy_assignable<_Up>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001936 _Up*
1937>::type
1938__move_backward(_Tp* __first, _Tp* __last, _Up* __result)
1939{
zoecarverd0279de2020-09-14 18:11:08 -04001940 if (__libcpp_is_constant_evaluated())
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05001941 return _VSTD::__move_backward_constexpr(__first, __last, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001942 const size_t __n = static_cast<size_t>(__last - __first);
Marshall Clowc3ef9622015-06-02 13:52:16 +00001943 if (__n > 0)
1944 {
1945 __result -= __n;
1946 _VSTD::memmove(__result, __first, __n * sizeof(_Up));
1947 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001948 return __result;
1949}
1950
1951template <class _BidirectionalIterator1, class _BidirectionalIterator2>
zoecarverd0279de2020-09-14 18:11:08 -04001952inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001953_BidirectionalIterator2
1954move_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
1955 _BidirectionalIterator2 __result)
1956{
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05001957 return _VSTD::__move_backward(_VSTD::__unwrap_iter(__first), _VSTD::__unwrap_iter(__last), _VSTD::__unwrap_iter(__result));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001958}
1959
1960// iter_swap
1961
Howard Hinnantdbfd4b42011-05-27 15:04:19 +00001962// moved to <type_traits> for better swap / noexcept support
Howard Hinnantc51e1022010-05-11 19:42:16 +00001963
1964// transform
1965
1966template <class _InputIterator, class _OutputIterator, class _UnaryOperation>
Marshall Clow31427c62018-01-19 17:45:39 +00001967inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001968_OutputIterator
1969transform(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _UnaryOperation __op)
1970{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00001971 for (; __first != __last; ++__first, (void) ++__result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001972 *__result = __op(*__first);
1973 return __result;
1974}
1975
1976template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _BinaryOperation>
Marshall Clow31427c62018-01-19 17:45:39 +00001977inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001978_OutputIterator
1979transform(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2,
1980 _OutputIterator __result, _BinaryOperation __binary_op)
1981{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00001982 for (; __first1 != __last1; ++__first1, (void) ++__first2, ++__result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001983 *__result = __binary_op(*__first1, *__first2);
1984 return __result;
1985}
1986
1987// replace
1988
1989template <class _ForwardIterator, class _Tp>
Marshall Clow01bbbd22018-01-19 18:07:29 +00001990inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00001991void
1992replace(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __old_value, const _Tp& __new_value)
1993{
1994 for (; __first != __last; ++__first)
1995 if (*__first == __old_value)
1996 *__first = __new_value;
1997}
1998
1999// replace_if
2000
2001template <class _ForwardIterator, class _Predicate, class _Tp>
Marshall Clow01bbbd22018-01-19 18:07:29 +00002002inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002003void
2004replace_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, const _Tp& __new_value)
2005{
2006 for (; __first != __last; ++__first)
2007 if (__pred(*__first))
2008 *__first = __new_value;
2009}
2010
2011// replace_copy
2012
2013template <class _InputIterator, class _OutputIterator, class _Tp>
Marshall Clow01bbbd22018-01-19 18:07:29 +00002014inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002015_OutputIterator
2016replace_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
2017 const _Tp& __old_value, const _Tp& __new_value)
2018{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00002019 for (; __first != __last; ++__first, (void) ++__result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002020 if (*__first == __old_value)
2021 *__result = __new_value;
2022 else
2023 *__result = *__first;
2024 return __result;
2025}
2026
2027// replace_copy_if
2028
2029template <class _InputIterator, class _OutputIterator, class _Predicate, class _Tp>
Marshall Clow01bbbd22018-01-19 18:07:29 +00002030inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002031_OutputIterator
2032replace_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
2033 _Predicate __pred, const _Tp& __new_value)
2034{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00002035 for (; __first != __last; ++__first, (void) ++__result)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002036 if (__pred(*__first))
2037 *__result = __new_value;
2038 else
2039 *__result = *__first;
2040 return __result;
2041}
2042
2043// fill_n
2044
2045template <class _OutputIterator, class _Size, class _Tp>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002046inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002047_OutputIterator
Howard Hinnant0ad1c122013-08-01 17:29:28 +00002048__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002049{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00002050 for (; __n > 0; ++__first, (void) --__n)
Howard Hinnantbf074022011-10-22 20:59:45 +00002051 *__first = __value_;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002052 return __first;
2053}
2054
Howard Hinnantc51e1022010-05-11 19:42:16 +00002055template <class _OutputIterator, class _Size, class _Tp>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002056inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002057_OutputIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00002058fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002059{
Arthur O'Dwyer6e9069c2020-12-07 23:42:47 -05002060 return _VSTD::__fill_n(__first, _VSTD::__convert_to_integral(__n), __value_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002061}
2062
2063// fill
2064
2065template <class _ForwardIterator, class _Tp>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002066inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002067void
Howard Hinnantbf074022011-10-22 20:59:45 +00002068__fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, forward_iterator_tag)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002069{
2070 for (; __first != __last; ++__first)
Howard Hinnantbf074022011-10-22 20:59:45 +00002071 *__first = __value_;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002072}
2073
2074template <class _RandomAccessIterator, class _Tp>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002075inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002076void
Howard Hinnantbf074022011-10-22 20:59:45 +00002077__fill(_RandomAccessIterator __first, _RandomAccessIterator __last, const _Tp& __value_, random_access_iterator_tag)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002078{
Howard Hinnantbf074022011-10-22 20:59:45 +00002079 _VSTD::fill_n(__first, __last - __first, __value_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002080}
2081
2082template <class _ForwardIterator, class _Tp>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002083inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002084void
Howard Hinnantbf074022011-10-22 20:59:45 +00002085fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002086{
Howard Hinnantbf074022011-10-22 20:59:45 +00002087 _VSTD::__fill(__first, __last, __value_, typename iterator_traits<_ForwardIterator>::iterator_category());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002088}
2089
2090// generate
2091
2092template <class _ForwardIterator, class _Generator>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002093inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002094void
2095generate(_ForwardIterator __first, _ForwardIterator __last, _Generator __gen)
2096{
2097 for (; __first != __last; ++__first)
2098 *__first = __gen();
2099}
2100
2101// generate_n
2102
2103template <class _OutputIterator, class _Size, class _Generator>
Nico Weber471b10a2019-04-03 18:13:08 +00002104inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002105_OutputIterator
Eric Fiselier97ec07d2015-02-10 16:46:42 +00002106generate_n(_OutputIterator __first, _Size __orig_n, _Generator __gen)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002107{
Arthur O'Dwyer6e9069c2020-12-07 23:42:47 -05002108 typedef decltype(_VSTD::__convert_to_integral(__orig_n)) _IntegralSize;
Eric Fiselier97ec07d2015-02-10 16:46:42 +00002109 _IntegralSize __n = __orig_n;
Eric Fiseliera09a3b42014-10-27 19:28:20 +00002110 for (; __n > 0; ++__first, (void) --__n)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002111 *__first = __gen();
2112 return __first;
2113}
2114
2115// remove
2116
2117template <class _ForwardIterator, class _Tp>
Nico Weber471b10a2019-04-03 18:13:08 +00002118_LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00002119remove(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002120{
Howard Hinnantbf074022011-10-22 20:59:45 +00002121 __first = _VSTD::find(__first, __last, __value_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002122 if (__first != __last)
2123 {
2124 _ForwardIterator __i = __first;
2125 while (++__i != __last)
2126 {
Howard Hinnantbf074022011-10-22 20:59:45 +00002127 if (!(*__i == __value_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002128 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002129 *__first = _VSTD::move(*__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002130 ++__first;
2131 }
2132 }
2133 }
2134 return __first;
2135}
2136
2137// remove_if
2138
2139template <class _ForwardIterator, class _Predicate>
Nico Weber471b10a2019-04-03 18:13:08 +00002140_LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00002141remove_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
2142{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002143 __first = _VSTD::find_if<_ForwardIterator, typename add_lvalue_reference<_Predicate>::type>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002144 (__first, __last, __pred);
2145 if (__first != __last)
2146 {
2147 _ForwardIterator __i = __first;
2148 while (++__i != __last)
2149 {
2150 if (!__pred(*__i))
2151 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002152 *__first = _VSTD::move(*__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002153 ++__first;
2154 }
2155 }
2156 }
2157 return __first;
2158}
2159
2160// remove_copy
2161
2162template <class _InputIterator, class _OutputIterator, class _Tp>
Marshall Clow7c0fbd82018-01-22 21:43:04 +00002163inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002164_OutputIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00002165remove_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002166{
2167 for (; __first != __last; ++__first)
2168 {
Howard Hinnantbf074022011-10-22 20:59:45 +00002169 if (!(*__first == __value_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002170 {
2171 *__result = *__first;
2172 ++__result;
2173 }
2174 }
2175 return __result;
2176}
2177
2178// remove_copy_if
2179
2180template <class _InputIterator, class _OutputIterator, class _Predicate>
Marshall Clow7c0fbd82018-01-22 21:43:04 +00002181inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002182_OutputIterator
2183remove_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Predicate __pred)
2184{
2185 for (; __first != __last; ++__first)
2186 {
2187 if (!__pred(*__first))
2188 {
2189 *__result = *__first;
2190 ++__result;
2191 }
2192 }
2193 return __result;
2194}
2195
2196// unique
2197
2198template <class _ForwardIterator, class _BinaryPredicate>
Nico Weber471b10a2019-04-03 18:13:08 +00002199_LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00002200unique(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred)
2201{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002202 __first = _VSTD::adjacent_find<_ForwardIterator, typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002203 (__first, __last, __pred);
2204 if (__first != __last)
2205 {
2206 // ... a a ? ...
2207 // f i
2208 _ForwardIterator __i = __first;
2209 for (++__i; ++__i != __last;)
2210 if (!__pred(*__first, *__i))
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002211 *++__first = _VSTD::move(*__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002212 ++__first;
2213 }
2214 return __first;
2215}
2216
2217template <class _ForwardIterator>
Nico Weber471b10a2019-04-03 18:13:08 +00002218_LIBCPP_NODISCARD_EXT inline
2219_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002220_ForwardIterator
2221unique(_ForwardIterator __first, _ForwardIterator __last)
2222{
2223 typedef typename iterator_traits<_ForwardIterator>::value_type __v;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002224 return _VSTD::unique(__first, __last, __equal_to<__v>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002225}
2226
2227// unique_copy
2228
2229template <class _BinaryPredicate, class _InputIterator, class _OutputIterator>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002230_LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00002231__unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred,
2232 input_iterator_tag, output_iterator_tag)
2233{
2234 if (__first != __last)
2235 {
2236 typename iterator_traits<_InputIterator>::value_type __t(*__first);
2237 *__result = __t;
2238 ++__result;
2239 while (++__first != __last)
2240 {
2241 if (!__pred(__t, *__first))
2242 {
2243 __t = *__first;
2244 *__result = __t;
2245 ++__result;
2246 }
2247 }
2248 }
2249 return __result;
2250}
2251
2252template <class _BinaryPredicate, class _ForwardIterator, class _OutputIterator>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002253_LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00002254__unique_copy(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result, _BinaryPredicate __pred,
2255 forward_iterator_tag, output_iterator_tag)
2256{
2257 if (__first != __last)
2258 {
2259 _ForwardIterator __i = __first;
2260 *__result = *__i;
2261 ++__result;
2262 while (++__first != __last)
2263 {
2264 if (!__pred(*__i, *__first))
2265 {
2266 *__result = *__first;
2267 ++__result;
2268 __i = __first;
2269 }
2270 }
2271 }
2272 return __result;
2273}
2274
2275template <class _BinaryPredicate, class _InputIterator, class _ForwardIterator>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002276_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00002277__unique_copy(_InputIterator __first, _InputIterator __last, _ForwardIterator __result, _BinaryPredicate __pred,
2278 input_iterator_tag, forward_iterator_tag)
2279{
2280 if (__first != __last)
2281 {
2282 *__result = *__first;
2283 while (++__first != __last)
2284 if (!__pred(*__result, *__first))
2285 *++__result = *__first;
2286 ++__result;
2287 }
2288 return __result;
2289}
2290
Howard Hinnantc51e1022010-05-11 19:42:16 +00002291template <class _InputIterator, class _OutputIterator, class _BinaryPredicate>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002292inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002293_OutputIterator
2294unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred)
2295{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002296 return _VSTD::__unique_copy<typename add_lvalue_reference<_BinaryPredicate>::type>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002297 (__first, __last, __result, __pred,
2298 typename iterator_traits<_InputIterator>::iterator_category(),
2299 typename iterator_traits<_OutputIterator>::iterator_category());
2300}
2301
2302template <class _InputIterator, class _OutputIterator>
Marshall Clowe9cdc5c2018-01-20 20:14:32 +00002303inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002304_OutputIterator
2305unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
2306{
2307 typedef typename iterator_traits<_InputIterator>::value_type __v;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002308 return _VSTD::unique_copy(__first, __last, __result, __equal_to<__v>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002309}
2310
2311// reverse
2312
2313template <class _BidirectionalIterator>
2314inline _LIBCPP_INLINE_VISIBILITY
2315void
2316__reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirectional_iterator_tag)
2317{
2318 while (__first != __last)
2319 {
2320 if (__first == --__last)
2321 break;
Marshall Clow2ad71042015-11-02 21:34:25 +00002322 _VSTD::iter_swap(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002323 ++__first;
2324 }
2325}
2326
2327template <class _RandomAccessIterator>
2328inline _LIBCPP_INLINE_VISIBILITY
2329void
2330__reverse(_RandomAccessIterator __first, _RandomAccessIterator __last, random_access_iterator_tag)
2331{
2332 if (__first != __last)
2333 for (; __first < --__last; ++__first)
Marshall Clow2ad71042015-11-02 21:34:25 +00002334 _VSTD::iter_swap(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002335}
2336
2337template <class _BidirectionalIterator>
2338inline _LIBCPP_INLINE_VISIBILITY
2339void
2340reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
2341{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002342 _VSTD::__reverse(__first, __last, typename iterator_traits<_BidirectionalIterator>::iterator_category());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002343}
2344
2345// reverse_copy
2346
2347template <class _BidirectionalIterator, class _OutputIterator>
Marshall Clow7c0fbd82018-01-22 21:43:04 +00002348inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002349_OutputIterator
2350reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last, _OutputIterator __result)
2351{
2352 for (; __first != __last; ++__result)
2353 *__result = *--__last;
2354 return __result;
2355}
2356
2357// rotate
2358
2359template <class _ForwardIterator>
zoecarverd0279de2020-09-14 18:11:08 -04002360_LIBCPP_CONSTEXPR_AFTER_CXX11 _ForwardIterator
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002361__rotate_left(_ForwardIterator __first, _ForwardIterator __last)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002362{
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002363 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
2364 value_type __tmp = _VSTD::move(*__first);
2365 _ForwardIterator __lm1 = _VSTD::move(_VSTD::next(__first), __last, __first);
2366 *__lm1 = _VSTD::move(__tmp);
2367 return __lm1;
2368}
2369
2370template <class _BidirectionalIterator>
zoecarverd0279de2020-09-14 18:11:08 -04002371_LIBCPP_CONSTEXPR_AFTER_CXX11 _BidirectionalIterator
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002372__rotate_right(_BidirectionalIterator __first, _BidirectionalIterator __last)
2373{
2374 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
2375 _BidirectionalIterator __lm1 = _VSTD::prev(__last);
2376 value_type __tmp = _VSTD::move(*__lm1);
2377 _BidirectionalIterator __fp1 = _VSTD::move_backward(__first, __lm1, __last);
2378 *__first = _VSTD::move(__tmp);
2379 return __fp1;
2380}
2381
2382template <class _ForwardIterator>
zoecarverd0279de2020-09-14 18:11:08 -04002383_LIBCPP_CONSTEXPR_AFTER_CXX14 _ForwardIterator
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002384__rotate_forward(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last)
2385{
Howard Hinnantc51e1022010-05-11 19:42:16 +00002386 _ForwardIterator __i = __middle;
2387 while (true)
2388 {
2389 swap(*__first, *__i);
2390 ++__first;
2391 if (++__i == __last)
2392 break;
2393 if (__first == __middle)
2394 __middle = __i;
2395 }
2396 _ForwardIterator __r = __first;
2397 if (__first != __middle)
2398 {
2399 __i = __middle;
2400 while (true)
2401 {
2402 swap(*__first, *__i);
2403 ++__first;
2404 if (++__i == __last)
2405 {
2406 if (__first == __middle)
2407 break;
2408 __i = __middle;
2409 }
2410 else if (__first == __middle)
2411 __middle = __i;
2412 }
2413 }
2414 return __r;
2415}
2416
2417template<typename _Integral>
2418inline _LIBCPP_INLINE_VISIBILITY
zoecarverd0279de2020-09-14 18:11:08 -04002419_LIBCPP_CONSTEXPR_AFTER_CXX14 _Integral
Marshall Clowb8bfc2c2016-07-26 14:29:45 +00002420__algo_gcd(_Integral __x, _Integral __y)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002421{
2422 do
2423 {
2424 _Integral __t = __x % __y;
2425 __x = __y;
2426 __y = __t;
2427 } while (__y);
2428 return __x;
2429}
2430
2431template<typename _RandomAccessIterator>
zoecarverd0279de2020-09-14 18:11:08 -04002432_LIBCPP_CONSTEXPR_AFTER_CXX14 _RandomAccessIterator
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002433__rotate_gcd(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002434{
2435 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
2436 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002437
Howard Hinnantc51e1022010-05-11 19:42:16 +00002438 const difference_type __m1 = __middle - __first;
2439 const difference_type __m2 = __last - __middle;
2440 if (__m1 == __m2)
2441 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002442 _VSTD::swap_ranges(__first, __middle, __middle);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002443 return __middle;
2444 }
Marshall Clowb8bfc2c2016-07-26 14:29:45 +00002445 const difference_type __g = _VSTD::__algo_gcd(__m1, __m2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002446 for (_RandomAccessIterator __p = __first + __g; __p != __first;)
2447 {
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002448 value_type __t(_VSTD::move(*--__p));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002449 _RandomAccessIterator __p1 = __p;
2450 _RandomAccessIterator __p2 = __p1 + __m1;
2451 do
2452 {
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002453 *__p1 = _VSTD::move(*__p2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002454 __p1 = __p2;
2455 const difference_type __d = __last - __p2;
2456 if (__m1 < __d)
2457 __p2 += __m1;
2458 else
2459 __p2 = __first + (__m1 - __d);
2460 } while (__p2 != __p);
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002461 *__p1 = _VSTD::move(__t);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002462 }
2463 return __first + __m2;
2464}
2465
2466template <class _ForwardIterator>
2467inline _LIBCPP_INLINE_VISIBILITY
zoecarverd0279de2020-09-14 18:11:08 -04002468_LIBCPP_CONSTEXPR_AFTER_CXX11 _ForwardIterator
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002469__rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last,
2470 _VSTD::forward_iterator_tag)
2471{
2472 typedef typename _VSTD::iterator_traits<_ForwardIterator>::value_type value_type;
2473 if (_VSTD::is_trivially_move_assignable<value_type>::value)
2474 {
2475 if (_VSTD::next(__first) == __middle)
2476 return _VSTD::__rotate_left(__first, __last);
2477 }
2478 return _VSTD::__rotate_forward(__first, __middle, __last);
2479}
2480
2481template <class _BidirectionalIterator>
2482inline _LIBCPP_INLINE_VISIBILITY
zoecarverd0279de2020-09-14 18:11:08 -04002483_LIBCPP_CONSTEXPR_AFTER_CXX11 _BidirectionalIterator
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002484__rotate(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
2485 _VSTD::bidirectional_iterator_tag)
2486{
2487 typedef typename _VSTD::iterator_traits<_BidirectionalIterator>::value_type value_type;
2488 if (_VSTD::is_trivially_move_assignable<value_type>::value)
2489 {
2490 if (_VSTD::next(__first) == __middle)
2491 return _VSTD::__rotate_left(__first, __last);
2492 if (_VSTD::next(__middle) == __last)
2493 return _VSTD::__rotate_right(__first, __last);
2494 }
2495 return _VSTD::__rotate_forward(__first, __middle, __last);
2496}
2497
2498template <class _RandomAccessIterator>
2499inline _LIBCPP_INLINE_VISIBILITY
zoecarverd0279de2020-09-14 18:11:08 -04002500_LIBCPP_CONSTEXPR_AFTER_CXX11 _RandomAccessIterator
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002501__rotate(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
2502 _VSTD::random_access_iterator_tag)
2503{
2504 typedef typename _VSTD::iterator_traits<_RandomAccessIterator>::value_type value_type;
2505 if (_VSTD::is_trivially_move_assignable<value_type>::value)
2506 {
2507 if (_VSTD::next(__first) == __middle)
2508 return _VSTD::__rotate_left(__first, __last);
2509 if (_VSTD::next(__middle) == __last)
2510 return _VSTD::__rotate_right(__first, __last);
2511 return _VSTD::__rotate_gcd(__first, __middle, __last);
2512 }
2513 return _VSTD::__rotate_forward(__first, __middle, __last);
2514}
2515
2516template <class _ForwardIterator>
2517inline _LIBCPP_INLINE_VISIBILITY
zoecarverd0279de2020-09-14 18:11:08 -04002518_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00002519rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last)
2520{
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002521 if (__first == __middle)
2522 return __last;
2523 if (__middle == __last)
2524 return __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002525 return _VSTD::__rotate(__first, __middle, __last,
Howard Hinnant5fec4ff2012-08-03 18:01:20 +00002526 typename _VSTD::iterator_traits<_ForwardIterator>::iterator_category());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002527}
2528
2529// rotate_copy
2530
2531template <class _ForwardIterator, class _OutputIterator>
Nicholas-Baron7fd82722020-09-14 16:37:41 -04002532inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00002533_OutputIterator
2534rotate_copy(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last, _OutputIterator __result)
2535{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002536 return _VSTD::copy(__first, __middle, _VSTD::copy(__middle, __last, __result));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002537}
2538
Howard Hinnantc51e1022010-05-11 19:42:16 +00002539// min_element
2540
2541template <class _ForwardIterator, class _Compare>
Nico Weber471b10a2019-04-03 18:13:08 +00002542_LIBCPP_NODISCARD_EXT inline
2543_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantc51e1022010-05-11 19:42:16 +00002544_ForwardIterator
Marshall Clow9e173072015-05-10 13:53:31 +00002545min_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002546{
Eric Fiseliercd5a6772019-11-18 01:46:58 -05002547 static_assert(__is_cpp17_forward_iterator<_ForwardIterator>::value,
Eric Fiselierf8ecd942018-08-22 17:47:13 +00002548 "std::min_element requires a ForwardIterator");
Howard Hinnantc51e1022010-05-11 19:42:16 +00002549 if (__first != __last)
2550 {
2551 _ForwardIterator __i = __first;
2552 while (++__i != __last)
2553 if (__comp(*__i, *__first))
2554 __first = __i;
2555 }
2556 return __first;
2557}
2558
2559template <class _ForwardIterator>
Nico Weber471b10a2019-04-03 18:13:08 +00002560_LIBCPP_NODISCARD_EXT inline
2561_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantc51e1022010-05-11 19:42:16 +00002562_ForwardIterator
2563min_element(_ForwardIterator __first, _ForwardIterator __last)
2564{
Marshall Clow9e173072015-05-10 13:53:31 +00002565 return _VSTD::min_element(__first, __last,
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002566 __less<typename iterator_traits<_ForwardIterator>::value_type>());
2567}
2568
2569// min
2570
2571template <class _Tp, class _Compare>
Nico Weber471b10a2019-04-03 18:13:08 +00002572_LIBCPP_NODISCARD_EXT inline
2573_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002574const _Tp&
2575min(const _Tp& __a, const _Tp& __b, _Compare __comp)
2576{
2577 return __comp(__b, __a) ? __b : __a;
2578}
2579
2580template <class _Tp>
Nico Weber471b10a2019-04-03 18:13:08 +00002581_LIBCPP_NODISCARD_EXT inline
2582_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002583const _Tp&
2584min(const _Tp& __a, const _Tp& __b)
2585{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002586 return _VSTD::min(__a, __b, __less<_Tp>());
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002587}
2588
Eric Fiselier93dd1372017-04-18 23:26:47 +00002589#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002590
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002591template<class _Tp, class _Compare>
Nico Weber471b10a2019-04-03 18:13:08 +00002592_LIBCPP_NODISCARD_EXT inline
2593_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002594_Tp
2595min(initializer_list<_Tp> __t, _Compare __comp)
2596{
Marshall Clow9e173072015-05-10 13:53:31 +00002597 return *_VSTD::min_element(__t.begin(), __t.end(), __comp);
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002598}
2599
2600template<class _Tp>
Nico Weber471b10a2019-04-03 18:13:08 +00002601_LIBCPP_NODISCARD_EXT inline
2602_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002603_Tp
2604min(initializer_list<_Tp> __t)
2605{
Marshall Clow9e173072015-05-10 13:53:31 +00002606 return *_VSTD::min_element(__t.begin(), __t.end(), __less<_Tp>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002607}
2608
Eric Fiselier93dd1372017-04-18 23:26:47 +00002609#endif // _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002610
Howard Hinnantc51e1022010-05-11 19:42:16 +00002611// max_element
2612
2613template <class _ForwardIterator, class _Compare>
Nico Weber471b10a2019-04-03 18:13:08 +00002614_LIBCPP_NODISCARD_EXT inline
2615_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantc51e1022010-05-11 19:42:16 +00002616_ForwardIterator
Marshall Clow9e173072015-05-10 13:53:31 +00002617max_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002618{
Eric Fiseliercd5a6772019-11-18 01:46:58 -05002619 static_assert(__is_cpp17_forward_iterator<_ForwardIterator>::value,
Eric Fiselierf8ecd942018-08-22 17:47:13 +00002620 "std::max_element requires a ForwardIterator");
Howard Hinnantc51e1022010-05-11 19:42:16 +00002621 if (__first != __last)
2622 {
2623 _ForwardIterator __i = __first;
2624 while (++__i != __last)
2625 if (__comp(*__first, *__i))
2626 __first = __i;
2627 }
2628 return __first;
2629}
2630
Marshall Clowe9dca072014-02-19 16:51:35 +00002631
Howard Hinnantc51e1022010-05-11 19:42:16 +00002632template <class _ForwardIterator>
Nico Weber471b10a2019-04-03 18:13:08 +00002633_LIBCPP_NODISCARD_EXT inline
2634_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantc51e1022010-05-11 19:42:16 +00002635_ForwardIterator
2636max_element(_ForwardIterator __first, _ForwardIterator __last)
2637{
Marshall Clow9e173072015-05-10 13:53:31 +00002638 return _VSTD::max_element(__first, __last,
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002639 __less<typename iterator_traits<_ForwardIterator>::value_type>());
2640}
2641
2642// max
2643
2644template <class _Tp, class _Compare>
Nico Weber471b10a2019-04-03 18:13:08 +00002645_LIBCPP_NODISCARD_EXT inline
2646_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002647const _Tp&
2648max(const _Tp& __a, const _Tp& __b, _Compare __comp)
2649{
2650 return __comp(__a, __b) ? __b : __a;
2651}
2652
2653template <class _Tp>
Nico Weber471b10a2019-04-03 18:13:08 +00002654_LIBCPP_NODISCARD_EXT inline
2655_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002656const _Tp&
2657max(const _Tp& __a, const _Tp& __b)
2658{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002659 return _VSTD::max(__a, __b, __less<_Tp>());
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002660}
2661
Eric Fiselier93dd1372017-04-18 23:26:47 +00002662#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002663
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002664template<class _Tp, class _Compare>
Nico Weber471b10a2019-04-03 18:13:08 +00002665_LIBCPP_NODISCARD_EXT inline
2666_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002667_Tp
2668max(initializer_list<_Tp> __t, _Compare __comp)
2669{
Marshall Clow9e173072015-05-10 13:53:31 +00002670 return *_VSTD::max_element(__t.begin(), __t.end(), __comp);
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002671}
2672
2673template<class _Tp>
Nico Weber471b10a2019-04-03 18:13:08 +00002674_LIBCPP_NODISCARD_EXT inline
2675_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002676_Tp
2677max(initializer_list<_Tp> __t)
2678{
Marshall Clow9e173072015-05-10 13:53:31 +00002679 return *_VSTD::max_element(__t.begin(), __t.end(), __less<_Tp>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002680}
2681
Eric Fiselier93dd1372017-04-18 23:26:47 +00002682#endif // _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002683
Marshall Clow3e18d0e2016-03-07 22:43:49 +00002684#if _LIBCPP_STD_VER > 14
2685// clamp
2686template<class _Tp, class _Compare>
Nico Weber471b10a2019-04-03 18:13:08 +00002687_LIBCPP_NODISCARD_EXT inline
2688_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Marshall Clow3e18d0e2016-03-07 22:43:49 +00002689const _Tp&
2690clamp(const _Tp& __v, const _Tp& __lo, const _Tp& __hi, _Compare __comp)
2691{
2692 _LIBCPP_ASSERT(!__comp(__hi, __lo), "Bad bounds passed to std::clamp");
2693 return __comp(__v, __lo) ? __lo : __comp(__hi, __v) ? __hi : __v;
2694
2695}
2696
2697template<class _Tp>
Nico Weber471b10a2019-04-03 18:13:08 +00002698_LIBCPP_NODISCARD_EXT inline
2699_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Marshall Clow3e18d0e2016-03-07 22:43:49 +00002700const _Tp&
2701clamp(const _Tp& __v, const _Tp& __lo, const _Tp& __hi)
2702{
2703 return _VSTD::clamp(__v, __lo, __hi, __less<_Tp>());
2704}
2705#endif
2706
Howard Hinnantc51e1022010-05-11 19:42:16 +00002707// minmax_element
2708
2709template <class _ForwardIterator, class _Compare>
Nico Weber471b10a2019-04-03 18:13:08 +00002710_LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_AFTER_CXX11
Arthur O'Dwyer07b22492020-11-27 11:02:06 -05002711pair<_ForwardIterator, _ForwardIterator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002712minmax_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
2713{
Eric Fiseliercd5a6772019-11-18 01:46:58 -05002714 static_assert(__is_cpp17_forward_iterator<_ForwardIterator>::value,
Eric Fiselierf8ecd942018-08-22 17:47:13 +00002715 "std::minmax_element requires a ForwardIterator");
Arthur O'Dwyer07b22492020-11-27 11:02:06 -05002716 pair<_ForwardIterator, _ForwardIterator> __result(__first, __first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002717 if (__first != __last)
2718 {
2719 if (++__first != __last)
2720 {
2721 if (__comp(*__first, *__result.first))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002722 __result.first = __first;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002723 else
2724 __result.second = __first;
2725 while (++__first != __last)
2726 {
2727 _ForwardIterator __i = __first;
2728 if (++__first == __last)
2729 {
2730 if (__comp(*__i, *__result.first))
2731 __result.first = __i;
2732 else if (!__comp(*__i, *__result.second))
2733 __result.second = __i;
2734 break;
2735 }
2736 else
2737 {
2738 if (__comp(*__first, *__i))
2739 {
2740 if (__comp(*__first, *__result.first))
2741 __result.first = __first;
2742 if (!__comp(*__i, *__result.second))
2743 __result.second = __i;
2744 }
2745 else
2746 {
2747 if (__comp(*__i, *__result.first))
2748 __result.first = __i;
2749 if (!__comp(*__first, *__result.second))
2750 __result.second = __first;
2751 }
2752 }
2753 }
2754 }
2755 }
2756 return __result;
2757}
2758
2759template <class _ForwardIterator>
Nico Weber471b10a2019-04-03 18:13:08 +00002760_LIBCPP_NODISCARD_EXT inline
2761_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Arthur O'Dwyer07b22492020-11-27 11:02:06 -05002762pair<_ForwardIterator, _ForwardIterator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002763minmax_element(_ForwardIterator __first, _ForwardIterator __last)
2764{
Marshall Clowe9dca072014-02-19 16:51:35 +00002765 return _VSTD::minmax_element(__first, __last,
2766 __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002767}
2768
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002769// minmax
2770
2771template<class _Tp, class _Compare>
Nico Weber471b10a2019-04-03 18:13:08 +00002772_LIBCPP_NODISCARD_EXT inline
2773_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002774pair<const _Tp&, const _Tp&>
2775minmax(const _Tp& __a, const _Tp& __b, _Compare __comp)
2776{
2777 return __comp(__b, __a) ? pair<const _Tp&, const _Tp&>(__b, __a) :
2778 pair<const _Tp&, const _Tp&>(__a, __b);
2779}
2780
2781template<class _Tp>
Nico Weber471b10a2019-04-03 18:13:08 +00002782_LIBCPP_NODISCARD_EXT inline
2783_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002784pair<const _Tp&, const _Tp&>
2785minmax(const _Tp& __a, const _Tp& __b)
2786{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002787 return _VSTD::minmax(__a, __b, __less<_Tp>());
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002788}
2789
Eric Fiselier93dd1372017-04-18 23:26:47 +00002790#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002791
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002792template<class _Tp, class _Compare>
Nico Weber471b10a2019-04-03 18:13:08 +00002793_LIBCPP_NODISCARD_EXT inline
2794_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002795pair<_Tp, _Tp>
2796minmax(initializer_list<_Tp> __t, _Compare __comp)
2797{
Marshall Clowe9dca072014-02-19 16:51:35 +00002798 typedef typename initializer_list<_Tp>::const_iterator _Iter;
2799 _Iter __first = __t.begin();
2800 _Iter __last = __t.end();
Arthur O'Dwyer07b22492020-11-27 11:02:06 -05002801 pair<_Tp, _Tp> __result(*__first, *__first);
Marshall Clowe9dca072014-02-19 16:51:35 +00002802
2803 ++__first;
2804 if (__t.size() % 2 == 0)
2805 {
2806 if (__comp(*__first, __result.first))
2807 __result.first = *__first;
2808 else
2809 __result.second = *__first;
2810 ++__first;
2811 }
Aditya Kumar3a0179a2016-08-25 11:52:38 +00002812
Marshall Clowe9dca072014-02-19 16:51:35 +00002813 while (__first != __last)
2814 {
2815 _Tp __prev = *__first++;
Marshall Clow447713a2015-02-11 15:41:34 +00002816 if (__comp(*__first, __prev)) {
2817 if ( __comp(*__first, __result.first)) __result.first = *__first;
2818 if (!__comp(__prev, __result.second)) __result.second = __prev;
Marshall Clowe9dca072014-02-19 16:51:35 +00002819 }
2820 else {
Marshall Clow447713a2015-02-11 15:41:34 +00002821 if ( __comp(__prev, __result.first)) __result.first = __prev;
2822 if (!__comp(*__first, __result.second)) __result.second = *__first;
Marshall Clowe9dca072014-02-19 16:51:35 +00002823 }
Aditya Kumar3a0179a2016-08-25 11:52:38 +00002824
Marshall Clowe9dca072014-02-19 16:51:35 +00002825 __first++;
2826 }
2827 return __result;
2828}
2829
2830template<class _Tp>
Nico Weber471b10a2019-04-03 18:13:08 +00002831_LIBCPP_NODISCARD_EXT inline
2832_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Marshall Clowe9dca072014-02-19 16:51:35 +00002833pair<_Tp, _Tp>
2834minmax(initializer_list<_Tp> __t)
2835{
2836 return _VSTD::minmax(__t, __less<_Tp>());
Howard Hinnantb120e7a2010-08-21 20:10:01 +00002837}
2838
Eric Fiselier93dd1372017-04-18 23:26:47 +00002839#endif // _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002840
Howard Hinnantc51e1022010-05-11 19:42:16 +00002841// random_shuffle
2842
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002843// __independent_bits_engine
2844
Howard Hinnantc834c512011-11-29 18:15:50 +00002845template <unsigned long long _Xp, size_t _Rp>
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002846struct __log2_imp
Howard Hinnantc51e1022010-05-11 19:42:16 +00002847{
Howard Hinnantc834c512011-11-29 18:15:50 +00002848 static const size_t value = _Xp & ((unsigned long long)(1) << _Rp) ? _Rp
2849 : __log2_imp<_Xp, _Rp - 1>::value;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002850};
2851
Howard Hinnantc834c512011-11-29 18:15:50 +00002852template <unsigned long long _Xp>
2853struct __log2_imp<_Xp, 0>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002854{
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002855 static const size_t value = 0;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002856};
2857
Howard Hinnantc834c512011-11-29 18:15:50 +00002858template <size_t _Rp>
2859struct __log2_imp<0, _Rp>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002860{
Howard Hinnantc834c512011-11-29 18:15:50 +00002861 static const size_t value = _Rp + 1;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002862};
2863
Eric Fiselier4638fca2017-05-31 21:20:18 +00002864template <class _UIntType, _UIntType _Xp>
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002865struct __log2
Howard Hinnantc51e1022010-05-11 19:42:16 +00002866{
Howard Hinnantc834c512011-11-29 18:15:50 +00002867 static const size_t value = __log2_imp<_Xp,
Eric Fiselier4638fca2017-05-31 21:20:18 +00002868 sizeof(_UIntType) * __CHAR_BIT__ - 1>::value;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002869};
2870
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002871template<class _Engine, class _UIntType>
2872class __independent_bits_engine
Howard Hinnantc51e1022010-05-11 19:42:16 +00002873{
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002874public:
2875 // types
2876 typedef _UIntType result_type;
2877
2878private:
2879 typedef typename _Engine::result_type _Engine_result_type;
2880 typedef typename conditional
2881 <
2882 sizeof(_Engine_result_type) <= sizeof(result_type),
2883 result_type,
2884 _Engine_result_type
2885 >::type _Working_result_type;
2886
2887 _Engine& __e_;
2888 size_t __w_;
2889 size_t __w0_;
2890 size_t __n_;
2891 size_t __n0_;
2892 _Working_result_type __y0_;
2893 _Working_result_type __y1_;
2894 _Engine_result_type __mask0_;
2895 _Engine_result_type __mask1_;
2896
Eric Fiselier93dd1372017-04-18 23:26:47 +00002897#ifdef _LIBCPP_CXX03_LANG
Howard Hinnantc834c512011-11-29 18:15:50 +00002898 static const _Working_result_type _Rp = _Engine::_Max - _Engine::_Min
Howard Hinnant5a646852012-04-02 21:00:45 +00002899 + _Working_result_type(1);
2900#else
2901 static _LIBCPP_CONSTEXPR const _Working_result_type _Rp = _Engine::max() - _Engine::min()
2902 + _Working_result_type(1);
2903#endif
2904 static _LIBCPP_CONSTEXPR const size_t __m = __log2<_Working_result_type, _Rp>::value;
2905 static _LIBCPP_CONSTEXPR const size_t _WDt = numeric_limits<_Working_result_type>::digits;
2906 static _LIBCPP_CONSTEXPR const size_t _EDt = numeric_limits<_Engine_result_type>::digits;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002907
2908public:
2909 // constructors and seeding functions
2910 __independent_bits_engine(_Engine& __e, size_t __w);
2911
2912 // generating functions
Howard Hinnantc834c512011-11-29 18:15:50 +00002913 result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>());}
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002914
2915private:
Marshall Clowfe778582017-09-20 19:38:43 +00002916 result_type __eval(false_type);
2917 result_type __eval(true_type);
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002918};
2919
2920template<class _Engine, class _UIntType>
2921__independent_bits_engine<_Engine, _UIntType>
2922 ::__independent_bits_engine(_Engine& __e, size_t __w)
2923 : __e_(__e),
2924 __w_(__w)
2925{
2926 __n_ = __w_ / __m + (__w_ % __m != 0);
2927 __w0_ = __w_ / __n_;
Howard Hinnantc834c512011-11-29 18:15:50 +00002928 if (_Rp == 0)
2929 __y0_ = _Rp;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002930 else if (__w0_ < _WDt)
Howard Hinnantc834c512011-11-29 18:15:50 +00002931 __y0_ = (_Rp >> __w0_) << __w0_;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002932 else
2933 __y0_ = 0;
Howard Hinnantc834c512011-11-29 18:15:50 +00002934 if (_Rp - __y0_ > __y0_ / __n_)
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002935 {
2936 ++__n_;
2937 __w0_ = __w_ / __n_;
2938 if (__w0_ < _WDt)
Howard Hinnantc834c512011-11-29 18:15:50 +00002939 __y0_ = (_Rp >> __w0_) << __w0_;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002940 else
2941 __y0_ = 0;
2942 }
2943 __n0_ = __n_ - __w_ % __n_;
2944 if (__w0_ < _WDt - 1)
Howard Hinnantc834c512011-11-29 18:15:50 +00002945 __y1_ = (_Rp >> (__w0_ + 1)) << (__w0_ + 1);
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002946 else
2947 __y1_ = 0;
2948 __mask0_ = __w0_ > 0 ? _Engine_result_type(~0) >> (_EDt - __w0_) :
2949 _Engine_result_type(0);
2950 __mask1_ = __w0_ < _EDt - 1 ?
2951 _Engine_result_type(~0) >> (_EDt - (__w0_ + 1)) :
2952 _Engine_result_type(~0);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002953}
2954
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002955template<class _Engine, class _UIntType>
2956inline
2957_UIntType
Marshall Clowfe778582017-09-20 19:38:43 +00002958__independent_bits_engine<_Engine, _UIntType>::__eval(false_type)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002959{
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002960 return static_cast<result_type>(__e_() & __mask0_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002961}
2962
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002963template<class _Engine, class _UIntType>
2964_UIntType
Marshall Clowfe778582017-09-20 19:38:43 +00002965__independent_bits_engine<_Engine, _UIntType>::__eval(true_type)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002966{
Marshall Clowafc48592017-09-20 17:34:11 +00002967 const size_t _WRt = numeric_limits<result_type>::digits;
Howard Hinnantc834c512011-11-29 18:15:50 +00002968 result_type _Sp = 0;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002969 for (size_t __k = 0; __k < __n0_; ++__k)
2970 {
2971 _Engine_result_type __u;
2972 do
2973 {
2974 __u = __e_() - _Engine::min();
2975 } while (__u >= __y0_);
Marshall Clowafc48592017-09-20 17:34:11 +00002976 if (__w0_ < _WRt)
Howard Hinnantc834c512011-11-29 18:15:50 +00002977 _Sp <<= __w0_;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002978 else
Howard Hinnantc834c512011-11-29 18:15:50 +00002979 _Sp = 0;
2980 _Sp += __u & __mask0_;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002981 }
2982 for (size_t __k = __n0_; __k < __n_; ++__k)
2983 {
2984 _Engine_result_type __u;
2985 do
2986 {
2987 __u = __e_() - _Engine::min();
2988 } while (__u >= __y1_);
Marshall Clowafc48592017-09-20 17:34:11 +00002989 if (__w0_ < _WRt - 1)
Howard Hinnantc834c512011-11-29 18:15:50 +00002990 _Sp <<= __w0_ + 1;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002991 else
Howard Hinnantc834c512011-11-29 18:15:50 +00002992 _Sp = 0;
2993 _Sp += __u & __mask1_;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002994 }
Howard Hinnantc834c512011-11-29 18:15:50 +00002995 return _Sp;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00002996}
2997
2998// uniform_int_distribution
2999
3000template<class _IntType = int>
3001class uniform_int_distribution
3002{
3003public:
3004 // types
3005 typedef _IntType result_type;
3006
3007 class param_type
3008 {
3009 result_type __a_;
3010 result_type __b_;
3011 public:
3012 typedef uniform_int_distribution distribution_type;
3013
3014 explicit param_type(result_type __a = 0,
3015 result_type __b = numeric_limits<result_type>::max())
3016 : __a_(__a), __b_(__b) {}
3017
3018 result_type a() const {return __a_;}
3019 result_type b() const {return __b_;}
3020
3021 friend bool operator==(const param_type& __x, const param_type& __y)
3022 {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;}
3023 friend bool operator!=(const param_type& __x, const param_type& __y)
3024 {return !(__x == __y);}
3025 };
3026
3027private:
3028 param_type __p_;
3029
3030public:
3031 // constructors and reset functions
Marek Kurdejcd0bd6a2021-01-19 08:21:09 +01003032#ifndef _LIBCPP_CXX03_LANG
3033 uniform_int_distribution() : uniform_int_distribution(0) {}
3034 explicit uniform_int_distribution(
3035 result_type __a, result_type __b = numeric_limits<result_type>::max())
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003036 : __p_(param_type(__a, __b)) {}
Marek Kurdejcd0bd6a2021-01-19 08:21:09 +01003037#else
3038 explicit uniform_int_distribution(
3039 result_type __a = 0,
3040 result_type __b = numeric_limits<result_type>::max())
3041 : __p_(param_type(__a, __b)) {}
3042#endif
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003043 explicit uniform_int_distribution(const param_type& __p) : __p_(__p) {}
3044 void reset() {}
3045
3046 // generating functions
3047 template<class _URNG> result_type operator()(_URNG& __g)
3048 {return (*this)(__g, __p_);}
3049 template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
3050
3051 // property functions
3052 result_type a() const {return __p_.a();}
3053 result_type b() const {return __p_.b();}
3054
3055 param_type param() const {return __p_;}
3056 void param(const param_type& __p) {__p_ = __p;}
3057
3058 result_type min() const {return a();}
3059 result_type max() const {return b();}
3060
3061 friend bool operator==(const uniform_int_distribution& __x,
3062 const uniform_int_distribution& __y)
3063 {return __x.__p_ == __y.__p_;}
3064 friend bool operator!=(const uniform_int_distribution& __x,
3065 const uniform_int_distribution& __y)
3066 {return !(__x == __y);}
3067};
3068
3069template<class _IntType>
3070template<class _URNG>
3071typename uniform_int_distribution<_IntType>::result_type
3072uniform_int_distribution<_IntType>::operator()(_URNG& __g, const param_type& __p)
Marshall Clowf79f4402018-10-08 20:20:34 +00003073_LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003074{
3075 typedef typename conditional<sizeof(result_type) <= sizeof(uint32_t),
3076 uint32_t, uint64_t>::type _UIntType;
Marshall Clowf79f4402018-10-08 20:20:34 +00003077 const _UIntType _Rp = _UIntType(__p.b()) - _UIntType(__p.a()) + _UIntType(1);
Howard Hinnantc834c512011-11-29 18:15:50 +00003078 if (_Rp == 1)
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003079 return __p.a();
3080 const size_t _Dt = numeric_limits<_UIntType>::digits;
3081 typedef __independent_bits_engine<_URNG, _UIntType> _Eng;
Howard Hinnantc834c512011-11-29 18:15:50 +00003082 if (_Rp == 0)
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003083 return static_cast<result_type>(_Eng(__g, _Dt)());
Marshall Clow370375e2019-07-12 01:01:55 +00003084 size_t __w = _Dt - __libcpp_clz(_Rp) - 1;
Arthur O'Dwyer07b22492020-11-27 11:02:06 -05003085 if ((_Rp & (numeric_limits<_UIntType>::max() >> (_Dt - __w))) != 0)
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003086 ++__w;
3087 _Eng __e(__g, __w);
3088 _UIntType __u;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003089 do
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003090 {
3091 __u = __e();
Howard Hinnantc834c512011-11-29 18:15:50 +00003092 } while (__u >= _Rp);
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003093 return static_cast<result_type>(__u + __p.a());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003094}
3095
Eric Fiselierf5fb27c2017-04-03 23:23:44 +00003096#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_RANDOM_SHUFFLE) \
3097 || defined(_LIBCPP_BUILDING_LIBRARY)
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00003098class _LIBCPP_TYPE_VIS __rs_default;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003099
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00003100_LIBCPP_FUNC_VIS __rs_default __rs_get();
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003101
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00003102class _LIBCPP_TYPE_VIS __rs_default
Howard Hinnantc51e1022010-05-11 19:42:16 +00003103{
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003104 static unsigned __c_;
3105
3106 __rs_default();
3107public:
Marshall Clow9903c5b2013-02-07 22:12:02 +00003108 typedef uint_fast32_t result_type;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003109
3110 static const result_type _Min = 0;
3111 static const result_type _Max = 0xFFFFFFFF;
3112
3113 __rs_default(const __rs_default&);
3114 ~__rs_default();
3115
3116 result_type operator()();
3117
Howard Hinnant664183b2012-04-02 00:40:41 +00003118 static _LIBCPP_CONSTEXPR result_type min() {return _Min;}
3119 static _LIBCPP_CONSTEXPR result_type max() {return _Max;}
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003120
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00003121 friend _LIBCPP_FUNC_VIS __rs_default __rs_get();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003122};
3123
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00003124_LIBCPP_FUNC_VIS __rs_default __rs_get();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003125
3126template <class _RandomAccessIterator>
Louis Dionne481a2662018-09-23 18:35:00 +00003127_LIBCPP_DEPRECATED_IN_CXX14 void
Howard Hinnantc51e1022010-05-11 19:42:16 +00003128random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
3129{
3130 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnantc834c512011-11-29 18:15:50 +00003131 typedef uniform_int_distribution<ptrdiff_t> _Dp;
3132 typedef typename _Dp::param_type _Pp;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003133 difference_type __d = __last - __first;
3134 if (__d > 1)
3135 {
Howard Hinnantc834c512011-11-29 18:15:50 +00003136 _Dp __uid;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003137 __rs_default __g = __rs_get();
Marshall Clowa224ace2019-01-24 19:20:19 +00003138 for (--__last, (void) --__d; __first < __last; ++__first, (void) --__d)
Howard Hinnantc9bc02c2010-10-22 15:26:39 +00003139 {
Howard Hinnantc834c512011-11-29 18:15:50 +00003140 difference_type __i = __uid(__g, _Pp(0, __d));
Howard Hinnantc9bc02c2010-10-22 15:26:39 +00003141 if (__i != difference_type(0))
3142 swap(*__first, *(__first + __i));
3143 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00003144 }
3145}
3146
3147template <class _RandomAccessIterator, class _RandomNumberGenerator>
Louis Dionne481a2662018-09-23 18:35:00 +00003148_LIBCPP_DEPRECATED_IN_CXX14 void
Howard Hinnantc51e1022010-05-11 19:42:16 +00003149random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
Eric Fiselier93dd1372017-04-18 23:26:47 +00003150#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003151 _RandomNumberGenerator&& __rand)
3152#else
3153 _RandomNumberGenerator& __rand)
3154#endif
3155{
3156 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
3157 difference_type __d = __last - __first;
3158 if (__d > 1)
3159 {
Marshall Clowa224ace2019-01-24 19:20:19 +00003160 for (--__last; __first < __last; ++__first, (void) --__d)
Howard Hinnantc9bc02c2010-10-22 15:26:39 +00003161 {
3162 difference_type __i = __rand(__d);
Marshall Clow5bdfc232018-09-11 18:33:45 +00003163 if (__i != difference_type(0))
Marshall Clowf79f4402018-10-08 20:20:34 +00003164 swap(*__first, *(__first + __i));
Howard Hinnantc9bc02c2010-10-22 15:26:39 +00003165 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00003166 }
3167}
Marshall Clowfac06e52017-03-23 13:43:37 +00003168#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00003169
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003170template <class _PopulationIterator, class _SampleIterator, class _Distance,
3171 class _UniformRandomNumberGenerator>
3172_LIBCPP_INLINE_VISIBILITY
3173_SampleIterator __sample(_PopulationIterator __first,
Alexander Richardsonc9637642017-11-14 11:14:25 +00003174 _PopulationIterator __last, _SampleIterator __output_iter,
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003175 _Distance __n,
3176 _UniformRandomNumberGenerator & __g,
3177 input_iterator_tag) {
3178
3179 _Distance __k = 0;
Marshall Clow0d332012019-08-20 21:31:51 +00003180 for (; __first != __last && __k < __n; ++__first, (void) ++__k)
Alexander Richardsonc9637642017-11-14 11:14:25 +00003181 __output_iter[__k] = *__first;
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003182 _Distance __sz = __k;
Marshall Clow0d332012019-08-20 21:31:51 +00003183 for (; __first != __last; ++__first, (void) ++__k) {
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003184 _Distance __r = _VSTD::uniform_int_distribution<_Distance>(0, __k)(__g);
3185 if (__r < __sz)
Alexander Richardsonc9637642017-11-14 11:14:25 +00003186 __output_iter[__r] = *__first;
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003187 }
Alexander Richardsonc9637642017-11-14 11:14:25 +00003188 return __output_iter + _VSTD::min(__n, __k);
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003189}
3190
3191template <class _PopulationIterator, class _SampleIterator, class _Distance,
3192 class _UniformRandomNumberGenerator>
3193_LIBCPP_INLINE_VISIBILITY
3194_SampleIterator __sample(_PopulationIterator __first,
Alexander Richardsonc9637642017-11-14 11:14:25 +00003195 _PopulationIterator __last, _SampleIterator __output_iter,
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003196 _Distance __n,
3197 _UniformRandomNumberGenerator& __g,
3198 forward_iterator_tag) {
3199 _Distance __unsampled_sz = _VSTD::distance(__first, __last);
3200 for (__n = _VSTD::min(__n, __unsampled_sz); __n != 0; ++__first) {
3201 _Distance __r =
3202 _VSTD::uniform_int_distribution<_Distance>(0, --__unsampled_sz)(__g);
3203 if (__r < __n) {
Alexander Richardsonc9637642017-11-14 11:14:25 +00003204 *__output_iter++ = *__first;
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003205 --__n;
3206 }
3207 }
Alexander Richardsonc9637642017-11-14 11:14:25 +00003208 return __output_iter;
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003209}
3210
3211template <class _PopulationIterator, class _SampleIterator, class _Distance,
3212 class _UniformRandomNumberGenerator>
3213_LIBCPP_INLINE_VISIBILITY
3214_SampleIterator __sample(_PopulationIterator __first,
Alexander Richardsonc9637642017-11-14 11:14:25 +00003215 _PopulationIterator __last, _SampleIterator __output_iter,
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003216 _Distance __n, _UniformRandomNumberGenerator& __g) {
3217 typedef typename iterator_traits<_PopulationIterator>::iterator_category
3218 _PopCategory;
3219 typedef typename iterator_traits<_PopulationIterator>::difference_type
3220 _Difference;
Eric Fiseliercd5a6772019-11-18 01:46:58 -05003221 static_assert(__is_cpp17_forward_iterator<_PopulationIterator>::value ||
3222 __is_cpp17_random_access_iterator<_SampleIterator>::value,
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003223 "SampleIterator must meet the requirements of RandomAccessIterator");
3224 typedef typename common_type<_Distance, _Difference>::type _CommonType;
3225 _LIBCPP_ASSERT(__n >= 0, "N must be a positive number.");
3226 return _VSTD::__sample(
Alexander Richardsonc9637642017-11-14 11:14:25 +00003227 __first, __last, __output_iter, _CommonType(__n),
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003228 __g, _PopCategory());
3229}
3230
3231#if _LIBCPP_STD_VER > 14
3232template <class _PopulationIterator, class _SampleIterator, class _Distance,
3233 class _UniformRandomNumberGenerator>
3234inline _LIBCPP_INLINE_VISIBILITY
3235_SampleIterator sample(_PopulationIterator __first,
Alexander Richardsonc9637642017-11-14 11:14:25 +00003236 _PopulationIterator __last, _SampleIterator __output_iter,
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003237 _Distance __n, _UniformRandomNumberGenerator&& __g) {
Alexander Richardsonc9637642017-11-14 11:14:25 +00003238 return _VSTD::__sample(__first, __last, __output_iter, __n, __g);
Eric Fiselier1208fcd2016-08-28 22:14:37 +00003239}
3240#endif // _LIBCPP_STD_VER > 14
3241
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003242template<class _RandomAccessIterator, class _UniformRandomNumberGenerator>
3243 void shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
Howard Hinnanta5e71782010-11-18 01:47:02 +00003244 _UniformRandomNumberGenerator&& __g)
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003245{
3246 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnantc834c512011-11-29 18:15:50 +00003247 typedef uniform_int_distribution<ptrdiff_t> _Dp;
3248 typedef typename _Dp::param_type _Pp;
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003249 difference_type __d = __last - __first;
3250 if (__d > 1)
3251 {
Howard Hinnantc834c512011-11-29 18:15:50 +00003252 _Dp __uid;
Marshall Clow0d332012019-08-20 21:31:51 +00003253 for (--__last, (void) --__d; __first < __last; ++__first, (void) --__d)
Howard Hinnantc9bc02c2010-10-22 15:26:39 +00003254 {
Howard Hinnantc834c512011-11-29 18:15:50 +00003255 difference_type __i = __uid(__g, _Pp(0, __d));
Howard Hinnantc9bc02c2010-10-22 15:26:39 +00003256 if (__i != difference_type(0))
3257 swap(*__first, *(__first + __i));
3258 }
Howard Hinnant578ac0f2010-05-26 17:49:34 +00003259 }
3260}
3261
Howard Hinnantc51e1022010-05-11 19:42:16 +00003262template <class _InputIterator, class _Predicate>
Nico Weber471b10a2019-04-03 18:13:08 +00003263_LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Howard Hinnantc51e1022010-05-11 19:42:16 +00003264is_partitioned(_InputIterator __first, _InputIterator __last, _Predicate __pred)
3265{
3266 for (; __first != __last; ++__first)
3267 if (!__pred(*__first))
3268 break;
Marshall Clow3562ed72015-02-02 18:16:35 +00003269 if ( __first == __last )
3270 return true;
3271 ++__first;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003272 for (; __first != __last; ++__first)
3273 if (__pred(*__first))
3274 return false;
3275 return true;
3276}
3277
3278// partition
3279
3280template <class _Predicate, class _ForwardIterator>
3281_ForwardIterator
3282__partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, forward_iterator_tag)
3283{
3284 while (true)
3285 {
3286 if (__first == __last)
3287 return __first;
3288 if (!__pred(*__first))
3289 break;
3290 ++__first;
3291 }
3292 for (_ForwardIterator __p = __first; ++__p != __last;)
3293 {
3294 if (__pred(*__p))
3295 {
3296 swap(*__first, *__p);
3297 ++__first;
3298 }
3299 }
3300 return __first;
3301}
3302
3303template <class _Predicate, class _BidirectionalIterator>
3304_BidirectionalIterator
3305__partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3306 bidirectional_iterator_tag)
3307{
3308 while (true)
3309 {
3310 while (true)
3311 {
3312 if (__first == __last)
3313 return __first;
3314 if (!__pred(*__first))
3315 break;
3316 ++__first;
3317 }
3318 do
3319 {
3320 if (__first == --__last)
3321 return __first;
3322 } while (!__pred(*__last));
3323 swap(*__first, *__last);
3324 ++__first;
3325 }
3326}
3327
3328template <class _ForwardIterator, class _Predicate>
3329inline _LIBCPP_INLINE_VISIBILITY
3330_ForwardIterator
3331partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
3332{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003333 return _VSTD::__partition<typename add_lvalue_reference<_Predicate>::type>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003334 (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
3335}
3336
3337// partition_copy
3338
3339template <class _InputIterator, class _OutputIterator1,
3340 class _OutputIterator2, class _Predicate>
Marshall Clow5492c8a2018-01-22 20:44:33 +00003341_LIBCPP_CONSTEXPR_AFTER_CXX17 pair<_OutputIterator1, _OutputIterator2>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003342partition_copy(_InputIterator __first, _InputIterator __last,
3343 _OutputIterator1 __out_true, _OutputIterator2 __out_false,
3344 _Predicate __pred)
3345{
3346 for (; __first != __last; ++__first)
3347 {
3348 if (__pred(*__first))
3349 {
3350 *__out_true = *__first;
3351 ++__out_true;
3352 }
3353 else
3354 {
3355 *__out_false = *__first;
3356 ++__out_false;
3357 }
3358 }
3359 return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false);
3360}
3361
3362// partition_point
3363
3364template<class _ForwardIterator, class _Predicate>
Marshall Clowcb3c8262018-01-15 17:53:34 +00003365_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00003366partition_point(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
3367{
3368 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003369 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003370 while (__len != 0)
3371 {
Louis Dionnedda14512018-12-17 16:04:39 +00003372 difference_type __l2 = _VSTD::__half_positive(__len);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003373 _ForwardIterator __m = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003374 _VSTD::advance(__m, __l2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003375 if (__pred(*__m))
3376 {
3377 __first = ++__m;
3378 __len -= __l2 + 1;
3379 }
3380 else
3381 __len = __l2;
3382 }
3383 return __first;
3384}
3385
3386// stable_partition
3387
3388template <class _Predicate, class _ForwardIterator, class _Distance, class _Pair>
3389_ForwardIterator
3390__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
3391 _Distance __len, _Pair __p, forward_iterator_tag __fit)
3392{
3393 // *__first is known to be false
3394 // __len >= 1
3395 if (__len == 1)
3396 return __first;
3397 if (__len == 2)
3398 {
3399 _ForwardIterator __m = __first;
3400 if (__pred(*++__m))
3401 {
3402 swap(*__first, *__m);
3403 return __m;
3404 }
3405 return __first;
3406 }
3407 if (__len <= __p.second)
3408 { // The buffer is big enough to use
3409 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
3410 __destruct_n __d(0);
3411 unique_ptr<value_type, __destruct_n&> __h(__p.first, __d);
3412 // Move the falses into the temporary buffer, and the trues to the front of the line
3413 // Update __first to always point to the end of the trues
3414 value_type* __t = __p.first;
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003415 ::new ((void*)__t) value_type(_VSTD::move(*__first));
Bruce Mitchener170d8972020-11-24 12:53:53 -05003416 __d.template __incr<value_type>();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003417 ++__t;
3418 _ForwardIterator __i = __first;
3419 while (++__i != __last)
3420 {
3421 if (__pred(*__i))
3422 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003423 *__first = _VSTD::move(*__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003424 ++__first;
3425 }
3426 else
3427 {
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003428 ::new ((void*)__t) value_type(_VSTD::move(*__i));
Bruce Mitchener170d8972020-11-24 12:53:53 -05003429 __d.template __incr<value_type>();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003430 ++__t;
3431 }
3432 }
3433 // All trues now at start of range, all falses in buffer
3434 // Move falses back into range, but don't mess up __first which points to first false
3435 __i = __first;
Marshall Clow0d332012019-08-20 21:31:51 +00003436 for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, (void) ++__i)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003437 *__i = _VSTD::move(*__t2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003438 // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer
3439 return __first;
3440 }
3441 // Else not enough buffer, do in place
3442 // __len >= 3
3443 _ForwardIterator __m = __first;
3444 _Distance __len2 = __len / 2; // __len2 >= 2
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003445 _VSTD::advance(__m, __len2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003446 // recurse on [__first, __m), *__first know to be false
3447 // F?????????????????
3448 // f m l
3449 typedef typename add_lvalue_reference<_Predicate>::type _PredRef;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05003450 _ForwardIterator __first_false = _VSTD::__stable_partition<_PredRef>(__first, __m, __pred, __len2, __p, __fit);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003451 // TTTFFFFF??????????
3452 // f ff m l
3453 // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true
3454 _ForwardIterator __m1 = __m;
3455 _ForwardIterator __second_false = __last;
3456 _Distance __len_half = __len - __len2;
3457 while (__pred(*__m1))
3458 {
3459 if (++__m1 == __last)
3460 goto __second_half_done;
3461 --__len_half;
3462 }
3463 // TTTFFFFFTTTF??????
3464 // f ff m m1 l
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05003465 __second_false = _VSTD::__stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __fit);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003466__second_half_done:
3467 // TTTFFFFFTTTTTFFFFF
3468 // f ff m sf l
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003469 return _VSTD::rotate(__first_false, __m, __second_false);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003470 // TTTTTTTTFFFFFFFFFF
3471 // |
3472}
3473
3474struct __return_temporary_buffer
3475{
3476 template <class _Tp>
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003477 _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) const {_VSTD::return_temporary_buffer(__p);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00003478};
3479
3480template <class _Predicate, class _ForwardIterator>
3481_ForwardIterator
3482__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
3483 forward_iterator_tag)
3484{
3485 const unsigned __alloc_limit = 3; // might want to make this a function of trivial assignment
3486 // Either prove all true and return __first or point to first false
3487 while (true)
3488 {
3489 if (__first == __last)
3490 return __first;
3491 if (!__pred(*__first))
3492 break;
3493 ++__first;
3494 }
3495 // We now have a reduced range [__first, __last)
3496 // *__first is known to be false
3497 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
3498 typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003499 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003500 pair<value_type*, ptrdiff_t> __p(0, 0);
3501 unique_ptr<value_type, __return_temporary_buffer> __h;
3502 if (__len >= __alloc_limit)
3503 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003504 __p = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003505 __h.reset(__p.first);
3506 }
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05003507 return _VSTD::__stable_partition<typename add_lvalue_reference<_Predicate>::type>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003508 (__first, __last, __pred, __len, __p, forward_iterator_tag());
3509}
3510
3511template <class _Predicate, class _BidirectionalIterator, class _Distance, class _Pair>
3512_BidirectionalIterator
3513__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3514 _Distance __len, _Pair __p, bidirectional_iterator_tag __bit)
3515{
3516 // *__first is known to be false
3517 // *__last is known to be true
3518 // __len >= 2
3519 if (__len == 2)
3520 {
3521 swap(*__first, *__last);
3522 return __last;
3523 }
3524 if (__len == 3)
3525 {
3526 _BidirectionalIterator __m = __first;
3527 if (__pred(*++__m))
3528 {
3529 swap(*__first, *__m);
3530 swap(*__m, *__last);
3531 return __last;
3532 }
3533 swap(*__m, *__last);
3534 swap(*__first, *__m);
3535 return __m;
3536 }
3537 if (__len <= __p.second)
3538 { // The buffer is big enough to use
3539 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3540 __destruct_n __d(0);
3541 unique_ptr<value_type, __destruct_n&> __h(__p.first, __d);
3542 // Move the falses into the temporary buffer, and the trues to the front of the line
3543 // Update __first to always point to the end of the trues
3544 value_type* __t = __p.first;
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003545 ::new ((void*)__t) value_type(_VSTD::move(*__first));
Bruce Mitchener170d8972020-11-24 12:53:53 -05003546 __d.template __incr<value_type>();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003547 ++__t;
3548 _BidirectionalIterator __i = __first;
3549 while (++__i != __last)
3550 {
3551 if (__pred(*__i))
3552 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003553 *__first = _VSTD::move(*__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003554 ++__first;
3555 }
3556 else
3557 {
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003558 ::new ((void*)__t) value_type(_VSTD::move(*__i));
Bruce Mitchener170d8972020-11-24 12:53:53 -05003559 __d.template __incr<value_type>();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003560 ++__t;
3561 }
3562 }
3563 // move *__last, known to be true
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003564 *__first = _VSTD::move(*__i);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003565 __i = ++__first;
3566 // All trues now at start of range, all falses in buffer
3567 // Move falses back into range, but don't mess up __first which points to first false
Marshall Clow0d332012019-08-20 21:31:51 +00003568 for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, (void) ++__i)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003569 *__i = _VSTD::move(*__t2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003570 // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer
3571 return __first;
3572 }
3573 // Else not enough buffer, do in place
3574 // __len >= 4
3575 _BidirectionalIterator __m = __first;
3576 _Distance __len2 = __len / 2; // __len2 >= 2
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003577 _VSTD::advance(__m, __len2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003578 // recurse on [__first, __m-1], except reduce __m-1 until *(__m-1) is true, *__first know to be false
3579 // F????????????????T
3580 // f m l
3581 _BidirectionalIterator __m1 = __m;
3582 _BidirectionalIterator __first_false = __first;
3583 _Distance __len_half = __len2;
3584 while (!__pred(*--__m1))
3585 {
3586 if (__m1 == __first)
3587 goto __first_half_done;
3588 --__len_half;
3589 }
3590 // F???TFFF?????????T
3591 // f m1 m l
3592 typedef typename add_lvalue_reference<_Predicate>::type _PredRef;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05003593 __first_false = _VSTD::__stable_partition<_PredRef>(__first, __m1, __pred, __len_half, __p, __bit);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003594__first_half_done:
3595 // TTTFFFFF?????????T
3596 // f ff m l
3597 // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true
3598 __m1 = __m;
3599 _BidirectionalIterator __second_false = __last;
3600 ++__second_false;
3601 __len_half = __len - __len2;
3602 while (__pred(*__m1))
3603 {
3604 if (++__m1 == __last)
3605 goto __second_half_done;
3606 --__len_half;
3607 }
3608 // TTTFFFFFTTTF?????T
3609 // f ff m m1 l
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05003610 __second_false = _VSTD::__stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __bit);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003611__second_half_done:
3612 // TTTFFFFFTTTTTFFFFF
3613 // f ff m sf l
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003614 return _VSTD::rotate(__first_false, __m, __second_false);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003615 // TTTTTTTTFFFFFFFFFF
3616 // |
3617}
3618
3619template <class _Predicate, class _BidirectionalIterator>
3620_BidirectionalIterator
3621__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3622 bidirectional_iterator_tag)
3623{
3624 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
3625 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3626 const difference_type __alloc_limit = 4; // might want to make this a function of trivial assignment
3627 // Either prove all true and return __first or point to first false
3628 while (true)
3629 {
3630 if (__first == __last)
3631 return __first;
3632 if (!__pred(*__first))
3633 break;
3634 ++__first;
3635 }
3636 // __first points to first false, everything prior to __first is already set.
3637 // Either prove [__first, __last) is all false and return __first, or point __last to last true
3638 do
3639 {
3640 if (__first == --__last)
3641 return __first;
3642 } while (!__pred(*__last));
3643 // We now have a reduced range [__first, __last]
3644 // *__first is known to be false
3645 // *__last is known to be true
3646 // __len >= 2
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003647 difference_type __len = _VSTD::distance(__first, __last) + 1;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003648 pair<value_type*, ptrdiff_t> __p(0, 0);
3649 unique_ptr<value_type, __return_temporary_buffer> __h;
3650 if (__len >= __alloc_limit)
3651 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003652 __p = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003653 __h.reset(__p.first);
3654 }
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05003655 return _VSTD::__stable_partition<typename add_lvalue_reference<_Predicate>::type>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003656 (__first, __last, __pred, __len, __p, bidirectional_iterator_tag());
3657}
3658
3659template <class _ForwardIterator, class _Predicate>
3660inline _LIBCPP_INLINE_VISIBILITY
3661_ForwardIterator
3662stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
3663{
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05003664 return _VSTD::__stable_partition<typename add_lvalue_reference<_Predicate>::type>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003665 (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
3666}
3667
3668// is_sorted_until
3669
3670template <class _ForwardIterator, class _Compare>
Nico Weber471b10a2019-04-03 18:13:08 +00003671_LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00003672is_sorted_until(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
3673{
3674 if (__first != __last)
3675 {
3676 _ForwardIterator __i = __first;
3677 while (++__i != __last)
3678 {
3679 if (__comp(*__i, *__first))
3680 return __i;
3681 __first = __i;
3682 }
3683 }
3684 return __last;
3685}
3686
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003687template<class _ForwardIterator>
Nico Weber471b10a2019-04-03 18:13:08 +00003688_LIBCPP_NODISCARD_EXT inline
3689_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00003690_ForwardIterator
3691is_sorted_until(_ForwardIterator __first, _ForwardIterator __last)
3692{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003693 return _VSTD::is_sorted_until(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003694}
3695
3696// is_sorted
3697
3698template <class _ForwardIterator, class _Compare>
Nico Weber471b10a2019-04-03 18:13:08 +00003699_LIBCPP_NODISCARD_EXT inline
3700_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00003701bool
3702is_sorted(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
3703{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003704 return _VSTD::is_sorted_until(__first, __last, __comp) == __last;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003705}
3706
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003707template<class _ForwardIterator>
Nico Weber471b10a2019-04-03 18:13:08 +00003708_LIBCPP_NODISCARD_EXT inline
3709_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00003710bool
3711is_sorted(_ForwardIterator __first, _ForwardIterator __last)
3712{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003713 return _VSTD::is_sorted(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003714}
3715
3716// sort
3717
3718// stable, 2-3 compares, 0-2 swaps
3719
3720template <class _Compare, class _ForwardIterator>
3721unsigned
3722__sort3(_ForwardIterator __x, _ForwardIterator __y, _ForwardIterator __z, _Compare __c)
3723{
3724 unsigned __r = 0;
3725 if (!__c(*__y, *__x)) // if x <= y
3726 {
3727 if (!__c(*__z, *__y)) // if y <= z
3728 return __r; // x <= y && y <= z
3729 // x <= y && y > z
3730 swap(*__y, *__z); // x <= z && y < z
3731 __r = 1;
3732 if (__c(*__y, *__x)) // if x > y
3733 {
3734 swap(*__x, *__y); // x < y && y <= z
3735 __r = 2;
3736 }
3737 return __r; // x <= y && y < z
3738 }
3739 if (__c(*__z, *__y)) // x > y, if y > z
3740 {
3741 swap(*__x, *__z); // x < y && y < z
3742 __r = 1;
3743 return __r;
3744 }
3745 swap(*__x, *__y); // x > y && y <= z
3746 __r = 1; // x < y && x <= z
3747 if (__c(*__z, *__y)) // if y > z
3748 {
3749 swap(*__y, *__z); // x <= y && y < z
3750 __r = 2;
3751 }
3752 return __r;
3753} // x <= y && y <= z
3754
3755// stable, 3-6 compares, 0-5 swaps
3756
3757template <class _Compare, class _ForwardIterator>
3758unsigned
3759__sort4(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3,
3760 _ForwardIterator __x4, _Compare __c)
3761{
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05003762 unsigned __r = _VSTD::__sort3<_Compare>(__x1, __x2, __x3, __c);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003763 if (__c(*__x4, *__x3))
3764 {
3765 swap(*__x3, *__x4);
3766 ++__r;
3767 if (__c(*__x3, *__x2))
3768 {
3769 swap(*__x2, *__x3);
3770 ++__r;
3771 if (__c(*__x2, *__x1))
3772 {
3773 swap(*__x1, *__x2);
3774 ++__r;
3775 }
3776 }
3777 }
3778 return __r;
3779}
3780
3781// stable, 4-10 compares, 0-9 swaps
3782
3783template <class _Compare, class _ForwardIterator>
Louis Dionne9e70e362018-11-21 16:24:46 +00003784_LIBCPP_HIDDEN
Howard Hinnantc51e1022010-05-11 19:42:16 +00003785unsigned
3786__sort5(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3,
3787 _ForwardIterator __x4, _ForwardIterator __x5, _Compare __c)
3788{
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05003789 unsigned __r = _VSTD::__sort4<_Compare>(__x1, __x2, __x3, __x4, __c);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003790 if (__c(*__x5, *__x4))
3791 {
3792 swap(*__x4, *__x5);
3793 ++__r;
3794 if (__c(*__x4, *__x3))
3795 {
3796 swap(*__x3, *__x4);
3797 ++__r;
3798 if (__c(*__x3, *__x2))
3799 {
3800 swap(*__x2, *__x3);
3801 ++__r;
3802 if (__c(*__x2, *__x1))
3803 {
3804 swap(*__x1, *__x2);
3805 ++__r;
3806 }
3807 }
3808 }
3809 }
3810 return __r;
3811}
3812
3813// Assumes size > 0
Arthur O'Dwyerb3b2d732020-12-12 11:37:36 -05003814template <class _Compare, class _BidirectionalIterator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003815void
Arthur O'Dwyerb3b2d732020-12-12 11:37:36 -05003816__selection_sort(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00003817{
Arthur O'Dwyerb3b2d732020-12-12 11:37:36 -05003818 _BidirectionalIterator __lm1 = __last;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003819 for (--__lm1; __first != __lm1; ++__first)
3820 {
Arthur O'Dwyerb3b2d732020-12-12 11:37:36 -05003821 _BidirectionalIterator __i = _VSTD::min_element<_BidirectionalIterator,
Howard Hinnantc51e1022010-05-11 19:42:16 +00003822 typename add_lvalue_reference<_Compare>::type>
3823 (__first, __last, __comp);
3824 if (__i != __first)
3825 swap(*__first, *__i);
3826 }
3827}
3828
Arthur O'Dwyerb3b2d732020-12-12 11:37:36 -05003829template <class _Compare, class _BidirectionalIterator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003830void
Arthur O'Dwyerb3b2d732020-12-12 11:37:36 -05003831__insertion_sort(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00003832{
Arthur O'Dwyerb3b2d732020-12-12 11:37:36 -05003833 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003834 if (__first != __last)
3835 {
Arthur O'Dwyerb3b2d732020-12-12 11:37:36 -05003836 _BidirectionalIterator __i = __first;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003837 for (++__i; __i != __last; ++__i)
3838 {
Arthur O'Dwyerb3b2d732020-12-12 11:37:36 -05003839 _BidirectionalIterator __j = __i;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003840 value_type __t(_VSTD::move(*__j));
Arthur O'Dwyerb3b2d732020-12-12 11:37:36 -05003841 for (_BidirectionalIterator __k = __i; __k != __first && __comp(__t, *--__k); --__j)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003842 *__j = _VSTD::move(*__k);
3843 *__j = _VSTD::move(__t);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003844 }
3845 }
3846}
3847
3848template <class _Compare, class _RandomAccessIterator>
3849void
3850__insertion_sort_3(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3851{
3852 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3853 _RandomAccessIterator __j = __first+2;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05003854 _VSTD::__sort3<_Compare>(__first, __first+1, __j, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003855 for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
3856 {
3857 if (__comp(*__i, *__j))
3858 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003859 value_type __t(_VSTD::move(*__i));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003860 _RandomAccessIterator __k = __j;
3861 __j = __i;
3862 do
3863 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003864 *__j = _VSTD::move(*__k);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003865 __j = __k;
3866 } while (__j != __first && __comp(__t, *--__k));
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003867 *__j = _VSTD::move(__t);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003868 }
3869 __j = __i;
3870 }
3871}
3872
3873template <class _Compare, class _RandomAccessIterator>
3874bool
3875__insertion_sort_incomplete(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3876{
3877 switch (__last - __first)
3878 {
3879 case 0:
3880 case 1:
3881 return true;
3882 case 2:
3883 if (__comp(*--__last, *__first))
3884 swap(*__first, *__last);
3885 return true;
3886 case 3:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003887 _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003888 return true;
3889 case 4:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003890 _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003891 return true;
3892 case 5:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003893 _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003894 return true;
3895 }
3896 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3897 _RandomAccessIterator __j = __first+2;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05003898 _VSTD::__sort3<_Compare>(__first, __first+1, __j, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003899 const unsigned __limit = 8;
3900 unsigned __count = 0;
3901 for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
3902 {
3903 if (__comp(*__i, *__j))
3904 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003905 value_type __t(_VSTD::move(*__i));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003906 _RandomAccessIterator __k = __j;
3907 __j = __i;
3908 do
3909 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003910 *__j = _VSTD::move(*__k);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003911 __j = __k;
3912 } while (__j != __first && __comp(__t, *--__k));
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003913 *__j = _VSTD::move(__t);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003914 if (++__count == __limit)
3915 return ++__i == __last;
3916 }
3917 __j = __i;
3918 }
3919 return true;
3920}
3921
Arthur O'Dwyerb3b2d732020-12-12 11:37:36 -05003922template <class _Compare, class _BidirectionalIterator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003923void
Arthur O'Dwyerb3b2d732020-12-12 11:37:36 -05003924__insertion_sort_move(_BidirectionalIterator __first1, _BidirectionalIterator __last1,
3925 typename iterator_traits<_BidirectionalIterator>::value_type* __first2, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00003926{
Arthur O'Dwyerb3b2d732020-12-12 11:37:36 -05003927 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003928 if (__first1 != __last1)
3929 {
3930 __destruct_n __d(0);
3931 unique_ptr<value_type, __destruct_n&> __h(__first2, __d);
3932 value_type* __last2 = __first2;
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003933 ::new ((void*)__last2) value_type(_VSTD::move(*__first1));
Bruce Mitchener170d8972020-11-24 12:53:53 -05003934 __d.template __incr<value_type>();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003935 for (++__last2; ++__first1 != __last1; ++__last2)
3936 {
3937 value_type* __j2 = __last2;
3938 value_type* __i2 = __j2;
3939 if (__comp(*__first1, *--__i2))
3940 {
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003941 ::new ((void*)__j2) value_type(_VSTD::move(*__i2));
Bruce Mitchener170d8972020-11-24 12:53:53 -05003942 __d.template __incr<value_type>();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003943 for (--__j2; __i2 != __first2 && __comp(*__first1, *--__i2); --__j2)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003944 *__j2 = _VSTD::move(*__i2);
3945 *__j2 = _VSTD::move(*__first1);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003946 }
3947 else
3948 {
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003949 ::new ((void*)__j2) value_type(_VSTD::move(*__first1));
Bruce Mitchener170d8972020-11-24 12:53:53 -05003950 __d.template __incr<value_type>();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003951 }
3952 }
3953 __h.release();
3954 }
3955}
3956
3957template <class _Compare, class _RandomAccessIterator>
3958void
3959__sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3960{
3961 // _Compare is known to be a reference type
3962 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
3963 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
Howard Hinnanta9a897e2010-11-19 22:17:28 +00003964 const difference_type __limit = is_trivially_copy_constructible<value_type>::value &&
3965 is_trivially_copy_assignable<value_type>::value ? 30 : 6;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003966 while (true)
3967 {
3968 __restart:
3969 difference_type __len = __last - __first;
3970 switch (__len)
3971 {
3972 case 0:
3973 case 1:
3974 return;
3975 case 2:
3976 if (__comp(*--__last, *__first))
3977 swap(*__first, *__last);
3978 return;
3979 case 3:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003980 _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003981 return;
3982 case 4:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003983 _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003984 return;
3985 case 5:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003986 _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003987 return;
3988 }
3989 if (__len <= __limit)
3990 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003991 _VSTD::__insertion_sort_3<_Compare>(__first, __last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003992 return;
3993 }
3994 // __len > 5
3995 _RandomAccessIterator __m = __first;
3996 _RandomAccessIterator __lm1 = __last;
3997 --__lm1;
3998 unsigned __n_swaps;
3999 {
4000 difference_type __delta;
4001 if (__len >= 1000)
4002 {
4003 __delta = __len/2;
4004 __m += __delta;
4005 __delta /= 2;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004006 __n_swaps = _VSTD::__sort5<_Compare>(__first, __first + __delta, __m, __m+__delta, __lm1, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004007 }
4008 else
4009 {
4010 __delta = __len/2;
4011 __m += __delta;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004012 __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, __lm1, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004013 }
4014 }
4015 // *__m is median
4016 // partition [__first, __m) < *__m and *__m <= [__m, __last)
4017 // (this inhibits tossing elements equivalent to __m around unnecessarily)
4018 _RandomAccessIterator __i = __first;
4019 _RandomAccessIterator __j = __lm1;
4020 // j points beyond range to be tested, *__m is known to be <= *__lm1
4021 // The search going up is known to be guarded but the search coming down isn't.
4022 // Prime the downward search with a guard.
4023 if (!__comp(*__i, *__m)) // if *__first == *__m
4024 {
4025 // *__first == *__m, *__first doesn't go in first part
4026 // manually guard downward moving __j against __i
4027 while (true)
4028 {
4029 if (__i == --__j)
4030 {
4031 // *__first == *__m, *__m <= all other elements
4032 // Parition instead into [__first, __i) == *__first and *__first < [__i, __last)
4033 ++__i; // __first + 1
4034 __j = __last;
4035 if (!__comp(*__first, *--__j)) // we need a guard if *__first == *(__last-1)
4036 {
4037 while (true)
4038 {
4039 if (__i == __j)
4040 return; // [__first, __last) all equivalent elements
4041 if (__comp(*__first, *__i))
4042 {
4043 swap(*__i, *__j);
4044 ++__n_swaps;
4045 ++__i;
4046 break;
4047 }
4048 ++__i;
4049 }
4050 }
4051 // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1
4052 if (__i == __j)
4053 return;
4054 while (true)
4055 {
4056 while (!__comp(*__first, *__i))
4057 ++__i;
4058 while (__comp(*__first, *--__j))
4059 ;
4060 if (__i >= __j)
4061 break;
4062 swap(*__i, *__j);
4063 ++__n_swaps;
4064 ++__i;
4065 }
4066 // [__first, __i) == *__first and *__first < [__i, __last)
Arthur O'Dwyerdf5df562020-12-12 11:57:32 -05004067 // The first part is sorted, sort the second part
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004068 // _VSTD::__sort<_Compare>(__i, __last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004069 __first = __i;
4070 goto __restart;
4071 }
4072 if (__comp(*__j, *__m))
4073 {
4074 swap(*__i, *__j);
4075 ++__n_swaps;
4076 break; // found guard for downward moving __j, now use unguarded partition
4077 }
4078 }
4079 }
4080 // It is known that *__i < *__m
4081 ++__i;
4082 // j points beyond range to be tested, *__m is known to be <= *__lm1
4083 // if not yet partitioned...
4084 if (__i < __j)
4085 {
4086 // known that *(__i - 1) < *__m
4087 // known that __i <= __m
4088 while (true)
4089 {
4090 // __m still guards upward moving __i
4091 while (__comp(*__i, *__m))
4092 ++__i;
4093 // It is now known that a guard exists for downward moving __j
4094 while (!__comp(*--__j, *__m))
4095 ;
4096 if (__i > __j)
4097 break;
4098 swap(*__i, *__j);
4099 ++__n_swaps;
4100 // It is known that __m != __j
4101 // If __m just moved, follow it
4102 if (__m == __i)
4103 __m = __j;
4104 ++__i;
4105 }
4106 }
4107 // [__first, __i) < *__m and *__m <= [__i, __last)
4108 if (__i != __m && __comp(*__m, *__i))
4109 {
4110 swap(*__i, *__m);
4111 ++__n_swaps;
4112 }
4113 // [__first, __i) < *__i and *__i <= [__i+1, __last)
4114 // If we were given a perfect partition, see if insertion sort is quick...
4115 if (__n_swaps == 0)
4116 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004117 bool __fs = _VSTD::__insertion_sort_incomplete<_Compare>(__first, __i, __comp);
4118 if (_VSTD::__insertion_sort_incomplete<_Compare>(__i+1, __last, __comp))
Howard Hinnantc51e1022010-05-11 19:42:16 +00004119 {
4120 if (__fs)
4121 return;
4122 __last = __i;
4123 continue;
4124 }
4125 else
4126 {
4127 if (__fs)
4128 {
4129 __first = ++__i;
4130 continue;
4131 }
4132 }
4133 }
4134 // sort smaller range with recursive call and larger with tail recursion elimination
4135 if (__i - __first < __last - __i)
4136 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004137 _VSTD::__sort<_Compare>(__first, __i, __comp);
4138 // _VSTD::__sort<_Compare>(__i+1, __last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004139 __first = ++__i;
4140 }
4141 else
4142 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004143 _VSTD::__sort<_Compare>(__i+1, __last, __comp);
4144 // _VSTD::__sort<_Compare>(__first, __i, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004145 __last = __i;
4146 }
4147 }
4148}
4149
4150// This forwarder keeps the top call and the recursive calls using the same instantiation, forcing a reference _Compare
4151template <class _RandomAccessIterator, class _Compare>
4152inline _LIBCPP_INLINE_VISIBILITY
4153void
4154sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4155{
Eric Fiselier7ceab7b2019-04-12 05:18:19 +00004156 typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
4157 _VSTD::__sort<_Comp_ref>(__first, __last, _Comp_ref(__comp));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004158}
4159
4160template <class _RandomAccessIterator>
4161inline _LIBCPP_INLINE_VISIBILITY
4162void
4163sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
4164{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004165 _VSTD::sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004166}
4167
4168template <class _Tp>
4169inline _LIBCPP_INLINE_VISIBILITY
4170void
4171sort(_Tp** __first, _Tp** __last)
4172{
Brett Gutstein57a68402020-12-04 16:05:03 -05004173 _VSTD::sort((uintptr_t*)__first, (uintptr_t*)__last, __less<uintptr_t>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004174}
4175
4176template <class _Tp>
4177inline _LIBCPP_INLINE_VISIBILITY
4178void
4179sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last)
4180{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004181 _VSTD::sort(__first.base(), __last.base());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004182}
4183
Howard Hinnant27e0e772011-09-14 18:33:51 +00004184template <class _Tp, class _Compare>
4185inline _LIBCPP_INLINE_VISIBILITY
4186void
4187sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last, _Compare __comp)
4188{
4189 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4190 _VSTD::sort<_Tp*, _Comp_ref>(__first.base(), __last.base(), __comp);
4191}
4192
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00004193_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<char>&, char*>(char*, char*, __less<char>&))
4194_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&))
4195_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&))
4196_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&))
4197_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<short>&, short*>(short*, short*, __less<short>&))
4198_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&))
4199_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<int>&, int*>(int*, int*, __less<int>&))
4200_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&))
4201_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<long>&, long*>(long*, long*, __less<long>&))
4202_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&))
4203_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<long long>&, long long*>(long long*, long long*, __less<long long>&))
4204_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>&))
4205_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<float>&, float*>(float*, float*, __less<float>&))
4206_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<double>&, double*>(double*, double*, __less<double>&))
4207_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 +00004208
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00004209_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<char>&, char*>(char*, char*, __less<char>&))
4210_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&))
4211_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&))
4212_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&))
4213_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<short>&, short*>(short*, short*, __less<short>&))
4214_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&))
4215_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<int>&, int*>(int*, int*, __less<int>&))
4216_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&))
4217_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<long>&, long*>(long*, long*, __less<long>&))
4218_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&))
4219_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<long long>&, long long*>(long long*, long long*, __less<long long>&))
4220_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>&))
4221_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<float>&, float*>(float*, float*, __less<float>&))
4222_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<double>&, double*>(double*, double*, __less<double>&))
4223_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 +00004224
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00004225_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 +00004226
4227// lower_bound
4228
4229template <class _Compare, class _ForwardIterator, class _Tp>
Marshall Clowe00916c2018-01-16 02:34:41 +00004230_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00004231__lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004232{
4233 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004234 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004235 while (__len != 0)
4236 {
Louis Dionnedda14512018-12-17 16:04:39 +00004237 difference_type __l2 = _VSTD::__half_positive(__len);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004238 _ForwardIterator __m = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004239 _VSTD::advance(__m, __l2);
Howard Hinnantbf074022011-10-22 20:59:45 +00004240 if (__comp(*__m, __value_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00004241 {
4242 __first = ++__m;
4243 __len -= __l2 + 1;
4244 }
4245 else
4246 __len = __l2;
4247 }
4248 return __first;
4249}
4250
4251template <class _ForwardIterator, class _Tp, class _Compare>
Nico Weber471b10a2019-04-03 18:13:08 +00004252_LIBCPP_NODISCARD_EXT inline
4253_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004254_ForwardIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00004255lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004256{
Howard Hinnantc51e1022010-05-11 19:42:16 +00004257 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05004258 return _VSTD::__lower_bound<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004259}
4260
4261template <class _ForwardIterator, class _Tp>
Nico Weber471b10a2019-04-03 18:13:08 +00004262_LIBCPP_NODISCARD_EXT inline
4263_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004264_ForwardIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00004265lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004266{
Howard Hinnantbf074022011-10-22 20:59:45 +00004267 return _VSTD::lower_bound(__first, __last, __value_,
Howard Hinnantc51e1022010-05-11 19:42:16 +00004268 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
4269}
4270
4271// upper_bound
4272
4273template <class _Compare, class _ForwardIterator, class _Tp>
Marshall Clowe00916c2018-01-16 02:34:41 +00004274_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00004275__upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004276{
4277 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004278 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004279 while (__len != 0)
4280 {
Louis Dionnedda14512018-12-17 16:04:39 +00004281 difference_type __l2 = _VSTD::__half_positive(__len);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004282 _ForwardIterator __m = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004283 _VSTD::advance(__m, __l2);
Howard Hinnantbf074022011-10-22 20:59:45 +00004284 if (__comp(__value_, *__m))
Howard Hinnantc51e1022010-05-11 19:42:16 +00004285 __len = __l2;
4286 else
4287 {
4288 __first = ++__m;
4289 __len -= __l2 + 1;
4290 }
4291 }
4292 return __first;
4293}
4294
4295template <class _ForwardIterator, class _Tp, class _Compare>
Nico Weber471b10a2019-04-03 18:13:08 +00004296_LIBCPP_NODISCARD_EXT inline
4297_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004298_ForwardIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00004299upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004300{
Howard Hinnantc51e1022010-05-11 19:42:16 +00004301 typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05004302 return _VSTD::__upper_bound<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004303}
4304
4305template <class _ForwardIterator, class _Tp>
Nico Weber471b10a2019-04-03 18:13:08 +00004306_LIBCPP_NODISCARD_EXT inline
4307_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004308_ForwardIterator
Howard Hinnantbf074022011-10-22 20:59:45 +00004309upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004310{
Howard Hinnantbf074022011-10-22 20:59:45 +00004311 return _VSTD::upper_bound(__first, __last, __value_,
Howard Hinnantc51e1022010-05-11 19:42:16 +00004312 __less<_Tp, typename iterator_traits<_ForwardIterator>::value_type>());
4313}
4314
4315// equal_range
4316
4317template <class _Compare, class _ForwardIterator, class _Tp>
Marshall Clowe00916c2018-01-16 02:34:41 +00004318_LIBCPP_CONSTEXPR_AFTER_CXX17 pair<_ForwardIterator, _ForwardIterator>
Howard Hinnantbf074022011-10-22 20:59:45 +00004319__equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004320{
4321 typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004322 difference_type __len = _VSTD::distance(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004323 while (__len != 0)
4324 {
Louis Dionnedda14512018-12-17 16:04:39 +00004325 difference_type __l2 = _VSTD::__half_positive(__len);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004326 _ForwardIterator __m = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004327 _VSTD::advance(__m, __l2);
Howard Hinnantbf074022011-10-22 20:59:45 +00004328 if (__comp(*__m, __value_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00004329 {
4330 __first = ++__m;
4331 __len -= __l2 + 1;
4332 }
Howard Hinnantbf074022011-10-22 20:59:45 +00004333 else if (__comp(__value_, *__m))
Howard Hinnantc51e1022010-05-11 19:42:16 +00004334 {
4335 __last = __m;
4336 __len = __l2;
4337 }
4338 else
4339 {
4340 _ForwardIterator __mp1 = __m;
4341 return pair<_ForwardIterator, _ForwardIterator>
4342 (
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05004343 _VSTD::__lower_bound<_Compare>(__first, __m, __value_, __comp),
4344 _VSTD::__upper_bound<_Compare>(++__mp1, __last, __value_, __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004345 );
4346 }
4347 }
4348 return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
4349}
4350
4351template <class _ForwardIterator, class _Tp, class _Compare>
Nico Weber471b10a2019-04-03 18:13:08 +00004352_LIBCPP_NODISCARD_EXT inline
4353_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004354pair<_ForwardIterator, _ForwardIterator>
Howard Hinnantbf074022011-10-22 20:59:45 +00004355equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004356{
Eric Fiselier7ceab7b2019-04-12 05:18:19 +00004357 typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05004358 return _VSTD::__equal_range<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004359}
4360
4361template <class _ForwardIterator, class _Tp>
Nico Weber471b10a2019-04-03 18:13:08 +00004362_LIBCPP_NODISCARD_EXT inline
4363_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004364pair<_ForwardIterator, _ForwardIterator>
Howard Hinnantbf074022011-10-22 20:59:45 +00004365equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004366{
Howard Hinnantbf074022011-10-22 20:59:45 +00004367 return _VSTD::equal_range(__first, __last, __value_,
Howard Hinnantc51e1022010-05-11 19:42:16 +00004368 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
4369}
4370
4371// binary_search
4372
4373template <class _Compare, class _ForwardIterator, class _Tp>
Marshall Clowe00916c2018-01-16 02:34:41 +00004374inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004375bool
Howard Hinnantbf074022011-10-22 20:59:45 +00004376__binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004377{
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05004378 __first = _VSTD::__lower_bound<_Compare>(__first, __last, __value_, __comp);
Howard Hinnantbf074022011-10-22 20:59:45 +00004379 return __first != __last && !__comp(__value_, *__first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004380}
4381
4382template <class _ForwardIterator, class _Tp, class _Compare>
Nico Weber471b10a2019-04-03 18:13:08 +00004383_LIBCPP_NODISCARD_EXT inline
4384_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004385bool
Howard Hinnantbf074022011-10-22 20:59:45 +00004386binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004387{
Eric Fiselier7ceab7b2019-04-12 05:18:19 +00004388 typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05004389 return _VSTD::__binary_search<_Comp_ref>(__first, __last, __value_, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004390}
4391
4392template <class _ForwardIterator, class _Tp>
Nico Weber471b10a2019-04-03 18:13:08 +00004393_LIBCPP_NODISCARD_EXT inline
4394_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004395bool
Howard Hinnantbf074022011-10-22 20:59:45 +00004396binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004397{
Howard Hinnantbf074022011-10-22 20:59:45 +00004398 return _VSTD::binary_search(__first, __last, __value_,
Howard Hinnantc51e1022010-05-11 19:42:16 +00004399 __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
4400}
4401
4402// merge
4403
4404template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
Nicholas-Baron7fd82722020-09-14 16:37:41 -04004405_LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004406_OutputIterator
4407__merge(_InputIterator1 __first1, _InputIterator1 __last1,
4408 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4409{
4410 for (; __first1 != __last1; ++__result)
4411 {
4412 if (__first2 == __last2)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004413 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004414 if (__comp(*__first2, *__first1))
4415 {
4416 *__result = *__first2;
4417 ++__first2;
4418 }
4419 else
4420 {
4421 *__result = *__first1;
4422 ++__first1;
4423 }
4424 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004425 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004426}
4427
4428template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
Nicholas-Baron7fd82722020-09-14 16:37:41 -04004429inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004430_OutputIterator
4431merge(_InputIterator1 __first1, _InputIterator1 __last1,
4432 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4433{
Eric Fiselier7ceab7b2019-04-12 05:18:19 +00004434 typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004435 return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004436}
4437
4438template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
Nicholas-Baron7fd82722020-09-14 16:37:41 -04004439inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004440_OutputIterator
4441merge(_InputIterator1 __first1, _InputIterator1 __last1,
4442 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
4443{
4444 typedef typename iterator_traits<_InputIterator1>::value_type __v1;
4445 typedef typename iterator_traits<_InputIterator2>::value_type __v2;
Marshall Clowf913beb2019-08-20 22:23:35 +00004446 return _VSTD::merge(__first1, __last1, __first2, __last2, __result, __less<__v1, __v2>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004447}
4448
4449// inplace_merge
4450
Marshall Clow1bc51102015-07-29 16:25:45 +00004451template <class _Compare, class _InputIterator1, class _InputIterator2,
4452 class _OutputIterator>
4453void __half_inplace_merge(_InputIterator1 __first1, _InputIterator1 __last1,
4454 _InputIterator2 __first2, _InputIterator2 __last2,
4455 _OutputIterator __result, _Compare __comp)
4456{
4457 for (; __first1 != __last1; ++__result)
4458 {
4459 if (__first2 == __last2)
4460 {
4461 _VSTD::move(__first1, __last1, __result);
4462 return;
4463 }
4464
4465 if (__comp(*__first2, *__first1))
4466 {
4467 *__result = _VSTD::move(*__first2);
4468 ++__first2;
4469 }
4470 else
4471 {
4472 *__result = _VSTD::move(*__first1);
4473 ++__first1;
4474 }
4475 }
4476 // __first2 through __last2 are already in the right spot.
4477}
4478
Howard Hinnantc51e1022010-05-11 19:42:16 +00004479template <class _Compare, class _BidirectionalIterator>
4480void
4481__buffered_inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4482 _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1,
4483 typename iterator_traits<_BidirectionalIterator>::difference_type __len2,
4484 typename iterator_traits<_BidirectionalIterator>::value_type* __buff)
4485{
4486 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00004487 __destruct_n __d(0);
4488 unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
4489 if (__len1 <= __len2)
4490 {
4491 value_type* __p = __buff;
Bruce Mitchener170d8972020-11-24 12:53:53 -05004492 for (_BidirectionalIterator __i = __first; __i != __middle; __d.template __incr<value_type>(), (void) ++__i, (void) ++__p)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05004493 ::new ((void*)__p) value_type(_VSTD::move(*__i));
Arthur O'Dwyer2f0c3302020-12-18 15:11:51 -05004494 _VSTD::__half_inplace_merge<_Compare>(__buff, __p, __middle, __last, __first, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004495 }
4496 else
4497 {
4498 value_type* __p = __buff;
Bruce Mitchener170d8972020-11-24 12:53:53 -05004499 for (_BidirectionalIterator __i = __middle; __i != __last; __d.template __incr<value_type>(), (void) ++__i, (void) ++__p)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05004500 ::new ((void*)__p) value_type(_VSTD::move(*__i));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004501 typedef reverse_iterator<_BidirectionalIterator> _RBi;
4502 typedef reverse_iterator<value_type*> _Rv;
Arthur O'Dwyer2f0c3302020-12-18 15:11:51 -05004503 typedef __invert<_Compare> _Inverted;
4504 _VSTD::__half_inplace_merge<_Inverted>(_Rv(__p), _Rv(__buff),
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05004505 _RBi(__middle), _RBi(__first),
Arthur O'Dwyer2f0c3302020-12-18 15:11:51 -05004506 _RBi(__last), _Inverted(__comp));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004507 }
4508}
4509
4510template <class _Compare, class _BidirectionalIterator>
4511void
4512__inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4513 _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1,
4514 typename iterator_traits<_BidirectionalIterator>::difference_type __len2,
4515 typename iterator_traits<_BidirectionalIterator>::value_type* __buff, ptrdiff_t __buff_size)
4516{
Howard Hinnantc51e1022010-05-11 19:42:16 +00004517 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
4518 while (true)
4519 {
4520 // if __middle == __last, we're done
4521 if (__len2 == 0)
4522 return;
Marshall Clow8eff8232015-02-02 16:44:11 +00004523 if (__len1 <= __buff_size || __len2 <= __buff_size)
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05004524 return _VSTD::__buffered_inplace_merge<_Compare>
Marshall Clow8eff8232015-02-02 16:44:11 +00004525 (__first, __middle, __last, __comp, __len1, __len2, __buff);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004526 // shrink [__first, __middle) as much as possible (with no moves), returning if it shrinks to 0
Eric Fiseliera09a3b42014-10-27 19:28:20 +00004527 for (; true; ++__first, (void) --__len1)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004528 {
4529 if (__len1 == 0)
4530 return;
4531 if (__comp(*__middle, *__first))
4532 break;
4533 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00004534 // __first < __middle < __last
4535 // *__first > *__middle
4536 // partition [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last) such that
4537 // all elements in:
4538 // [__first, __m1) <= [__middle, __m2)
4539 // [__middle, __m2) < [__m1, __middle)
4540 // [__m1, __middle) <= [__m2, __last)
4541 // and __m1 or __m2 is in the middle of its range
4542 _BidirectionalIterator __m1; // "median" of [__first, __middle)
4543 _BidirectionalIterator __m2; // "median" of [__middle, __last)
4544 difference_type __len11; // distance(__first, __m1)
4545 difference_type __len21; // distance(__middle, __m2)
4546 // binary search smaller range
4547 if (__len1 < __len2)
4548 { // __len >= 1, __len2 >= 2
4549 __len21 = __len2 / 2;
4550 __m2 = __middle;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004551 _VSTD::advance(__m2, __len21);
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05004552 __m1 = _VSTD::__upper_bound<_Compare>(__first, __middle, *__m2, __comp);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004553 __len11 = _VSTD::distance(__first, __m1);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004554 }
4555 else
4556 {
4557 if (__len1 == 1)
4558 { // __len1 >= __len2 && __len2 > 0, therefore __len2 == 1
4559 // It is known *__first > *__middle
4560 swap(*__first, *__middle);
4561 return;
4562 }
4563 // __len1 >= 2, __len2 >= 1
4564 __len11 = __len1 / 2;
4565 __m1 = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004566 _VSTD::advance(__m1, __len11);
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05004567 __m2 = _VSTD::__lower_bound<_Compare>(__middle, __last, *__m1, __comp);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004568 __len21 = _VSTD::distance(__middle, __m2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004569 }
4570 difference_type __len12 = __len1 - __len11; // distance(__m1, __middle)
4571 difference_type __len22 = __len2 - __len21; // distance(__m2, __last)
4572 // [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last)
4573 // swap middle two partitions
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004574 __middle = _VSTD::rotate(__m1, __middle, __m2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004575 // __len12 and __len21 now have swapped meanings
Arthur O'Dwyerdf5df562020-12-12 11:57:32 -05004576 // merge smaller range with recursive call and larger with tail recursion elimination
Howard Hinnantc51e1022010-05-11 19:42:16 +00004577 if (__len11 + __len21 < __len12 + __len22)
4578 {
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05004579 _VSTD::__inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size);
4580// _VSTD::__inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004581 __first = __middle;
4582 __middle = __m2;
4583 __len1 = __len12;
4584 __len2 = __len22;
4585 }
4586 else
4587 {
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05004588 _VSTD::__inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size);
4589// _VSTD::__inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004590 __last = __middle;
4591 __middle = __m1;
4592 __len1 = __len11;
4593 __len2 = __len21;
4594 }
4595 }
4596}
4597
Howard Hinnantc51e1022010-05-11 19:42:16 +00004598template <class _BidirectionalIterator, class _Compare>
4599inline _LIBCPP_INLINE_VISIBILITY
4600void
4601inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4602 _Compare __comp)
4603{
4604 typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
4605 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004606 difference_type __len1 = _VSTD::distance(__first, __middle);
4607 difference_type __len2 = _VSTD::distance(__middle, __last);
4608 difference_type __buf_size = _VSTD::min(__len1, __len2);
Marshall Clow488f19f2015-02-02 17:35:53 +00004609 pair<value_type*, ptrdiff_t> __buf = _VSTD::get_temporary_buffer<value_type>(__buf_size);
4610 unique_ptr<value_type, __return_temporary_buffer> __h(__buf.first);
Eric Fiselier7ceab7b2019-04-12 05:18:19 +00004611 typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004612 return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __comp, __len1, __len2,
Howard Hinnantc51e1022010-05-11 19:42:16 +00004613 __buf.first, __buf.second);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004614}
4615
4616template <class _BidirectionalIterator>
4617inline _LIBCPP_INLINE_VISIBILITY
4618void
4619inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last)
4620{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004621 _VSTD::inplace_merge(__first, __middle, __last,
Howard Hinnantc51e1022010-05-11 19:42:16 +00004622 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
4623}
4624
4625// stable_sort
4626
4627template <class _Compare, class _InputIterator1, class _InputIterator2>
4628void
4629__merge_move_construct(_InputIterator1 __first1, _InputIterator1 __last1,
4630 _InputIterator2 __first2, _InputIterator2 __last2,
4631 typename iterator_traits<_InputIterator1>::value_type* __result, _Compare __comp)
4632{
4633 typedef typename iterator_traits<_InputIterator1>::value_type value_type;
4634 __destruct_n __d(0);
4635 unique_ptr<value_type, __destruct_n&> __h(__result, __d);
4636 for (; true; ++__result)
4637 {
4638 if (__first1 == __last1)
4639 {
Bruce Mitchener170d8972020-11-24 12:53:53 -05004640 for (; __first2 != __last2; ++__first2, ++__result, (void)__d.template __incr<value_type>())
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05004641 ::new ((void*)__result) value_type(_VSTD::move(*__first2));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004642 __h.release();
4643 return;
4644 }
4645 if (__first2 == __last2)
4646 {
Bruce Mitchener170d8972020-11-24 12:53:53 -05004647 for (; __first1 != __last1; ++__first1, ++__result, (void)__d.template __incr<value_type>())
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05004648 ::new ((void*)__result) value_type(_VSTD::move(*__first1));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004649 __h.release();
4650 return;
4651 }
4652 if (__comp(*__first2, *__first1))
4653 {
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05004654 ::new ((void*)__result) value_type(_VSTD::move(*__first2));
Bruce Mitchener170d8972020-11-24 12:53:53 -05004655 __d.template __incr<value_type>();
Howard Hinnantc51e1022010-05-11 19:42:16 +00004656 ++__first2;
4657 }
4658 else
4659 {
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05004660 ::new ((void*)__result) value_type(_VSTD::move(*__first1));
Bruce Mitchener170d8972020-11-24 12:53:53 -05004661 __d.template __incr<value_type>();
Howard Hinnantc51e1022010-05-11 19:42:16 +00004662 ++__first1;
4663 }
4664 }
4665}
4666
4667template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4668void
4669__merge_move_assign(_InputIterator1 __first1, _InputIterator1 __last1,
4670 _InputIterator2 __first2, _InputIterator2 __last2,
4671 _OutputIterator __result, _Compare __comp)
4672{
4673 for (; __first1 != __last1; ++__result)
4674 {
4675 if (__first2 == __last2)
4676 {
Marshall Clow0d332012019-08-20 21:31:51 +00004677 for (; __first1 != __last1; ++__first1, (void) ++__result)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004678 *__result = _VSTD::move(*__first1);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004679 return;
4680 }
4681 if (__comp(*__first2, *__first1))
4682 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004683 *__result = _VSTD::move(*__first2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004684 ++__first2;
4685 }
4686 else
4687 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004688 *__result = _VSTD::move(*__first1);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004689 ++__first1;
4690 }
4691 }
Marshall Clow0d332012019-08-20 21:31:51 +00004692 for (; __first2 != __last2; ++__first2, (void) ++__result)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004693 *__result = _VSTD::move(*__first2);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004694}
4695
4696template <class _Compare, class _RandomAccessIterator>
4697void
4698__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4699 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4700 typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size);
4701
4702template <class _Compare, class _RandomAccessIterator>
4703void
4704__stable_sort_move(_RandomAccessIterator __first1, _RandomAccessIterator __last1, _Compare __comp,
4705 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4706 typename iterator_traits<_RandomAccessIterator>::value_type* __first2)
4707{
4708 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4709 switch (__len)
4710 {
4711 case 0:
4712 return;
4713 case 1:
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05004714 ::new ((void*)__first2) value_type(_VSTD::move(*__first1));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004715 return;
4716 case 2:
Marshall Clow32043ac2018-02-06 18:58:05 +00004717 __destruct_n __d(0);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004718 unique_ptr<value_type, __destruct_n&> __h2(__first2, __d);
Marshall Clow32043ac2018-02-06 18:58:05 +00004719 if (__comp(*--__last1, *__first1))
Howard Hinnantc51e1022010-05-11 19:42:16 +00004720 {
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05004721 ::new ((void*)__first2) value_type(_VSTD::move(*__last1));
Bruce Mitchener170d8972020-11-24 12:53:53 -05004722 __d.template __incr<value_type>();
Howard Hinnantc51e1022010-05-11 19:42:16 +00004723 ++__first2;
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05004724 ::new ((void*)__first2) value_type(_VSTD::move(*__first1));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004725 }
4726 else
4727 {
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05004728 ::new ((void*)__first2) value_type(_VSTD::move(*__first1));
Bruce Mitchener170d8972020-11-24 12:53:53 -05004729 __d.template __incr<value_type>();
Howard Hinnantc51e1022010-05-11 19:42:16 +00004730 ++__first2;
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05004731 ::new ((void*)__first2) value_type(_VSTD::move(*__last1));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004732 }
4733 __h2.release();
4734 return;
4735 }
4736 if (__len <= 8)
4737 {
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05004738 _VSTD::__insertion_sort_move<_Compare>(__first1, __last1, __first2, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004739 return;
4740 }
4741 typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2;
4742 _RandomAccessIterator __m = __first1 + __l2;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05004743 _VSTD::__stable_sort<_Compare>(__first1, __m, __comp, __l2, __first2, __l2);
4744 _VSTD::__stable_sort<_Compare>(__m, __last1, __comp, __len - __l2, __first2 + __l2, __len - __l2);
4745 _VSTD::__merge_move_construct<_Compare>(__first1, __m, __m, __last1, __first2, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004746}
4747
4748template <class _Tp>
4749struct __stable_sort_switch
4750{
Howard Hinnanta9a897e2010-11-19 22:17:28 +00004751 static const unsigned value = 128*is_trivially_copy_assignable<_Tp>::value;
Howard Hinnantc51e1022010-05-11 19:42:16 +00004752};
4753
4754template <class _Compare, class _RandomAccessIterator>
4755void
4756__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4757 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4758 typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size)
4759{
4760 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4761 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4762 switch (__len)
4763 {
4764 case 0:
4765 case 1:
4766 return;
4767 case 2:
4768 if (__comp(*--__last, *__first))
4769 swap(*__first, *__last);
4770 return;
4771 }
4772 if (__len <= static_cast<difference_type>(__stable_sort_switch<value_type>::value))
4773 {
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05004774 _VSTD::__insertion_sort<_Compare>(__first, __last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004775 return;
4776 }
4777 typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2;
4778 _RandomAccessIterator __m = __first + __l2;
4779 if (__len <= __buff_size)
4780 {
4781 __destruct_n __d(0);
4782 unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05004783 _VSTD::__stable_sort_move<_Compare>(__first, __m, __comp, __l2, __buff);
Bruce Mitchener170d8972020-11-24 12:53:53 -05004784 __d.__set(__l2, (value_type*)nullptr);
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05004785 _VSTD::__stable_sort_move<_Compare>(__m, __last, __comp, __len - __l2, __buff + __l2);
Bruce Mitchener170d8972020-11-24 12:53:53 -05004786 __d.__set(__len, (value_type*)nullptr);
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05004787 _VSTD::__merge_move_assign<_Compare>(__buff, __buff + __l2, __buff + __l2, __buff + __len, __first, __comp);
4788// _VSTD::__merge<_Compare>(move_iterator<value_type*>(__buff),
4789// move_iterator<value_type*>(__buff + __l2),
4790// move_iterator<_RandomAccessIterator>(__buff + __l2),
4791// move_iterator<_RandomAccessIterator>(__buff + __len),
4792// __first, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004793 return;
4794 }
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05004795 _VSTD::__stable_sort<_Compare>(__first, __m, __comp, __l2, __buff, __buff_size);
4796 _VSTD::__stable_sort<_Compare>(__m, __last, __comp, __len - __l2, __buff, __buff_size);
4797 _VSTD::__inplace_merge<_Compare>(__first, __m, __last, __comp, __l2, __len - __l2, __buff, __buff_size);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004798}
4799
4800template <class _RandomAccessIterator, class _Compare>
4801inline _LIBCPP_INLINE_VISIBILITY
4802void
4803stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4804{
4805 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4806 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4807 difference_type __len = __last - __first;
4808 pair<value_type*, ptrdiff_t> __buf(0, 0);
4809 unique_ptr<value_type, __return_temporary_buffer> __h;
4810 if (__len > static_cast<difference_type>(__stable_sort_switch<value_type>::value))
4811 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004812 __buf = _VSTD::get_temporary_buffer<value_type>(__len);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004813 __h.reset(__buf.first);
4814 }
Eric Fiselier7ceab7b2019-04-12 05:18:19 +00004815 typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05004816 _VSTD::__stable_sort<_Comp_ref>(__first, __last, __comp, __len, __buf.first, __buf.second);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004817}
4818
4819template <class _RandomAccessIterator>
4820inline _LIBCPP_INLINE_VISIBILITY
4821void
4822stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
4823{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004824 _VSTD::stable_sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004825}
4826
4827// is_heap_until
4828
4829template <class _RandomAccessIterator, class _Compare>
Nico Weber471b10a2019-04-03 18:13:08 +00004830_LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_AFTER_CXX17 _RandomAccessIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00004831is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4832{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004833 typedef typename _VSTD::iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00004834 difference_type __len = __last - __first;
4835 difference_type __p = 0;
4836 difference_type __c = 1;
4837 _RandomAccessIterator __pp = __first;
4838 while (__c < __len)
4839 {
4840 _RandomAccessIterator __cp = __first + __c;
4841 if (__comp(*__pp, *__cp))
4842 return __cp;
4843 ++__c;
4844 ++__cp;
4845 if (__c == __len)
4846 return __last;
4847 if (__comp(*__pp, *__cp))
4848 return __cp;
4849 ++__p;
4850 ++__pp;
4851 __c = 2 * __p + 1;
4852 }
4853 return __last;
4854}
4855
Howard Hinnant3b6579a2010-08-22 00:02:43 +00004856template<class _RandomAccessIterator>
Nico Weber471b10a2019-04-03 18:13:08 +00004857_LIBCPP_NODISCARD_EXT inline
4858_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004859_RandomAccessIterator
4860is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last)
4861{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004862 return _VSTD::is_heap_until(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004863}
4864
4865// is_heap
4866
4867template <class _RandomAccessIterator, class _Compare>
Nico Weber471b10a2019-04-03 18:13:08 +00004868_LIBCPP_NODISCARD_EXT inline
4869_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004870bool
4871is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4872{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004873 return _VSTD::is_heap_until(__first, __last, __comp) == __last;
Howard Hinnantc51e1022010-05-11 19:42:16 +00004874}
4875
Howard Hinnant3b6579a2010-08-22 00:02:43 +00004876template<class _RandomAccessIterator>
Nico Weber471b10a2019-04-03 18:13:08 +00004877_LIBCPP_NODISCARD_EXT inline
4878_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004879bool
4880is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4881{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004882 return _VSTD::is_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004883}
4884
4885// push_heap
4886
4887template <class _Compare, class _RandomAccessIterator>
4888void
David Majnemer4468d562014-07-22 06:07:09 +00004889__sift_up(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4890 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
Howard Hinnantc51e1022010-05-11 19:42:16 +00004891{
Howard Hinnantc51e1022010-05-11 19:42:16 +00004892 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4893 if (__len > 1)
4894 {
4895 __len = (__len - 2) / 2;
4896 _RandomAccessIterator __ptr = __first + __len;
4897 if (__comp(*__ptr, *--__last))
4898 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004899 value_type __t(_VSTD::move(*__last));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004900 do
4901 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004902 *__last = _VSTD::move(*__ptr);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004903 __last = __ptr;
4904 if (__len == 0)
4905 break;
4906 __len = (__len - 1) / 2;
4907 __ptr = __first + __len;
4908 } while (__comp(*__ptr, __t));
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004909 *__last = _VSTD::move(__t);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004910 }
4911 }
4912}
4913
4914template <class _RandomAccessIterator, class _Compare>
4915inline _LIBCPP_INLINE_VISIBILITY
4916void
4917push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4918{
Eric Fiselier7ceab7b2019-04-12 05:18:19 +00004919 typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05004920 _VSTD::__sift_up<_Comp_ref>(__first, __last, __comp, __last - __first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004921}
4922
4923template <class _RandomAccessIterator>
4924inline _LIBCPP_INLINE_VISIBILITY
4925void
4926push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4927{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004928 _VSTD::push_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004929}
4930
4931// pop_heap
4932
4933template <class _Compare, class _RandomAccessIterator>
David Majnemer4468d562014-07-22 06:07:09 +00004934void
Eric Fiselier6003c772016-12-23 23:37:52 +00004935__sift_down(_RandomAccessIterator __first, _RandomAccessIterator /*__last*/,
4936 _Compare __comp,
David Majnemer4468d562014-07-22 06:07:09 +00004937 typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4938 _RandomAccessIterator __start)
4939{
4940 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4941 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4942 // left-child of __start is at 2 * __start + 1
4943 // right-child of __start is at 2 * __start + 2
4944 difference_type __child = __start - __first;
4945
4946 if (__len < 2 || (__len - 2) / 2 < __child)
4947 return;
4948
4949 __child = 2 * __child + 1;
4950 _RandomAccessIterator __child_i = __first + __child;
4951
4952 if ((__child + 1) < __len && __comp(*__child_i, *(__child_i + 1))) {
4953 // right-child exists and is greater than left-child
4954 ++__child_i;
4955 ++__child;
4956 }
4957
4958 // check if we are in heap-order
4959 if (__comp(*__child_i, *__start))
4960 // we are, __start is larger than it's largest child
4961 return;
4962
4963 value_type __top(_VSTD::move(*__start));
4964 do
4965 {
4966 // we are not in heap-order, swap the parent with it's largest child
4967 *__start = _VSTD::move(*__child_i);
4968 __start = __child_i;
4969
4970 if ((__len - 2) / 2 < __child)
4971 break;
4972
4973 // recompute the child based off of the updated parent
4974 __child = 2 * __child + 1;
4975 __child_i = __first + __child;
4976
4977 if ((__child + 1) < __len && __comp(*__child_i, *(__child_i + 1))) {
4978 // right-child exists and is greater than left-child
4979 ++__child_i;
4980 ++__child;
4981 }
4982
4983 // check if we are in heap-order
4984 } while (!__comp(*__child_i, __top));
4985 *__start = _VSTD::move(__top);
4986}
4987
4988template <class _Compare, class _RandomAccessIterator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00004989inline _LIBCPP_INLINE_VISIBILITY
4990void
4991__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4992 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
4993{
4994 if (__len > 1)
4995 {
4996 swap(*__first, *--__last);
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05004997 _VSTD::__sift_down<_Compare>(__first, __last, __comp, __len - 1, __first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004998 }
4999}
5000
5001template <class _RandomAccessIterator, class _Compare>
5002inline _LIBCPP_INLINE_VISIBILITY
5003void
5004pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
5005{
Eric Fiselier7ceab7b2019-04-12 05:18:19 +00005006 typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005007 _VSTD::__pop_heap<_Comp_ref>(__first, __last, __comp, __last - __first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005008}
5009
5010template <class _RandomAccessIterator>
5011inline _LIBCPP_INLINE_VISIBILITY
5012void
5013pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
5014{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005015 _VSTD::pop_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00005016}
5017
5018// make_heap
5019
5020template <class _Compare, class _RandomAccessIterator>
5021void
5022__make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
5023{
5024 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
5025 difference_type __n = __last - __first;
5026 if (__n > 1)
5027 {
David Majnemer4468d562014-07-22 06:07:09 +00005028 // start from the first parent, there is no need to consider children
5029 for (difference_type __start = (__n - 2) / 2; __start >= 0; --__start)
5030 {
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005031 _VSTD::__sift_down<_Compare>(__first, __last, __comp, __n, __first + __start);
David Majnemer4468d562014-07-22 06:07:09 +00005032 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00005033 }
5034}
5035
5036template <class _RandomAccessIterator, class _Compare>
5037inline _LIBCPP_INLINE_VISIBILITY
5038void
5039make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
5040{
Eric Fiselier7ceab7b2019-04-12 05:18:19 +00005041 typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005042 _VSTD::__make_heap<_Comp_ref>(__first, __last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005043}
5044
5045template <class _RandomAccessIterator>
5046inline _LIBCPP_INLINE_VISIBILITY
5047void
5048make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
5049{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005050 _VSTD::make_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00005051}
5052
5053// sort_heap
5054
5055template <class _Compare, class _RandomAccessIterator>
5056void
5057__sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
5058{
5059 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
Marshall Clow0d332012019-08-20 21:31:51 +00005060 for (difference_type __n = __last - __first; __n > 1; --__last, (void) --__n)
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005061 _VSTD::__pop_heap<_Compare>(__first, __last, __comp, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005062}
5063
5064template <class _RandomAccessIterator, class _Compare>
5065inline _LIBCPP_INLINE_VISIBILITY
5066void
5067sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
5068{
Eric Fiselier7ceab7b2019-04-12 05:18:19 +00005069 typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005070 _VSTD::__sort_heap<_Comp_ref>(__first, __last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005071}
5072
5073template <class _RandomAccessIterator>
5074inline _LIBCPP_INLINE_VISIBILITY
5075void
5076sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
5077{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005078 _VSTD::sort_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00005079}
5080
5081// partial_sort
5082
5083template <class _Compare, class _RandomAccessIterator>
5084void
5085__partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
5086 _Compare __comp)
5087{
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005088 _VSTD::__make_heap<_Compare>(__first, __middle, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005089 typename iterator_traits<_RandomAccessIterator>::difference_type __len = __middle - __first;
5090 for (_RandomAccessIterator __i = __middle; __i != __last; ++__i)
5091 {
5092 if (__comp(*__i, *__first))
5093 {
5094 swap(*__i, *__first);
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005095 _VSTD::__sift_down<_Compare>(__first, __middle, __comp, __len, __first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005096 }
5097 }
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005098 _VSTD::__sort_heap<_Compare>(__first, __middle, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005099}
5100
5101template <class _RandomAccessIterator, class _Compare>
5102inline _LIBCPP_INLINE_VISIBILITY
5103void
5104partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
5105 _Compare __comp)
5106{
Eric Fiselier7ceab7b2019-04-12 05:18:19 +00005107 typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005108 _VSTD::__partial_sort<_Comp_ref>(__first, __middle, __last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005109}
5110
5111template <class _RandomAccessIterator>
5112inline _LIBCPP_INLINE_VISIBILITY
5113void
5114partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last)
5115{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005116 _VSTD::partial_sort(__first, __middle, __last,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005117 __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
5118}
5119
5120// partial_sort_copy
5121
5122template <class _Compare, class _InputIterator, class _RandomAccessIterator>
5123_RandomAccessIterator
5124__partial_sort_copy(_InputIterator __first, _InputIterator __last,
5125 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp)
5126{
5127 _RandomAccessIterator __r = __result_first;
5128 if (__r != __result_last)
5129 {
Marshall Clow0d332012019-08-20 21:31:51 +00005130 for (; __first != __last && __r != __result_last; ++__first, (void) ++__r)
Howard Hinnantc51e1022010-05-11 19:42:16 +00005131 *__r = *__first;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005132 _VSTD::__make_heap<_Compare>(__result_first, __r, __comp);
David Majnemer4468d562014-07-22 06:07:09 +00005133 typename iterator_traits<_RandomAccessIterator>::difference_type __len = __r - __result_first;
Howard Hinnantc51e1022010-05-11 19:42:16 +00005134 for (; __first != __last; ++__first)
5135 if (__comp(*__first, *__result_first))
5136 {
5137 *__result_first = *__first;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005138 _VSTD::__sift_down<_Compare>(__result_first, __r, __comp, __len, __result_first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005139 }
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005140 _VSTD::__sort_heap<_Compare>(__result_first, __r, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005141 }
5142 return __r;
5143}
5144
5145template <class _InputIterator, class _RandomAccessIterator, class _Compare>
5146inline _LIBCPP_INLINE_VISIBILITY
5147_RandomAccessIterator
5148partial_sort_copy(_InputIterator __first, _InputIterator __last,
5149 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp)
5150{
Eric Fiselier7ceab7b2019-04-12 05:18:19 +00005151 typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005152 return _VSTD::__partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005153}
5154
5155template <class _InputIterator, class _RandomAccessIterator>
5156inline _LIBCPP_INLINE_VISIBILITY
5157_RandomAccessIterator
5158partial_sort_copy(_InputIterator __first, _InputIterator __last,
5159 _RandomAccessIterator __result_first, _RandomAccessIterator __result_last)
5160{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005161 return _VSTD::partial_sort_copy(__first, __last, __result_first, __result_last,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005162 __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
5163}
5164
5165// nth_element
5166
5167template <class _Compare, class _RandomAccessIterator>
5168void
5169__nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
5170{
5171 // _Compare is known to be a reference type
5172 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
5173 const difference_type __limit = 7;
5174 while (true)
5175 {
5176 __restart:
Howard Hinnant2fa038c2011-12-29 17:45:35 +00005177 if (__nth == __last)
5178 return;
Howard Hinnantc51e1022010-05-11 19:42:16 +00005179 difference_type __len = __last - __first;
5180 switch (__len)
5181 {
5182 case 0:
5183 case 1:
5184 return;
5185 case 2:
5186 if (__comp(*--__last, *__first))
5187 swap(*__first, *__last);
5188 return;
5189 case 3:
5190 {
5191 _RandomAccessIterator __m = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005192 _VSTD::__sort3<_Compare>(__first, ++__m, --__last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005193 return;
5194 }
5195 }
5196 if (__len <= __limit)
5197 {
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005198 _VSTD::__selection_sort<_Compare>(__first, __last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005199 return;
5200 }
5201 // __len > __limit >= 3
5202 _RandomAccessIterator __m = __first + __len/2;
5203 _RandomAccessIterator __lm1 = __last;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005204 unsigned __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, --__lm1, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005205 // *__m is median
5206 // partition [__first, __m) < *__m and *__m <= [__m, __last)
5207 // (this inhibits tossing elements equivalent to __m around unnecessarily)
5208 _RandomAccessIterator __i = __first;
5209 _RandomAccessIterator __j = __lm1;
5210 // j points beyond range to be tested, *__lm1 is known to be <= *__m
5211 // The search going up is known to be guarded but the search coming down isn't.
5212 // Prime the downward search with a guard.
5213 if (!__comp(*__i, *__m)) // if *__first == *__m
5214 {
5215 // *__first == *__m, *__first doesn't go in first part
5216 // manually guard downward moving __j against __i
5217 while (true)
5218 {
5219 if (__i == --__j)
5220 {
5221 // *__first == *__m, *__m <= all other elements
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005222 // Partition instead into [__first, __i) == *__first and *__first < [__i, __last)
Howard Hinnantc51e1022010-05-11 19:42:16 +00005223 ++__i; // __first + 1
5224 __j = __last;
5225 if (!__comp(*__first, *--__j)) // we need a guard if *__first == *(__last-1)
5226 {
5227 while (true)
5228 {
5229 if (__i == __j)
5230 return; // [__first, __last) all equivalent elements
5231 if (__comp(*__first, *__i))
5232 {
5233 swap(*__i, *__j);
5234 ++__n_swaps;
5235 ++__i;
5236 break;
5237 }
5238 ++__i;
5239 }
5240 }
5241 // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1
5242 if (__i == __j)
5243 return;
5244 while (true)
5245 {
5246 while (!__comp(*__first, *__i))
5247 ++__i;
5248 while (__comp(*__first, *--__j))
5249 ;
5250 if (__i >= __j)
5251 break;
5252 swap(*__i, *__j);
5253 ++__n_swaps;
5254 ++__i;
5255 }
5256 // [__first, __i) == *__first and *__first < [__i, __last)
5257 // The first part is sorted,
5258 if (__nth < __i)
5259 return;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005260 // __nth_element the second part
5261 // _VSTD::__nth_element<_Compare>(__i, __nth, __last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005262 __first = __i;
5263 goto __restart;
5264 }
5265 if (__comp(*__j, *__m))
5266 {
5267 swap(*__i, *__j);
5268 ++__n_swaps;
5269 break; // found guard for downward moving __j, now use unguarded partition
5270 }
5271 }
5272 }
5273 ++__i;
5274 // j points beyond range to be tested, *__lm1 is known to be <= *__m
5275 // if not yet partitioned...
5276 if (__i < __j)
5277 {
5278 // known that *(__i - 1) < *__m
5279 while (true)
5280 {
5281 // __m still guards upward moving __i
5282 while (__comp(*__i, *__m))
5283 ++__i;
5284 // It is now known that a guard exists for downward moving __j
5285 while (!__comp(*--__j, *__m))
5286 ;
5287 if (__i >= __j)
5288 break;
5289 swap(*__i, *__j);
5290 ++__n_swaps;
5291 // It is known that __m != __j
5292 // If __m just moved, follow it
5293 if (__m == __i)
5294 __m = __j;
5295 ++__i;
5296 }
5297 }
5298 // [__first, __i) < *__m and *__m <= [__i, __last)
5299 if (__i != __m && __comp(*__m, *__i))
5300 {
5301 swap(*__i, *__m);
5302 ++__n_swaps;
5303 }
5304 // [__first, __i) < *__i and *__i <= [__i+1, __last)
5305 if (__nth == __i)
5306 return;
5307 if (__n_swaps == 0)
5308 {
5309 // We were given a perfectly partitioned sequence. Coincidence?
5310 if (__nth < __i)
5311 {
5312 // Check for [__first, __i) already sorted
5313 __j = __m = __first;
5314 while (++__j != __i)
5315 {
5316 if (__comp(*__j, *__m))
5317 // not yet sorted, so sort
5318 goto not_sorted;
5319 __m = __j;
5320 }
5321 // [__first, __i) sorted
5322 return;
5323 }
5324 else
5325 {
5326 // Check for [__i, __last) already sorted
5327 __j = __m = __i;
5328 while (++__j != __last)
5329 {
5330 if (__comp(*__j, *__m))
5331 // not yet sorted, so sort
5332 goto not_sorted;
5333 __m = __j;
5334 }
5335 // [__i, __last) sorted
5336 return;
5337 }
5338 }
5339not_sorted:
5340 // __nth_element on range containing __nth
5341 if (__nth < __i)
5342 {
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005343 // _VSTD::__nth_element<_Compare>(__first, __nth, __i, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005344 __last = __i;
5345 }
5346 else
5347 {
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005348 // _VSTD::__nth_element<_Compare>(__i+1, __nth, __last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005349 __first = ++__i;
5350 }
5351 }
5352}
5353
5354template <class _RandomAccessIterator, class _Compare>
5355inline _LIBCPP_INLINE_VISIBILITY
5356void
5357nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
5358{
Eric Fiselier7ceab7b2019-04-12 05:18:19 +00005359 typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005360 _VSTD::__nth_element<_Comp_ref>(__first, __nth, __last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005361}
5362
5363template <class _RandomAccessIterator>
5364inline _LIBCPP_INLINE_VISIBILITY
5365void
5366nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last)
5367{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005368 _VSTD::nth_element(__first, __nth, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00005369}
5370
5371// includes
5372
5373template <class _Compare, class _InputIterator1, class _InputIterator2>
Marshall Clowc0b7f972018-01-22 23:10:40 +00005374_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Howard Hinnantc51e1022010-05-11 19:42:16 +00005375__includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
5376 _Compare __comp)
5377{
5378 for (; __first2 != __last2; ++__first1)
5379 {
5380 if (__first1 == __last1 || __comp(*__first2, *__first1))
5381 return false;
5382 if (!__comp(*__first1, *__first2))
5383 ++__first2;
5384 }
5385 return true;
5386}
5387
5388template <class _InputIterator1, class _InputIterator2, class _Compare>
Nico Weber471b10a2019-04-03 18:13:08 +00005389_LIBCPP_NODISCARD_EXT inline
5390_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00005391bool
5392includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
5393 _Compare __comp)
5394{
Eric Fiselier7ceab7b2019-04-12 05:18:19 +00005395 typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005396 return _VSTD::__includes<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005397}
5398
5399template <class _InputIterator1, class _InputIterator2>
Nico Weber471b10a2019-04-03 18:13:08 +00005400_LIBCPP_NODISCARD_EXT inline
5401_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00005402bool
5403includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2)
5404{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005405 return _VSTD::includes(__first1, __last1, __first2, __last2,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005406 __less<typename iterator_traits<_InputIterator1>::value_type,
5407 typename iterator_traits<_InputIterator2>::value_type>());
5408}
5409
5410// set_union
5411
5412template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
Arthur O'Dwyer5afc5692020-12-04 13:47:12 -05005413_LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00005414__set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5415 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5416{
5417 for (; __first1 != __last1; ++__result)
5418 {
5419 if (__first2 == __last2)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005420 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005421 if (__comp(*__first2, *__first1))
5422 {
5423 *__result = *__first2;
5424 ++__first2;
5425 }
5426 else
5427 {
Howard Hinnantc51e1022010-05-11 19:42:16 +00005428 if (!__comp(*__first1, *__first2))
5429 ++__first2;
Marshall Clowb4687412017-10-30 15:50:00 +00005430 *__result = *__first1;
Howard Hinnantc51e1022010-05-11 19:42:16 +00005431 ++__first1;
5432 }
5433 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005434 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005435}
5436
5437template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
Arthur O'Dwyer5afc5692020-12-04 13:47:12 -05005438inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00005439_OutputIterator
5440set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5441 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5442{
Eric Fiselier7ceab7b2019-04-12 05:18:19 +00005443 typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005444 return _VSTD::__set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005445}
5446
5447template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
Arthur O'Dwyer5afc5692020-12-04 13:47:12 -05005448inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00005449_OutputIterator
5450set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5451 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5452{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005453 return _VSTD::set_union(__first1, __last1, __first2, __last2, __result,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005454 __less<typename iterator_traits<_InputIterator1>::value_type,
5455 typename iterator_traits<_InputIterator2>::value_type>());
5456}
5457
5458// set_intersection
5459
5460template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
Marshall Clowc0b7f972018-01-22 23:10:40 +00005461_LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00005462__set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5463 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5464{
5465 while (__first1 != __last1 && __first2 != __last2)
5466 {
5467 if (__comp(*__first1, *__first2))
5468 ++__first1;
5469 else
5470 {
5471 if (!__comp(*__first2, *__first1))
5472 {
5473 *__result = *__first1;
5474 ++__result;
5475 ++__first1;
5476 }
5477 ++__first2;
5478 }
5479 }
5480 return __result;
5481}
5482
5483template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
Marshall Clowc0b7f972018-01-22 23:10:40 +00005484inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00005485_OutputIterator
5486set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5487 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5488{
Eric Fiselier7ceab7b2019-04-12 05:18:19 +00005489 typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005490 return _VSTD::__set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005491}
5492
5493template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
Marshall Clowc0b7f972018-01-22 23:10:40 +00005494inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00005495_OutputIterator
5496set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5497 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5498{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005499 return _VSTD::set_intersection(__first1, __last1, __first2, __last2, __result,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005500 __less<typename iterator_traits<_InputIterator1>::value_type,
5501 typename iterator_traits<_InputIterator2>::value_type>());
5502}
5503
5504// set_difference
5505
5506template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
Arthur O'Dwyer5afc5692020-12-04 13:47:12 -05005507_LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00005508__set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5509 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5510{
5511 while (__first1 != __last1)
5512 {
5513 if (__first2 == __last2)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005514 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005515 if (__comp(*__first1, *__first2))
5516 {
5517 *__result = *__first1;
5518 ++__result;
5519 ++__first1;
5520 }
5521 else
5522 {
5523 if (!__comp(*__first2, *__first1))
5524 ++__first1;
5525 ++__first2;
5526 }
5527 }
5528 return __result;
5529}
5530
5531template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
Arthur O'Dwyer5afc5692020-12-04 13:47:12 -05005532inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00005533_OutputIterator
5534set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5535 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5536{
Eric Fiselier7ceab7b2019-04-12 05:18:19 +00005537 typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005538 return _VSTD::__set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005539}
5540
5541template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
Arthur O'Dwyer5afc5692020-12-04 13:47:12 -05005542inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00005543_OutputIterator
5544set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5545 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5546{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005547 return _VSTD::set_difference(__first1, __last1, __first2, __last2, __result,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005548 __less<typename iterator_traits<_InputIterator1>::value_type,
5549 typename iterator_traits<_InputIterator2>::value_type>());
5550}
5551
5552// set_symmetric_difference
5553
5554template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
Arthur O'Dwyer5afc5692020-12-04 13:47:12 -05005555_LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator
Howard Hinnantc51e1022010-05-11 19:42:16 +00005556__set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5557 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5558{
5559 while (__first1 != __last1)
5560 {
5561 if (__first2 == __last2)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005562 return _VSTD::copy(__first1, __last1, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005563 if (__comp(*__first1, *__first2))
5564 {
5565 *__result = *__first1;
5566 ++__result;
5567 ++__first1;
5568 }
5569 else
5570 {
5571 if (__comp(*__first2, *__first1))
5572 {
5573 *__result = *__first2;
5574 ++__result;
5575 }
5576 else
5577 ++__first1;
5578 ++__first2;
5579 }
5580 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005581 return _VSTD::copy(__first2, __last2, __result);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005582}
5583
5584template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
Arthur O'Dwyer5afc5692020-12-04 13:47:12 -05005585inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00005586_OutputIterator
5587set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5588 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5589{
Eric Fiselier7ceab7b2019-04-12 05:18:19 +00005590 typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005591 return _VSTD::__set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005592}
5593
5594template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
Arthur O'Dwyer5afc5692020-12-04 13:47:12 -05005595inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00005596_OutputIterator
5597set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5598 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5599{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005600 return _VSTD::set_symmetric_difference(__first1, __last1, __first2, __last2, __result,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005601 __less<typename iterator_traits<_InputIterator1>::value_type,
5602 typename iterator_traits<_InputIterator2>::value_type>());
5603}
5604
5605// lexicographical_compare
5606
5607template <class _Compare, class _InputIterator1, class _InputIterator2>
Marshall Clow5492c8a2018-01-22 20:44:33 +00005608_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
Howard Hinnantc51e1022010-05-11 19:42:16 +00005609__lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5610 _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
5611{
Eric Fiseliera09a3b42014-10-27 19:28:20 +00005612 for (; __first2 != __last2; ++__first1, (void) ++__first2)
Howard Hinnantc51e1022010-05-11 19:42:16 +00005613 {
5614 if (__first1 == __last1 || __comp(*__first1, *__first2))
5615 return true;
5616 if (__comp(*__first2, *__first1))
5617 return false;
5618 }
5619 return false;
5620}
5621
5622template <class _InputIterator1, class _InputIterator2, class _Compare>
Nico Weber471b10a2019-04-03 18:13:08 +00005623_LIBCPP_NODISCARD_EXT inline
5624_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00005625bool
5626lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5627 _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
5628{
Eric Fiselier7ceab7b2019-04-12 05:18:19 +00005629 typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005630 return _VSTD::__lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005631}
5632
5633template <class _InputIterator1, class _InputIterator2>
Nico Weber471b10a2019-04-03 18:13:08 +00005634_LIBCPP_NODISCARD_EXT inline
5635_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
Howard Hinnantc51e1022010-05-11 19:42:16 +00005636bool
5637lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5638 _InputIterator2 __first2, _InputIterator2 __last2)
5639{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005640 return _VSTD::lexicographical_compare(__first1, __last1, __first2, __last2,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005641 __less<typename iterator_traits<_InputIterator1>::value_type,
5642 typename iterator_traits<_InputIterator2>::value_type>());
5643}
5644
5645// next_permutation
5646
5647template <class _Compare, class _BidirectionalIterator>
5648bool
5649__next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5650{
5651 _BidirectionalIterator __i = __last;
5652 if (__first == __last || __first == --__i)
5653 return false;
5654 while (true)
5655 {
5656 _BidirectionalIterator __ip1 = __i;
5657 if (__comp(*--__i, *__ip1))
5658 {
5659 _BidirectionalIterator __j = __last;
5660 while (!__comp(*__i, *--__j))
5661 ;
5662 swap(*__i, *__j);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005663 _VSTD::reverse(__ip1, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005664 return true;
5665 }
5666 if (__i == __first)
5667 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005668 _VSTD::reverse(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005669 return false;
5670 }
5671 }
5672}
5673
5674template <class _BidirectionalIterator, class _Compare>
5675inline _LIBCPP_INLINE_VISIBILITY
5676bool
5677next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5678{
Eric Fiselier7ceab7b2019-04-12 05:18:19 +00005679 typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005680 return _VSTD::__next_permutation<_Comp_ref>(__first, __last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005681}
5682
5683template <class _BidirectionalIterator>
5684inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3b6579a2010-08-22 00:02:43 +00005685bool
Howard Hinnantc51e1022010-05-11 19:42:16 +00005686next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
5687{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005688 return _VSTD::next_permutation(__first, __last,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005689 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
5690}
5691
5692// prev_permutation
5693
5694template <class _Compare, class _BidirectionalIterator>
5695bool
5696__prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5697{
5698 _BidirectionalIterator __i = __last;
5699 if (__first == __last || __first == --__i)
5700 return false;
5701 while (true)
5702 {
5703 _BidirectionalIterator __ip1 = __i;
5704 if (__comp(*__ip1, *--__i))
5705 {
5706 _BidirectionalIterator __j = __last;
5707 while (!__comp(*--__j, *__i))
5708 ;
5709 swap(*__i, *__j);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005710 _VSTD::reverse(__ip1, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005711 return true;
5712 }
5713 if (__i == __first)
5714 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005715 _VSTD::reverse(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005716 return false;
5717 }
5718 }
5719}
5720
5721template <class _BidirectionalIterator, class _Compare>
5722inline _LIBCPP_INLINE_VISIBILITY
5723bool
5724prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5725{
Eric Fiselier7ceab7b2019-04-12 05:18:19 +00005726 typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
Arthur O'Dwyere75dcfa2020-11-22 13:21:11 -05005727 return _VSTD::__prev_permutation<_Comp_ref>(__first, __last, __comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00005728}
5729
5730template <class _BidirectionalIterator>
5731inline _LIBCPP_INLINE_VISIBILITY
5732bool
5733prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
5734{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005735 return _VSTD::prev_permutation(__first, __last,
Howard Hinnantc51e1022010-05-11 19:42:16 +00005736 __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
5737}
5738
Howard Hinnantc51e1022010-05-11 19:42:16 +00005739_LIBCPP_END_NAMESPACE_STD
5740
Eric Fiselierf4433a32017-05-31 22:07:49 +00005741_LIBCPP_POP_MACROS
5742
Louis Dionne59d0b3c2019-08-05 18:29:14 +00005743#if defined(_LIBCPP_HAS_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17
Louis Dionned53d8c02019-08-06 21:11:24 +00005744# include <__pstl_algorithm>
Louis Dionne59d0b3c2019-08-05 18:29:14 +00005745#endif
5746
Howard Hinnantc51e1022010-05-11 19:42:16 +00005747#endif // _LIBCPP_ALGORITHM