10b57cec5SDimitry Andric// -*- C++ -*- 2349cc55cSDimitry Andric//===----------------------------------------------------------------------===// 30b57cec5SDimitry Andric// 40b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 50b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 60b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 70b57cec5SDimitry Andric// 80b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 90b57cec5SDimitry Andric 100b57cec5SDimitry Andric#ifndef _LIBCPP_ALGORITHM 110b57cec5SDimitry Andric#define _LIBCPP_ALGORITHM 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric/* 140b57cec5SDimitry Andric algorithm synopsis 150b57cec5SDimitry Andric 160b57cec5SDimitry Andric#include <initializer_list> 170b57cec5SDimitry Andric 180b57cec5SDimitry Andricnamespace std 190b57cec5SDimitry Andric{ 200b57cec5SDimitry Andric 2104eeddc0SDimitry Andricnamespace ranges { 2281ad6265SDimitry Andric 2381ad6265SDimitry Andric // [algorithms.results], algorithm result types 2481ad6265SDimitry Andric template <class I, class F> 2581ad6265SDimitry Andric struct in_fun_result; // since C++20 2681ad6265SDimitry Andric 2704eeddc0SDimitry Andric template <class I1, class I2> 2804eeddc0SDimitry Andric struct in_in_result; // since C++20 291fd87a68SDimitry Andric 3081ad6265SDimitry Andric template <class I, class O> 3181ad6265SDimitry Andric struct in_out_result; // since C++20 3281ad6265SDimitry Andric 331fd87a68SDimitry Andric template <class I1, class I2, class O> 341fd87a68SDimitry Andric struct in_in_out_result; // since C++20 3581ad6265SDimitry Andric 3681ad6265SDimitry Andric template <class I, class O1, class O2> 3781ad6265SDimitry Andric struct in_out_out_result; // since C++20 3881ad6265SDimitry Andric 3981ad6265SDimitry Andric template <class I1, class I2> 4081ad6265SDimitry Andric struct min_max_result; // since C++20 4181ad6265SDimitry Andric 4281ad6265SDimitry Andric template <class I> 4381ad6265SDimitry Andric struct in_found_result; // since C++20 4481ad6265SDimitry Andric 4581ad6265SDimitry Andric template<forward_iterator I, sentinel_for<I> S, class Proj = identity, 4681ad6265SDimitry Andric indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less> // since C++20 4781ad6265SDimitry Andric constexpr I min_element(I first, S last, Comp comp = {}, Proj proj = {}); 4881ad6265SDimitry Andric 4981ad6265SDimitry Andric template<forward_range R, class Proj = identity, 5081ad6265SDimitry Andric indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less> // since C++20 5181ad6265SDimitry Andric constexpr borrowed_iterator_t<R> min_element(R&& r, Comp comp = {}, Proj proj = {}); 5281ad6265SDimitry Andric 5381ad6265SDimitry Andric template<forward_iterator I, sentinel_for<I> S, class Proj = identity, 5481ad6265SDimitry Andric indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less> 5581ad6265SDimitry Andric constexpr I ranges::max_element(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20 5681ad6265SDimitry Andric 5781ad6265SDimitry Andric template<forward_range R, class Proj = identity, 5881ad6265SDimitry Andric indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less> 5981ad6265SDimitry Andric constexpr borrowed_iterator_t<R> ranges::max_element(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 6081ad6265SDimitry Andric 6181ad6265SDimitry Andric template<class I1, class I2> 6281ad6265SDimitry Andric using mismatch_result = in_in_result<I1, I2>; 6381ad6265SDimitry Andric 6481ad6265SDimitry Andric template <input_iterator I1, sentinel_for<_I1> S1, input_iterator I2, sentinel_for<_I2> S2, 6581ad6265SDimitry Andric class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity> 6681ad6265SDimitry Andric requires indirectly_comparable<I1, I2, Pred, Proj1, Proj2> 6781ad6265SDimitry Andric constexpr mismatch_result<_I1, _I2> 6881ad6265SDimitry Andric mismatch()(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {}, Proj1 proj1 = {}, Proj2 proj2 = {}) // since C++20 6981ad6265SDimitry Andric 7081ad6265SDimitry Andric template <input_range R1, input_range R2, 7181ad6265SDimitry Andric class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity> 7281ad6265SDimitry Andric requires indirectly_comparable<iterator_t<R1>, iterator_t<R2>, Pred, Proj1, Proj2> 7381ad6265SDimitry Andric constexpr mismatch_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>> 7481ad6265SDimitry Andric mismatch(R1&& r1, R2&& r2, Pred pred = {}, Proj1 proj1 = {}, Proj2 proj2 = {}) // since C++20 7581ad6265SDimitry Andric 7681ad6265SDimitry Andric requires indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T*> 7781ad6265SDimitry Andric constexpr I find(I first, S last, const T& value, Proj proj = {}); // since C++20 7881ad6265SDimitry Andric 7981ad6265SDimitry Andric template<input_range R, class T, class Proj = identity> 8081ad6265SDimitry Andric requires indirect_binary_predicate<ranges::equal_to, projected<iterator_t<R>, Proj>, const T*> 8181ad6265SDimitry Andric constexpr borrowed_iterator_t<R> 8281ad6265SDimitry Andric find(R&& r, const T& value, Proj proj = {}); // since C++20 8381ad6265SDimitry Andric 8481ad6265SDimitry Andric template<input_iterator I, sentinel_for<I> S, class Proj = identity, 8581ad6265SDimitry Andric indirect_unary_predicate<projected<I, Proj>> Pred> 8681ad6265SDimitry Andric constexpr I find_if(I first, S last, Pred pred, Proj proj = {}); // since C++20 8781ad6265SDimitry Andric 8881ad6265SDimitry Andric template<input_range R, class Proj = identity, 8981ad6265SDimitry Andric indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 9081ad6265SDimitry Andric constexpr borrowed_iterator_t<R> 9181ad6265SDimitry Andric find_if(R&& r, Pred pred, Proj proj = {}); // since C++20 9281ad6265SDimitry Andric 9381ad6265SDimitry Andric template<input_iterator I, sentinel_for<I> S, class Proj = identity, 9481ad6265SDimitry Andric indirect_unary_predicate<projected<I, Proj>> Pred> 9581ad6265SDimitry Andric constexpr I find_if_not(I first, S last, Pred pred, Proj proj = {}); // since C++20 9681ad6265SDimitry Andric 9781ad6265SDimitry Andric template<input_range R, class Proj = identity, 9881ad6265SDimitry Andric indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 9981ad6265SDimitry Andric constexpr borrowed_iterator_t<R> 10081ad6265SDimitry Andric find_if_not(R&& r, Pred pred, Proj proj = {}); // since C++20 10181ad6265SDimitry Andric 10281ad6265SDimitry Andric template<class T, class Proj = identity, 10381ad6265SDimitry Andric indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less> 10481ad6265SDimitry Andric constexpr const T& min(const T& a, const T& b, Comp comp = {}, Proj proj = {}); // since C++20 10581ad6265SDimitry Andric 10681ad6265SDimitry Andric template<copyable T, class Proj = identity, 10781ad6265SDimitry Andric indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less> 10881ad6265SDimitry Andric constexpr T min(initializer_list<T> r, Comp comp = {}, Proj proj = {}); // since C++20 10981ad6265SDimitry Andric 11081ad6265SDimitry Andric template<input_range R, class Proj = identity, 11181ad6265SDimitry Andric indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less> 11281ad6265SDimitry Andric requires indirectly_copyable_storable<iterator_t<R>, range_value_t<R>*> 11381ad6265SDimitry Andric constexpr range_value_t<R> 11481ad6265SDimitry Andric min(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 11581ad6265SDimitry Andric 11681ad6265SDimitry Andric template<class T, class Proj = identity, 11781ad6265SDimitry Andric indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less> 11881ad6265SDimitry Andric constexpr const T& max(const T& a, const T& b, Comp comp = {}, Proj proj = {}); // since C++20 11981ad6265SDimitry Andric 12081ad6265SDimitry Andric template<copyable T, class Proj = identity, 12181ad6265SDimitry Andric indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less> 12281ad6265SDimitry Andric constexpr T max(initializer_list<T> r, Comp comp = {}, Proj proj = {}); // since C++20 12381ad6265SDimitry Andric 12481ad6265SDimitry Andric template<input_range R, class Proj = identity, 12581ad6265SDimitry Andric indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less> 12681ad6265SDimitry Andric requires indirectly_copyable_storable<iterator_t<R>, range_value_t<R>*> 12781ad6265SDimitry Andric constexpr range_value_t<R> 12881ad6265SDimitry Andric max(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 12981ad6265SDimitry Andric 13081ad6265SDimitry Andric template<class I, class O> 13181ad6265SDimitry Andric using unary_transform_result = in_out_result<I, O>; // since C++20 13281ad6265SDimitry Andric 13381ad6265SDimitry Andric template<class I1, class I2, class O> 13481ad6265SDimitry Andric using binary_transform_result = in_in_out_result<I1, I2, O>; // since C++20 13581ad6265SDimitry Andric 13681ad6265SDimitry Andric template<input_iterator I, sentinel_for<I> S, weakly_incrementable O, 13781ad6265SDimitry Andric copy_constructible F, class Proj = identity> 13881ad6265SDimitry Andric requires indirectly_writable<O, indirect_result_t<F&, projected<I, Proj>>> 13981ad6265SDimitry Andric constexpr ranges::unary_transform_result<I, O> 14081ad6265SDimitry Andric transform(I first1, S last1, O result, F op, Proj proj = {}); // since C++20 14181ad6265SDimitry Andric 14281ad6265SDimitry Andric template<input_range R, weakly_incrementable O, copy_constructible F, 14381ad6265SDimitry Andric class Proj = identity> 14481ad6265SDimitry Andric requires indirectly_writable<O, indirect_result_t<F&, projected<iterator_t<R>, Proj>>> 14581ad6265SDimitry Andric constexpr ranges::unary_transform_result<borrowed_iterator_t<R>, O> 14681ad6265SDimitry Andric transform(R&& r, O result, F op, Proj proj = {}); // since C++20 14781ad6265SDimitry Andric 14881ad6265SDimitry Andric template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2, 14981ad6265SDimitry Andric weakly_incrementable O, copy_constructible F, class Proj1 = identity, 15081ad6265SDimitry Andric class Proj2 = identity> 15181ad6265SDimitry Andric requires indirectly_writable<O, indirect_result_t<F&, projected<I1, Proj1>, 15281ad6265SDimitry Andric projected<I2, Proj2>>> 15381ad6265SDimitry Andric constexpr ranges::binary_transform_result<I1, I2, O> 15481ad6265SDimitry Andric transform(I1 first1, S1 last1, I2 first2, S2 last2, O result, 15581ad6265SDimitry Andric F binary_op, Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 15681ad6265SDimitry Andric 15781ad6265SDimitry Andric template<input_range R1, input_range R2, weakly_incrementable O, 15881ad6265SDimitry Andric copy_constructible F, class Proj1 = identity, class Proj2 = identity> 15981ad6265SDimitry Andric requires indirectly_writable<O, indirect_result_t<F&, projected<iterator_t<R1>, Proj1>, 16081ad6265SDimitry Andric projected<iterator_t<R2>, Proj2>>> 16181ad6265SDimitry Andric constexpr ranges::binary_transform_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>, O> 16281ad6265SDimitry Andric transform(R1&& r1, R2&& r2, O result, 16381ad6265SDimitry Andric F binary_op, Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 16481ad6265SDimitry Andric 16581ad6265SDimitry Andric template<input_iterator I, sentinel_for<I> S, class T, class Proj = identity> 16681ad6265SDimitry Andric requires indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T*> 16781ad6265SDimitry Andric constexpr iter_difference_t<I> 16881ad6265SDimitry Andric count(I first, S last, const T& value, Proj proj = {}); // since C++20 16981ad6265SDimitry Andric 17081ad6265SDimitry Andric template<input_range R, class T, class Proj = identity> 17181ad6265SDimitry Andric requires indirect_binary_predicate<ranges::equal_to, projected<iterator_t<R>, Proj>, const T*> 17281ad6265SDimitry Andric constexpr range_difference_t<R> 17381ad6265SDimitry Andric count(R&& r, const T& value, Proj proj = {}); // since C++20 17481ad6265SDimitry Andric 17581ad6265SDimitry Andric template<input_iterator I, sentinel_for<I> S, class Proj = identity, 17681ad6265SDimitry Andric indirect_unary_predicate<projected<I, Proj>> Pred> 17781ad6265SDimitry Andric constexpr iter_difference_t<I> 17881ad6265SDimitry Andric count_if(I first, S last, Pred pred, Proj proj = {}); // since C++20 17981ad6265SDimitry Andric 18081ad6265SDimitry Andric template<input_range R, class Proj = identity, 18181ad6265SDimitry Andric indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 18281ad6265SDimitry Andric constexpr range_difference_t<R> 18381ad6265SDimitry Andric count_if(R&& r, Pred pred, Proj proj = {}); // since C++20 18481ad6265SDimitry Andric 18581ad6265SDimitry Andric template<class T> 18681ad6265SDimitry Andric using minmax_result = min_max_result<T>; 18781ad6265SDimitry Andric 18881ad6265SDimitry Andric template<class T, class Proj = identity, 18981ad6265SDimitry Andric indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less> 19081ad6265SDimitry Andric constexpr ranges::minmax_result<const T&> 19181ad6265SDimitry Andric minmax(const T& a, const T& b, Comp comp = {}, Proj proj = {}); // since C++20 19281ad6265SDimitry Andric 19381ad6265SDimitry Andric template<copyable T, class Proj = identity, 19481ad6265SDimitry Andric indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less> 19581ad6265SDimitry Andric constexpr ranges::minmax_result<T> 19681ad6265SDimitry Andric minmax(initializer_list<T> r, Comp comp = {}, Proj proj = {}); // since C++20 19781ad6265SDimitry Andric 19881ad6265SDimitry Andric template<input_range R, class Proj = identity, 19981ad6265SDimitry Andric indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less> 20081ad6265SDimitry Andric requires indirectly_copyable_storable<iterator_t<R>, range_value_t<R>*> 20181ad6265SDimitry Andric constexpr ranges::minmax_result<range_value_t<R>> 20281ad6265SDimitry Andric minmax(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 20381ad6265SDimitry Andric 20481ad6265SDimitry Andric template<class I> 20581ad6265SDimitry Andric using minmax_element_result = min_max_result<I>; 20681ad6265SDimitry Andric 20781ad6265SDimitry Andric template<forward_iterator I, sentinel_for<I> S, class Proj = identity, 20881ad6265SDimitry Andric indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less> 20981ad6265SDimitry Andric constexpr ranges::minmax_element_result<I> 21081ad6265SDimitry Andric minmax_element(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20 21181ad6265SDimitry Andric 21281ad6265SDimitry Andric template<forward_range R, class Proj = identity, 21381ad6265SDimitry Andric indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less> 21481ad6265SDimitry Andric constexpr ranges::minmax_element_result<borrowed_iterator_t<R>> 21581ad6265SDimitry Andric minmax_element(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 21681ad6265SDimitry Andric 21781ad6265SDimitry Andric template<class I, class O> 21881ad6265SDimitry Andric using copy_result = in_out_result<I, O>; // since C++20 21981ad6265SDimitry Andric 22081ad6265SDimitry Andric template<class I, class O> 22181ad6265SDimitry Andric using copy_n_result = in_out_result<I, O>; // since C++20 22281ad6265SDimitry Andric 22381ad6265SDimitry Andric template<class I, class O> 22481ad6265SDimitry Andric using copy_if_result = in_out_result<I, O>; // since C++20 22581ad6265SDimitry Andric 22681ad6265SDimitry Andric template<class I1, class I2> 22781ad6265SDimitry Andric using copy_backward_result = in_out_result<I1, I2>; // since C++20 22881ad6265SDimitry Andric 22981ad6265SDimitry Andric template<input_iterator I, sentinel_for<I> S, weakly_incrementable O> 23081ad6265SDimitry Andric requires indirectly_copyable<I, O> 23181ad6265SDimitry Andric constexpr ranges::copy_result<I, O> ranges::copy(I first, S last, O result); // since C++20 23281ad6265SDimitry Andric 23381ad6265SDimitry Andric template<input_range R, weakly_incrementable O> 23481ad6265SDimitry Andric requires indirectly_copyable<iterator_t<R>, O> 23581ad6265SDimitry Andric constexpr ranges::copy_result<borrowed_iterator_t<R>, O> ranges::copy(R&& r, O result); // since C++20 23681ad6265SDimitry Andric 23781ad6265SDimitry Andric template<input_iterator I, weakly_incrementable O> 23881ad6265SDimitry Andric requires indirectly_copyable<I, O> 23981ad6265SDimitry Andric constexpr ranges::copy_n_result<I, O> 24081ad6265SDimitry Andric ranges::copy_n(I first, iter_difference_t<I> n, O result); // since C++20 24181ad6265SDimitry Andric 24281ad6265SDimitry Andric template<input_iterator I, sentinel_for<I> S, weakly_incrementable O, class Proj = identity, 24381ad6265SDimitry Andric indirect_unary_predicate<projected<I, Proj>> Pred> 24481ad6265SDimitry Andric requires indirectly_copyable<I, O> 24581ad6265SDimitry Andric constexpr ranges::copy_if_result<I, O> 24681ad6265SDimitry Andric ranges::copy_if(I first, S last, O result, Pred pred, Proj proj = {}); // since C++20 24781ad6265SDimitry Andric 24881ad6265SDimitry Andric template<input_range R, weakly_incrementable O, class Proj = identity, 24981ad6265SDimitry Andric indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 25081ad6265SDimitry Andric requires indirectly_copyable<iterator_t<R>, O> 25181ad6265SDimitry Andric constexpr ranges::copy_if_result<borrowed_iterator_t<R>, O> 25281ad6265SDimitry Andric ranges::copy_if(R&& r, O result, Pred pred, Proj proj = {}); // since C++20 25381ad6265SDimitry Andric 25481ad6265SDimitry Andric template<bidirectional_iterator I1, sentinel_for<I1> S1, bidirectional_iterator I2> 25581ad6265SDimitry Andric requires indirectly_copyable<I1, I2> 25681ad6265SDimitry Andric constexpr ranges::copy_backward_result<I1, I2> 25781ad6265SDimitry Andric ranges::copy_backward(I1 first, S1 last, I2 result); // since C++20 25881ad6265SDimitry Andric 25981ad6265SDimitry Andric template<bidirectional_range R, bidirectional_iterator I> 26081ad6265SDimitry Andric requires indirectly_copyable<iterator_t<R>, I> 26181ad6265SDimitry Andric constexpr ranges::copy_backward_result<borrowed_iterator_t<R>, I> 26281ad6265SDimitry Andric ranges::copy_backward(R&& r, I result); // since C++20 26381ad6265SDimitry Andric 26481ad6265SDimitry Andric template<class I, class F> 26581ad6265SDimitry Andric using for_each_result = in_fun_result<I, F>; // since C++20 26681ad6265SDimitry Andric 26781ad6265SDimitry Andric template<input_iterator I, sentinel_for<I> S, class Proj = identity, 26881ad6265SDimitry Andric indirectly_unary_invocable<projected<I, Proj>> Fun> 26981ad6265SDimitry Andric constexpr ranges::for_each_result<I, Fun> 27081ad6265SDimitry Andric ranges::for_each(I first, S last, Fun f, Proj proj = {}); // since C++20 27181ad6265SDimitry Andric 27281ad6265SDimitry Andric template<input_range R, class Proj = identity, 27381ad6265SDimitry Andric indirectly_unary_invocable<projected<iterator_t<R>, Proj>> Fun> 27481ad6265SDimitry Andric constexpr ranges::for_each_result<borrowed_iterator_t<R>, Fun> 27581ad6265SDimitry Andric ranges::for_each(R&& r, Fun f, Proj proj = {}); // since C++20 27681ad6265SDimitry Andric 27781ad6265SDimitry Andric template<input_iterator I, class Proj = identity, 27881ad6265SDimitry Andric indirectly_unary_invocable<projected<I, Proj>> Fun> 27981ad6265SDimitry Andric constexpr ranges::for_each_n_result<I, Fun> 28081ad6265SDimitry Andric ranges::for_each_n(I first, iter_difference_t<I> n, Fun f, Proj proj = {}); // since C++20 28181ad6265SDimitry Andric 28281ad6265SDimitry Andric template<input_iterator I, sentinel_for<I> S, class Proj = identity, 28381ad6265SDimitry Andric indirect_unary_predicate<projected<I, Proj>> Pred> 28481ad6265SDimitry Andric constexpr bool ranges::is_partitioned(I first, S last, Pred pred, Proj proj = {}); // since C++20 28581ad6265SDimitry Andric 28681ad6265SDimitry Andric template<input_range R, class Proj = identity, 28781ad6265SDimitry Andric indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 28881ad6265SDimitry Andric constexpr bool ranges::is_partitioned(R&& r, Pred pred, Proj proj = {}); // since C++20 28981ad6265SDimitry Andric 290753f127fSDimitry Andric template<random_access_iterator I, sentinel_for<I> S, class Comp = ranges::less, 291753f127fSDimitry Andric class Proj = identity> 292753f127fSDimitry Andric requires sortable<I, Comp, Proj> 293753f127fSDimitry Andric constexpr I 294753f127fSDimitry Andric ranges::push_heap(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20 295753f127fSDimitry Andric 296753f127fSDimitry Andric template<random_access_range R, class Comp = ranges::less, class Proj = identity> 297753f127fSDimitry Andric requires sortable<iterator_t<R>, Comp, Proj> 298753f127fSDimitry Andric constexpr borrowed_iterator_t<R> 299753f127fSDimitry Andric ranges::push_heap(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 300753f127fSDimitry Andric 301753f127fSDimitry Andric template<random_access_iterator I, sentinel_for<I> S, class Comp = ranges::less, 302753f127fSDimitry Andric class Proj = identity> 303753f127fSDimitry Andric requires sortable<I, Comp, Proj> 304753f127fSDimitry Andric constexpr I 305753f127fSDimitry Andric ranges::pop_heap(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20 306753f127fSDimitry Andric 307753f127fSDimitry Andric template<random_access_range R, class Comp = ranges::less, class Proj = identity> 308753f127fSDimitry Andric requires sortable<iterator_t<R>, Comp, Proj> 309753f127fSDimitry Andric constexpr borrowed_iterator_t<R> 310753f127fSDimitry Andric ranges::pop_heap(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 311753f127fSDimitry Andric 312753f127fSDimitry Andric template<random_access_iterator I, sentinel_for<I> S, class Comp = ranges::less, 313753f127fSDimitry Andric class Proj = identity> 314753f127fSDimitry Andric requires sortable<I, Comp, Proj> 315753f127fSDimitry Andric constexpr I 316753f127fSDimitry Andric ranges::make_heap(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20 317753f127fSDimitry Andric 318753f127fSDimitry Andric template<random_access_range R, class Comp = ranges::less, class Proj = identity> 319753f127fSDimitry Andric requires sortable<iterator_t<R>, Comp, Proj> 320753f127fSDimitry Andric constexpr borrowed_iterator_t<R> 321753f127fSDimitry Andric ranges::make_heap(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 322753f127fSDimitry Andric 323753f127fSDimitry Andric template<random_access_iterator I, sentinel_for<I> S, class Comp = ranges::less, 324753f127fSDimitry Andric class Proj = identity> 325753f127fSDimitry Andric requires sortable<I, Comp, Proj> 326753f127fSDimitry Andric constexpr I 327753f127fSDimitry Andric ranges::sort_heap(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20 328753f127fSDimitry Andric 329753f127fSDimitry Andric template<random_access_range R, class Comp = ranges::less, class Proj = identity> 330753f127fSDimitry Andric requires sortable<iterator_t<R>, Comp, Proj> 331753f127fSDimitry Andric constexpr borrowed_iterator_t<R> 332753f127fSDimitry Andric ranges::sort_heap(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 333753f127fSDimitry Andric 33481ad6265SDimitry Andric template<bidirectional_iterator I, sentinel_for<I> S> 33581ad6265SDimitry Andric requires permutable<I> 33681ad6265SDimitry Andric constexpr I ranges::reverse(I first, S last); // since C++20 33781ad6265SDimitry Andric 33881ad6265SDimitry Andric template<bidirectional_range R> 33981ad6265SDimitry Andric requires permutable<iterator_t<R>> 34081ad6265SDimitry Andric constexpr borrowed_iterator_t<R> ranges::reverse(R&& r); // since C++20 34181ad6265SDimitry Andric 34281ad6265SDimitry Andric template<random_access_iterator I, sentinel_for<I> S, class Comp = ranges::less, 34381ad6265SDimitry Andric class Proj = identity> 34481ad6265SDimitry Andric requires sortable<I, Comp, Proj> 34581ad6265SDimitry Andric constexpr I 34681ad6265SDimitry Andric ranges::sort(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20 34781ad6265SDimitry Andric 34881ad6265SDimitry Andric template<random_access_range R, class Comp = ranges::less, class Proj = identity> 34981ad6265SDimitry Andric requires sortable<iterator_t<R>, Comp, Proj> 35081ad6265SDimitry Andric constexpr borrowed_iterator_t<R> 35181ad6265SDimitry Andric ranges::sort(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 35281ad6265SDimitry Andric 35381ad6265SDimitry Andric template<random_access_iterator I, sentinel_for<I> S, class Comp = ranges::less, 35481ad6265SDimitry Andric class Proj = identity> 35581ad6265SDimitry Andric requires sortable<I, Comp, Proj> 35681ad6265SDimitry Andric I ranges::stable_sort(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20 35781ad6265SDimitry Andric 35881ad6265SDimitry Andric template<random_access_range R, class Comp = ranges::less, class Proj = identity> 35981ad6265SDimitry Andric requires sortable<iterator_t<R>, Comp, Proj> 36081ad6265SDimitry Andric borrowed_iterator_t<R> 36181ad6265SDimitry Andric ranges::stable_sort(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 36281ad6265SDimitry Andric 363*fcaf7f86SDimitry Andric template<random_access_iterator I, sentinel_for<I> S, class Comp = ranges::less, 364*fcaf7f86SDimitry Andric class Proj = identity> 365*fcaf7f86SDimitry Andric requires sortable<I, Comp, Proj> 366*fcaf7f86SDimitry Andric constexpr I 367*fcaf7f86SDimitry Andric ranges::partial_sort(I first, I middle, S last, Comp comp = {}, Proj proj = {}); // since C++20 368*fcaf7f86SDimitry Andric 369*fcaf7f86SDimitry Andric template<random_access_range R, class Comp = ranges::less, class Proj = identity> 370*fcaf7f86SDimitry Andric requires sortable<iterator_t<R>, Comp, Proj> 371*fcaf7f86SDimitry Andric constexpr borrowed_iterator_t<R> 372*fcaf7f86SDimitry Andric ranges::partial_sort(R&& r, iterator_t<R> middle, Comp comp = {}, Proj proj = {}); // since C++20 373*fcaf7f86SDimitry Andric 37481ad6265SDimitry Andric template<class T, output_iterator<const T&> O, sentinel_for<O> S> 37581ad6265SDimitry Andric constexpr O ranges::fill(O first, S last, const T& value); // since C++20 37681ad6265SDimitry Andric 37781ad6265SDimitry Andric template<class T, output_range<const T&> R> 37881ad6265SDimitry Andric constexpr borrowed_iterator_t<R> ranges::fill(R&& r, const T& value); // since C++20 37981ad6265SDimitry Andric 38081ad6265SDimitry Andric template<class T, output_iterator<const T&> O> 38181ad6265SDimitry Andric constexpr O ranges::fill_n(O first, iter_difference_t<O> n, const T& value); // since C++20 38281ad6265SDimitry Andric 38381ad6265SDimitry Andric template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2, 38481ad6265SDimitry Andric class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity> 38581ad6265SDimitry Andric requires indirectly_comparable<I1, I2, Pred, Proj1, Proj2> 38681ad6265SDimitry Andric constexpr bool ranges::equal(I1 first1, S1 last1, I2 first2, S2 last2, 38781ad6265SDimitry Andric Pred pred = {}, 38881ad6265SDimitry Andric Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 38981ad6265SDimitry Andric 39081ad6265SDimitry Andric template<input_range R1, input_range R2, class Pred = ranges::equal_to, 39181ad6265SDimitry Andric class Proj1 = identity, class Proj2 = identity> 39281ad6265SDimitry Andric requires indirectly_comparable<iterator_t<R1>, iterator_t<R2>, Pred, Proj1, Proj2> 39381ad6265SDimitry Andric constexpr bool ranges::equal(R1&& r1, R2&& r2, Pred pred = {}, 39481ad6265SDimitry Andric Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 39581ad6265SDimitry Andric 39681ad6265SDimitry Andric template<input_iterator I, sentinel_for<I> S, class Proj = identity, 39781ad6265SDimitry Andric indirect_unary_predicate<projected<I, Proj>> Pred> 39881ad6265SDimitry Andric constexpr bool ranges::all_of(I first, S last, Pred pred, Proj proj = {}); // since C++20 39981ad6265SDimitry Andric 40081ad6265SDimitry Andric template<input_range R, class Proj = identity, 40181ad6265SDimitry Andric indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 40281ad6265SDimitry Andric constexpr bool ranges::all_of(R&& r, Pred pred, Proj proj = {}); // since C++20 40381ad6265SDimitry Andric 40481ad6265SDimitry Andric template<input_iterator I, sentinel_for<I> S, class Proj = identity, 40581ad6265SDimitry Andric indirect_unary_predicate<projected<I, Proj>> Pred> 40681ad6265SDimitry Andric constexpr bool ranges::any_of(I first, S last, Pred pred, Proj proj = {}); // since C++20 40781ad6265SDimitry Andric 40881ad6265SDimitry Andric template<input_range R, class Proj = identity, 40981ad6265SDimitry Andric indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 41081ad6265SDimitry Andric constexpr bool ranges::any_of(R&& r, Pred pred, Proj proj = {}); // since C++20 41181ad6265SDimitry Andric 41281ad6265SDimitry Andric template<input_iterator I, sentinel_for<I> S, class Proj = identity, 41381ad6265SDimitry Andric indirect_unary_predicate<projected<I, Proj>> Pred> 41481ad6265SDimitry Andric constexpr bool ranges::none_of(I first, S last, Pred pred, Proj proj = {}); // since C++20 41581ad6265SDimitry Andric 41681ad6265SDimitry Andric template<input_range R, class Proj = identity, 41781ad6265SDimitry Andric indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 41881ad6265SDimitry Andric constexpr bool ranges::none_of(R&& r, Pred pred, Proj proj = {}); // since C++20 41981ad6265SDimitry Andric 42081ad6265SDimitry Andric template<forward_iterator I, sentinel_for<I> S, class Proj = identity, 42181ad6265SDimitry Andric indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less> 42281ad6265SDimitry Andric constexpr bool ranges::is_sorted(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20 42381ad6265SDimitry Andric 42481ad6265SDimitry Andric template<forward_range R, class Proj = identity, 42581ad6265SDimitry Andric indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less> 42681ad6265SDimitry Andric constexpr bool ranges::is_sorted(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 42781ad6265SDimitry Andric 42881ad6265SDimitry Andric template<forward_iterator I, sentinel_for<I> S, class Proj = identity, 42981ad6265SDimitry Andric indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less> 43081ad6265SDimitry Andric constexpr I ranges::is_sorted_until(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20 43181ad6265SDimitry Andric 43281ad6265SDimitry Andric template<forward_range R, class Proj = identity, 43381ad6265SDimitry Andric indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less> 43481ad6265SDimitry Andric constexpr borrowed_iterator_t<R> 43581ad6265SDimitry Andric ranges::is_sorted_until(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 43681ad6265SDimitry Andric 437753f127fSDimitry Andric template<random_access_iterator I, sentinel_for<I> S, class Comp = ranges::less, 438753f127fSDimitry Andric class Proj = identity> 439753f127fSDimitry Andric requires sortable<I, Comp, Proj> 440753f127fSDimitry Andric constexpr I 441753f127fSDimitry Andric ranges::nth_element(I first, I nth, S last, Comp comp = {}, Proj proj = {}); // since C++20 442753f127fSDimitry Andric 443753f127fSDimitry Andric template<random_access_range R, class Comp = ranges::less, class Proj = identity> 444753f127fSDimitry Andric requires sortable<iterator_t<R>, Comp, Proj> 445753f127fSDimitry Andric constexpr borrowed_iterator_t<R> 446753f127fSDimitry Andric ranges::nth_element(R&& r, iterator_t<R> nth, Comp comp = {}, Proj proj = {}); // since C++20 447753f127fSDimitry Andric 44881ad6265SDimitry Andric template<forward_iterator I, sentinel_for<I> S, class T, class Proj = identity, 44981ad6265SDimitry Andric indirect_strict_weak_order<const T*, projected<I, Proj>> Comp = ranges::less> 45081ad6265SDimitry Andric constexpr I upper_bound(I first, S last, const T& value, Comp comp = {}, Proj proj = {}); // since C++20 45181ad6265SDimitry Andric 45281ad6265SDimitry Andric template<forward_range R, class T, class Proj = identity, 45381ad6265SDimitry Andric indirect_strict_weak_order<const T*, projected<iterator_t<R>, Proj>> Comp = 45481ad6265SDimitry Andric ranges::less> 45581ad6265SDimitry Andric constexpr borrowed_iterator_t<R> 45681ad6265SDimitry Andric upper_bound(R&& r, const T& value, Comp comp = {}, Proj proj = {}); // since C++20 45781ad6265SDimitry Andric 45881ad6265SDimitry Andric template<forward_iterator I, sentinel_for<I> S, class T, class Proj = identity, 45981ad6265SDimitry Andric indirect_strict_weak_order<const T*, projected<I, Proj>> Comp = ranges::less> 46081ad6265SDimitry Andric constexpr I lower_bound(I first, S last, const T& value, Comp comp = {}, 46181ad6265SDimitry Andric Proj proj = {}); // since C++20 46281ad6265SDimitry Andric template<forward_range R, class T, class Proj = identity, 46381ad6265SDimitry Andric indirect_strict_weak_order<const T*, projected<iterator_t<R>, Proj>> Comp = 46481ad6265SDimitry Andric ranges::less> 46581ad6265SDimitry Andric constexpr borrowed_iterator_t<R> 46681ad6265SDimitry Andric lower_bound(R&& r, const T& value, Comp comp = {}, Proj proj = {}); // since C++20 46781ad6265SDimitry Andric 46881ad6265SDimitry Andric template<forward_iterator I, sentinel_for<I> S, class T, class Proj = identity, 46981ad6265SDimitry Andric indirect_strict_weak_order<const T*, projected<I, Proj>> Comp = ranges::less> 47081ad6265SDimitry Andric constexpr bool binary_search(I first, S last, const T& value, Comp comp = {}, 47181ad6265SDimitry Andric Proj proj = {}); // since C++20 47281ad6265SDimitry Andric 47381ad6265SDimitry Andric template<forward_range R, class T, class Proj = identity, 47481ad6265SDimitry Andric indirect_strict_weak_order<const T*, projected<iterator_t<R>, Proj>> Comp = 47581ad6265SDimitry Andric ranges::less> 47681ad6265SDimitry Andric constexpr bool binary_search(R&& r, const T& value, Comp comp = {}, 47781ad6265SDimitry Andric Proj proj = {}); // since C++20 478*fcaf7f86SDimitry Andric 479*fcaf7f86SDimitry Andric template<permutable I, sentinel_for<I> S, class Proj = identity, 480*fcaf7f86SDimitry Andric indirect_unary_predicate<projected<I, Proj>> Pred> 481*fcaf7f86SDimitry Andric constexpr subrange<I> 482*fcaf7f86SDimitry Andric partition(I first, S last, Pred pred, Proj proj = {}); // Since C++20 483*fcaf7f86SDimitry Andric 484*fcaf7f86SDimitry Andric template<forward_range R, class Proj = identity, 485*fcaf7f86SDimitry Andric indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 486*fcaf7f86SDimitry Andric requires permutable<iterator_t<R>> 487*fcaf7f86SDimitry Andric constexpr borrowed_subrange_t<R> 488*fcaf7f86SDimitry Andric partition(R&& r, Pred pred, Proj proj = {}); // Since C++20 489*fcaf7f86SDimitry Andric 490*fcaf7f86SDimitry Andric template<bidirectional_iterator I, sentinel_for<I> S, class Proj = identity, 491*fcaf7f86SDimitry Andric indirect_unary_predicate<projected<I, Proj>> Pred> 492*fcaf7f86SDimitry Andric requires permutable<I> 493*fcaf7f86SDimitry Andric subrange<I> stable_partition(I first, S last, Pred pred, Proj proj = {}); // Since C++20 494*fcaf7f86SDimitry Andric 495*fcaf7f86SDimitry Andric template<bidirectional_range R, class Proj = identity, 496*fcaf7f86SDimitry Andric indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 497*fcaf7f86SDimitry Andric requires permutable<iterator_t<R>> 498*fcaf7f86SDimitry Andric borrowed_subrange_t<R> stable_partition(R&& r, Pred pred, Proj proj = {}); // Since C++20 499*fcaf7f86SDimitry Andric 50081ad6265SDimitry Andric template<input_iterator I1, sentinel_for<I1> S1, forward_iterator I2, sentinel_for<I2> S2, 50181ad6265SDimitry Andric class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity> 50281ad6265SDimitry Andric requires indirectly_comparable<I1, I2, Pred, Proj1, Proj2> 50381ad6265SDimitry Andric constexpr I1 ranges::find_first_of(I1 first1, S1 last1, I2 first2, S2 last2, 50481ad6265SDimitry Andric Pred pred = {}, 50581ad6265SDimitry Andric Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 50681ad6265SDimitry Andric 50781ad6265SDimitry Andric template<input_range R1, forward_range R2, 50881ad6265SDimitry Andric class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity> 50981ad6265SDimitry Andric requires indirectly_comparable<iterator_t<R1>, iterator_t<R2>, Pred, Proj1, Proj2> 51081ad6265SDimitry Andric constexpr borrowed_iterator_t<R1> 51181ad6265SDimitry Andric ranges::find_first_of(R1&& r1, R2&& r2, 51281ad6265SDimitry Andric Pred pred = {}, 51381ad6265SDimitry Andric Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 51481ad6265SDimitry Andric 51581ad6265SDimitry Andric template<forward_iterator I, sentinel_for<I> S, class Proj = identity, 51681ad6265SDimitry Andric indirect_binary_predicate<projected<I, Proj>, 51781ad6265SDimitry Andric projected<I, Proj>> Pred = ranges::equal_to> 51881ad6265SDimitry Andric constexpr I ranges::adjacent_find(I first, S last, Pred pred = {}, Proj proj = {}); // since C+20 51981ad6265SDimitry Andric 52081ad6265SDimitry Andric template<forward_range R, class Proj = identity, 52181ad6265SDimitry Andric indirect_binary_predicate<projected<iterator_t<R>, Proj>, 52281ad6265SDimitry Andric projected<iterator_t<R>, Proj>> Pred = ranges::equal_to> 52381ad6265SDimitry Andric constexpr borrowed_iterator_t<R> ranges::adjacent_find(R&& r, Pred pred = {}, Proj proj = {}); // since C++20 52481ad6265SDimitry Andric 52581ad6265SDimitry Andric template<input_iterator I, sentinel_for<I> S, class T1, class T2, class Proj = identity> 52681ad6265SDimitry Andric requires indirectly_writable<I, const T2&> && 52781ad6265SDimitry Andric indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T1*> 52881ad6265SDimitry Andric constexpr I 52981ad6265SDimitry Andric ranges::replace(I first, S last, const T1& old_value, const T2& new_value, Proj proj = {}); // since C++20 53081ad6265SDimitry Andric 53181ad6265SDimitry Andric template<input_range R, class T1, class T2, class Proj = identity> 53281ad6265SDimitry Andric requires indirectly_writable<iterator_t<R>, const T2&> && 53381ad6265SDimitry Andric indirect_binary_predicate<ranges::equal_to, projected<iterator_t<R>, Proj>, const T1*> 53481ad6265SDimitry Andric constexpr borrowed_iterator_t<R> 53581ad6265SDimitry Andric ranges::replace(R&& r, const T1& old_value, const T2& new_value, Proj proj = {}); // since C++20 53681ad6265SDimitry Andric 53781ad6265SDimitry Andric template<input_iterator I, sentinel_for<I> S, class T, class Proj = identity, 53881ad6265SDimitry Andric indirect_unary_predicate<projected<I, Proj>> Pred> 53981ad6265SDimitry Andric requires indirectly_writable<I, const T&> 54081ad6265SDimitry Andric constexpr I ranges::replace_if(I first, S last, Pred pred, const T& new_value, Proj proj = {}); // since C++20 54181ad6265SDimitry Andric 54281ad6265SDimitry Andric template<input_range R, class T, class Proj = identity, 54381ad6265SDimitry Andric indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 54481ad6265SDimitry Andric requires indirectly_writable<iterator_t<R>, const T&> 54581ad6265SDimitry Andric constexpr borrowed_iterator_t<R> 54681ad6265SDimitry Andric ranges::replace_if(R&& r, Pred pred, const T& new_value, Proj proj = {}); // since C++20 54781ad6265SDimitry Andric 54881ad6265SDimitry Andric template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2, 54981ad6265SDimitry Andric class Proj1 = identity, class Proj2 = identity, 55081ad6265SDimitry Andric indirect_strict_weak_order<projected<I1, Proj1>, 55181ad6265SDimitry Andric projected<I2, Proj2>> Comp = ranges::less> 55281ad6265SDimitry Andric constexpr bool 55381ad6265SDimitry Andric ranges::lexicographical_compare(I1 first1, S1 last1, I2 first2, S2 last2, 55481ad6265SDimitry Andric Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 55581ad6265SDimitry Andric 55681ad6265SDimitry Andric template<input_range R1, input_range R2, class Proj1 = identity, 55781ad6265SDimitry Andric class Proj2 = identity, 55881ad6265SDimitry Andric indirect_strict_weak_order<projected<iterator_t<R1>, Proj1>, 55981ad6265SDimitry Andric projected<iterator_t<R2>, Proj2>> Comp = ranges::less> 56081ad6265SDimitry Andric constexpr bool 56181ad6265SDimitry Andric ranges::lexicographical_compare(R1&& r1, R2&& r2, Comp comp = {}, 56281ad6265SDimitry Andric Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 56381ad6265SDimitry Andric 56481ad6265SDimitry Andric template<bidirectional_iterator I1, sentinel_for<I1> S1, bidirectional_iterator I2> 56581ad6265SDimitry Andric requires indirectly_movable<I1, I2> 56681ad6265SDimitry Andric constexpr ranges::move_backward_result<I1, I2> 56781ad6265SDimitry Andric ranges::move_backward(I1 first, S1 last, I2 result); // since C++20 56881ad6265SDimitry Andric 56981ad6265SDimitry Andric template<bidirectional_range R, bidirectional_iterator I> 57081ad6265SDimitry Andric requires indirectly_movable<iterator_t<R>, I> 57181ad6265SDimitry Andric constexpr ranges::move_backward_result<borrowed_iterator_t<R>, I> 57281ad6265SDimitry Andric ranges::move_backward(R&& r, I result); // since C++20 57381ad6265SDimitry Andric 57481ad6265SDimitry Andric template<input_iterator I, sentinel_for<I> S, weakly_incrementable O> 57581ad6265SDimitry Andric requires indirectly_movable<I, O> 57681ad6265SDimitry Andric constexpr ranges::move_result<I, O> 57781ad6265SDimitry Andric ranges::move(I first, S last, O result); // since C++20 57881ad6265SDimitry Andric 57981ad6265SDimitry Andric template<input_range R, weakly_incrementable O> 58081ad6265SDimitry Andric requires indirectly_movable<iterator_t<R>, O> 58181ad6265SDimitry Andric constexpr ranges::move_result<borrowed_iterator_t<R>, O> 58281ad6265SDimitry Andric ranges::move(R&& r, O result); // since C++20 58381ad6265SDimitry Andric 584*fcaf7f86SDimitry Andric template<class I, class O1, class O2> 585*fcaf7f86SDimitry Andric using partition_copy_result = in_out_out_result<I, O1, O2>; // since C++20 586*fcaf7f86SDimitry Andric 587*fcaf7f86SDimitry Andric template<input_iterator I, sentinel_for<I> S, 588*fcaf7f86SDimitry Andric weakly_incrementable O1, weakly_incrementable O2, 589*fcaf7f86SDimitry Andric class Proj = identity, indirect_unary_predicate<projected<I, Proj>> Pred> 590*fcaf7f86SDimitry Andric requires indirectly_copyable<I, O1> && indirectly_copyable<I, O2> 591*fcaf7f86SDimitry Andric constexpr partition_copy_result<I, O1, O2> 592*fcaf7f86SDimitry Andric partition_copy(I first, S last, O1 out_true, O2 out_false, Pred pred, 593*fcaf7f86SDimitry Andric Proj proj = {}); // Since C++20 594*fcaf7f86SDimitry Andric 595*fcaf7f86SDimitry Andric template<input_range R, weakly_incrementable O1, weakly_incrementable O2, 596*fcaf7f86SDimitry Andric class Proj = identity, 597*fcaf7f86SDimitry Andric indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 598*fcaf7f86SDimitry Andric requires indirectly_copyable<iterator_t<R>, O1> && 599*fcaf7f86SDimitry Andric indirectly_copyable<iterator_t<R>, O2> 600*fcaf7f86SDimitry Andric constexpr partition_copy_result<borrowed_iterator_t<R>, O1, O2> 601*fcaf7f86SDimitry Andric partition_copy(R&& r, O1 out_true, O2 out_false, Pred pred, Proj proj = {}); // Since C++20 602*fcaf7f86SDimitry Andric 603*fcaf7f86SDimitry Andric template<forward_iterator I, sentinel_for<I> S, class Proj = identity, 604*fcaf7f86SDimitry Andric indirect_unary_predicate<projected<I, Proj>> Pred> 605*fcaf7f86SDimitry Andric constexpr I partition_point(I first, S last, Pred pred, Proj proj = {}); // Since C++20 606*fcaf7f86SDimitry Andric 607*fcaf7f86SDimitry Andric template<forward_range R, class Proj = identity, 608*fcaf7f86SDimitry Andric indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 609*fcaf7f86SDimitry Andric constexpr borrowed_iterator_t<R> 610*fcaf7f86SDimitry Andric partition_point(R&& r, Pred pred, Proj proj = {}); // Since C++20 611*fcaf7f86SDimitry Andric 612753f127fSDimitry Andric template<class I1, class I2, class O> 613753f127fSDimitry Andric using merge_result = in_in_out_result<I1, I2, O>; // since C++20 614753f127fSDimitry Andric 615753f127fSDimitry Andric template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2, 616753f127fSDimitry Andric weakly_incrementable O, class Comp = ranges::less, class Proj1 = identity, 617753f127fSDimitry Andric class Proj2 = identity> 618753f127fSDimitry Andric requires mergeable<I1, I2, O, Comp, Proj1, Proj2> 619753f127fSDimitry Andric constexpr merge_result<I1, I2, O> 620753f127fSDimitry Andric merge(I1 first1, S1 last1, I2 first2, S2 last2, O result, 621753f127fSDimitry Andric Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 622753f127fSDimitry Andric 623753f127fSDimitry Andric template<input_range R1, input_range R2, weakly_incrementable O, class Comp = ranges::less, 624753f127fSDimitry Andric class Proj1 = identity, class Proj2 = identity> 625753f127fSDimitry Andric requires mergeable<iterator_t<R1>, iterator_t<R2>, O, Comp, Proj1, Proj2> 626753f127fSDimitry Andric constexpr merge_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>, O> 627753f127fSDimitry Andric merge(R1&& r1, R2&& r2, O result, 628753f127fSDimitry Andric Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 629753f127fSDimitry Andric 630753f127fSDimitry Andric template<permutable I, sentinel_for<I> S, class T, class Proj = identity> 631753f127fSDimitry Andric requires indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T*> 632753f127fSDimitry Andric constexpr subrange<I> ranges::remove(I first, S last, const T& value, Proj proj = {}); // since C++20 633753f127fSDimitry Andric 634753f127fSDimitry Andric template<forward_range R, class T, class Proj = identity> 635753f127fSDimitry Andric requires permutable<iterator_t<R>> && 636753f127fSDimitry Andric indirect_binary_predicate<ranges::equal_to, projected<iterator_t<R>, Proj>, const T*> 637753f127fSDimitry Andric constexpr borrowed_subrange_t<R> 638753f127fSDimitry Andric ranges::remove(R&& r, const T& value, Proj proj = {}); // since C++20 639753f127fSDimitry Andric 640753f127fSDimitry Andric template<permutable I, sentinel_for<I> S, class Proj = identity, 641753f127fSDimitry Andric indirect_unary_predicate<projected<I, Proj>> Pred> 642753f127fSDimitry Andric constexpr subrange<I> ranges::remove_if(I first, S last, Pred pred, Proj proj = {}); // since C++20 643753f127fSDimitry Andric 644753f127fSDimitry Andric template<forward_range R, class Proj = identity, 645753f127fSDimitry Andric indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 646753f127fSDimitry Andric requires permutable<iterator_t<R>> 647753f127fSDimitry Andric constexpr borrowed_subrange_t<R> 648753f127fSDimitry Andric ranges::remove_if(R&& r, Pred pred, Proj proj = {}); // since C++20 649753f127fSDimitry Andric 650753f127fSDimitry Andric template<class I, class O> 651753f127fSDimitry Andric using set_difference_result = in_out_result<I, O>; // since C++20 652753f127fSDimitry Andric 653753f127fSDimitry Andric template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2, 654753f127fSDimitry Andric weakly_incrementable O, class Comp = ranges::less, 655753f127fSDimitry Andric class Proj1 = identity, class Proj2 = identity> 656753f127fSDimitry Andric requires mergeable<I1, I2, O, Comp, Proj1, Proj2> 657753f127fSDimitry Andric constexpr set_difference_result<I1, O> 658753f127fSDimitry Andric set_difference(I1 first1, S1 last1, I2 first2, S2 last2, O result, 659753f127fSDimitry Andric Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 660753f127fSDimitry Andric 661753f127fSDimitry Andric template<input_range R1, input_range R2, weakly_incrementable O, 662753f127fSDimitry Andric class Comp = ranges::less, class Proj1 = identity, class Proj2 = identity> 663753f127fSDimitry Andric requires mergeable<iterator_t<R1>, iterator_t<R2>, O, Comp, Proj1, Proj2> 664753f127fSDimitry Andric constexpr set_difference_result<borrowed_iterator_t<R1>, O> 665753f127fSDimitry Andric set_difference(R1&& r1, R2&& r2, O result, 666753f127fSDimitry Andric Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 667753f127fSDimitry Andric 668753f127fSDimitry Andric template<class I1, class I2, class O> 669753f127fSDimitry Andric using set_intersection_result = in_in_out_result<I1, I2, O>; // since C++20 670753f127fSDimitry Andric 671753f127fSDimitry Andric template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2, 672753f127fSDimitry Andric weakly_incrementable O, class Comp = ranges::less, 673753f127fSDimitry Andric class Proj1 = identity, class Proj2 = identity> 674753f127fSDimitry Andric requires mergeable<I1, I2, O, Comp, Proj1, Proj2> 675753f127fSDimitry Andric constexpr set_intersection_result<I1, I2, O> 676753f127fSDimitry Andric set_intersection(I1 first1, S1 last1, I2 first2, S2 last2, O result, 677753f127fSDimitry Andric Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 678753f127fSDimitry Andric 679753f127fSDimitry Andric template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2, 680753f127fSDimitry Andric weakly_incrementable O, class Comp = ranges::less, 681753f127fSDimitry Andric class Proj1 = identity, class Proj2 = identity> 682753f127fSDimitry Andric requires mergeable<I1, I2, O, Comp, Proj1, Proj2> 683753f127fSDimitry Andric constexpr set_intersection_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>, O> 684753f127fSDimitry Andric set_intersection(R1&& r1, R2&& r2, O result, 685753f127fSDimitry Andric Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 686753f127fSDimitry Andric 687753f127fSDimitry Andric template <class _InIter, class _OutIter> 688753f127fSDimitry Andric using reverse_copy_result = in_out_result<_InIter, _OutIter>; // since C++20 689753f127fSDimitry Andric 690753f127fSDimitry Andric template<bidirectional_iterator I, sentinel_for<I> S, weakly_incrementable O> 691753f127fSDimitry Andric requires indirectly_copyable<I, O> 692753f127fSDimitry Andric constexpr ranges::reverse_copy_result<I, O> 693753f127fSDimitry Andric ranges::reverse_copy(I first, S last, O result); // since C++20 694753f127fSDimitry Andric 695753f127fSDimitry Andric template<bidirectional_range R, weakly_incrementable O> 696753f127fSDimitry Andric requires indirectly_copyable<iterator_t<R>, O> 697753f127fSDimitry Andric constexpr ranges::reverse_copy_result<borrowed_iterator_t<R>, O> 698753f127fSDimitry Andric ranges::reverse_copy(R&& r, O result); // since C++20 699753f127fSDimitry Andric 700753f127fSDimitry Andric template <class _InIter, class _OutIter> 701753f127fSDimitry Andric using rotate_copy_result = in_out_result<_InIter, _OutIter>; // since C++20 702753f127fSDimitry Andric 703753f127fSDimitry Andric template<forward_iterator I, sentinel_for<I> S, weakly_incrementable O> 704753f127fSDimitry Andric requires indirectly_copyable<I, O> 705753f127fSDimitry Andric constexpr ranges::rotate_copy_result<I, O> 706753f127fSDimitry Andric ranges::rotate_copy(I first, I middle, S last, O result); // since C++20 707753f127fSDimitry Andric 708753f127fSDimitry Andric template<forward_range R, weakly_incrementable O> 709753f127fSDimitry Andric requires indirectly_copyable<iterator_t<R>, O> 710753f127fSDimitry Andric constexpr ranges::rotate_copy_result<borrowed_iterator_t<R>, O> 711753f127fSDimitry Andric ranges::rotate_copy(R&& r, iterator_t<R> middle, O result); // since C++20 712753f127fSDimitry Andric 713*fcaf7f86SDimitry Andric template<random_access_iterator I, sentinel_for<I> S, class Gen> 714*fcaf7f86SDimitry Andric requires permutable<I> && 715*fcaf7f86SDimitry Andric uniform_random_bit_generator<remove_reference_t<Gen>> 716*fcaf7f86SDimitry Andric I shuffle(I first, S last, Gen&& g); // Since C++20 717*fcaf7f86SDimitry Andric 718*fcaf7f86SDimitry Andric template<random_access_range R, class Gen> 719*fcaf7f86SDimitry Andric requires permutable<iterator_t<R>> && 720*fcaf7f86SDimitry Andric uniform_random_bit_generator<remove_reference_t<Gen>> 721*fcaf7f86SDimitry Andric borrowed_iterator_t<R> shuffle(R&& r, Gen&& g); // Since C++20 722*fcaf7f86SDimitry Andric 723753f127fSDimitry Andric template<forward_iterator I1, sentinel_for<I1> S1, forward_iterator I2, 724753f127fSDimitry Andric sentinel_for<I2> S2, class Pred = ranges::equal_to, 725753f127fSDimitry Andric class Proj1 = identity, class Proj2 = identity> 726753f127fSDimitry Andric requires indirectly_comparable<I1, I2, Pred, Proj1, Proj2> 727753f127fSDimitry Andric constexpr subrange<I1> 728753f127fSDimitry Andric ranges::search(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {}, 729753f127fSDimitry Andric Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 730753f127fSDimitry Andric 731753f127fSDimitry Andric template<forward_range R1, forward_range R2, class Pred = ranges::equal_to, 732753f127fSDimitry Andric class Proj1 = identity, class Proj2 = identity> 733753f127fSDimitry Andric requires indirectly_comparable<iterator_t<R1>, iterator_t<R2>, Pred, Proj1, Proj2> 734753f127fSDimitry Andric constexpr borrowed_subrange_t<R1> 735753f127fSDimitry Andric ranges::search(R1&& r1, R2&& r2, Pred pred = {}, 736753f127fSDimitry Andric Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 737753f127fSDimitry Andric 738753f127fSDimitry Andric template<forward_iterator I, sentinel_for<I> S, class T, 739753f127fSDimitry Andric class Pred = ranges::equal_to, class Proj = identity> 740753f127fSDimitry Andric requires indirectly_comparable<I, const T*, Pred, Proj> 741753f127fSDimitry Andric constexpr subrange<I> 742753f127fSDimitry Andric ranges::search_n(I first, S last, iter_difference_t<I> count, 743753f127fSDimitry Andric const T& value, Pred pred = {}, Proj proj = {}); // since C++20 744753f127fSDimitry Andric 745753f127fSDimitry Andric template<forward_range R, class T, class Pred = ranges::equal_to, 746753f127fSDimitry Andric class Proj = identity> 747753f127fSDimitry Andric requires indirectly_comparable<iterator_t<R>, const T*, Pred, Proj> 748753f127fSDimitry Andric constexpr borrowed_subrange_t<R> 749753f127fSDimitry Andric ranges::search_n(R&& r, range_difference_t<R> count, 750753f127fSDimitry Andric const T& value, Pred pred = {}, Proj proj = {}); // since C++20 751753f127fSDimitry Andric 752753f127fSDimitry Andric template<forward_iterator I1, sentinel_for<I1> S1, forward_iterator I2, sentinel_for<I2> S2, 753753f127fSDimitry Andric class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity> 754753f127fSDimitry Andric requires indirectly_comparable<I1, I2, Pred, Proj1, Proj2> 755753f127fSDimitry Andric constexpr subrange<I1> 756753f127fSDimitry Andric ranges::find_end(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {}, 757753f127fSDimitry Andric Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 758753f127fSDimitry Andric 759753f127fSDimitry Andric template<forward_range R1, forward_range R2, 760753f127fSDimitry Andric class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity> 761753f127fSDimitry Andric requires indirectly_comparable<iterator_t<R1>, iterator_t<R2>, Pred, Proj1, Proj2> 762753f127fSDimitry Andric constexpr borrowed_subrange_t<R1> 763753f127fSDimitry Andric ranges::find_end(R1&& r1, R2&& r2, Pred pred = {}, 764753f127fSDimitry Andric Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 765753f127fSDimitry Andric 766753f127fSDimitry Andric template<class I1, class I2, class O> 767753f127fSDimitry Andric using set_symmetric_difference_result = in_in_out_result<I1, I2, O>; // since C++20 768753f127fSDimitry Andric 769753f127fSDimitry Andric template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2, 770753f127fSDimitry Andric weakly_incrementable O, class Comp = ranges::less, 771753f127fSDimitry Andric class Proj1 = identity, class Proj2 = identity> 772753f127fSDimitry Andric requires mergeable<I1, I2, O, Comp, Proj1, Proj2> 773753f127fSDimitry Andric constexpr set_symmetric_difference_result<I1, I2, O> 774753f127fSDimitry Andric set_symmetric_difference(I1 first1, S1 last1, I2 first2, S2 last2, O result, 775753f127fSDimitry Andric Comp comp = {}, Proj1 proj1 = {}, 776753f127fSDimitry Andric Proj2 proj2 = {}); // since C++20 777753f127fSDimitry Andric 778753f127fSDimitry Andric template<input_range R1, input_range R2, weakly_incrementable O, 779753f127fSDimitry Andric class Comp = ranges::less, class Proj1 = identity, class Proj2 = identity> 780753f127fSDimitry Andric requires mergeable<iterator_t<R1>, iterator_t<R2>, O, Comp, Proj1, Proj2> 781753f127fSDimitry Andric constexpr set_symmetric_difference_result<borrowed_iterator_t<R1>, 782753f127fSDimitry Andric borrowed_iterator_t<R2>, O> 783753f127fSDimitry Andric set_symmetric_difference(R1&& r1, R2&& r2, O result, Comp comp = {}, 784753f127fSDimitry Andric Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 78581ad6265SDimitry Andric 786*fcaf7f86SDimitry Andric template<forward_iterator I, sentinel_for<I> S, class T, class Proj = identity, 787*fcaf7f86SDimitry Andric indirect_strict_weak_order<const T*, projected<I, Proj>> Comp = ranges::less> 788*fcaf7f86SDimitry Andric constexpr subrange<I> 789*fcaf7f86SDimitry Andric equal_range(I first, S last, const T& value, Comp comp = {}, Proj proj = {}); // since C++20 790*fcaf7f86SDimitry Andric 791*fcaf7f86SDimitry Andric template<forward_range R, class T, class Proj = identity, 792*fcaf7f86SDimitry Andric indirect_strict_weak_order<const T*, projected<iterator_t<R>, Proj>> Comp = 793*fcaf7f86SDimitry Andric ranges::less> 794*fcaf7f86SDimitry Andric constexpr borrowed_subrange_t<R> 795*fcaf7f86SDimitry Andric equal_range(R&& r, const T& value, Comp comp = {}, Proj proj = {}); // since C++20 796*fcaf7f86SDimitry Andric 797*fcaf7f86SDimitry Andric template<class I1, class I2, class O> 798*fcaf7f86SDimitry Andric using set_union_result = in_in_out_result<I1, I2, O>; // since C++20 799*fcaf7f86SDimitry Andric 800*fcaf7f86SDimitry Andric template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2, 801*fcaf7f86SDimitry Andric weakly_incrementable O, class Comp = ranges::less, 802*fcaf7f86SDimitry Andric class Proj1 = identity, class Proj2 = identity> 803*fcaf7f86SDimitry Andric requires mergeable<I1, I2, O, Comp, Proj1, Proj2> 804*fcaf7f86SDimitry Andric constexpr set_union_result<I1, I2, O> 805*fcaf7f86SDimitry Andric set_union(I1 first1, S1 last1, I2 first2, S2 last2, O result, Comp comp = {}, 806*fcaf7f86SDimitry Andric Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 807*fcaf7f86SDimitry Andric 808*fcaf7f86SDimitry Andric template<input_range R1, input_range R2, weakly_incrementable O, 809*fcaf7f86SDimitry Andric class Comp = ranges::less, class Proj1 = identity, class Proj2 = identity> 810*fcaf7f86SDimitry Andric requires mergeable<iterator_t<R1>, iterator_t<R2>, O, Comp, Proj1, Proj2> 811*fcaf7f86SDimitry Andric constexpr set_union_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>, O> 812*fcaf7f86SDimitry Andric set_union(R1&& r1, R2&& r2, O result, Comp comp = {}, 813*fcaf7f86SDimitry Andric Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 814*fcaf7f86SDimitry Andric 815*fcaf7f86SDimitry Andric template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2, 816*fcaf7f86SDimitry Andric class Proj1 = identity, class Proj2 = identity, 817*fcaf7f86SDimitry Andric indirect_strict_weak_order<projected<I1, Proj1>, projected<I2, Proj2>> Comp = 818*fcaf7f86SDimitry Andric ranges::less> 819*fcaf7f86SDimitry Andric constexpr bool includes(I1 first1, S1 last1, I2 first2, S2 last2, Comp comp = {}, 820*fcaf7f86SDimitry Andric Proj1 proj1 = {}, Proj2 proj2 = {}); // Since C++20 821*fcaf7f86SDimitry Andric 822*fcaf7f86SDimitry Andric template<input_range R1, input_range R2, class Proj1 = identity, 823*fcaf7f86SDimitry Andric class Proj2 = identity, 824*fcaf7f86SDimitry Andric indirect_strict_weak_order<projected<iterator_t<R1>, Proj1>, 825*fcaf7f86SDimitry Andric projected<iterator_t<R2>, Proj2>> Comp = ranges::less> 826*fcaf7f86SDimitry Andric constexpr bool includes(R1&& r1, R2&& r2, Comp comp = {}, 827*fcaf7f86SDimitry Andric Proj1 proj1 = {}, Proj2 proj2 = {}); // Since C++20 82804eeddc0SDimitry Andric} 82904eeddc0SDimitry Andric 8300b57cec5SDimitry Andric constexpr bool // constexpr in C++20 8310b57cec5SDimitry Andric all_of(InputIterator first, InputIterator last, Predicate pred); 8320b57cec5SDimitry Andric 8330b57cec5SDimitry Andrictemplate <class InputIterator, class Predicate> 8340b57cec5SDimitry Andric constexpr bool // constexpr in C++20 8350b57cec5SDimitry Andric any_of(InputIterator first, InputIterator last, Predicate pred); 8360b57cec5SDimitry Andric 8370b57cec5SDimitry Andrictemplate <class InputIterator, class Predicate> 8380b57cec5SDimitry Andric constexpr bool // constexpr in C++20 8390b57cec5SDimitry Andric none_of(InputIterator first, InputIterator last, Predicate pred); 8400b57cec5SDimitry Andric 8410b57cec5SDimitry Andrictemplate <class InputIterator, class Function> 8420b57cec5SDimitry Andric constexpr Function // constexpr in C++20 8430b57cec5SDimitry Andric for_each(InputIterator first, InputIterator last, Function f); 8440b57cec5SDimitry Andric 8450b57cec5SDimitry Andrictemplate<class InputIterator, class Size, class Function> 8460b57cec5SDimitry Andric constexpr InputIterator // constexpr in C++20 8470b57cec5SDimitry Andric for_each_n(InputIterator first, Size n, Function f); // C++17 8480b57cec5SDimitry Andric 8490b57cec5SDimitry Andrictemplate <class InputIterator, class T> 8500b57cec5SDimitry Andric constexpr InputIterator // constexpr in C++20 8510b57cec5SDimitry Andric find(InputIterator first, InputIterator last, const T& value); 8520b57cec5SDimitry Andric 8530b57cec5SDimitry Andrictemplate <class InputIterator, class Predicate> 8540b57cec5SDimitry Andric constexpr InputIterator // constexpr in C++20 8550b57cec5SDimitry Andric find_if(InputIterator first, InputIterator last, Predicate pred); 8560b57cec5SDimitry Andric 8570b57cec5SDimitry Andrictemplate<class InputIterator, class Predicate> 858e8d8bef9SDimitry Andric constexpr InputIterator // constexpr in C++20 8590b57cec5SDimitry Andric find_if_not(InputIterator first, InputIterator last, Predicate pred); 8600b57cec5SDimitry Andric 8610b57cec5SDimitry Andrictemplate <class ForwardIterator1, class ForwardIterator2> 862e8d8bef9SDimitry Andric constexpr ForwardIterator1 // constexpr in C++20 8630b57cec5SDimitry Andric find_end(ForwardIterator1 first1, ForwardIterator1 last1, 8640b57cec5SDimitry Andric ForwardIterator2 first2, ForwardIterator2 last2); 8650b57cec5SDimitry Andric 8660b57cec5SDimitry Andrictemplate <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 867e8d8bef9SDimitry Andric constexpr ForwardIterator1 // constexpr in C++20 8680b57cec5SDimitry Andric find_end(ForwardIterator1 first1, ForwardIterator1 last1, 8690b57cec5SDimitry Andric ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred); 8700b57cec5SDimitry Andric 8710b57cec5SDimitry Andrictemplate <class ForwardIterator1, class ForwardIterator2> 8720b57cec5SDimitry Andric constexpr ForwardIterator1 // constexpr in C++20 8730b57cec5SDimitry Andric find_first_of(ForwardIterator1 first1, ForwardIterator1 last1, 8740b57cec5SDimitry Andric ForwardIterator2 first2, ForwardIterator2 last2); 8750b57cec5SDimitry Andric 8760b57cec5SDimitry Andrictemplate <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 8770b57cec5SDimitry Andric constexpr ForwardIterator1 // constexpr in C++20 8780b57cec5SDimitry Andric find_first_of(ForwardIterator1 first1, ForwardIterator1 last1, 8790b57cec5SDimitry Andric ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred); 8800b57cec5SDimitry Andric 8810b57cec5SDimitry Andrictemplate <class ForwardIterator> 8820b57cec5SDimitry Andric constexpr ForwardIterator // constexpr in C++20 8830b57cec5SDimitry Andric adjacent_find(ForwardIterator first, ForwardIterator last); 8840b57cec5SDimitry Andric 8850b57cec5SDimitry Andrictemplate <class ForwardIterator, class BinaryPredicate> 8860b57cec5SDimitry Andric constexpr ForwardIterator // constexpr in C++20 8870b57cec5SDimitry Andric adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate pred); 8880b57cec5SDimitry Andric 8890b57cec5SDimitry Andrictemplate <class InputIterator, class T> 8900b57cec5SDimitry Andric constexpr typename iterator_traits<InputIterator>::difference_type // constexpr in C++20 8910b57cec5SDimitry Andric count(InputIterator first, InputIterator last, const T& value); 8920b57cec5SDimitry Andric 8930b57cec5SDimitry Andrictemplate <class InputIterator, class Predicate> 8940b57cec5SDimitry Andric constexpr typename iterator_traits<InputIterator>::difference_type // constexpr in C++20 8950b57cec5SDimitry Andric count_if(InputIterator first, InputIterator last, Predicate pred); 8960b57cec5SDimitry Andric 8970b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2> 8980b57cec5SDimitry Andric constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20 8990b57cec5SDimitry Andric mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2); 9000b57cec5SDimitry Andric 9010b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2> 9020b57cec5SDimitry Andric constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20 9030b57cec5SDimitry Andric mismatch(InputIterator1 first1, InputIterator1 last1, 9040b57cec5SDimitry Andric InputIterator2 first2, InputIterator2 last2); // **C++14** 9050b57cec5SDimitry Andric 9060b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class BinaryPredicate> 9070b57cec5SDimitry Andric constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20 9080b57cec5SDimitry Andric mismatch(InputIterator1 first1, InputIterator1 last1, 9090b57cec5SDimitry Andric InputIterator2 first2, BinaryPredicate pred); 9100b57cec5SDimitry Andric 9110b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class BinaryPredicate> 9120b57cec5SDimitry Andric constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20 9130b57cec5SDimitry Andric mismatch(InputIterator1 first1, InputIterator1 last1, 9140b57cec5SDimitry Andric InputIterator2 first2, InputIterator2 last2, 9150b57cec5SDimitry Andric BinaryPredicate pred); // **C++14** 9160b57cec5SDimitry Andric 9170b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2> 9180b57cec5SDimitry Andric constexpr bool // constexpr in C++20 9190b57cec5SDimitry Andric equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2); 9200b57cec5SDimitry Andric 9210b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2> 9220b57cec5SDimitry Andric constexpr bool // constexpr in C++20 9230b57cec5SDimitry Andric equal(InputIterator1 first1, InputIterator1 last1, 9240b57cec5SDimitry Andric InputIterator2 first2, InputIterator2 last2); // **C++14** 9250b57cec5SDimitry Andric 9260b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class BinaryPredicate> 9270b57cec5SDimitry Andric constexpr bool // constexpr in C++20 9280b57cec5SDimitry Andric equal(InputIterator1 first1, InputIterator1 last1, 9290b57cec5SDimitry Andric InputIterator2 first2, BinaryPredicate pred); 9300b57cec5SDimitry Andric 9310b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class BinaryPredicate> 9320b57cec5SDimitry Andric constexpr bool // constexpr in C++20 9330b57cec5SDimitry Andric equal(InputIterator1 first1, InputIterator1 last1, 9340b57cec5SDimitry Andric InputIterator2 first2, InputIterator2 last2, 9350b57cec5SDimitry Andric BinaryPredicate pred); // **C++14** 9360b57cec5SDimitry Andric 9370b57cec5SDimitry Andrictemplate<class ForwardIterator1, class ForwardIterator2> 9380b57cec5SDimitry Andric constexpr bool // constexpr in C++20 9390b57cec5SDimitry Andric is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, 9400b57cec5SDimitry Andric ForwardIterator2 first2); 9410b57cec5SDimitry Andric 9420b57cec5SDimitry Andrictemplate<class ForwardIterator1, class ForwardIterator2> 9430b57cec5SDimitry Andric constexpr bool // constexpr in C++20 9440b57cec5SDimitry Andric is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, 9450b57cec5SDimitry Andric ForwardIterator2 first2, ForwardIterator2 last2); // **C++14** 9460b57cec5SDimitry Andric 9470b57cec5SDimitry Andrictemplate<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 9480b57cec5SDimitry Andric constexpr bool // constexpr in C++20 9490b57cec5SDimitry Andric is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, 9500b57cec5SDimitry Andric ForwardIterator2 first2, BinaryPredicate pred); 9510b57cec5SDimitry Andric 9520b57cec5SDimitry Andrictemplate<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 9530b57cec5SDimitry Andric constexpr bool // constexpr in C++20 9540b57cec5SDimitry Andric is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, 9550b57cec5SDimitry Andric ForwardIterator2 first2, ForwardIterator2 last2, 9560b57cec5SDimitry Andric BinaryPredicate pred); // **C++14** 9570b57cec5SDimitry Andric 9580b57cec5SDimitry Andrictemplate <class ForwardIterator1, class ForwardIterator2> 9590b57cec5SDimitry Andric constexpr ForwardIterator1 // constexpr in C++20 9600b57cec5SDimitry Andric search(ForwardIterator1 first1, ForwardIterator1 last1, 9610b57cec5SDimitry Andric ForwardIterator2 first2, ForwardIterator2 last2); 9620b57cec5SDimitry Andric 9630b57cec5SDimitry Andrictemplate <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 9640b57cec5SDimitry Andric constexpr ForwardIterator1 // constexpr in C++20 9650b57cec5SDimitry Andric search(ForwardIterator1 first1, ForwardIterator1 last1, 9660b57cec5SDimitry Andric ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred); 9670b57cec5SDimitry Andric 9680b57cec5SDimitry Andrictemplate <class ForwardIterator, class Size, class T> 9690b57cec5SDimitry Andric constexpr ForwardIterator // constexpr in C++20 9700b57cec5SDimitry Andric search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value); 9710b57cec5SDimitry Andric 9720b57cec5SDimitry Andrictemplate <class ForwardIterator, class Size, class T, class BinaryPredicate> 9730b57cec5SDimitry Andric constexpr ForwardIterator // constexpr in C++20 9740b57cec5SDimitry Andric search_n(ForwardIterator first, ForwardIterator last, 9750b57cec5SDimitry Andric Size count, const T& value, BinaryPredicate pred); 9760b57cec5SDimitry Andric 9770b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator> 978480093f4SDimitry Andric constexpr OutputIterator // constexpr in C++20 9790b57cec5SDimitry Andric copy(InputIterator first, InputIterator last, OutputIterator result); 9800b57cec5SDimitry Andric 9810b57cec5SDimitry Andrictemplate<class InputIterator, class OutputIterator, class Predicate> 982480093f4SDimitry Andric constexpr OutputIterator // constexpr in C++20 9830b57cec5SDimitry Andric copy_if(InputIterator first, InputIterator last, 9840b57cec5SDimitry Andric OutputIterator result, Predicate pred); 9850b57cec5SDimitry Andric 9860b57cec5SDimitry Andrictemplate<class InputIterator, class Size, class OutputIterator> 987480093f4SDimitry Andric constexpr OutputIterator // constexpr in C++20 9880b57cec5SDimitry Andric copy_n(InputIterator first, Size n, OutputIterator result); 9890b57cec5SDimitry Andric 9900b57cec5SDimitry Andrictemplate <class BidirectionalIterator1, class BidirectionalIterator2> 991480093f4SDimitry Andric constexpr BidirectionalIterator2 // constexpr in C++20 9920b57cec5SDimitry Andric copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last, 9930b57cec5SDimitry Andric BidirectionalIterator2 result); 9940b57cec5SDimitry Andric 99581ad6265SDimitry Andric// [alg.move], move 99681ad6265SDimitry Andrictemplate<class InputIterator, class OutputIterator> 99781ad6265SDimitry Andric constexpr OutputIterator move(InputIterator first, InputIterator last, 99881ad6265SDimitry Andric OutputIterator result); 99981ad6265SDimitry Andric 100081ad6265SDimitry Andrictemplate<class BidirectionalIterator1, class BidirectionalIterator2> 100181ad6265SDimitry Andric constexpr BidirectionalIterator2 100281ad6265SDimitry Andric move_backward(BidirectionalIterator1 first, BidirectionalIterator1 last, 100381ad6265SDimitry Andric BidirectionalIterator2 result); 100481ad6265SDimitry Andric 10050b57cec5SDimitry Andrictemplate <class ForwardIterator1, class ForwardIterator2> 1006e8d8bef9SDimitry Andric constexpr ForwardIterator2 // constexpr in C++20 10070b57cec5SDimitry Andric swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2); 10080b57cec5SDimitry Andric 100981ad6265SDimitry Andricnamespace ranges { 101081ad6265SDimitry Andric template<class I1, class I2> 101181ad6265SDimitry Andric using swap_ranges_result = in_in_result<I1, I2>; 101281ad6265SDimitry Andric 101381ad6265SDimitry Andrictemplate<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2> 101481ad6265SDimitry Andric requires indirectly_swappable<I1, I2> 101581ad6265SDimitry Andric constexpr ranges::swap_ranges_result<I1, I2> 101681ad6265SDimitry Andric swap_ranges(I1 first1, S1 last1, I2 first2, S2 last2); 101781ad6265SDimitry Andric 101881ad6265SDimitry Andrictemplate<input_range R1, input_range R2> 101981ad6265SDimitry Andric requires indirectly_swappable<iterator_t<R1>, iterator_t<R2>> 102081ad6265SDimitry Andric constexpr ranges::swap_ranges_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>> 102181ad6265SDimitry Andric swap_ranges(R1&& r1, R2&& r2); 102281ad6265SDimitry Andric} 102381ad6265SDimitry Andric 10240b57cec5SDimitry Andrictemplate <class ForwardIterator1, class ForwardIterator2> 1025e8d8bef9SDimitry Andric constexpr void // constexpr in C++20 10260b57cec5SDimitry Andric iter_swap(ForwardIterator1 a, ForwardIterator2 b); 10270b57cec5SDimitry Andric 10280b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator, class UnaryOperation> 10290b57cec5SDimitry Andric constexpr OutputIterator // constexpr in C++20 10300b57cec5SDimitry Andric transform(InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op); 10310b57cec5SDimitry Andric 10320b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation> 10330b57cec5SDimitry Andric constexpr OutputIterator // constexpr in C++20 10340b57cec5SDimitry Andric transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, 10350b57cec5SDimitry Andric OutputIterator result, BinaryOperation binary_op); 10360b57cec5SDimitry Andric 10370b57cec5SDimitry Andrictemplate <class ForwardIterator, class T> 10380b57cec5SDimitry Andric constexpr void // constexpr in C++20 10390b57cec5SDimitry Andric replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value); 10400b57cec5SDimitry Andric 10410b57cec5SDimitry Andrictemplate <class ForwardIterator, class Predicate, class T> 10420b57cec5SDimitry Andric constexpr void // constexpr in C++20 10430b57cec5SDimitry Andric replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value); 10440b57cec5SDimitry Andric 10450b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator, class T> 10460b57cec5SDimitry Andric constexpr OutputIterator // constexpr in C++20 10470b57cec5SDimitry Andric replace_copy(InputIterator first, InputIterator last, OutputIterator result, 10480b57cec5SDimitry Andric const T& old_value, const T& new_value); 10490b57cec5SDimitry Andric 10500b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator, class Predicate, class T> 10510b57cec5SDimitry Andric constexpr OutputIterator // constexpr in C++20 10520b57cec5SDimitry Andric replace_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value); 10530b57cec5SDimitry Andric 10540b57cec5SDimitry Andrictemplate <class ForwardIterator, class T> 10550b57cec5SDimitry Andric constexpr void // constexpr in C++20 10560b57cec5SDimitry Andric fill(ForwardIterator first, ForwardIterator last, const T& value); 10570b57cec5SDimitry Andric 10580b57cec5SDimitry Andrictemplate <class OutputIterator, class Size, class T> 10590b57cec5SDimitry Andric constexpr OutputIterator // constexpr in C++20 10600b57cec5SDimitry Andric fill_n(OutputIterator first, Size n, const T& value); 10610b57cec5SDimitry Andric 10620b57cec5SDimitry Andrictemplate <class ForwardIterator, class Generator> 10630b57cec5SDimitry Andric constexpr void // constexpr in C++20 10640b57cec5SDimitry Andric generate(ForwardIterator first, ForwardIterator last, Generator gen); 10650b57cec5SDimitry Andric 10660b57cec5SDimitry Andrictemplate <class OutputIterator, class Size, class Generator> 10670b57cec5SDimitry Andric constexpr OutputIterator // constexpr in C++20 10680b57cec5SDimitry Andric generate_n(OutputIterator first, Size n, Generator gen); 10690b57cec5SDimitry Andric 10700b57cec5SDimitry Andrictemplate <class ForwardIterator, class T> 10710b57cec5SDimitry Andric constexpr ForwardIterator // constexpr in C++20 10720b57cec5SDimitry Andric remove(ForwardIterator first, ForwardIterator last, const T& value); 10730b57cec5SDimitry Andric 10740b57cec5SDimitry Andrictemplate <class ForwardIterator, class Predicate> 10750b57cec5SDimitry Andric constexpr ForwardIterator // constexpr in C++20 10760b57cec5SDimitry Andric remove_if(ForwardIterator first, ForwardIterator last, Predicate pred); 10770b57cec5SDimitry Andric 10780b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator, class T> 10790b57cec5SDimitry Andric constexpr OutputIterator // constexpr in C++20 10800b57cec5SDimitry Andric remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value); 10810b57cec5SDimitry Andric 10820b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator, class Predicate> 10830b57cec5SDimitry Andric constexpr OutputIterator // constexpr in C++20 10840b57cec5SDimitry Andric remove_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred); 10850b57cec5SDimitry Andric 10860b57cec5SDimitry Andrictemplate <class ForwardIterator> 1087e8d8bef9SDimitry Andric constexpr ForwardIterator // constexpr in C++20 10880b57cec5SDimitry Andric unique(ForwardIterator first, ForwardIterator last); 10890b57cec5SDimitry Andric 10900b57cec5SDimitry Andrictemplate <class ForwardIterator, class BinaryPredicate> 1091e8d8bef9SDimitry Andric constexpr ForwardIterator // constexpr in C++20 10920b57cec5SDimitry Andric unique(ForwardIterator first, ForwardIterator last, BinaryPredicate pred); 10930b57cec5SDimitry Andric 10940b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator> 1095e8d8bef9SDimitry Andric constexpr OutputIterator // constexpr in C++20 10960b57cec5SDimitry Andric unique_copy(InputIterator first, InputIterator last, OutputIterator result); 10970b57cec5SDimitry Andric 10980b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator, class BinaryPredicate> 1099e8d8bef9SDimitry Andric constexpr OutputIterator // constexpr in C++20 11000b57cec5SDimitry Andric unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate pred); 11010b57cec5SDimitry Andric 11020b57cec5SDimitry Andrictemplate <class BidirectionalIterator> 1103e8d8bef9SDimitry Andric constexpr void // constexpr in C++20 11040b57cec5SDimitry Andric reverse(BidirectionalIterator first, BidirectionalIterator last); 11050b57cec5SDimitry Andric 11060b57cec5SDimitry Andrictemplate <class BidirectionalIterator, class OutputIterator> 11070b57cec5SDimitry Andric constexpr OutputIterator // constexpr in C++20 11080b57cec5SDimitry Andric reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result); 11090b57cec5SDimitry Andric 11100b57cec5SDimitry Andrictemplate <class ForwardIterator> 1111e8d8bef9SDimitry Andric constexpr ForwardIterator // constexpr in C++20 11120b57cec5SDimitry Andric rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last); 11130b57cec5SDimitry Andric 11140b57cec5SDimitry Andrictemplate <class ForwardIterator, class OutputIterator> 1115e8d8bef9SDimitry Andric constexpr OutputIterator // constexpr in C++20 11160b57cec5SDimitry Andric rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result); 11170b57cec5SDimitry Andric 11180b57cec5SDimitry Andrictemplate <class RandomAccessIterator> 11190b57cec5SDimitry Andric void 11200b57cec5SDimitry Andric random_shuffle(RandomAccessIterator first, RandomAccessIterator last); // deprecated in C++14, removed in C++17 11210b57cec5SDimitry Andric 11220b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class RandomNumberGenerator> 11230b57cec5SDimitry Andric void 11240b57cec5SDimitry Andric random_shuffle(RandomAccessIterator first, RandomAccessIterator last, 11250b57cec5SDimitry Andric RandomNumberGenerator& rand); // deprecated in C++14, removed in C++17 11260b57cec5SDimitry Andric 11270b57cec5SDimitry Andrictemplate<class PopulationIterator, class SampleIterator, 11280b57cec5SDimitry Andric class Distance, class UniformRandomBitGenerator> 11290b57cec5SDimitry Andric SampleIterator sample(PopulationIterator first, PopulationIterator last, 11300b57cec5SDimitry Andric SampleIterator out, Distance n, 11310b57cec5SDimitry Andric UniformRandomBitGenerator&& g); // C++17 11320b57cec5SDimitry Andric 11330b57cec5SDimitry Andrictemplate<class RandomAccessIterator, class UniformRandomNumberGenerator> 11340b57cec5SDimitry Andric void shuffle(RandomAccessIterator first, RandomAccessIterator last, 11350b57cec5SDimitry Andric UniformRandomNumberGenerator&& g); 11360b57cec5SDimitry Andric 1137e8d8bef9SDimitry Andrictemplate<class ForwardIterator> 1138e8d8bef9SDimitry Andric constexpr ForwardIterator 1139e8d8bef9SDimitry Andric shift_left(ForwardIterator first, ForwardIterator last, 1140e8d8bef9SDimitry Andric typename iterator_traits<ForwardIterator>::difference_type n); // C++20 1141e8d8bef9SDimitry Andric 1142e8d8bef9SDimitry Andrictemplate<class ForwardIterator> 1143e8d8bef9SDimitry Andric constexpr ForwardIterator 1144e8d8bef9SDimitry Andric shift_right(ForwardIterator first, ForwardIterator last, 1145e8d8bef9SDimitry Andric typename iterator_traits<ForwardIterator>::difference_type n); // C++20 1146e8d8bef9SDimitry Andric 11470b57cec5SDimitry Andrictemplate <class InputIterator, class Predicate> 11480b57cec5SDimitry Andric constexpr bool // constexpr in C++20 11490b57cec5SDimitry Andric is_partitioned(InputIterator first, InputIterator last, Predicate pred); 11500b57cec5SDimitry Andric 11510b57cec5SDimitry Andrictemplate <class ForwardIterator, class Predicate> 1152e8d8bef9SDimitry Andric constexpr ForwardIterator // constexpr in C++20 11530b57cec5SDimitry Andric partition(ForwardIterator first, ForwardIterator last, Predicate pred); 11540b57cec5SDimitry Andric 11550b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator1, 11560b57cec5SDimitry Andric class OutputIterator2, class Predicate> 11570b57cec5SDimitry Andric constexpr pair<OutputIterator1, OutputIterator2> // constexpr in C++20 11580b57cec5SDimitry Andric partition_copy(InputIterator first, InputIterator last, 11590b57cec5SDimitry Andric OutputIterator1 out_true, OutputIterator2 out_false, 11600b57cec5SDimitry Andric Predicate pred); 11610b57cec5SDimitry Andric 11620b57cec5SDimitry Andrictemplate <class ForwardIterator, class Predicate> 11630b57cec5SDimitry Andric ForwardIterator 11640b57cec5SDimitry Andric stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred); 11650b57cec5SDimitry Andric 11660b57cec5SDimitry Andrictemplate<class ForwardIterator, class Predicate> 11670b57cec5SDimitry Andric constexpr ForwardIterator // constexpr in C++20 11680b57cec5SDimitry Andric partition_point(ForwardIterator first, ForwardIterator last, Predicate pred); 11690b57cec5SDimitry Andric 11700b57cec5SDimitry Andrictemplate <class ForwardIterator> 11710b57cec5SDimitry Andric constexpr bool // constexpr in C++20 11720b57cec5SDimitry Andric is_sorted(ForwardIterator first, ForwardIterator last); 11730b57cec5SDimitry Andric 11740b57cec5SDimitry Andrictemplate <class ForwardIterator, class Compare> 1175e8d8bef9SDimitry Andric constexpr bool // constexpr in C++20 11760b57cec5SDimitry Andric is_sorted(ForwardIterator first, ForwardIterator last, Compare comp); 11770b57cec5SDimitry Andric 11780b57cec5SDimitry Andrictemplate<class ForwardIterator> 11790b57cec5SDimitry Andric constexpr ForwardIterator // constexpr in C++20 11800b57cec5SDimitry Andric is_sorted_until(ForwardIterator first, ForwardIterator last); 11810b57cec5SDimitry Andric 11820b57cec5SDimitry Andrictemplate <class ForwardIterator, class Compare> 11830b57cec5SDimitry Andric constexpr ForwardIterator // constexpr in C++20 11840b57cec5SDimitry Andric is_sorted_until(ForwardIterator first, ForwardIterator last, Compare comp); 11850b57cec5SDimitry Andric 11860b57cec5SDimitry Andrictemplate <class RandomAccessIterator> 1187fe6060f1SDimitry Andric constexpr void // constexpr in C++20 11880b57cec5SDimitry Andric sort(RandomAccessIterator first, RandomAccessIterator last); 11890b57cec5SDimitry Andric 11900b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare> 1191fe6060f1SDimitry Andric constexpr void // constexpr in C++20 11920b57cec5SDimitry Andric sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 11930b57cec5SDimitry Andric 11940b57cec5SDimitry Andrictemplate <class RandomAccessIterator> 11950b57cec5SDimitry Andric void 11960b57cec5SDimitry Andric stable_sort(RandomAccessIterator first, RandomAccessIterator last); 11970b57cec5SDimitry Andric 11980b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare> 11990b57cec5SDimitry Andric void 12000b57cec5SDimitry Andric stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 12010b57cec5SDimitry Andric 12020b57cec5SDimitry Andrictemplate <class RandomAccessIterator> 1203fe6060f1SDimitry Andric constexpr void // constexpr in C++20 12040b57cec5SDimitry Andric partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last); 12050b57cec5SDimitry Andric 12060b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare> 1207fe6060f1SDimitry Andric constexpr void // constexpr in C++20 12080b57cec5SDimitry Andric partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp); 12090b57cec5SDimitry Andric 12100b57cec5SDimitry Andrictemplate <class InputIterator, class RandomAccessIterator> 1211fe6060f1SDimitry Andric constexpr RandomAccessIterator // constexpr in C++20 12120b57cec5SDimitry Andric partial_sort_copy(InputIterator first, InputIterator last, 12130b57cec5SDimitry Andric RandomAccessIterator result_first, RandomAccessIterator result_last); 12140b57cec5SDimitry Andric 12150b57cec5SDimitry Andrictemplate <class InputIterator, class RandomAccessIterator, class Compare> 1216fe6060f1SDimitry Andric constexpr RandomAccessIterator // constexpr in C++20 12170b57cec5SDimitry Andric partial_sort_copy(InputIterator first, InputIterator last, 12180b57cec5SDimitry Andric RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp); 12190b57cec5SDimitry Andric 12200b57cec5SDimitry Andrictemplate <class RandomAccessIterator> 1221fe6060f1SDimitry Andric constexpr void // constexpr in C++20 12220b57cec5SDimitry Andric nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last); 12230b57cec5SDimitry Andric 12240b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare> 1225fe6060f1SDimitry Andric constexpr void // constexpr in C++20 12260b57cec5SDimitry Andric nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp); 12270b57cec5SDimitry Andric 12280b57cec5SDimitry Andrictemplate <class ForwardIterator, class T> 12290b57cec5SDimitry Andric constexpr ForwardIterator // constexpr in C++20 12300b57cec5SDimitry Andric lower_bound(ForwardIterator first, ForwardIterator last, const T& value); 12310b57cec5SDimitry Andric 12320b57cec5SDimitry Andrictemplate <class ForwardIterator, class T, class Compare> 12330b57cec5SDimitry Andric constexpr ForwardIterator // constexpr in C++20 12340b57cec5SDimitry Andric lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); 12350b57cec5SDimitry Andric 12360b57cec5SDimitry Andrictemplate <class ForwardIterator, class T> 12370b57cec5SDimitry Andric constexpr ForwardIterator // constexpr in C++20 12380b57cec5SDimitry Andric upper_bound(ForwardIterator first, ForwardIterator last, const T& value); 12390b57cec5SDimitry Andric 12400b57cec5SDimitry Andrictemplate <class ForwardIterator, class T, class Compare> 12410b57cec5SDimitry Andric constexpr ForwardIterator // constexpr in C++20 12420b57cec5SDimitry Andric upper_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); 12430b57cec5SDimitry Andric 12440b57cec5SDimitry Andrictemplate <class ForwardIterator, class T> 12450b57cec5SDimitry Andric constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++20 12460b57cec5SDimitry Andric equal_range(ForwardIterator first, ForwardIterator last, const T& value); 12470b57cec5SDimitry Andric 12480b57cec5SDimitry Andrictemplate <class ForwardIterator, class T, class Compare> 12490b57cec5SDimitry Andric constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++20 12500b57cec5SDimitry Andric equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); 12510b57cec5SDimitry Andric 12520b57cec5SDimitry Andrictemplate <class ForwardIterator, class T> 12530b57cec5SDimitry Andric constexpr bool // constexpr in C++20 12540b57cec5SDimitry Andric binary_search(ForwardIterator first, ForwardIterator last, const T& value); 12550b57cec5SDimitry Andric 12560b57cec5SDimitry Andrictemplate <class ForwardIterator, class T, class Compare> 12570b57cec5SDimitry Andric constexpr bool // constexpr in C++20 12580b57cec5SDimitry Andric binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); 12590b57cec5SDimitry Andric 12600b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator> 1261e8d8bef9SDimitry Andric constexpr OutputIterator // constexpr in C++20 12620b57cec5SDimitry Andric merge(InputIterator1 first1, InputIterator1 last1, 12630b57cec5SDimitry Andric InputIterator2 first2, InputIterator2 last2, OutputIterator result); 12640b57cec5SDimitry Andric 12650b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> 1266e8d8bef9SDimitry Andric constexpr OutputIterator // constexpr in C++20 12670b57cec5SDimitry Andric merge(InputIterator1 first1, InputIterator1 last1, 12680b57cec5SDimitry Andric InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 12690b57cec5SDimitry Andric 12700b57cec5SDimitry Andrictemplate <class BidirectionalIterator> 12710b57cec5SDimitry Andric void 12720b57cec5SDimitry Andric inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last); 12730b57cec5SDimitry Andric 12740b57cec5SDimitry Andrictemplate <class BidirectionalIterator, class Compare> 12750b57cec5SDimitry Andric void 12760b57cec5SDimitry Andric inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp); 12770b57cec5SDimitry Andric 12780b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2> 12790b57cec5SDimitry Andric constexpr bool // constexpr in C++20 12800b57cec5SDimitry Andric includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2); 12810b57cec5SDimitry Andric 12820b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class Compare> 12830b57cec5SDimitry Andric constexpr bool // constexpr in C++20 12840b57cec5SDimitry Andric includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp); 12850b57cec5SDimitry Andric 12860b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator> 1287e8d8bef9SDimitry Andric constexpr OutputIterator // constexpr in C++20 12880b57cec5SDimitry Andric set_union(InputIterator1 first1, InputIterator1 last1, 12890b57cec5SDimitry Andric InputIterator2 first2, InputIterator2 last2, OutputIterator result); 12900b57cec5SDimitry Andric 12910b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> 1292e8d8bef9SDimitry Andric constexpr OutputIterator // constexpr in C++20 12930b57cec5SDimitry Andric set_union(InputIterator1 first1, InputIterator1 last1, 12940b57cec5SDimitry Andric InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 12950b57cec5SDimitry Andric 12960b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator> 12970b57cec5SDimitry Andric constexpr OutputIterator // constexpr in C++20 12980b57cec5SDimitry Andric set_intersection(InputIterator1 first1, InputIterator1 last1, 12990b57cec5SDimitry Andric InputIterator2 first2, InputIterator2 last2, OutputIterator result); 13000b57cec5SDimitry Andric 13010b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> 13020b57cec5SDimitry Andric constexpr OutputIterator // constexpr in C++20 13030b57cec5SDimitry Andric set_intersection(InputIterator1 first1, InputIterator1 last1, 13040b57cec5SDimitry Andric InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 13050b57cec5SDimitry Andric 13060b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator> 1307e8d8bef9SDimitry Andric constexpr OutputIterator // constexpr in C++20 13080b57cec5SDimitry Andric set_difference(InputIterator1 first1, InputIterator1 last1, 13090b57cec5SDimitry Andric InputIterator2 first2, InputIterator2 last2, OutputIterator result); 13100b57cec5SDimitry Andric 13110b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> 1312e8d8bef9SDimitry Andric constexpr OutputIterator // constexpr in C++20 13130b57cec5SDimitry Andric set_difference(InputIterator1 first1, InputIterator1 last1, 13140b57cec5SDimitry Andric InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 13150b57cec5SDimitry Andric 13160b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator> 1317e8d8bef9SDimitry Andric constexpr OutputIterator // constexpr in C++20 13180b57cec5SDimitry Andric set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, 13190b57cec5SDimitry Andric InputIterator2 first2, InputIterator2 last2, OutputIterator result); 13200b57cec5SDimitry Andric 13210b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> 1322e8d8bef9SDimitry Andric constexpr OutputIterator // constexpr in C++20 13230b57cec5SDimitry Andric set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, 13240b57cec5SDimitry Andric InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 13250b57cec5SDimitry Andric 13260b57cec5SDimitry Andrictemplate <class RandomAccessIterator> 1327fe6060f1SDimitry Andric constexpr void // constexpr in C++20 13280b57cec5SDimitry Andric push_heap(RandomAccessIterator first, RandomAccessIterator last); 13290b57cec5SDimitry Andric 13300b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare> 1331fe6060f1SDimitry Andric constexpr void // constexpr in C++20 13320b57cec5SDimitry Andric push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 13330b57cec5SDimitry Andric 13340b57cec5SDimitry Andrictemplate <class RandomAccessIterator> 1335fe6060f1SDimitry Andric constexpr void // constexpr in C++20 13360b57cec5SDimitry Andric pop_heap(RandomAccessIterator first, RandomAccessIterator last); 13370b57cec5SDimitry Andric 13380b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare> 1339fe6060f1SDimitry Andric constexpr void // constexpr in C++20 13400b57cec5SDimitry Andric pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 13410b57cec5SDimitry Andric 13420b57cec5SDimitry Andrictemplate <class RandomAccessIterator> 1343fe6060f1SDimitry Andric constexpr void // constexpr in C++20 13440b57cec5SDimitry Andric make_heap(RandomAccessIterator first, RandomAccessIterator last); 13450b57cec5SDimitry Andric 13460b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare> 1347fe6060f1SDimitry Andric constexpr void // constexpr in C++20 13480b57cec5SDimitry Andric make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 13490b57cec5SDimitry Andric 13500b57cec5SDimitry Andrictemplate <class RandomAccessIterator> 1351fe6060f1SDimitry Andric constexpr void // constexpr in C++20 13520b57cec5SDimitry Andric sort_heap(RandomAccessIterator first, RandomAccessIterator last); 13530b57cec5SDimitry Andric 13540b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare> 1355fe6060f1SDimitry Andric constexpr void // constexpr in C++20 13560b57cec5SDimitry Andric sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 13570b57cec5SDimitry Andric 13580b57cec5SDimitry Andrictemplate <class RandomAccessIterator> 13590b57cec5SDimitry Andric constexpr bool // constexpr in C++20 13600b57cec5SDimitry Andric is_heap(RandomAccessIterator first, RandomAccessiterator last); 13610b57cec5SDimitry Andric 13620b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare> 13630b57cec5SDimitry Andric constexpr bool // constexpr in C++20 13640b57cec5SDimitry Andric is_heap(RandomAccessIterator first, RandomAccessiterator last, Compare comp); 13650b57cec5SDimitry Andric 13660b57cec5SDimitry Andrictemplate <class RandomAccessIterator> 13670b57cec5SDimitry Andric constexpr RandomAccessIterator // constexpr in C++20 13680b57cec5SDimitry Andric is_heap_until(RandomAccessIterator first, RandomAccessiterator last); 13690b57cec5SDimitry Andric 13700b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare> 13710b57cec5SDimitry Andric constexpr RandomAccessIterator // constexpr in C++20 13720b57cec5SDimitry Andric is_heap_until(RandomAccessIterator first, RandomAccessiterator last, Compare comp); 13730b57cec5SDimitry Andric 13740b57cec5SDimitry Andrictemplate <class ForwardIterator> 1375e8d8bef9SDimitry Andric constexpr ForwardIterator // constexpr in C++14 1376e8d8bef9SDimitry Andric min_element(ForwardIterator first, ForwardIterator last); 13770b57cec5SDimitry Andric 13780b57cec5SDimitry Andrictemplate <class ForwardIterator, class Compare> 1379e8d8bef9SDimitry Andric constexpr ForwardIterator // constexpr in C++14 1380e8d8bef9SDimitry Andric min_element(ForwardIterator first, ForwardIterator last, Compare comp); 13810b57cec5SDimitry Andric 13820b57cec5SDimitry Andrictemplate <class T> 1383e8d8bef9SDimitry Andric constexpr const T& // constexpr in C++14 1384e8d8bef9SDimitry Andric min(const T& a, const T& b); 13850b57cec5SDimitry Andric 13860b57cec5SDimitry Andrictemplate <class T, class Compare> 1387e8d8bef9SDimitry Andric constexpr const T& // constexpr in C++14 1388e8d8bef9SDimitry Andric min(const T& a, const T& b, Compare comp); 13890b57cec5SDimitry Andric 13900b57cec5SDimitry Andrictemplate<class T> 1391e8d8bef9SDimitry Andric constexpr T // constexpr in C++14 1392e8d8bef9SDimitry Andric min(initializer_list<T> t); 13930b57cec5SDimitry Andric 13940b57cec5SDimitry Andrictemplate<class T, class Compare> 1395e8d8bef9SDimitry Andric constexpr T // constexpr in C++14 1396e8d8bef9SDimitry Andric min(initializer_list<T> t, Compare comp); 13970b57cec5SDimitry Andric 13980b57cec5SDimitry Andrictemplate<class T> 13990b57cec5SDimitry Andric constexpr const T& clamp(const T& v, const T& lo, const T& hi); // C++17 14000b57cec5SDimitry Andric 14010b57cec5SDimitry Andrictemplate<class T, class Compare> 14020b57cec5SDimitry Andric constexpr const T& clamp(const T& v, const T& lo, const T& hi, Compare comp); // C++17 14030b57cec5SDimitry Andric 14040b57cec5SDimitry Andrictemplate <class ForwardIterator> 1405e8d8bef9SDimitry Andric constexpr ForwardIterator // constexpr in C++14 1406e8d8bef9SDimitry Andric max_element(ForwardIterator first, ForwardIterator last); 14070b57cec5SDimitry Andric 14080b57cec5SDimitry Andrictemplate <class ForwardIterator, class Compare> 1409e8d8bef9SDimitry Andric constexpr ForwardIterator // constexpr in C++14 1410e8d8bef9SDimitry Andric max_element(ForwardIterator first, ForwardIterator last, Compare comp); 14110b57cec5SDimitry Andric 14120b57cec5SDimitry Andrictemplate <class T> 1413e8d8bef9SDimitry Andric constexpr const T& // constexpr in C++14 1414e8d8bef9SDimitry Andric max(const T& a, const T& b); 14150b57cec5SDimitry Andric 14160b57cec5SDimitry Andrictemplate <class T, class Compare> 1417e8d8bef9SDimitry Andric constexpr const T& // constexpr in C++14 1418e8d8bef9SDimitry Andric max(const T& a, const T& b, Compare comp); 14190b57cec5SDimitry Andric 14200b57cec5SDimitry Andrictemplate<class T> 1421e8d8bef9SDimitry Andric constexpr T // constexpr in C++14 1422e8d8bef9SDimitry Andric max(initializer_list<T> t); 14230b57cec5SDimitry Andric 14240b57cec5SDimitry Andrictemplate<class T, class Compare> 1425e8d8bef9SDimitry Andric constexpr T // constexpr in C++14 1426e8d8bef9SDimitry Andric max(initializer_list<T> t, Compare comp); 14270b57cec5SDimitry Andric 14280b57cec5SDimitry Andrictemplate<class ForwardIterator> 1429e8d8bef9SDimitry Andric constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++14 1430e8d8bef9SDimitry Andric minmax_element(ForwardIterator first, ForwardIterator last); 14310b57cec5SDimitry Andric 14320b57cec5SDimitry Andrictemplate<class ForwardIterator, class Compare> 1433e8d8bef9SDimitry Andric constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++14 1434e8d8bef9SDimitry Andric minmax_element(ForwardIterator first, ForwardIterator last, Compare comp); 14350b57cec5SDimitry Andric 14360b57cec5SDimitry Andrictemplate<class T> 1437e8d8bef9SDimitry Andric constexpr pair<const T&, const T&> // constexpr in C++14 1438e8d8bef9SDimitry Andric minmax(const T& a, const T& b); 14390b57cec5SDimitry Andric 14400b57cec5SDimitry Andrictemplate<class T, class Compare> 1441e8d8bef9SDimitry Andric constexpr pair<const T&, const T&> // constexpr in C++14 1442e8d8bef9SDimitry Andric minmax(const T& a, const T& b, Compare comp); 14430b57cec5SDimitry Andric 14440b57cec5SDimitry Andrictemplate<class T> 1445e8d8bef9SDimitry Andric constexpr pair<T, T> // constexpr in C++14 1446e8d8bef9SDimitry Andric minmax(initializer_list<T> t); 14470b57cec5SDimitry Andric 14480b57cec5SDimitry Andrictemplate<class T, class Compare> 1449e8d8bef9SDimitry Andric constexpr pair<T, T> // constexpr in C++14 1450e8d8bef9SDimitry Andric minmax(initializer_list<T> t, Compare comp); 14510b57cec5SDimitry Andric 14520b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2> 14530b57cec5SDimitry Andric constexpr bool // constexpr in C++20 14540b57cec5SDimitry Andric lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2); 14550b57cec5SDimitry Andric 14560b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class Compare> 14570b57cec5SDimitry Andric constexpr bool // constexpr in C++20 14580b57cec5SDimitry Andric lexicographical_compare(InputIterator1 first1, InputIterator1 last1, 14590b57cec5SDimitry Andric InputIterator2 first2, InputIterator2 last2, Compare comp); 14600b57cec5SDimitry Andric 14610b57cec5SDimitry Andrictemplate <class BidirectionalIterator> 1462e8d8bef9SDimitry Andric constexpr bool // constexpr in C++20 14630b57cec5SDimitry Andric next_permutation(BidirectionalIterator first, BidirectionalIterator last); 14640b57cec5SDimitry Andric 14650b57cec5SDimitry Andrictemplate <class BidirectionalIterator, class Compare> 1466e8d8bef9SDimitry Andric constexpr bool // constexpr in C++20 14670b57cec5SDimitry Andric next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp); 14680b57cec5SDimitry Andric 14690b57cec5SDimitry Andrictemplate <class BidirectionalIterator> 1470e8d8bef9SDimitry Andric constexpr bool // constexpr in C++20 14710b57cec5SDimitry Andric prev_permutation(BidirectionalIterator first, BidirectionalIterator last); 14720b57cec5SDimitry Andric 14730b57cec5SDimitry Andrictemplate <class BidirectionalIterator, class Compare> 1474e8d8bef9SDimitry Andric constexpr bool // constexpr in C++20 14750b57cec5SDimitry Andric prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp); 14760b57cec5SDimitry Andric} // std 14770b57cec5SDimitry Andric 14780b57cec5SDimitry Andric*/ 14790b57cec5SDimitry Andric 148081ad6265SDimitry Andric#include <__assert> // all public C++ headers provide the assertion handler 148181ad6265SDimitry Andric#include <__bits> 14820b57cec5SDimitry Andric#include <__config> 1483fe6060f1SDimitry Andric#include <__debug> 1484fe6060f1SDimitry Andric#include <cstddef> 14850b57cec5SDimitry Andric#include <cstring> 1486fe6060f1SDimitry Andric#include <memory> 1487fe6060f1SDimitry Andric#include <type_traits> 14880b57cec5SDimitry Andric#include <version> 14890b57cec5SDimitry Andric 1490fe6060f1SDimitry Andric#include <__algorithm/adjacent_find.h> 1491fe6060f1SDimitry Andric#include <__algorithm/all_of.h> 1492fe6060f1SDimitry Andric#include <__algorithm/any_of.h> 1493fe6060f1SDimitry Andric#include <__algorithm/binary_search.h> 1494fe6060f1SDimitry Andric#include <__algorithm/clamp.h> 1495fe6060f1SDimitry Andric#include <__algorithm/comp.h> 1496fe6060f1SDimitry Andric#include <__algorithm/comp_ref_type.h> 1497fe6060f1SDimitry Andric#include <__algorithm/copy.h> 1498fe6060f1SDimitry Andric#include <__algorithm/copy_backward.h> 1499fe6060f1SDimitry Andric#include <__algorithm/copy_if.h> 1500fe6060f1SDimitry Andric#include <__algorithm/copy_n.h> 1501fe6060f1SDimitry Andric#include <__algorithm/count.h> 1502fe6060f1SDimitry Andric#include <__algorithm/count_if.h> 1503fe6060f1SDimitry Andric#include <__algorithm/equal.h> 1504fe6060f1SDimitry Andric#include <__algorithm/equal_range.h> 1505fe6060f1SDimitry Andric#include <__algorithm/fill.h> 150604eeddc0SDimitry Andric#include <__algorithm/fill_n.h> 1507fe6060f1SDimitry Andric#include <__algorithm/find.h> 1508fe6060f1SDimitry Andric#include <__algorithm/find_end.h> 1509fe6060f1SDimitry Andric#include <__algorithm/find_first_of.h> 1510fe6060f1SDimitry Andric#include <__algorithm/find_if.h> 1511fe6060f1SDimitry Andric#include <__algorithm/find_if_not.h> 1512fe6060f1SDimitry Andric#include <__algorithm/for_each.h> 1513fe6060f1SDimitry Andric#include <__algorithm/for_each_n.h> 1514fe6060f1SDimitry Andric#include <__algorithm/generate.h> 151504eeddc0SDimitry Andric#include <__algorithm/generate_n.h> 1516fe6060f1SDimitry Andric#include <__algorithm/half_positive.h> 151781ad6265SDimitry Andric#include <__algorithm/in_found_result.h> 151881ad6265SDimitry Andric#include <__algorithm/in_fun_result.h> 15191fd87a68SDimitry Andric#include <__algorithm/in_in_out_result.h> 152004eeddc0SDimitry Andric#include <__algorithm/in_in_result.h> 152181ad6265SDimitry Andric#include <__algorithm/in_out_out_result.h> 152204eeddc0SDimitry Andric#include <__algorithm/in_out_result.h> 1523fe6060f1SDimitry Andric#include <__algorithm/includes.h> 1524fe6060f1SDimitry Andric#include <__algorithm/inplace_merge.h> 1525fe6060f1SDimitry Andric#include <__algorithm/is_heap.h> 1526fe6060f1SDimitry Andric#include <__algorithm/is_heap_until.h> 1527fe6060f1SDimitry Andric#include <__algorithm/is_partitioned.h> 1528fe6060f1SDimitry Andric#include <__algorithm/is_permutation.h> 1529fe6060f1SDimitry Andric#include <__algorithm/is_sorted.h> 1530fe6060f1SDimitry Andric#include <__algorithm/is_sorted_until.h> 1531fe6060f1SDimitry Andric#include <__algorithm/iter_swap.h> 1532fe6060f1SDimitry Andric#include <__algorithm/lexicographical_compare.h> 1533fe6060f1SDimitry Andric#include <__algorithm/lower_bound.h> 1534fe6060f1SDimitry Andric#include <__algorithm/make_heap.h> 1535fe6060f1SDimitry Andric#include <__algorithm/max.h> 1536fe6060f1SDimitry Andric#include <__algorithm/max_element.h> 1537fe6060f1SDimitry Andric#include <__algorithm/merge.h> 1538fe6060f1SDimitry Andric#include <__algorithm/min.h> 1539fe6060f1SDimitry Andric#include <__algorithm/min_element.h> 154081ad6265SDimitry Andric#include <__algorithm/min_max_result.h> 1541fe6060f1SDimitry Andric#include <__algorithm/minmax.h> 1542fe6060f1SDimitry Andric#include <__algorithm/minmax_element.h> 1543fe6060f1SDimitry Andric#include <__algorithm/mismatch.h> 1544fe6060f1SDimitry Andric#include <__algorithm/move.h> 1545fe6060f1SDimitry Andric#include <__algorithm/move_backward.h> 1546fe6060f1SDimitry Andric#include <__algorithm/next_permutation.h> 1547fe6060f1SDimitry Andric#include <__algorithm/none_of.h> 1548fe6060f1SDimitry Andric#include <__algorithm/nth_element.h> 1549fe6060f1SDimitry Andric#include <__algorithm/partial_sort.h> 1550fe6060f1SDimitry Andric#include <__algorithm/partial_sort_copy.h> 1551fe6060f1SDimitry Andric#include <__algorithm/partition.h> 1552fe6060f1SDimitry Andric#include <__algorithm/partition_copy.h> 1553fe6060f1SDimitry Andric#include <__algorithm/partition_point.h> 1554fe6060f1SDimitry Andric#include <__algorithm/pop_heap.h> 1555fe6060f1SDimitry Andric#include <__algorithm/prev_permutation.h> 1556fe6060f1SDimitry Andric#include <__algorithm/push_heap.h> 155781ad6265SDimitry Andric#include <__algorithm/ranges_adjacent_find.h> 155881ad6265SDimitry Andric#include <__algorithm/ranges_all_of.h> 155981ad6265SDimitry Andric#include <__algorithm/ranges_any_of.h> 156081ad6265SDimitry Andric#include <__algorithm/ranges_binary_search.h> 156181ad6265SDimitry Andric#include <__algorithm/ranges_copy.h> 156281ad6265SDimitry Andric#include <__algorithm/ranges_copy_backward.h> 156381ad6265SDimitry Andric#include <__algorithm/ranges_copy_if.h> 156481ad6265SDimitry Andric#include <__algorithm/ranges_copy_n.h> 156581ad6265SDimitry Andric#include <__algorithm/ranges_count.h> 156681ad6265SDimitry Andric#include <__algorithm/ranges_count_if.h> 156781ad6265SDimitry Andric#include <__algorithm/ranges_equal.h> 1568*fcaf7f86SDimitry Andric#include <__algorithm/ranges_equal_range.h> 156981ad6265SDimitry Andric#include <__algorithm/ranges_fill.h> 157081ad6265SDimitry Andric#include <__algorithm/ranges_fill_n.h> 157181ad6265SDimitry Andric#include <__algorithm/ranges_find.h> 1572753f127fSDimitry Andric#include <__algorithm/ranges_find_end.h> 157381ad6265SDimitry Andric#include <__algorithm/ranges_find_first_of.h> 157481ad6265SDimitry Andric#include <__algorithm/ranges_find_if.h> 157581ad6265SDimitry Andric#include <__algorithm/ranges_find_if_not.h> 157681ad6265SDimitry Andric#include <__algorithm/ranges_for_each.h> 157781ad6265SDimitry Andric#include <__algorithm/ranges_for_each_n.h> 1578*fcaf7f86SDimitry Andric#include <__algorithm/ranges_includes.h> 157981ad6265SDimitry Andric#include <__algorithm/ranges_is_partitioned.h> 158081ad6265SDimitry Andric#include <__algorithm/ranges_is_sorted.h> 158181ad6265SDimitry Andric#include <__algorithm/ranges_is_sorted_until.h> 158281ad6265SDimitry Andric#include <__algorithm/ranges_lexicographical_compare.h> 158381ad6265SDimitry Andric#include <__algorithm/ranges_lower_bound.h> 1584753f127fSDimitry Andric#include <__algorithm/ranges_make_heap.h> 158581ad6265SDimitry Andric#include <__algorithm/ranges_max.h> 158681ad6265SDimitry Andric#include <__algorithm/ranges_max_element.h> 1587753f127fSDimitry Andric#include <__algorithm/ranges_merge.h> 158881ad6265SDimitry Andric#include <__algorithm/ranges_min.h> 158981ad6265SDimitry Andric#include <__algorithm/ranges_min_element.h> 159081ad6265SDimitry Andric#include <__algorithm/ranges_minmax.h> 159181ad6265SDimitry Andric#include <__algorithm/ranges_minmax_element.h> 159281ad6265SDimitry Andric#include <__algorithm/ranges_mismatch.h> 159381ad6265SDimitry Andric#include <__algorithm/ranges_move.h> 159481ad6265SDimitry Andric#include <__algorithm/ranges_move_backward.h> 159581ad6265SDimitry Andric#include <__algorithm/ranges_none_of.h> 1596753f127fSDimitry Andric#include <__algorithm/ranges_nth_element.h> 1597*fcaf7f86SDimitry Andric#include <__algorithm/ranges_partial_sort.h> 1598*fcaf7f86SDimitry Andric#include <__algorithm/ranges_partition.h> 1599*fcaf7f86SDimitry Andric#include <__algorithm/ranges_partition_copy.h> 1600*fcaf7f86SDimitry Andric#include <__algorithm/ranges_partition_point.h> 1601753f127fSDimitry Andric#include <__algorithm/ranges_pop_heap.h> 1602753f127fSDimitry Andric#include <__algorithm/ranges_push_heap.h> 1603753f127fSDimitry Andric#include <__algorithm/ranges_remove.h> 1604753f127fSDimitry Andric#include <__algorithm/ranges_remove_if.h> 160581ad6265SDimitry Andric#include <__algorithm/ranges_replace.h> 160681ad6265SDimitry Andric#include <__algorithm/ranges_replace_if.h> 160781ad6265SDimitry Andric#include <__algorithm/ranges_reverse.h> 1608753f127fSDimitry Andric#include <__algorithm/ranges_reverse_copy.h> 1609753f127fSDimitry Andric#include <__algorithm/ranges_rotate_copy.h> 1610753f127fSDimitry Andric#include <__algorithm/ranges_search.h> 1611753f127fSDimitry Andric#include <__algorithm/ranges_search_n.h> 1612753f127fSDimitry Andric#include <__algorithm/ranges_set_difference.h> 1613753f127fSDimitry Andric#include <__algorithm/ranges_set_intersection.h> 1614753f127fSDimitry Andric#include <__algorithm/ranges_set_symmetric_difference.h> 1615*fcaf7f86SDimitry Andric#include <__algorithm/ranges_set_union.h> 1616*fcaf7f86SDimitry Andric#include <__algorithm/ranges_shuffle.h> 161781ad6265SDimitry Andric#include <__algorithm/ranges_sort.h> 1618753f127fSDimitry Andric#include <__algorithm/ranges_sort_heap.h> 1619*fcaf7f86SDimitry Andric#include <__algorithm/ranges_stable_partition.h> 162081ad6265SDimitry Andric#include <__algorithm/ranges_stable_sort.h> 162181ad6265SDimitry Andric#include <__algorithm/ranges_swap_ranges.h> 162281ad6265SDimitry Andric#include <__algorithm/ranges_transform.h> 162381ad6265SDimitry Andric#include <__algorithm/ranges_upper_bound.h> 1624fe6060f1SDimitry Andric#include <__algorithm/remove.h> 1625fe6060f1SDimitry Andric#include <__algorithm/remove_copy.h> 1626fe6060f1SDimitry Andric#include <__algorithm/remove_copy_if.h> 1627fe6060f1SDimitry Andric#include <__algorithm/remove_if.h> 1628fe6060f1SDimitry Andric#include <__algorithm/replace.h> 1629fe6060f1SDimitry Andric#include <__algorithm/replace_copy.h> 1630fe6060f1SDimitry Andric#include <__algorithm/replace_copy_if.h> 1631fe6060f1SDimitry Andric#include <__algorithm/replace_if.h> 1632fe6060f1SDimitry Andric#include <__algorithm/reverse.h> 1633fe6060f1SDimitry Andric#include <__algorithm/reverse_copy.h> 1634fe6060f1SDimitry Andric#include <__algorithm/rotate.h> 1635fe6060f1SDimitry Andric#include <__algorithm/rotate_copy.h> 1636fe6060f1SDimitry Andric#include <__algorithm/sample.h> 1637fe6060f1SDimitry Andric#include <__algorithm/search.h> 1638fe6060f1SDimitry Andric#include <__algorithm/search_n.h> 1639fe6060f1SDimitry Andric#include <__algorithm/set_difference.h> 1640fe6060f1SDimitry Andric#include <__algorithm/set_intersection.h> 1641fe6060f1SDimitry Andric#include <__algorithm/set_symmetric_difference.h> 1642fe6060f1SDimitry Andric#include <__algorithm/set_union.h> 1643fe6060f1SDimitry Andric#include <__algorithm/shift_left.h> 1644fe6060f1SDimitry Andric#include <__algorithm/shift_right.h> 1645fe6060f1SDimitry Andric#include <__algorithm/shuffle.h> 1646fe6060f1SDimitry Andric#include <__algorithm/sift_down.h> 1647fe6060f1SDimitry Andric#include <__algorithm/sort.h> 1648fe6060f1SDimitry Andric#include <__algorithm/sort_heap.h> 1649fe6060f1SDimitry Andric#include <__algorithm/stable_partition.h> 1650fe6060f1SDimitry Andric#include <__algorithm/stable_sort.h> 1651fe6060f1SDimitry Andric#include <__algorithm/swap_ranges.h> 1652fe6060f1SDimitry Andric#include <__algorithm/transform.h> 1653fe6060f1SDimitry Andric#include <__algorithm/unique.h> 165404eeddc0SDimitry Andric#include <__algorithm/unique_copy.h> 1655fe6060f1SDimitry Andric#include <__algorithm/unwrap_iter.h> 1656fe6060f1SDimitry Andric#include <__algorithm/upper_bound.h> 16570b57cec5SDimitry Andric 165881ad6265SDimitry Andric#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES 165981ad6265SDimitry Andric# include <chrono> 166081ad6265SDimitry Andric# include <iterator> 166181ad6265SDimitry Andric# include <utility> 166281ad6265SDimitry Andric#endif 166381ad6265SDimitry Andric 166481ad6265SDimitry Andric// standard-mandated includes 166581ad6265SDimitry Andric#include <initializer_list> 166681ad6265SDimitry Andric 16670b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 16680b57cec5SDimitry Andric# pragma GCC system_header 16690b57cec5SDimitry Andric#endif 16700b57cec5SDimitry Andric 1671e40139ffSDimitry Andric#if defined(_LIBCPP_HAS_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17 1672e40139ffSDimitry Andric# include <__pstl_algorithm> 1673e40139ffSDimitry Andric#endif 1674e40139ffSDimitry Andric 16750b57cec5SDimitry Andric#endif // _LIBCPP_ALGORITHM 1676