1// -*- C++ -*- 2//===----------------------------------------------------------------------===// 3// 4// 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 7// 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 21namespace ranges { 22 template <class I, class F> 23 struct in_fun_result; // since C++20 24 25 template <class I1, class I2> 26 struct in_in_result; // since C++20 27 28 template <class I1, class I2, class O> 29 struct in_in_out_result; // since C++20 30 31 template <class I, class O1, class O2> 32 struct in_out_out_result; // since C++20 33 34 template <class I1, class I2> 35 struct min_max_result; // since C++20 36 37 template <class I> 38 struct in_found_result; // since C++20 39 40 template<forward_iterator I, sentinel_for<I> S, class Proj = identity, 41 indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less> // since C++20 42 constexpr I min_element(I first, S last, Comp comp = {}, Proj proj = {}); 43 44 template<forward_range R, class Proj = identity, 45 indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less> // since C++20 46 constexpr borrowed_iterator_t<R> min_element(R&& r, Comp comp = {}, Proj proj = {}); 47 48 template <input_iterator I1, sentinel_for<_I1> S1, input_iterator I2, sentinel_for<_I2> S2, 49 class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity> 50 requires indirectly_comparable<I1, I2, Pred, Proj1, Proj2> 51 constexpr mismatch_result<_I1, _I2> 52 mismatch()(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {}, Proj1 proj1 = {}, Proj2 proj2 = {}) // since C++20 53 54 template <input_range R1, input_range R2, 55 class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity> 56 requires indirectly_comparable<iterator_t<R1>, iterator_t<R2>, Pred, Proj1, Proj2> 57 constexpr mismatch_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>> 58 mismatch(R1&& r1, R2&& r2, Pred pred = {}, Proj1 proj1 = {}, Proj2 proj2 = {}) // since C++20 59 60 requires indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T*> 61 constexpr I find(I first, S last, const T& value, Proj proj = {}); // since C++20 62 63 template<input_range R, class T, class Proj = identity> 64 requires indirect_binary_predicate<ranges::equal_to, projected<iterator_t<R>, Proj>, const T*> 65 constexpr borrowed_iterator_t<R> 66 find(R&& r, const T& value, Proj proj = {}); // since C++20 67 68 template<input_iterator I, sentinel_for<I> S, class Proj = identity, 69 indirect_unary_predicate<projected<I, Proj>> Pred> 70 constexpr I find_if(I first, S last, Pred pred, Proj proj = {}); // since C++20 71 72 template<input_range R, class Proj = identity, 73 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 74 constexpr borrowed_iterator_t<R> 75 find_if(R&& r, Pred pred, Proj proj = {}); // since C++20 76 77 template<input_iterator I, sentinel_for<I> S, class Proj = identity, 78 indirect_unary_predicate<projected<I, Proj>> Pred> 79 constexpr I find_if_not(I first, S last, Pred pred, Proj proj = {}); // since C++20 80 81 template<input_range R, class Proj = identity, 82 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 83 constexpr borrowed_iterator_t<R> 84 find_if_not(R&& r, Pred pred, Proj proj = {}); // since C++20 85 86 template<class T, class Proj = identity, 87 indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less> 88 constexpr const T& min(const T& a, const T& b, Comp comp = {}, Proj proj = {}); // since C++20 89 90 template<copyable T, class Proj = identity, 91 indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less> 92 constexpr T min(initializer_list<T> r, Comp comp = {}, Proj proj = {}); // since C++20 93 94 template<input_range R, class Proj = identity, 95 indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less> 96 requires indirectly_copyable_storable<iterator_t<R>, range_value_t<R>*> 97 constexpr range_value_t<R> 98 min(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 99 100 template<class T, class Proj = identity, 101 indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less> 102 constexpr const T& max(const T& a, const T& b, Comp comp = {}, Proj proj = {}); // since C++20 103 104 template<copyable T, class Proj = identity, 105 indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less> 106 constexpr T max(initializer_list<T> r, Comp comp = {}, Proj proj = {}); // since C++20 107 108 template<input_range R, class Proj = identity, 109 indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less> 110 requires indirectly_copyable_storable<iterator_t<R>, range_value_t<R>*> 111 constexpr range_value_t<R> 112 max(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 113 114 template<class I, class O> 115 using unary_transform_result = in_out_result<I, O>; // since C++20 116 117 template<class I1, class I2, class O> 118 using binary_transform_result = in_in_out_result<I1, I2, O>; // since C++20 119 120 template<input_iterator I, sentinel_for<I> S, weakly_incrementable O, 121 copy_constructible F, class Proj = identity> 122 requires indirectly_writable<O, indirect_result_t<F&, projected<I, Proj>>> 123 constexpr ranges::unary_transform_result<I, O> 124 transform(I first1, S last1, O result, F op, Proj proj = {}); // since C++20 125 126 template<input_range R, weakly_incrementable O, copy_constructible F, 127 class Proj = identity> 128 requires indirectly_writable<O, indirect_result_t<F&, projected<iterator_t<R>, Proj>>> 129 constexpr ranges::unary_transform_result<borrowed_iterator_t<R>, O> 130 transform(R&& r, O result, F op, Proj proj = {}); // since C++20 131 132 template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2, 133 weakly_incrementable O, copy_constructible F, class Proj1 = identity, 134 class Proj2 = identity> 135 requires indirectly_writable<O, indirect_result_t<F&, projected<I1, Proj1>, 136 projected<I2, Proj2>>> 137 constexpr ranges::binary_transform_result<I1, I2, O> 138 transform(I1 first1, S1 last1, I2 first2, S2 last2, O result, 139 F binary_op, Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 140 141 template<input_range R1, input_range R2, weakly_incrementable O, 142 copy_constructible F, class Proj1 = identity, class Proj2 = identity> 143 requires indirectly_writable<O, indirect_result_t<F&, projected<iterator_t<R1>, Proj1>, 144 projected<iterator_t<R2>, Proj2>>> 145 constexpr ranges::binary_transform_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>, O> 146 transform(R1&& r1, R2&& r2, O result, 147 F binary_op, Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 148 149 template<input_iterator I, sentinel_for<I> S, class T, class Proj = identity> 150 requires indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T*> 151 constexpr iter_difference_t<I> 152 count(I first, S last, const T& value, Proj proj = {}); // since C++20 153 154 template<input_range R, class T, class Proj = identity> 155 requires indirect_binary_predicate<ranges::equal_to, projected<iterator_t<R>, Proj>, const T*> 156 constexpr range_difference_t<R> 157 count(R&& r, const T& value, Proj proj = {}); // since C++20 158 159 template<input_iterator I, sentinel_for<I> S, class Proj = identity, 160 indirect_unary_predicate<projected<I, Proj>> Pred> 161 constexpr iter_difference_t<I> 162 count_if(I first, S last, Pred pred, Proj proj = {}); // since C++20 163 164 template<input_range R, class Proj = identity, 165 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 166 constexpr range_difference_t<R> 167 count_if(R&& r, Pred pred, Proj proj = {}); // since C++20 168 169 template<class T, class Proj = identity, 170 indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less> 171 constexpr ranges::minmax_result<const T&> 172 minmax(const T& a, const T& b, Comp comp = {}, Proj proj = {}); // since C++20 173 174 template<copyable T, class Proj = identity, 175 indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less> 176 constexpr ranges::minmax_result<T> 177 minmax(initializer_list<T> r, Comp comp = {}, Proj proj = {}); // since C++20 178 179 template<input_range R, class Proj = identity, 180 indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less> 181 requires indirectly_copyable_storable<iterator_t<R>, range_value_t<R>*> 182 constexpr ranges::minmax_result<range_value_t<R>> 183 minmax(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 184 185 template<forward_iterator I, sentinel_for<I> S, class Proj = identity, 186 indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less> 187 constexpr ranges::minmax_element_result<I> 188 minmax_element(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20 189 190 template<forward_range R, class Proj = identity, 191 indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less> 192 constexpr ranges::minmax_element_result<borrowed_iterator_t<R>> 193 minmax_element(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 194 195 template<class I, class O> 196 using copy_result = in_out_result<I, O>; // since C++20 197 198 template<class I, class O> 199 using copy_n_result = in_out_result<I, O>; // since C++20 200 201 template<class I, class O> 202 using copy_if_result = in_out_result<I, O>; // since C++20 203 204 template<class I1, class I2> 205 using copy_backward_result = in_out_result<I1, I2>; // since C++20 206 207 template<input_iterator I, sentinel_for<I> S, weakly_incrementable O> 208 requires indirectly_copyable<I, O> 209 constexpr ranges::copy_result<I, O> ranges::copy(I first, S last, O result); // since C++20 210 211 template<input_range R, weakly_incrementable O> 212 requires indirectly_copyable<iterator_t<R>, O> 213 constexpr ranges::copy_result<borrowed_iterator_t<R>, O> ranges::copy(R&& r, O result); // since C++20 214 215 template<input_iterator I, weakly_incrementable O> 216 requires indirectly_copyable<I, O> 217 constexpr ranges::copy_n_result<I, O> 218 ranges::copy_n(I first, iter_difference_t<I> n, O result); // since C++20 219 220 template<input_iterator I, sentinel_for<I> S, weakly_incrementable O, class Proj = identity, 221 indirect_unary_predicate<projected<I, Proj>> Pred> 222 requires indirectly_copyable<I, O> 223 constexpr ranges::copy_if_result<I, O> 224 ranges::copy_if(I first, S last, O result, Pred pred, Proj proj = {}); // since C++20 225 226 template<input_range R, weakly_incrementable O, class Proj = identity, 227 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 228 requires indirectly_copyable<iterator_t<R>, O> 229 constexpr ranges::copy_if_result<borrowed_iterator_t<R>, O> 230 ranges::copy_if(R&& r, O result, Pred pred, Proj proj = {}); // since C++20 231 232 template<bidirectional_iterator I1, sentinel_for<I1> S1, bidirectional_iterator I2> 233 requires indirectly_copyable<I1, I2> 234 constexpr ranges::copy_backward_result<I1, I2> 235 ranges::copy_backward(I1 first, S1 last, I2 result); // since C++20 236 237 template<bidirectional_range R, bidirectional_iterator I> 238 requires indirectly_copyable<iterator_t<R>, I> 239 constexpr ranges::copy_backward_result<borrowed_iterator_t<R>, I> 240 ranges::copy_backward(R&& r, I result); // since C++20 241} 242 243 constexpr bool // constexpr in C++20 244 all_of(InputIterator first, InputIterator last, Predicate pred); 245 246template <class InputIterator, class Predicate> 247 constexpr bool // constexpr in C++20 248 any_of(InputIterator first, InputIterator last, Predicate pred); 249 250template <class InputIterator, class Predicate> 251 constexpr bool // constexpr in C++20 252 none_of(InputIterator first, InputIterator last, Predicate pred); 253 254template <class InputIterator, class Function> 255 constexpr Function // constexpr in C++20 256 for_each(InputIterator first, InputIterator last, Function f); 257 258template<class InputIterator, class Size, class Function> 259 constexpr InputIterator // constexpr in C++20 260 for_each_n(InputIterator first, Size n, Function f); // C++17 261 262template <class InputIterator, class T> 263 constexpr InputIterator // constexpr in C++20 264 find(InputIterator first, InputIterator last, const T& value); 265 266template <class InputIterator, class Predicate> 267 constexpr InputIterator // constexpr in C++20 268 find_if(InputIterator first, InputIterator last, Predicate pred); 269 270template<class InputIterator, class Predicate> 271 constexpr InputIterator // constexpr in C++20 272 find_if_not(InputIterator first, InputIterator last, Predicate pred); 273 274template <class ForwardIterator1, class ForwardIterator2> 275 constexpr ForwardIterator1 // constexpr in C++20 276 find_end(ForwardIterator1 first1, ForwardIterator1 last1, 277 ForwardIterator2 first2, ForwardIterator2 last2); 278 279template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 280 constexpr ForwardIterator1 // constexpr in C++20 281 find_end(ForwardIterator1 first1, ForwardIterator1 last1, 282 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred); 283 284template <class ForwardIterator1, class ForwardIterator2> 285 constexpr ForwardIterator1 // constexpr in C++20 286 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1, 287 ForwardIterator2 first2, ForwardIterator2 last2); 288 289template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 290 constexpr ForwardIterator1 // constexpr in C++20 291 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1, 292 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred); 293 294template <class ForwardIterator> 295 constexpr ForwardIterator // constexpr in C++20 296 adjacent_find(ForwardIterator first, ForwardIterator last); 297 298template <class ForwardIterator, class BinaryPredicate> 299 constexpr ForwardIterator // constexpr in C++20 300 adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate pred); 301 302template <class InputIterator, class T> 303 constexpr typename iterator_traits<InputIterator>::difference_type // constexpr in C++20 304 count(InputIterator first, InputIterator last, const T& value); 305 306template <class InputIterator, class Predicate> 307 constexpr typename iterator_traits<InputIterator>::difference_type // constexpr in C++20 308 count_if(InputIterator first, InputIterator last, Predicate pred); 309 310template <class InputIterator1, class InputIterator2> 311 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20 312 mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2); 313 314template <class InputIterator1, class InputIterator2> 315 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20 316 mismatch(InputIterator1 first1, InputIterator1 last1, 317 InputIterator2 first2, InputIterator2 last2); // **C++14** 318 319template <class InputIterator1, class InputIterator2, class BinaryPredicate> 320 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20 321 mismatch(InputIterator1 first1, InputIterator1 last1, 322 InputIterator2 first2, BinaryPredicate pred); 323 324template <class InputIterator1, class InputIterator2, class BinaryPredicate> 325 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20 326 mismatch(InputIterator1 first1, InputIterator1 last1, 327 InputIterator2 first2, InputIterator2 last2, 328 BinaryPredicate pred); // **C++14** 329 330template <class InputIterator1, class InputIterator2> 331 constexpr bool // constexpr in C++20 332 equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2); 333 334template <class InputIterator1, class InputIterator2> 335 constexpr bool // constexpr in C++20 336 equal(InputIterator1 first1, InputIterator1 last1, 337 InputIterator2 first2, InputIterator2 last2); // **C++14** 338 339template <class InputIterator1, class InputIterator2, class BinaryPredicate> 340 constexpr bool // constexpr in C++20 341 equal(InputIterator1 first1, InputIterator1 last1, 342 InputIterator2 first2, BinaryPredicate pred); 343 344template <class InputIterator1, class InputIterator2, class BinaryPredicate> 345 constexpr bool // constexpr in C++20 346 equal(InputIterator1 first1, InputIterator1 last1, 347 InputIterator2 first2, InputIterator2 last2, 348 BinaryPredicate pred); // **C++14** 349 350template<class ForwardIterator1, class ForwardIterator2> 351 constexpr bool // constexpr in C++20 352 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, 353 ForwardIterator2 first2); 354 355template<class ForwardIterator1, class ForwardIterator2> 356 constexpr bool // constexpr in C++20 357 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, 358 ForwardIterator2 first2, ForwardIterator2 last2); // **C++14** 359 360template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 361 constexpr bool // constexpr in C++20 362 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, 363 ForwardIterator2 first2, BinaryPredicate pred); 364 365template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 366 constexpr bool // constexpr in C++20 367 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, 368 ForwardIterator2 first2, ForwardIterator2 last2, 369 BinaryPredicate pred); // **C++14** 370 371template <class ForwardIterator1, class ForwardIterator2> 372 constexpr ForwardIterator1 // constexpr in C++20 373 search(ForwardIterator1 first1, ForwardIterator1 last1, 374 ForwardIterator2 first2, ForwardIterator2 last2); 375 376template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 377 constexpr ForwardIterator1 // constexpr in C++20 378 search(ForwardIterator1 first1, ForwardIterator1 last1, 379 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred); 380 381template <class ForwardIterator, class Size, class T> 382 constexpr ForwardIterator // constexpr in C++20 383 search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value); 384 385template <class ForwardIterator, class Size, class T, class BinaryPredicate> 386 constexpr ForwardIterator // constexpr in C++20 387 search_n(ForwardIterator first, ForwardIterator last, 388 Size count, const T& value, BinaryPredicate pred); 389 390template <class InputIterator, class OutputIterator> 391 constexpr OutputIterator // constexpr in C++20 392 copy(InputIterator first, InputIterator last, OutputIterator result); 393 394template<class InputIterator, class OutputIterator, class Predicate> 395 constexpr OutputIterator // constexpr in C++20 396 copy_if(InputIterator first, InputIterator last, 397 OutputIterator result, Predicate pred); 398 399template<class InputIterator, class Size, class OutputIterator> 400 constexpr OutputIterator // constexpr in C++20 401 copy_n(InputIterator first, Size n, OutputIterator result); 402 403template <class BidirectionalIterator1, class BidirectionalIterator2> 404 constexpr BidirectionalIterator2 // constexpr in C++20 405 copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last, 406 BidirectionalIterator2 result); 407 408template <class ForwardIterator1, class ForwardIterator2> 409 constexpr ForwardIterator2 // constexpr in C++20 410 swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2); 411 412template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2> 413 requires indirectly_swappable<I1, I2> 414 constexpr ranges::swap_ranges_result<I1, I2> 415 ranges::swap_ranges(I1 first1, S1 last1, I2 first2, S2 last2); 416 417template<input_range R1, input_range R2> 418 requires indirectly_swappable<iterator_t<R1>, iterator_t<R2>> 419 constexpr ranges::swap_ranges_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>> 420 ranges::swap_ranges(R1&& r1, R2&& r2); 421 422template <class ForwardIterator1, class ForwardIterator2> 423 constexpr void // constexpr in C++20 424 iter_swap(ForwardIterator1 a, ForwardIterator2 b); 425 426template <class InputIterator, class OutputIterator, class UnaryOperation> 427 constexpr OutputIterator // constexpr in C++20 428 transform(InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op); 429 430template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation> 431 constexpr OutputIterator // constexpr in C++20 432 transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, 433 OutputIterator result, BinaryOperation binary_op); 434 435template <class ForwardIterator, class T> 436 constexpr void // constexpr in C++20 437 replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value); 438 439template <class ForwardIterator, class Predicate, class T> 440 constexpr void // constexpr in C++20 441 replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value); 442 443template <class InputIterator, class OutputIterator, class T> 444 constexpr OutputIterator // constexpr in C++20 445 replace_copy(InputIterator first, InputIterator last, OutputIterator result, 446 const T& old_value, const T& new_value); 447 448template <class InputIterator, class OutputIterator, class Predicate, class T> 449 constexpr OutputIterator // constexpr in C++20 450 replace_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value); 451 452template <class ForwardIterator, class T> 453 constexpr void // constexpr in C++20 454 fill(ForwardIterator first, ForwardIterator last, const T& value); 455 456template <class OutputIterator, class Size, class T> 457 constexpr OutputIterator // constexpr in C++20 458 fill_n(OutputIterator first, Size n, const T& value); 459 460template <class ForwardIterator, class Generator> 461 constexpr void // constexpr in C++20 462 generate(ForwardIterator first, ForwardIterator last, Generator gen); 463 464template <class OutputIterator, class Size, class Generator> 465 constexpr OutputIterator // constexpr in C++20 466 generate_n(OutputIterator first, Size n, Generator gen); 467 468template <class ForwardIterator, class T> 469 constexpr ForwardIterator // constexpr in C++20 470 remove(ForwardIterator first, ForwardIterator last, const T& value); 471 472template <class ForwardIterator, class Predicate> 473 constexpr ForwardIterator // constexpr in C++20 474 remove_if(ForwardIterator first, ForwardIterator last, Predicate pred); 475 476template <class InputIterator, class OutputIterator, class T> 477 constexpr OutputIterator // constexpr in C++20 478 remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value); 479 480template <class InputIterator, class OutputIterator, class Predicate> 481 constexpr OutputIterator // constexpr in C++20 482 remove_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred); 483 484template <class ForwardIterator> 485 constexpr ForwardIterator // constexpr in C++20 486 unique(ForwardIterator first, ForwardIterator last); 487 488template <class ForwardIterator, class BinaryPredicate> 489 constexpr ForwardIterator // constexpr in C++20 490 unique(ForwardIterator first, ForwardIterator last, BinaryPredicate pred); 491 492template <class InputIterator, class OutputIterator> 493 constexpr OutputIterator // constexpr in C++20 494 unique_copy(InputIterator first, InputIterator last, OutputIterator result); 495 496template <class InputIterator, class OutputIterator, class BinaryPredicate> 497 constexpr OutputIterator // constexpr in C++20 498 unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate pred); 499 500template <class BidirectionalIterator> 501 constexpr void // constexpr in C++20 502 reverse(BidirectionalIterator first, BidirectionalIterator last); 503 504template <class BidirectionalIterator, class OutputIterator> 505 constexpr OutputIterator // constexpr in C++20 506 reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result); 507 508template <class ForwardIterator> 509 constexpr ForwardIterator // constexpr in C++20 510 rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last); 511 512template <class ForwardIterator, class OutputIterator> 513 constexpr OutputIterator // constexpr in C++20 514 rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result); 515 516template <class RandomAccessIterator> 517 void 518 random_shuffle(RandomAccessIterator first, RandomAccessIterator last); // deprecated in C++14, removed in C++17 519 520template <class RandomAccessIterator, class RandomNumberGenerator> 521 void 522 random_shuffle(RandomAccessIterator first, RandomAccessIterator last, 523 RandomNumberGenerator& rand); // deprecated in C++14, removed in C++17 524 525template<class PopulationIterator, class SampleIterator, 526 class Distance, class UniformRandomBitGenerator> 527 SampleIterator sample(PopulationIterator first, PopulationIterator last, 528 SampleIterator out, Distance n, 529 UniformRandomBitGenerator&& g); // C++17 530 531template<class RandomAccessIterator, class UniformRandomNumberGenerator> 532 void shuffle(RandomAccessIterator first, RandomAccessIterator last, 533 UniformRandomNumberGenerator&& g); 534 535template<class ForwardIterator> 536 constexpr ForwardIterator 537 shift_left(ForwardIterator first, ForwardIterator last, 538 typename iterator_traits<ForwardIterator>::difference_type n); // C++20 539 540template<class ForwardIterator> 541 constexpr ForwardIterator 542 shift_right(ForwardIterator first, ForwardIterator last, 543 typename iterator_traits<ForwardIterator>::difference_type n); // C++20 544 545template <class InputIterator, class Predicate> 546 constexpr bool // constexpr in C++20 547 is_partitioned(InputIterator first, InputIterator last, Predicate pred); 548 549template <class ForwardIterator, class Predicate> 550 constexpr ForwardIterator // constexpr in C++20 551 partition(ForwardIterator first, ForwardIterator last, Predicate pred); 552 553template <class InputIterator, class OutputIterator1, 554 class OutputIterator2, class Predicate> 555 constexpr pair<OutputIterator1, OutputIterator2> // constexpr in C++20 556 partition_copy(InputIterator first, InputIterator last, 557 OutputIterator1 out_true, OutputIterator2 out_false, 558 Predicate pred); 559 560template <class ForwardIterator, class Predicate> 561 ForwardIterator 562 stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred); 563 564template<class ForwardIterator, class Predicate> 565 constexpr ForwardIterator // constexpr in C++20 566 partition_point(ForwardIterator first, ForwardIterator last, Predicate pred); 567 568template <class ForwardIterator> 569 constexpr bool // constexpr in C++20 570 is_sorted(ForwardIterator first, ForwardIterator last); 571 572template <class ForwardIterator, class Compare> 573 constexpr bool // constexpr in C++20 574 is_sorted(ForwardIterator first, ForwardIterator last, Compare comp); 575 576template<class ForwardIterator> 577 constexpr ForwardIterator // constexpr in C++20 578 is_sorted_until(ForwardIterator first, ForwardIterator last); 579 580template <class ForwardIterator, class Compare> 581 constexpr ForwardIterator // constexpr in C++20 582 is_sorted_until(ForwardIterator first, ForwardIterator last, Compare comp); 583 584template <class RandomAccessIterator> 585 constexpr void // constexpr in C++20 586 sort(RandomAccessIterator first, RandomAccessIterator last); 587 588template <class RandomAccessIterator, class Compare> 589 constexpr void // constexpr in C++20 590 sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 591 592template <class RandomAccessIterator> 593 void 594 stable_sort(RandomAccessIterator first, RandomAccessIterator last); 595 596template <class RandomAccessIterator, class Compare> 597 void 598 stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 599 600template <class RandomAccessIterator> 601 constexpr void // constexpr in C++20 602 partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last); 603 604template <class RandomAccessIterator, class Compare> 605 constexpr void // constexpr in C++20 606 partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp); 607 608template <class InputIterator, class RandomAccessIterator> 609 constexpr RandomAccessIterator // constexpr in C++20 610 partial_sort_copy(InputIterator first, InputIterator last, 611 RandomAccessIterator result_first, RandomAccessIterator result_last); 612 613template <class InputIterator, class RandomAccessIterator, class Compare> 614 constexpr RandomAccessIterator // constexpr in C++20 615 partial_sort_copy(InputIterator first, InputIterator last, 616 RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp); 617 618template <class RandomAccessIterator> 619 constexpr void // constexpr in C++20 620 nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last); 621 622template <class RandomAccessIterator, class Compare> 623 constexpr void // constexpr in C++20 624 nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp); 625 626template <class ForwardIterator, class T> 627 constexpr ForwardIterator // constexpr in C++20 628 lower_bound(ForwardIterator first, ForwardIterator last, const T& value); 629 630template <class ForwardIterator, class T, class Compare> 631 constexpr ForwardIterator // constexpr in C++20 632 lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); 633 634template <class ForwardIterator, class T> 635 constexpr ForwardIterator // constexpr in C++20 636 upper_bound(ForwardIterator first, ForwardIterator last, const T& value); 637 638template <class ForwardIterator, class T, class Compare> 639 constexpr ForwardIterator // constexpr in C++20 640 upper_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); 641 642template <class ForwardIterator, class T> 643 constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++20 644 equal_range(ForwardIterator first, ForwardIterator last, const T& value); 645 646template <class ForwardIterator, class T, class Compare> 647 constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++20 648 equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); 649 650template <class ForwardIterator, class T> 651 constexpr bool // constexpr in C++20 652 binary_search(ForwardIterator first, ForwardIterator last, const T& value); 653 654template <class ForwardIterator, class T, class Compare> 655 constexpr bool // constexpr in C++20 656 binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); 657 658template <class InputIterator1, class InputIterator2, class OutputIterator> 659 constexpr OutputIterator // constexpr in C++20 660 merge(InputIterator1 first1, InputIterator1 last1, 661 InputIterator2 first2, InputIterator2 last2, OutputIterator result); 662 663template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> 664 constexpr OutputIterator // constexpr in C++20 665 merge(InputIterator1 first1, InputIterator1 last1, 666 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 667 668template <class BidirectionalIterator> 669 void 670 inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last); 671 672template <class BidirectionalIterator, class Compare> 673 void 674 inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp); 675 676template <class InputIterator1, class InputIterator2> 677 constexpr bool // constexpr in C++20 678 includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2); 679 680template <class InputIterator1, class InputIterator2, class Compare> 681 constexpr bool // constexpr in C++20 682 includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp); 683 684template <class InputIterator1, class InputIterator2, class OutputIterator> 685 constexpr OutputIterator // constexpr in C++20 686 set_union(InputIterator1 first1, InputIterator1 last1, 687 InputIterator2 first2, InputIterator2 last2, OutputIterator result); 688 689template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> 690 constexpr OutputIterator // constexpr in C++20 691 set_union(InputIterator1 first1, InputIterator1 last1, 692 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 693 694template <class InputIterator1, class InputIterator2, class OutputIterator> 695 constexpr OutputIterator // constexpr in C++20 696 set_intersection(InputIterator1 first1, InputIterator1 last1, 697 InputIterator2 first2, InputIterator2 last2, OutputIterator result); 698 699template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> 700 constexpr OutputIterator // constexpr in C++20 701 set_intersection(InputIterator1 first1, InputIterator1 last1, 702 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 703 704template <class InputIterator1, class InputIterator2, class OutputIterator> 705 constexpr OutputIterator // constexpr in C++20 706 set_difference(InputIterator1 first1, InputIterator1 last1, 707 InputIterator2 first2, InputIterator2 last2, OutputIterator result); 708 709template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> 710 constexpr OutputIterator // constexpr in C++20 711 set_difference(InputIterator1 first1, InputIterator1 last1, 712 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 713 714template <class InputIterator1, class InputIterator2, class OutputIterator> 715 constexpr OutputIterator // constexpr in C++20 716 set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, 717 InputIterator2 first2, InputIterator2 last2, OutputIterator result); 718 719template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> 720 constexpr OutputIterator // constexpr in C++20 721 set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, 722 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 723 724template <class RandomAccessIterator> 725 constexpr void // constexpr in C++20 726 push_heap(RandomAccessIterator first, RandomAccessIterator last); 727 728template <class RandomAccessIterator, class Compare> 729 constexpr void // constexpr in C++20 730 push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 731 732template <class RandomAccessIterator> 733 constexpr void // constexpr in C++20 734 pop_heap(RandomAccessIterator first, RandomAccessIterator last); 735 736template <class RandomAccessIterator, class Compare> 737 constexpr void // constexpr in C++20 738 pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 739 740template <class RandomAccessIterator> 741 constexpr void // constexpr in C++20 742 make_heap(RandomAccessIterator first, RandomAccessIterator last); 743 744template <class RandomAccessIterator, class Compare> 745 constexpr void // constexpr in C++20 746 make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 747 748template <class RandomAccessIterator> 749 constexpr void // constexpr in C++20 750 sort_heap(RandomAccessIterator first, RandomAccessIterator last); 751 752template <class RandomAccessIterator, class Compare> 753 constexpr void // constexpr in C++20 754 sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 755 756template <class RandomAccessIterator> 757 constexpr bool // constexpr in C++20 758 is_heap(RandomAccessIterator first, RandomAccessiterator last); 759 760template <class RandomAccessIterator, class Compare> 761 constexpr bool // constexpr in C++20 762 is_heap(RandomAccessIterator first, RandomAccessiterator last, Compare comp); 763 764template <class RandomAccessIterator> 765 constexpr RandomAccessIterator // constexpr in C++20 766 is_heap_until(RandomAccessIterator first, RandomAccessiterator last); 767 768template <class RandomAccessIterator, class Compare> 769 constexpr RandomAccessIterator // constexpr in C++20 770 is_heap_until(RandomAccessIterator first, RandomAccessiterator last, Compare comp); 771 772template <class ForwardIterator> 773 constexpr ForwardIterator // constexpr in C++14 774 min_element(ForwardIterator first, ForwardIterator last); 775 776template <class ForwardIterator, class Compare> 777 constexpr ForwardIterator // constexpr in C++14 778 min_element(ForwardIterator first, ForwardIterator last, Compare comp); 779 780template <class T> 781 constexpr const T& // constexpr in C++14 782 min(const T& a, const T& b); 783 784template <class T, class Compare> 785 constexpr const T& // constexpr in C++14 786 min(const T& a, const T& b, Compare comp); 787 788template<class T> 789 constexpr T // constexpr in C++14 790 min(initializer_list<T> t); 791 792template<class T, class Compare> 793 constexpr T // constexpr in C++14 794 min(initializer_list<T> t, Compare comp); 795 796template<class T> 797 constexpr const T& clamp(const T& v, const T& lo, const T& hi); // C++17 798 799template<class T, class Compare> 800 constexpr const T& clamp(const T& v, const T& lo, const T& hi, Compare comp); // C++17 801 802template <class ForwardIterator> 803 constexpr ForwardIterator // constexpr in C++14 804 max_element(ForwardIterator first, ForwardIterator last); 805 806template <class ForwardIterator, class Compare> 807 constexpr ForwardIterator // constexpr in C++14 808 max_element(ForwardIterator first, ForwardIterator last, Compare comp); 809 810template <class T> 811 constexpr const T& // constexpr in C++14 812 max(const T& a, const T& b); 813 814template <class T, class Compare> 815 constexpr const T& // constexpr in C++14 816 max(const T& a, const T& b, Compare comp); 817 818template<class T> 819 constexpr T // constexpr in C++14 820 max(initializer_list<T> t); 821 822template<class T, class Compare> 823 constexpr T // constexpr in C++14 824 max(initializer_list<T> t, Compare comp); 825 826template<class ForwardIterator> 827 constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++14 828 minmax_element(ForwardIterator first, ForwardIterator last); 829 830template<class ForwardIterator, class Compare> 831 constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++14 832 minmax_element(ForwardIterator first, ForwardIterator last, Compare comp); 833 834template<class T> 835 constexpr pair<const T&, const T&> // constexpr in C++14 836 minmax(const T& a, const T& b); 837 838template<class T, class Compare> 839 constexpr pair<const T&, const T&> // constexpr in C++14 840 minmax(const T& a, const T& b, Compare comp); 841 842template<class T> 843 constexpr pair<T, T> // constexpr in C++14 844 minmax(initializer_list<T> t); 845 846template<class T, class Compare> 847 constexpr pair<T, T> // constexpr in C++14 848 minmax(initializer_list<T> t, Compare comp); 849 850template <class InputIterator1, class InputIterator2> 851 constexpr bool // constexpr in C++20 852 lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2); 853 854template <class InputIterator1, class InputIterator2, class Compare> 855 constexpr bool // constexpr in C++20 856 lexicographical_compare(InputIterator1 first1, InputIterator1 last1, 857 InputIterator2 first2, InputIterator2 last2, Compare comp); 858 859template <class BidirectionalIterator> 860 constexpr bool // constexpr in C++20 861 next_permutation(BidirectionalIterator first, BidirectionalIterator last); 862 863template <class BidirectionalIterator, class Compare> 864 constexpr bool // constexpr in C++20 865 next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp); 866 867template <class BidirectionalIterator> 868 constexpr bool // constexpr in C++20 869 prev_permutation(BidirectionalIterator first, BidirectionalIterator last); 870 871template <class BidirectionalIterator, class Compare> 872 constexpr bool // constexpr in C++20 873 prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp); 874} // std 875 876*/ 877 878#include <__assert> // all public C++ headers provide the assertion handler 879#include <__bits> 880#include <__config> 881#include <__debug> 882#include <cstddef> 883#include <cstring> 884#include <functional> // TODO: Remove this include 885#include <initializer_list> 886#include <iterator> 887#include <memory> 888#include <type_traits> 889#include <version> 890 891#include <__algorithm/adjacent_find.h> 892#include <__algorithm/all_of.h> 893#include <__algorithm/any_of.h> 894#include <__algorithm/binary_search.h> 895#include <__algorithm/clamp.h> 896#include <__algorithm/comp.h> 897#include <__algorithm/comp_ref_type.h> 898#include <__algorithm/copy.h> 899#include <__algorithm/copy_backward.h> 900#include <__algorithm/copy_if.h> 901#include <__algorithm/copy_n.h> 902#include <__algorithm/count.h> 903#include <__algorithm/count_if.h> 904#include <__algorithm/equal.h> 905#include <__algorithm/equal_range.h> 906#include <__algorithm/fill.h> 907#include <__algorithm/fill_n.h> 908#include <__algorithm/find.h> 909#include <__algorithm/find_end.h> 910#include <__algorithm/find_first_of.h> 911#include <__algorithm/find_if.h> 912#include <__algorithm/find_if_not.h> 913#include <__algorithm/for_each.h> 914#include <__algorithm/for_each_n.h> 915#include <__algorithm/generate.h> 916#include <__algorithm/generate_n.h> 917#include <__algorithm/half_positive.h> 918#include <__algorithm/in_found_result.h> 919#include <__algorithm/in_fun_result.h> 920#include <__algorithm/in_in_out_result.h> 921#include <__algorithm/in_in_result.h> 922#include <__algorithm/in_out_out_result.h> 923#include <__algorithm/in_out_result.h> 924#include <__algorithm/includes.h> 925#include <__algorithm/inplace_merge.h> 926#include <__algorithm/is_heap.h> 927#include <__algorithm/is_heap_until.h> 928#include <__algorithm/is_partitioned.h> 929#include <__algorithm/is_permutation.h> 930#include <__algorithm/is_sorted.h> 931#include <__algorithm/is_sorted_until.h> 932#include <__algorithm/iter_swap.h> 933#include <__algorithm/lexicographical_compare.h> 934#include <__algorithm/lower_bound.h> 935#include <__algorithm/make_heap.h> 936#include <__algorithm/max.h> 937#include <__algorithm/max_element.h> 938#include <__algorithm/merge.h> 939#include <__algorithm/min.h> 940#include <__algorithm/min_element.h> 941#include <__algorithm/min_max_result.h> 942#include <__algorithm/minmax.h> 943#include <__algorithm/minmax_element.h> 944#include <__algorithm/mismatch.h> 945#include <__algorithm/move.h> 946#include <__algorithm/move_backward.h> 947#include <__algorithm/next_permutation.h> 948#include <__algorithm/none_of.h> 949#include <__algorithm/nth_element.h> 950#include <__algorithm/partial_sort.h> 951#include <__algorithm/partial_sort_copy.h> 952#include <__algorithm/partition.h> 953#include <__algorithm/partition_copy.h> 954#include <__algorithm/partition_point.h> 955#include <__algorithm/pop_heap.h> 956#include <__algorithm/prev_permutation.h> 957#include <__algorithm/push_heap.h> 958#include <__algorithm/ranges_copy.h> 959#include <__algorithm/ranges_copy_backward.h> 960#include <__algorithm/ranges_copy_if.h> 961#include <__algorithm/ranges_copy_n.h> 962#include <__algorithm/ranges_count.h> 963#include <__algorithm/ranges_count_if.h> 964#include <__algorithm/ranges_find.h> 965#include <__algorithm/ranges_find_if.h> 966#include <__algorithm/ranges_find_if_not.h> 967#include <__algorithm/ranges_max.h> 968#include <__algorithm/ranges_max_element.h> 969#include <__algorithm/ranges_min.h> 970#include <__algorithm/ranges_min_element.h> 971#include <__algorithm/ranges_minmax.h> 972#include <__algorithm/ranges_minmax_element.h> 973#include <__algorithm/ranges_mismatch.h> 974#include <__algorithm/ranges_swap_ranges.h> 975#include <__algorithm/ranges_transform.h> 976#include <__algorithm/remove.h> 977#include <__algorithm/remove_copy.h> 978#include <__algorithm/remove_copy_if.h> 979#include <__algorithm/remove_if.h> 980#include <__algorithm/replace.h> 981#include <__algorithm/replace_copy.h> 982#include <__algorithm/replace_copy_if.h> 983#include <__algorithm/replace_if.h> 984#include <__algorithm/reverse.h> 985#include <__algorithm/reverse_copy.h> 986#include <__algorithm/rotate.h> 987#include <__algorithm/rotate_copy.h> 988#include <__algorithm/sample.h> 989#include <__algorithm/search.h> 990#include <__algorithm/search_n.h> 991#include <__algorithm/set_difference.h> 992#include <__algorithm/set_intersection.h> 993#include <__algorithm/set_symmetric_difference.h> 994#include <__algorithm/set_union.h> 995#include <__algorithm/shift_left.h> 996#include <__algorithm/shift_right.h> 997#include <__algorithm/shuffle.h> 998#include <__algorithm/sift_down.h> 999#include <__algorithm/sort.h> 1000#include <__algorithm/sort_heap.h> 1001#include <__algorithm/stable_partition.h> 1002#include <__algorithm/stable_sort.h> 1003#include <__algorithm/swap_ranges.h> 1004#include <__algorithm/transform.h> 1005#include <__algorithm/unique.h> 1006#include <__algorithm/unique_copy.h> 1007#include <__algorithm/unwrap_iter.h> 1008#include <__algorithm/upper_bound.h> 1009 1010#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 1011# pragma GCC system_header 1012#endif 1013 1014#if defined(_LIBCPP_HAS_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17 1015# include <__pstl_algorithm> 1016#endif 1017 1018#endif // _LIBCPP_ALGORITHM 1019