xref: /openbsd-src/gnu/llvm/libcxx/include/algorithm (revision dc37c87a60a1e3d67c2ac5d5c5b9fc1e4af89632)
146035553Spatrick// -*- C++ -*-
2*dc37c87aSrobert//===----------------------------------------------------------------------===//
346035553Spatrick//
446035553Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
546035553Spatrick// See https://llvm.org/LICENSE.txt for license information.
646035553Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
746035553Spatrick//
846035553Spatrick//===----------------------------------------------------------------------===//
946035553Spatrick
1046035553Spatrick#ifndef _LIBCPP_ALGORITHM
1146035553Spatrick#define _LIBCPP_ALGORITHM
1246035553Spatrick
1346035553Spatrick/*
1446035553Spatrick    algorithm synopsis
1546035553Spatrick
1646035553Spatrick#include <initializer_list>
1746035553Spatrick
1846035553Spatricknamespace std
1946035553Spatrick{
2046035553Spatrick
21dcb03dacSrobertnamespace ranges {
22*dc37c87aSrobert
23*dc37c87aSrobert  // [algorithms.results], algorithm result types
24*dc37c87aSrobert  template <class I, class F>
25*dc37c87aSrobert    struct in_fun_result;     // since C++20
26*dc37c87aSrobert
27*dc37c87aSrobert  template <class I1, class I2>
28*dc37c87aSrobert    struct in_in_result;      // since C++20
29*dc37c87aSrobert
30*dc37c87aSrobert  template <class I, class O>
31*dc37c87aSrobert    struct in_out_result;  // since C++20
32*dc37c87aSrobert
33*dc37c87aSrobert  template <class I1, class I2, class O>
34*dc37c87aSrobert    struct in_in_out_result;  // since C++20
35*dc37c87aSrobert
36*dc37c87aSrobert  template <class I, class O1, class O2>
37*dc37c87aSrobert    struct in_out_out_result; // since C++20
38*dc37c87aSrobert
39*dc37c87aSrobert  template <class I1, class I2>
40*dc37c87aSrobert    struct min_max_result;    // since C++20
41*dc37c87aSrobert
42*dc37c87aSrobert  template <class I>
43*dc37c87aSrobert    struct in_found_result;   // since C++20
44*dc37c87aSrobert
45*dc37c87aSrobert  template<forward_iterator I, sentinel_for<I> S, class Proj = identity,
46*dc37c87aSrobert    indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less>             // since C++20
47*dc37c87aSrobert  constexpr I min_element(I first, S last, Comp comp = {}, Proj proj = {});
48*dc37c87aSrobert
49*dc37c87aSrobert  template<forward_range R, class Proj = identity,
50*dc37c87aSrobert    indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less> // since C++20
51*dc37c87aSrobert  constexpr borrowed_iterator_t<R> min_element(R&& r, Comp comp = {}, Proj proj = {});
52*dc37c87aSrobert
53*dc37c87aSrobert  template<forward_iterator I, sentinel_for<I> S, class Proj = identity,
54*dc37c87aSrobert    indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less>
55*dc37c87aSrobert  constexpr I ranges::max_element(I first, S last, Comp comp = {}, Proj proj = {});                        // since C++20
56*dc37c87aSrobert
57*dc37c87aSrobert  template<forward_range R, class Proj = identity,
58*dc37c87aSrobert    indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less>
59*dc37c87aSrobert  constexpr borrowed_iterator_t<R> ranges::max_element(R&& r, Comp comp = {}, Proj proj = {});             // since C++20
60*dc37c87aSrobert
61*dc37c87aSrobert  template<class I1, class I2>
62*dc37c87aSrobert    using mismatch_result = in_in_result<I1, I2>;
63*dc37c87aSrobert
64*dc37c87aSrobert  template <input_iterator I1, sentinel_for<_I1> S1, input_iterator I2, sentinel_for<_I2> S2,
65*dc37c87aSrobert          class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity>
66*dc37c87aSrobert    requires indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
67*dc37c87aSrobert  constexpr mismatch_result<_I1, _I2>
68*dc37c87aSrobert  mismatch()(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {}, Proj1 proj1 = {}, Proj2 proj2 = {}) // since C++20
69*dc37c87aSrobert
70*dc37c87aSrobert  template <input_range R1, input_range R2,
71*dc37c87aSrobert          class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity>
72*dc37c87aSrobert    requires indirectly_comparable<iterator_t<R1>, iterator_t<R2>, Pred, Proj1, Proj2>
73*dc37c87aSrobert  constexpr mismatch_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>>
74*dc37c87aSrobert  mismatch(R1&& r1, R2&& r2, Pred pred = {}, Proj1 proj1 = {}, Proj2 proj2 = {})                           // since C++20
75*dc37c87aSrobert
76dcb03dacSrobert    requires indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T*>
77dcb03dacSrobert    constexpr I find(I first, S last, const T& value, Proj proj = {});              // since C++20
78dcb03dacSrobert
79dcb03dacSrobert  template<input_range R, class T, class Proj = identity>
80dcb03dacSrobert    requires indirect_binary_predicate<ranges::equal_to, projected<iterator_t<R>, Proj>, const T*>
81dcb03dacSrobert    constexpr borrowed_iterator_t<R>
82dcb03dacSrobert      find(R&& r, const T& value, Proj proj = {});                                  // since C++20
83dcb03dacSrobert
84dcb03dacSrobert  template<input_iterator I, sentinel_for<I> S, class Proj = identity,
85dcb03dacSrobert           indirect_unary_predicate<projected<I, Proj>> Pred>
86dcb03dacSrobert    constexpr I find_if(I first, S last, Pred pred, Proj proj = {});                // since C++20
87dcb03dacSrobert
88dcb03dacSrobert  template<input_range R, class Proj = identity,
89dcb03dacSrobert           indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
90dcb03dacSrobert    constexpr borrowed_iterator_t<R>
91dcb03dacSrobert      find_if(R&& r, Pred pred, Proj proj = {});                                    // since C++20
92dcb03dacSrobert
93dcb03dacSrobert  template<input_iterator I, sentinel_for<I> S, class Proj = identity,
94dcb03dacSrobert           indirect_unary_predicate<projected<I, Proj>> Pred>
95dcb03dacSrobert    constexpr I find_if_not(I first, S last, Pred pred, Proj proj = {});            // since C++20
96dcb03dacSrobert
97dcb03dacSrobert  template<input_range R, class Proj = identity,
98dcb03dacSrobert           indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
99dcb03dacSrobert    constexpr borrowed_iterator_t<R>
100dcb03dacSrobert      find_if_not(R&& r, Pred pred, Proj proj = {});                                // since C++20
101*dc37c87aSrobert
102*dc37c87aSrobert  template<class T, class Proj = identity,
103*dc37c87aSrobert           indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less>
104*dc37c87aSrobert    constexpr const T& min(const T& a, const T& b, Comp comp = {}, Proj proj = {}); // since C++20
105*dc37c87aSrobert
106*dc37c87aSrobert  template<copyable T, class Proj = identity,
107*dc37c87aSrobert           indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less>
108*dc37c87aSrobert    constexpr T min(initializer_list<T> r, Comp comp = {}, Proj proj = {});         // since C++20
109*dc37c87aSrobert
110*dc37c87aSrobert template<input_range R, class Proj = identity,
111*dc37c87aSrobert          indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less>
112*dc37c87aSrobert   requires indirectly_copyable_storable<iterator_t<R>, range_value_t<R>*>
113*dc37c87aSrobert   constexpr range_value_t<R>
114*dc37c87aSrobert     min(R&& r, Comp comp = {}, Proj proj = {});                                    // since C++20
115*dc37c87aSrobert
116*dc37c87aSrobert  template<class T, class Proj = identity,
117*dc37c87aSrobert           indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less>
118*dc37c87aSrobert    constexpr const T& max(const T& a, const T& b, Comp comp = {}, Proj proj = {}); // since C++20
119*dc37c87aSrobert
120*dc37c87aSrobert  template<copyable T, class Proj = identity,
121*dc37c87aSrobert           indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less>
122*dc37c87aSrobert    constexpr T max(initializer_list<T> r, Comp comp = {}, Proj proj = {});         // since C++20
123*dc37c87aSrobert
124*dc37c87aSrobert  template<input_range R, class Proj = identity,
125*dc37c87aSrobert           indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less>
126*dc37c87aSrobert    requires indirectly_copyable_storable<iterator_t<R>, range_value_t<R>*>
127*dc37c87aSrobert    constexpr range_value_t<R>
128*dc37c87aSrobert      max(R&& r, Comp comp = {}, Proj proj = {});                                   // since C++20
129*dc37c87aSrobert
130*dc37c87aSrobert  template<class I, class O>
131*dc37c87aSrobert    using unary_transform_result = in_out_result<I, O>;                             // since C++20
132*dc37c87aSrobert
133*dc37c87aSrobert  template<class I1, class I2, class O>
134*dc37c87aSrobert    using binary_transform_result = in_in_out_result<I1, I2, O>;                    // since C++20
135*dc37c87aSrobert
136*dc37c87aSrobert  template<input_iterator I, sentinel_for<I> S, weakly_incrementable O,
137*dc37c87aSrobert           copy_constructible F, class Proj = identity>
138*dc37c87aSrobert    requires indirectly_writable<O, indirect_result_t<F&, projected<I, Proj>>>
139*dc37c87aSrobert    constexpr ranges::unary_transform_result<I, O>
140*dc37c87aSrobert      transform(I first1, S last1, O result, F op, Proj proj = {});                 // since C++20
141*dc37c87aSrobert
142*dc37c87aSrobert  template<input_range R, weakly_incrementable O, copy_constructible F,
143*dc37c87aSrobert           class Proj = identity>
144*dc37c87aSrobert    requires indirectly_writable<O, indirect_result_t<F&, projected<iterator_t<R>, Proj>>>
145*dc37c87aSrobert    constexpr ranges::unary_transform_result<borrowed_iterator_t<R>, O>
146*dc37c87aSrobert      transform(R&& r, O result, F op, Proj proj = {});                             // since C++20
147*dc37c87aSrobert
148*dc37c87aSrobert  template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2,
149*dc37c87aSrobert           weakly_incrementable O, copy_constructible F, class Proj1 = identity,
150*dc37c87aSrobert           class Proj2 = identity>
151*dc37c87aSrobert    requires indirectly_writable<O, indirect_result_t<F&, projected<I1, Proj1>,
152*dc37c87aSrobert                                           projected<I2, Proj2>>>
153*dc37c87aSrobert    constexpr ranges::binary_transform_result<I1, I2, O>
154*dc37c87aSrobert      transform(I1 first1, S1 last1, I2 first2, S2 last2, O result,
155*dc37c87aSrobert                        F binary_op, Proj1 proj1 = {}, Proj2 proj2 = {});           // since C++20
156*dc37c87aSrobert
157*dc37c87aSrobert  template<input_range R1, input_range R2, weakly_incrementable O,
158*dc37c87aSrobert           copy_constructible F, class Proj1 = identity, class Proj2 = identity>
159*dc37c87aSrobert    requires indirectly_writable<O, indirect_result_t<F&, projected<iterator_t<R1>, Proj1>,
160*dc37c87aSrobert                                           projected<iterator_t<R2>, Proj2>>>
161*dc37c87aSrobert    constexpr ranges::binary_transform_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>, O>
162*dc37c87aSrobert      transform(R1&& r1, R2&& r2, O result,
163*dc37c87aSrobert                        F binary_op, Proj1 proj1 = {}, Proj2 proj2 = {});           // since C++20
164*dc37c87aSrobert
165*dc37c87aSrobert  template<input_iterator I, sentinel_for<I> S, class T, class Proj = identity>
166*dc37c87aSrobert    requires indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T*>
167*dc37c87aSrobert    constexpr iter_difference_t<I>
168*dc37c87aSrobert      count(I first, S last, const T& value, Proj proj = {});                       // since C++20
169*dc37c87aSrobert
170*dc37c87aSrobert  template<input_range R, class T, class Proj = identity>
171*dc37c87aSrobert    requires indirect_binary_predicate<ranges::equal_to, projected<iterator_t<R>, Proj>, const T*>
172*dc37c87aSrobert    constexpr range_difference_t<R>
173*dc37c87aSrobert      count(R&& r, const T& value, Proj proj = {});                                 // since C++20
174*dc37c87aSrobert
175*dc37c87aSrobert  template<input_iterator I, sentinel_for<I> S, class Proj = identity,
176*dc37c87aSrobert           indirect_unary_predicate<projected<I, Proj>> Pred>
177*dc37c87aSrobert    constexpr iter_difference_t<I>
178*dc37c87aSrobert      count_if(I first, S last, Pred pred, Proj proj = {});                         // since C++20
179*dc37c87aSrobert
180*dc37c87aSrobert  template<input_range R, class Proj = identity,
181*dc37c87aSrobert           indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
182*dc37c87aSrobert    constexpr range_difference_t<R>
183*dc37c87aSrobert      count_if(R&& r, Pred pred, Proj proj = {});                                   // since C++20
184*dc37c87aSrobert
185*dc37c87aSrobert  template<class T>
186*dc37c87aSrobert  using minmax_result = min_max_result<T>;
187*dc37c87aSrobert
188*dc37c87aSrobert  template<class T, class Proj = identity,
189*dc37c87aSrobert           indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less>
190*dc37c87aSrobert    constexpr ranges::minmax_result<const T&>
191*dc37c87aSrobert      minmax(const T& a, const T& b, Comp comp = {}, Proj proj = {});                     // since C++20
192*dc37c87aSrobert
193*dc37c87aSrobert  template<copyable T, class Proj = identity,
194*dc37c87aSrobert           indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less>
195*dc37c87aSrobert    constexpr ranges::minmax_result<T>
196*dc37c87aSrobert      minmax(initializer_list<T> r, Comp comp = {}, Proj proj = {});                      // since C++20
197*dc37c87aSrobert
198*dc37c87aSrobert  template<input_range R, class Proj = identity,
199*dc37c87aSrobert           indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less>
200*dc37c87aSrobert    requires indirectly_copyable_storable<iterator_t<R>, range_value_t<R>*>
201*dc37c87aSrobert    constexpr ranges::minmax_result<range_value_t<R>>
202*dc37c87aSrobert      minmax(R&& r, Comp comp = {}, Proj proj = {});                                      // since C++20
203*dc37c87aSrobert
204*dc37c87aSrobert  template<class I>
205*dc37c87aSrobert  using minmax_element_result = min_max_result<I>;
206*dc37c87aSrobert
207*dc37c87aSrobert  template<forward_iterator I, sentinel_for<I> S, class Proj = identity,
208*dc37c87aSrobert           indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less>
209*dc37c87aSrobert    constexpr ranges::minmax_element_result<I>
210*dc37c87aSrobert      minmax_element(I first, S last, Comp comp = {}, Proj proj = {});                    // since C++20
211*dc37c87aSrobert
212*dc37c87aSrobert  template<forward_range R, class Proj = identity,
213*dc37c87aSrobert           indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less>
214*dc37c87aSrobert    constexpr ranges::minmax_element_result<borrowed_iterator_t<R>>
215*dc37c87aSrobert      minmax_element(R&& r, Comp comp = {}, Proj proj = {});                              // since C++20
216*dc37c87aSrobert
217*dc37c87aSrobert  template<class I, class O>
218*dc37c87aSrobert    using copy_result = in_out_result<I, O>;                                              // since C++20
219*dc37c87aSrobert
220*dc37c87aSrobert  template<class I, class O>
221*dc37c87aSrobert    using copy_n_result = in_out_result<I, O>;                                            // since C++20
222*dc37c87aSrobert
223*dc37c87aSrobert  template<class I, class O>
224*dc37c87aSrobert    using copy_if_result = in_out_result<I, O>;                                             // since C++20
225*dc37c87aSrobert
226*dc37c87aSrobert  template<class I1, class I2>
227*dc37c87aSrobert    using copy_backward_result = in_out_result<I1, I2>;                                     // since C++20
228*dc37c87aSrobert
229*dc37c87aSrobert  template<input_iterator I, sentinel_for<I> S, weakly_incrementable O>
230*dc37c87aSrobert    requires indirectly_copyable<I, O>
231*dc37c87aSrobert    constexpr ranges::copy_result<I, O> ranges::copy(I first, S last, O result);            // since C++20
232*dc37c87aSrobert
233*dc37c87aSrobert  template<input_range R, weakly_incrementable O>
234*dc37c87aSrobert    requires indirectly_copyable<iterator_t<R>, O>
235*dc37c87aSrobert    constexpr ranges::copy_result<borrowed_iterator_t<R>, O> ranges::copy(R&& r, O result); // since C++20
236*dc37c87aSrobert
237*dc37c87aSrobert  template<input_iterator I, weakly_incrementable O>
238*dc37c87aSrobert    requires indirectly_copyable<I, O>
239*dc37c87aSrobert    constexpr ranges::copy_n_result<I, O>
240*dc37c87aSrobert      ranges::copy_n(I first, iter_difference_t<I> n, O result);                            // since C++20
241*dc37c87aSrobert
242*dc37c87aSrobert  template<input_iterator I, sentinel_for<I> S, weakly_incrementable O, class Proj = identity,
243*dc37c87aSrobert           indirect_unary_predicate<projected<I, Proj>> Pred>
244*dc37c87aSrobert    requires indirectly_copyable<I, O>
245*dc37c87aSrobert    constexpr ranges::copy_if_result<I, O>
246*dc37c87aSrobert      ranges::copy_if(I first, S last, O result, Pred pred, Proj proj = {});                // since C++20
247*dc37c87aSrobert
248*dc37c87aSrobert  template<input_range R, weakly_incrementable O, class Proj = identity,
249*dc37c87aSrobert           indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
250*dc37c87aSrobert    requires indirectly_copyable<iterator_t<R>, O>
251*dc37c87aSrobert    constexpr ranges::copy_if_result<borrowed_iterator_t<R>, O>
252*dc37c87aSrobert      ranges::copy_if(R&& r, O result, Pred pred, Proj proj = {});                          // since C++20
253*dc37c87aSrobert
254*dc37c87aSrobert  template<bidirectional_iterator I1, sentinel_for<I1> S1, bidirectional_iterator I2>
255*dc37c87aSrobert    requires indirectly_copyable<I1, I2>
256*dc37c87aSrobert    constexpr ranges::copy_backward_result<I1, I2>
257*dc37c87aSrobert      ranges::copy_backward(I1 first, S1 last, I2 result);                                  // since C++20
258*dc37c87aSrobert
259*dc37c87aSrobert  template<bidirectional_range R, bidirectional_iterator I>
260*dc37c87aSrobert    requires indirectly_copyable<iterator_t<R>, I>
261*dc37c87aSrobert    constexpr ranges::copy_backward_result<borrowed_iterator_t<R>, I>
262*dc37c87aSrobert      ranges::copy_backward(R&& r, I result);                                               // since C++20
263*dc37c87aSrobert
264*dc37c87aSrobert  template<class I, class F>
265*dc37c87aSrobert    using for_each_result = in_fun_result<I, F>;                                            // since C++20
266*dc37c87aSrobert
267*dc37c87aSrobert  template<input_iterator I, sentinel_for<I> S, class Proj = identity,
268*dc37c87aSrobert           indirectly_unary_invocable<projected<I, Proj>> Fun>
269*dc37c87aSrobert    constexpr ranges::for_each_result<I, Fun>
270*dc37c87aSrobert      ranges::for_each(I first, S last, Fun f, Proj proj = {});                             // since C++20
271*dc37c87aSrobert
272*dc37c87aSrobert  template<input_range R, class Proj = identity,
273*dc37c87aSrobert           indirectly_unary_invocable<projected<iterator_t<R>, Proj>> Fun>
274*dc37c87aSrobert    constexpr ranges::for_each_result<borrowed_iterator_t<R>, Fun>
275*dc37c87aSrobert      ranges::for_each(R&& r, Fun f, Proj proj = {});                                       // since C++20
276*dc37c87aSrobert
277*dc37c87aSrobert  template<input_iterator I, class Proj = identity,
278*dc37c87aSrobert           indirectly_unary_invocable<projected<I, Proj>> Fun>
279*dc37c87aSrobert    constexpr ranges::for_each_n_result<I, Fun>
280*dc37c87aSrobert      ranges::for_each_n(I first, iter_difference_t<I> n, Fun f, Proj proj = {});           // since C++20
281*dc37c87aSrobert
282*dc37c87aSrobert  template<input_iterator I, sentinel_for<I> S, class Proj = identity,
283*dc37c87aSrobert           indirect_unary_predicate<projected<I, Proj>> Pred>
284*dc37c87aSrobert    constexpr bool ranges::is_partitioned(I first, S last, Pred pred, Proj proj = {});      // since C++20
285*dc37c87aSrobert
286*dc37c87aSrobert  template<input_range R, class Proj = identity,
287*dc37c87aSrobert           indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
288*dc37c87aSrobert    constexpr bool ranges::is_partitioned(R&& r, Pred pred, Proj proj = {});                // since C++20
289*dc37c87aSrobert
290*dc37c87aSrobert  template<random_access_iterator I, sentinel_for<I> S, class Comp = ranges::less,
291*dc37c87aSrobert          class Proj = identity>
292*dc37c87aSrobert    requires sortable<I, Comp, Proj>
293*dc37c87aSrobert    constexpr I
294*dc37c87aSrobert      ranges::push_heap(I first, S last, Comp comp = {}, Proj proj = {});                   // since C++20
295*dc37c87aSrobert
296*dc37c87aSrobert  template<random_access_range R, class Comp = ranges::less, class Proj = identity>
297*dc37c87aSrobert    requires sortable<iterator_t<R>, Comp, Proj>
298*dc37c87aSrobert    constexpr borrowed_iterator_t<R>
299*dc37c87aSrobert      ranges::push_heap(R&& r, Comp comp = {}, Proj proj = {});                             // since C++20
300*dc37c87aSrobert
301*dc37c87aSrobert  template<random_access_iterator I, sentinel_for<I> S, class Comp = ranges::less,
302*dc37c87aSrobert          class Proj = identity>
303*dc37c87aSrobert    requires sortable<I, Comp, Proj>
304*dc37c87aSrobert    constexpr I
305*dc37c87aSrobert      ranges::pop_heap(I first, S last, Comp comp = {}, Proj proj = {});                    // since C++20
306*dc37c87aSrobert
307*dc37c87aSrobert  template<random_access_range R, class Comp = ranges::less, class Proj = identity>
308*dc37c87aSrobert    requires sortable<iterator_t<R>, Comp, Proj>
309*dc37c87aSrobert    constexpr borrowed_iterator_t<R>
310*dc37c87aSrobert      ranges::pop_heap(R&& r, Comp comp = {}, Proj proj = {});                              // since C++20
311*dc37c87aSrobert
312*dc37c87aSrobert  template<random_access_iterator I, sentinel_for<I> S, class Comp = ranges::less,
313*dc37c87aSrobert          class Proj = identity>
314*dc37c87aSrobert    requires sortable<I, Comp, Proj>
315*dc37c87aSrobert    constexpr I
316*dc37c87aSrobert      ranges::make_heap(I first, S last, Comp comp = {}, Proj proj = {});                   // since C++20
317*dc37c87aSrobert
318*dc37c87aSrobert  template<random_access_range R, class Comp = ranges::less, class Proj = identity>
319*dc37c87aSrobert    requires sortable<iterator_t<R>, Comp, Proj>
320*dc37c87aSrobert    constexpr borrowed_iterator_t<R>
321*dc37c87aSrobert      ranges::make_heap(R&& r, Comp comp = {}, Proj proj = {});                             // since C++20
322*dc37c87aSrobert
323*dc37c87aSrobert  template<random_access_iterator I, sentinel_for<I> S, class Comp = ranges::less,
324*dc37c87aSrobert          class Proj = identity>
325*dc37c87aSrobert    requires sortable<I, Comp, Proj>
326*dc37c87aSrobert    constexpr I
327*dc37c87aSrobert      ranges::sort_heap(I first, S last, Comp comp = {}, Proj proj = {});                   // since C++20
328*dc37c87aSrobert
329*dc37c87aSrobert  template<random_access_range R, class Comp = ranges::less, class Proj = identity>
330*dc37c87aSrobert    requires sortable<iterator_t<R>, Comp, Proj>
331*dc37c87aSrobert    constexpr borrowed_iterator_t<R>
332*dc37c87aSrobert      ranges::sort_heap(R&& r, Comp comp = {}, Proj proj = {});                             // since C++20
333*dc37c87aSrobert
334*dc37c87aSrobert  template<random_access_iterator I, sentinel_for<I> S, class Proj = identity,
335*dc37c87aSrobert            indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less>
336*dc37c87aSrobert    constexpr bool is_heap(I first, S last, Comp comp = {}, Proj proj = {});                // Since C++20
337*dc37c87aSrobert
338*dc37c87aSrobert  template<random_access_range R, class Proj = identity,
339*dc37c87aSrobert            indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less>
340*dc37c87aSrobert    constexpr bool is_heap(R&& r, Comp comp = {}, Proj proj = {});                          // Since C++20
341*dc37c87aSrobert
342*dc37c87aSrobert  template<random_access_iterator I, sentinel_for<I> S, class Proj = identity,
343*dc37c87aSrobert           indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less>
344*dc37c87aSrobert    constexpr I is_heap_until(I first, S last, Comp comp = {}, Proj proj = {});             // Since C++20
345*dc37c87aSrobert
346*dc37c87aSrobert  template<random_access_range R, class Proj = identity,
347*dc37c87aSrobert           indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less>
348*dc37c87aSrobert    constexpr borrowed_iterator_t<R>
349*dc37c87aSrobert      is_heap_until(R&& r, Comp comp = {}, Proj proj = {});                                 // Since C++20
350*dc37c87aSrobert
351*dc37c87aSrobert  template<bidirectional_iterator I, sentinel_for<I> S>
352*dc37c87aSrobert    requires permutable<I>
353*dc37c87aSrobert    constexpr I ranges::reverse(I first, S last);                                           // since C++20
354*dc37c87aSrobert
355*dc37c87aSrobert  template<bidirectional_range R>
356*dc37c87aSrobert    requires permutable<iterator_t<R>>
357*dc37c87aSrobert    constexpr borrowed_iterator_t<R> ranges::reverse(R&& r);                                // since C++20
358*dc37c87aSrobert
359*dc37c87aSrobert  template<random_access_iterator I, sentinel_for<I> S, class Comp = ranges::less,
360*dc37c87aSrobert            class Proj = identity>
361*dc37c87aSrobert    requires sortable<I, Comp, Proj>
362*dc37c87aSrobert    constexpr I
363*dc37c87aSrobert      ranges::sort(I first, S last, Comp comp = {}, Proj proj = {});                        // since C++20
364*dc37c87aSrobert
365*dc37c87aSrobert  template<random_access_range R, class Comp = ranges::less, class Proj = identity>
366*dc37c87aSrobert    requires sortable<iterator_t<R>, Comp, Proj>
367*dc37c87aSrobert    constexpr borrowed_iterator_t<R>
368*dc37c87aSrobert      ranges::sort(R&& r, Comp comp = {}, Proj proj = {});                                  // since C++20
369*dc37c87aSrobert
370*dc37c87aSrobert  template<random_access_iterator I, sentinel_for<I> S, class Comp = ranges::less,
371*dc37c87aSrobert          class Proj = identity>
372*dc37c87aSrobert    requires sortable<I, Comp, Proj>
373*dc37c87aSrobert    I ranges::stable_sort(I first, S last, Comp comp = {}, Proj proj = {});                 // since C++20
374*dc37c87aSrobert
375*dc37c87aSrobert  template<random_access_range R, class Comp = ranges::less, class Proj = identity>
376*dc37c87aSrobert    requires sortable<iterator_t<R>, Comp, Proj>
377*dc37c87aSrobert    borrowed_iterator_t<R>
378*dc37c87aSrobert      ranges::stable_sort(R&& r, Comp comp = {}, Proj proj = {});                           // since C++20
379*dc37c87aSrobert
380*dc37c87aSrobert  template<random_access_iterator I, sentinel_for<I> S, class Comp = ranges::less,
381*dc37c87aSrobert           class Proj = identity>
382*dc37c87aSrobert    requires sortable<I, Comp, Proj>
383*dc37c87aSrobert    constexpr I
384*dc37c87aSrobert      ranges::partial_sort(I first, I middle, S last, Comp comp = {}, Proj proj = {});      // since C++20
385*dc37c87aSrobert
386*dc37c87aSrobert  template<random_access_range R, class Comp = ranges::less, class Proj = identity>
387*dc37c87aSrobert    requires sortable<iterator_t<R>, Comp, Proj>
388*dc37c87aSrobert    constexpr borrowed_iterator_t<R>
389*dc37c87aSrobert      ranges::partial_sort(R&& r, iterator_t<R> middle, Comp comp = {}, Proj proj = {});    // since C++20
390*dc37c87aSrobert
391*dc37c87aSrobert  template<class T, output_iterator<const T&> O, sentinel_for<O> S>
392*dc37c87aSrobert    constexpr O ranges::fill(O first, S last, const T& value);                              // since C++20
393*dc37c87aSrobert
394*dc37c87aSrobert  template<class T, output_range<const T&> R>
395*dc37c87aSrobert    constexpr borrowed_iterator_t<R> ranges::fill(R&& r, const T& value);                   // since C++20
396*dc37c87aSrobert
397*dc37c87aSrobert  template<class T, output_iterator<const T&> O>
398*dc37c87aSrobert    constexpr O ranges::fill_n(O first, iter_difference_t<O> n, const T& value);            // since C++20
399*dc37c87aSrobert
400*dc37c87aSrobert  template<input_or_output_iterator O, sentinel_for<O> S, copy_constructible F>
401*dc37c87aSrobert    requires invocable<F&> && indirectly_writable<O, invoke_result_t<F&>>
402*dc37c87aSrobert    constexpr O generate(O first, S last, F gen);                                           // Since C++20
403*dc37c87aSrobert
404*dc37c87aSrobert  template<class R, copy_constructible F>
405*dc37c87aSrobert    requires invocable<F&> && output_range<R, invoke_result_t<F&>>
406*dc37c87aSrobert    constexpr borrowed_iterator_t<R> generate(R&& r, F gen);                                // Since C++20
407*dc37c87aSrobert
408*dc37c87aSrobert  template<input_or_output_iterator O, copy_constructible F>
409*dc37c87aSrobert    requires invocable<F&> && indirectly_writable<O, invoke_result_t<F&>>
410*dc37c87aSrobert    constexpr O generate_n(O first, iter_difference_t<O> n, F gen);                         // Since C++20
411*dc37c87aSrobert
412*dc37c87aSrobert template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2,
413*dc37c87aSrobert          class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity>
414*dc37c87aSrobert   requires indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
415*dc37c87aSrobert   constexpr bool ranges::equal(I1 first1, S1 last1, I2 first2, S2 last2,
416*dc37c87aSrobert                                Pred pred = {},
417*dc37c87aSrobert                                Proj1 proj1 = {}, Proj2 proj2 = {});                        // since C++20
418*dc37c87aSrobert
419*dc37c87aSrobert template<input_range R1, input_range R2, class Pred = ranges::equal_to,
420*dc37c87aSrobert          class Proj1 = identity, class Proj2 = identity>
421*dc37c87aSrobert   requires indirectly_comparable<iterator_t<R1>, iterator_t<R2>, Pred, Proj1, Proj2>
422*dc37c87aSrobert   constexpr bool ranges::equal(R1&& r1, R2&& r2, Pred pred = {},
423*dc37c87aSrobert                                Proj1 proj1 = {}, Proj2 proj2 = {});                        // since C++20
424*dc37c87aSrobert
425*dc37c87aSrobert  template<input_iterator I, sentinel_for<I> S, class Proj = identity,
426*dc37c87aSrobert           indirect_unary_predicate<projected<I, Proj>> Pred>
427*dc37c87aSrobert    constexpr bool ranges::all_of(I first, S last, Pred pred, Proj proj = {});      // since C++20
428*dc37c87aSrobert
429*dc37c87aSrobert  template<input_range R, class Proj = identity,
430*dc37c87aSrobert           indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
431*dc37c87aSrobert    constexpr bool ranges::all_of(R&& r, Pred pred, Proj proj = {});                // since C++20
432*dc37c87aSrobert
433*dc37c87aSrobert  template<input_iterator I, sentinel_for<I> S, class Proj = identity,
434*dc37c87aSrobert           indirect_unary_predicate<projected<I, Proj>> Pred>
435*dc37c87aSrobert    constexpr bool ranges::any_of(I first, S last, Pred pred, Proj proj = {});      // since C++20
436*dc37c87aSrobert
437*dc37c87aSrobert  template<input_range R, class Proj = identity,
438*dc37c87aSrobert           indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
439*dc37c87aSrobert    constexpr bool ranges::any_of(R&& r, Pred pred, Proj proj = {});                // since C++20
440*dc37c87aSrobert
441*dc37c87aSrobert  template<input_iterator I, sentinel_for<I> S, class Proj = identity,
442*dc37c87aSrobert           indirect_unary_predicate<projected<I, Proj>> Pred>
443*dc37c87aSrobert    constexpr bool ranges::none_of(I first, S last, Pred pred, Proj proj = {});     // since C++20
444*dc37c87aSrobert
445*dc37c87aSrobert  template<input_range R, class Proj = identity,
446*dc37c87aSrobert           indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
447*dc37c87aSrobert    constexpr bool ranges::none_of(R&& r, Pred pred, Proj proj = {});               // since C++20
448*dc37c87aSrobert
449*dc37c87aSrobert  template<input_iterator I1, sentinel_for<I1> S1,
450*dc37c87aSrobert          random_access_iterator I2, sentinel_for<I2> S2,
451*dc37c87aSrobert          class Comp = ranges::less, class Proj1 = identity, class Proj2 = identity>
452*dc37c87aSrobert    requires indirectly_copyable<I1, I2> && sortable<I2, Comp, Proj2> &&
453*dc37c87aSrobert            indirect_strict_weak_order<Comp, projected<I1, Proj1>, projected<I2, Proj2>>
454*dc37c87aSrobert    constexpr partial_sort_copy_result<I1, I2>
455*dc37c87aSrobert      partial_sort_copy(I1 first, S1 last, I2 result_first, S2 result_last,
456*dc37c87aSrobert                        Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {});        // Since C++20
457*dc37c87aSrobert
458*dc37c87aSrobert  template<input_range R1, random_access_range R2, class Comp = ranges::less,
459*dc37c87aSrobert          class Proj1 = identity, class Proj2 = identity>
460*dc37c87aSrobert    requires indirectly_copyable<iterator_t<R1>, iterator_t<R2>> &&
461*dc37c87aSrobert            sortable<iterator_t<R2>, Comp, Proj2> &&
462*dc37c87aSrobert            indirect_strict_weak_order<Comp, projected<iterator_t<R1>, Proj1>,
463*dc37c87aSrobert                                        projected<iterator_t<R2>, Proj2>>
464*dc37c87aSrobert    constexpr partial_sort_copy_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>>
465*dc37c87aSrobert      partial_sort_copy(R1&& r, R2&& result_r, Comp comp = {},
466*dc37c87aSrobert                        Proj1 proj1 = {}, Proj2 proj2 = {});                        // Since C++20
467*dc37c87aSrobert
468*dc37c87aSrobert  template<forward_iterator I, sentinel_for<I> S, class Proj = identity,
469*dc37c87aSrobert           indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less>
470*dc37c87aSrobert    constexpr bool ranges::is_sorted(I first, S last, Comp comp = {}, Proj proj = {});      // since C++20
471*dc37c87aSrobert
472*dc37c87aSrobert  template<forward_range R, class Proj = identity,
473*dc37c87aSrobert           indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less>
474*dc37c87aSrobert    constexpr bool ranges::is_sorted(R&& r, Comp comp = {}, Proj proj = {});                // since C++20
475*dc37c87aSrobert
476*dc37c87aSrobert  template<forward_iterator I, sentinel_for<I> S, class Proj = identity,
477*dc37c87aSrobert           indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less>
478*dc37c87aSrobert    constexpr I ranges::is_sorted_until(I first, S last, Comp comp = {}, Proj proj = {});   // since C++20
479*dc37c87aSrobert
480*dc37c87aSrobert  template<forward_range R, class Proj = identity,
481*dc37c87aSrobert           indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less>
482*dc37c87aSrobert    constexpr borrowed_iterator_t<R>
483*dc37c87aSrobert      ranges::is_sorted_until(R&& r, Comp comp = {}, Proj proj = {});                       // since C++20
484*dc37c87aSrobert
485*dc37c87aSrobert  template<random_access_iterator I, sentinel_for<I> S, class Comp = ranges::less,
486*dc37c87aSrobert          class Proj = identity>
487*dc37c87aSrobert    requires sortable<I, Comp, Proj>
488*dc37c87aSrobert    constexpr I
489*dc37c87aSrobert      ranges::nth_element(I first, I nth, S last, Comp comp = {}, Proj proj = {});            // since C++20
490*dc37c87aSrobert
491*dc37c87aSrobert  template<random_access_range R, class Comp = ranges::less, class Proj = identity>
492*dc37c87aSrobert    requires sortable<iterator_t<R>, Comp, Proj>
493*dc37c87aSrobert    constexpr borrowed_iterator_t<R>
494*dc37c87aSrobert      ranges::nth_element(R&& r, iterator_t<R> nth, Comp comp = {}, Proj proj = {});          // since C++20
495*dc37c87aSrobert
496*dc37c87aSrobert  template<forward_iterator I, sentinel_for<I> S, class T, class Proj = identity,
497*dc37c87aSrobert           indirect_strict_weak_order<const T*, projected<I, Proj>> Comp = ranges::less>
498*dc37c87aSrobert    constexpr I upper_bound(I first, S last, const T& value, Comp comp = {}, Proj proj = {}); // since C++20
499*dc37c87aSrobert
500*dc37c87aSrobert  template<forward_range R, class T, class Proj = identity,
501*dc37c87aSrobert           indirect_strict_weak_order<const T*, projected<iterator_t<R>, Proj>> Comp =
502*dc37c87aSrobert             ranges::less>
503*dc37c87aSrobert    constexpr borrowed_iterator_t<R>
504*dc37c87aSrobert      upper_bound(R&& r, const T& value, Comp comp = {}, Proj proj = {});                     // since C++20
505*dc37c87aSrobert
506*dc37c87aSrobert  template<forward_iterator I, sentinel_for<I> S, class T, class Proj = identity,
507*dc37c87aSrobert           indirect_strict_weak_order<const T*, projected<I, Proj>> Comp = ranges::less>
508*dc37c87aSrobert    constexpr I lower_bound(I first, S last, const T& value, Comp comp = {},
509*dc37c87aSrobert                                    Proj proj = {});                                          // since C++20
510*dc37c87aSrobert  template<forward_range R, class T, class Proj = identity,
511*dc37c87aSrobert           indirect_strict_weak_order<const T*, projected<iterator_t<R>, Proj>> Comp =
512*dc37c87aSrobert             ranges::less>
513*dc37c87aSrobert    constexpr borrowed_iterator_t<R>
514*dc37c87aSrobert      lower_bound(R&& r, const T& value, Comp comp = {}, Proj proj = {});                     // since C++20
515*dc37c87aSrobert
516*dc37c87aSrobert  template<forward_iterator I, sentinel_for<I> S, class T, class Proj = identity,
517*dc37c87aSrobert           indirect_strict_weak_order<const T*, projected<I, Proj>> Comp = ranges::less>
518*dc37c87aSrobert    constexpr bool binary_search(I first, S last, const T& value, Comp comp = {},
519*dc37c87aSrobert                                         Proj proj = {});                                     // since C++20
520*dc37c87aSrobert
521*dc37c87aSrobert  template<forward_range R, class T, class Proj = identity,
522*dc37c87aSrobert           indirect_strict_weak_order<const T*, projected<iterator_t<R>, Proj>> Comp =
523*dc37c87aSrobert             ranges::less>
524*dc37c87aSrobert    constexpr bool binary_search(R&& r, const T& value, Comp comp = {},
525*dc37c87aSrobert                                         Proj proj = {});                                     // since C++20
526*dc37c87aSrobert
527*dc37c87aSrobert  template<permutable I, sentinel_for<I> S, class Proj = identity,
528*dc37c87aSrobert           indirect_unary_predicate<projected<I, Proj>> Pred>
529*dc37c87aSrobert    constexpr subrange<I>
530*dc37c87aSrobert      partition(I first, S last, Pred pred, Proj proj = {});                                  // Since C++20
531*dc37c87aSrobert
532*dc37c87aSrobert  template<forward_range R, class Proj = identity,
533*dc37c87aSrobert           indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
534*dc37c87aSrobert    requires permutable<iterator_t<R>>
535*dc37c87aSrobert    constexpr borrowed_subrange_t<R>
536*dc37c87aSrobert      partition(R&& r, Pred pred, Proj proj = {});                                            // Since C++20
537*dc37c87aSrobert
538*dc37c87aSrobert  template<bidirectional_iterator I, sentinel_for<I> S, class Proj = identity,
539*dc37c87aSrobert           indirect_unary_predicate<projected<I, Proj>> Pred>
540*dc37c87aSrobert    requires permutable<I>
541*dc37c87aSrobert    subrange<I> stable_partition(I first, S last, Pred pred, Proj proj = {});                 // Since C++20
542*dc37c87aSrobert
543*dc37c87aSrobert  template<bidirectional_range R, class Proj = identity,
544*dc37c87aSrobert           indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
545*dc37c87aSrobert    requires permutable<iterator_t<R>>
546*dc37c87aSrobert    borrowed_subrange_t<R> stable_partition(R&& r, Pred pred, Proj proj = {});                // Since C++20
547*dc37c87aSrobert
548*dc37c87aSrobert  template<input_iterator I1, sentinel_for<I1> S1, forward_iterator I2, sentinel_for<I2> S2,
549*dc37c87aSrobert           class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity>
550*dc37c87aSrobert    requires indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
551*dc37c87aSrobert    constexpr I1 ranges::find_first_of(I1 first1, S1 last1, I2 first2, S2 last2,
552*dc37c87aSrobert                                       Pred pred = {},
553*dc37c87aSrobert                                       Proj1 proj1 = {}, Proj2 proj2 = {});                 // since C++20
554*dc37c87aSrobert
555*dc37c87aSrobert  template<input_range R1, forward_range R2,
556*dc37c87aSrobert           class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity>
557*dc37c87aSrobert    requires indirectly_comparable<iterator_t<R1>, iterator_t<R2>, Pred, Proj1, Proj2>
558*dc37c87aSrobert    constexpr borrowed_iterator_t<R1>
559*dc37c87aSrobert      ranges::find_first_of(R1&& r1, R2&& r2,
560*dc37c87aSrobert                            Pred pred = {},
561*dc37c87aSrobert                            Proj1 proj1 = {}, Proj2 proj2 = {});                            // since C++20
562*dc37c87aSrobert
563*dc37c87aSrobert  template<forward_iterator I, sentinel_for<I> S, class Proj = identity,
564*dc37c87aSrobert           indirect_binary_predicate<projected<I, Proj>,
565*dc37c87aSrobert                                     projected<I, Proj>> Pred = ranges::equal_to>
566*dc37c87aSrobert    constexpr I ranges::adjacent_find(I first, S last, Pred pred = {}, Proj proj = {});     // since C+20
567*dc37c87aSrobert
568*dc37c87aSrobert  template<forward_range R, class Proj = identity,
569*dc37c87aSrobert           indirect_binary_predicate<projected<iterator_t<R>, Proj>,
570*dc37c87aSrobert                                     projected<iterator_t<R>, Proj>> Pred = ranges::equal_to>
571*dc37c87aSrobert    constexpr borrowed_iterator_t<R> ranges::adjacent_find(R&& r, Pred pred = {}, Proj proj = {});  // since C++20
572*dc37c87aSrobert
573*dc37c87aSrobert  template<input_iterator I, sentinel_for<I> S, class T1, class T2, class Proj = identity>
574*dc37c87aSrobert    requires indirectly_writable<I, const T2&> &&
575*dc37c87aSrobert             indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T1*>
576*dc37c87aSrobert    constexpr I
577*dc37c87aSrobert      ranges::replace(I first, S last, const T1& old_value, const T2& new_value, Proj proj = {});   // since C++20
578*dc37c87aSrobert
579*dc37c87aSrobert  template<input_range R, class T1, class T2, class Proj = identity>
580*dc37c87aSrobert    requires indirectly_writable<iterator_t<R>, const T2&> &&
581*dc37c87aSrobert             indirect_binary_predicate<ranges::equal_to, projected<iterator_t<R>, Proj>, const T1*>
582*dc37c87aSrobert    constexpr borrowed_iterator_t<R>
583*dc37c87aSrobert      ranges::replace(R&& r, const T1& old_value, const T2& new_value, Proj proj = {});             // since C++20
584*dc37c87aSrobert
585*dc37c87aSrobert  template<input_iterator I, sentinel_for<I> S, class T, class Proj = identity,
586*dc37c87aSrobert           indirect_unary_predicate<projected<I, Proj>> Pred>
587*dc37c87aSrobert    requires indirectly_writable<I, const T&>
588*dc37c87aSrobert    constexpr I ranges::replace_if(I first, S last, Pred pred, const T& new_value, Proj proj = {}); // since C++20
589*dc37c87aSrobert
590*dc37c87aSrobert  template<input_range R, class T, class Proj = identity,
591*dc37c87aSrobert           indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
592*dc37c87aSrobert    requires indirectly_writable<iterator_t<R>, const T&>
593*dc37c87aSrobert    constexpr borrowed_iterator_t<R>
594*dc37c87aSrobert      ranges::replace_if(R&& r, Pred pred, const T& new_value, Proj proj = {});                     // since C++20
595*dc37c87aSrobert
596*dc37c87aSrobert  template<class T, class Proj = identity,
597*dc37c87aSrobert           indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less>
598*dc37c87aSrobert    constexpr const T&
599*dc37c87aSrobert      ranges::clamp(const T& v, const T& lo, const T& hi, Comp comp = {}, Proj proj = {});          // since C++20
600*dc37c87aSrobert
601*dc37c87aSrobert  template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2,
602*dc37c87aSrobert           class Proj1 = identity, class Proj2 = identity,
603*dc37c87aSrobert           indirect_strict_weak_order<projected<I1, Proj1>,
604*dc37c87aSrobert                                      projected<I2, Proj2>> Comp = ranges::less>
605*dc37c87aSrobert    constexpr bool
606*dc37c87aSrobert      ranges::lexicographical_compare(I1 first1, S1 last1, I2 first2, S2 last2,
607*dc37c87aSrobert                                      Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {});    // since C++20
608*dc37c87aSrobert
609*dc37c87aSrobert  template<input_range R1, input_range R2, class Proj1 = identity,
610*dc37c87aSrobert           class Proj2 = identity,
611*dc37c87aSrobert           indirect_strict_weak_order<projected<iterator_t<R1>, Proj1>,
612*dc37c87aSrobert                                      projected<iterator_t<R2>, Proj2>> Comp = ranges::less>
613*dc37c87aSrobert    constexpr bool
614*dc37c87aSrobert      ranges::lexicographical_compare(R1&& r1, R2&& r2, Comp comp = {},
615*dc37c87aSrobert                                      Proj1 proj1 = {}, Proj2 proj2 = {});                    // since C++20
616*dc37c87aSrobert
617*dc37c87aSrobert  template<bidirectional_iterator I1, sentinel_for<I1> S1, bidirectional_iterator I2>
618*dc37c87aSrobert    requires indirectly_movable<I1, I2>
619*dc37c87aSrobert    constexpr ranges::move_backward_result<I1, I2>
620*dc37c87aSrobert      ranges::move_backward(I1 first, S1 last, I2 result);                                          // since C++20
621*dc37c87aSrobert
622*dc37c87aSrobert  template<bidirectional_range R, bidirectional_iterator I>
623*dc37c87aSrobert    requires indirectly_movable<iterator_t<R>, I>
624*dc37c87aSrobert    constexpr ranges::move_backward_result<borrowed_iterator_t<R>, I>
625*dc37c87aSrobert      ranges::move_backward(R&& r, I result);                                                       // since C++20
626*dc37c87aSrobert
627*dc37c87aSrobert  template<input_iterator I, sentinel_for<I> S, weakly_incrementable O>
628*dc37c87aSrobert    requires indirectly_movable<I, O>
629*dc37c87aSrobert    constexpr ranges::move_result<I, O>
630*dc37c87aSrobert      ranges::move(I first, S last, O result);                                                      // since C++20
631*dc37c87aSrobert
632*dc37c87aSrobert  template<input_range R, weakly_incrementable O>
633*dc37c87aSrobert    requires indirectly_movable<iterator_t<R>, O>
634*dc37c87aSrobert    constexpr ranges::move_result<borrowed_iterator_t<R>, O>
635*dc37c87aSrobert      ranges::move(R&& r, O result);                                                                // since C++20
636*dc37c87aSrobert
637*dc37c87aSrobert  template<class I, class O1, class O2>
638*dc37c87aSrobert      using partition_copy_result = in_out_out_result<I, O1, O2>;                                   // since C++20
639*dc37c87aSrobert
640*dc37c87aSrobert  template<input_iterator I, sentinel_for<I> S,
641*dc37c87aSrobert          weakly_incrementable O1, weakly_incrementable O2,
642*dc37c87aSrobert          class Proj = identity, indirect_unary_predicate<projected<I, Proj>> Pred>
643*dc37c87aSrobert    requires indirectly_copyable<I, O1> && indirectly_copyable<I, O2>
644*dc37c87aSrobert    constexpr partition_copy_result<I, O1, O2>
645*dc37c87aSrobert      partition_copy(I first, S last, O1 out_true, O2 out_false, Pred pred,
646*dc37c87aSrobert                    Proj proj = {});                                                                // Since C++20
647*dc37c87aSrobert
648*dc37c87aSrobert  template<input_range R, weakly_incrementable O1, weakly_incrementable O2,
649*dc37c87aSrobert          class Proj = identity,
650*dc37c87aSrobert          indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
651*dc37c87aSrobert    requires indirectly_copyable<iterator_t<R>, O1> &&
652*dc37c87aSrobert            indirectly_copyable<iterator_t<R>, O2>
653*dc37c87aSrobert    constexpr partition_copy_result<borrowed_iterator_t<R>, O1, O2>
654*dc37c87aSrobert      partition_copy(R&& r, O1 out_true, O2 out_false, Pred pred, Proj proj = {});                  // Since C++20
655*dc37c87aSrobert
656*dc37c87aSrobert  template<forward_iterator I, sentinel_for<I> S, class Proj = identity,
657*dc37c87aSrobert           indirect_unary_predicate<projected<I, Proj>> Pred>
658*dc37c87aSrobert    constexpr I partition_point(I first, S last, Pred pred, Proj proj = {});                        // Since C++20
659*dc37c87aSrobert
660*dc37c87aSrobert  template<forward_range R, class Proj = identity,
661*dc37c87aSrobert           indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
662*dc37c87aSrobert    constexpr borrowed_iterator_t<R>
663*dc37c87aSrobert      partition_point(R&& r, Pred pred, Proj proj = {});                                            // Since C++20
664*dc37c87aSrobert
665*dc37c87aSrobert  template<class I1, class I2, class O>
666*dc37c87aSrobert    using merge_result = in_in_out_result<I1, I2, O>;                                               // since C++20
667*dc37c87aSrobert
668*dc37c87aSrobert  template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2,
669*dc37c87aSrobert           weakly_incrementable O, class Comp = ranges::less, class Proj1 = identity,
670*dc37c87aSrobert           class Proj2 = identity>
671*dc37c87aSrobert    requires mergeable<I1, I2, O, Comp, Proj1, Proj2>
672*dc37c87aSrobert    constexpr merge_result<I1, I2, O>
673*dc37c87aSrobert      merge(I1 first1, S1 last1, I2 first2, S2 last2, O result,
674*dc37c87aSrobert            Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {});                                    // since C++20
675*dc37c87aSrobert
676*dc37c87aSrobert  template<input_range R1, input_range R2, weakly_incrementable O, class Comp = ranges::less,
677*dc37c87aSrobert           class Proj1 = identity, class Proj2 = identity>
678*dc37c87aSrobert    requires mergeable<iterator_t<R1>, iterator_t<R2>, O, Comp, Proj1, Proj2>
679*dc37c87aSrobert    constexpr merge_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>, O>
680*dc37c87aSrobert      merge(R1&& r1, R2&& r2, O result,
681*dc37c87aSrobert            Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {});                                    // since C++20
682*dc37c87aSrobert
683*dc37c87aSrobert  template<permutable I, sentinel_for<I> S, class T, class Proj = identity>
684*dc37c87aSrobert    requires indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T*>
685*dc37c87aSrobert    constexpr subrange<I> ranges::remove(I first, S last, const T& value, Proj proj = {});          // since C++20
686*dc37c87aSrobert
687*dc37c87aSrobert  template<forward_range R, class T, class Proj = identity>
688*dc37c87aSrobert    requires permutable<iterator_t<R>> &&
689*dc37c87aSrobert             indirect_binary_predicate<ranges::equal_to, projected<iterator_t<R>, Proj>, const T*>
690*dc37c87aSrobert    constexpr borrowed_subrange_t<R>
691*dc37c87aSrobert      ranges::remove(R&& r, const T& value, Proj proj = {});                                        // since C++20
692*dc37c87aSrobert
693*dc37c87aSrobert  template<permutable I, sentinel_for<I> S, class Proj = identity,
694*dc37c87aSrobert           indirect_unary_predicate<projected<I, Proj>> Pred>
695*dc37c87aSrobert    constexpr subrange<I> ranges::remove_if(I first, S last, Pred pred, Proj proj = {});            // since C++20
696*dc37c87aSrobert
697*dc37c87aSrobert  template<forward_range R, class Proj = identity,
698*dc37c87aSrobert           indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
699*dc37c87aSrobert    requires permutable<iterator_t<R>>
700*dc37c87aSrobert    constexpr borrowed_subrange_t<R>
701*dc37c87aSrobert      ranges::remove_if(R&& r, Pred pred, Proj proj = {});                                          // since C++20
702*dc37c87aSrobert
703*dc37c87aSrobert  template<class I, class O>
704*dc37c87aSrobert    using set_difference_result = in_out_result<I, O>;                                              // since C++20
705*dc37c87aSrobert
706*dc37c87aSrobert  template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2,
707*dc37c87aSrobert           weakly_incrementable O, class Comp = ranges::less,
708*dc37c87aSrobert           class Proj1 = identity, class Proj2 = identity>
709*dc37c87aSrobert    requires mergeable<I1, I2, O, Comp, Proj1, Proj2>
710*dc37c87aSrobert    constexpr set_difference_result<I1, O>
711*dc37c87aSrobert      set_difference(I1 first1, S1 last1, I2 first2, S2 last2, O result,
712*dc37c87aSrobert                     Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {});                           // since C++20
713*dc37c87aSrobert
714*dc37c87aSrobert  template<input_range R1, input_range R2, weakly_incrementable O,
715*dc37c87aSrobert           class Comp = ranges::less, class Proj1 = identity, class Proj2 = identity>
716*dc37c87aSrobert    requires mergeable<iterator_t<R1>, iterator_t<R2>, O, Comp, Proj1, Proj2>
717*dc37c87aSrobert    constexpr set_difference_result<borrowed_iterator_t<R1>, O>
718*dc37c87aSrobert      set_difference(R1&& r1, R2&& r2, O result,
719*dc37c87aSrobert                     Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {});                           // since C++20
720*dc37c87aSrobert
721*dc37c87aSrobert  template<class I1, class I2, class O>
722*dc37c87aSrobert    using set_intersection_result = in_in_out_result<I1, I2, O>;                                    // since C++20
723*dc37c87aSrobert
724*dc37c87aSrobert  template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2,
725*dc37c87aSrobert           weakly_incrementable O, class Comp = ranges::less,
726*dc37c87aSrobert           class Proj1 = identity, class Proj2 = identity>
727*dc37c87aSrobert    requires mergeable<I1, I2, O, Comp, Proj1, Proj2>
728*dc37c87aSrobert    constexpr set_intersection_result<I1, I2, O>
729*dc37c87aSrobert      set_intersection(I1 first1, S1 last1, I2 first2, S2 last2, O result,
730*dc37c87aSrobert                       Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {});                         // since C++20
731*dc37c87aSrobert
732*dc37c87aSrobert  template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2,
733*dc37c87aSrobert           weakly_incrementable O, class Comp = ranges::less,
734*dc37c87aSrobert           class Proj1 = identity, class Proj2 = identity>
735*dc37c87aSrobert    requires mergeable<I1, I2, O, Comp, Proj1, Proj2>
736*dc37c87aSrobert    constexpr set_intersection_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>, O>
737*dc37c87aSrobert      set_intersection(R1&& r1, R2&& r2, O result,
738*dc37c87aSrobert                       Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {});                         // since C++20
739*dc37c87aSrobert
740*dc37c87aSrobert  template <class _InIter, class _OutIter>
741*dc37c87aSrobert  using reverse_copy_result = in_out_result<_InIter, _OutIter>;                                     // since C++20
742*dc37c87aSrobert
743*dc37c87aSrobert  template<bidirectional_iterator I, sentinel_for<I> S, weakly_incrementable O>
744*dc37c87aSrobert    requires indirectly_copyable<I, O>
745*dc37c87aSrobert    constexpr ranges::reverse_copy_result<I, O>
746*dc37c87aSrobert      ranges::reverse_copy(I first, S last, O result);                                              // since C++20
747*dc37c87aSrobert
748*dc37c87aSrobert  template<bidirectional_range R, weakly_incrementable O>
749*dc37c87aSrobert    requires indirectly_copyable<iterator_t<R>, O>
750*dc37c87aSrobert    constexpr ranges::reverse_copy_result<borrowed_iterator_t<R>, O>
751*dc37c87aSrobert      ranges::reverse_copy(R&& r, O result);                                                        // since C++20
752*dc37c87aSrobert
753*dc37c87aSrobert  template<permutable I, sentinel_for<I> S>
754*dc37c87aSrobert    constexpr subrange<I> rotate(I first, I middle, S last);                                        // since C++20
755*dc37c87aSrobert
756*dc37c87aSrobert  template<forward_range R>
757*dc37c87aSrobert    requires permutable<iterator_t<R>>
758*dc37c87aSrobert    constexpr borrowed_subrange_t<R> rotate(R&& r, iterator_t<R> middle);                           // Since C++20
759*dc37c87aSrobert
760*dc37c87aSrobert  template <class _InIter, class _OutIter>
761*dc37c87aSrobert  using rotate_copy_result = in_out_result<_InIter, _OutIter>;                                      // since C++20
762*dc37c87aSrobert
763*dc37c87aSrobert  template<forward_iterator I, sentinel_for<I> S, weakly_incrementable O>
764*dc37c87aSrobert    requires indirectly_copyable<I, O>
765*dc37c87aSrobert    constexpr ranges::rotate_copy_result<I, O>
766*dc37c87aSrobert      ranges::rotate_copy(I first, I middle, S last, O result);                                     // since C++20
767*dc37c87aSrobert
768*dc37c87aSrobert  template<forward_range R, weakly_incrementable O>
769*dc37c87aSrobert    requires indirectly_copyable<iterator_t<R>, O>
770*dc37c87aSrobert    constexpr ranges::rotate_copy_result<borrowed_iterator_t<R>, O>
771*dc37c87aSrobert      ranges::rotate_copy(R&& r, iterator_t<R> middle, O result);                                   // since C++20
772*dc37c87aSrobert
773*dc37c87aSrobert  template<input_iterator I, sentinel_for<I> S, weakly_incrementable O, class Gen>
774*dc37c87aSrobert    requires (forward_iterator<I> || random_access_iterator<O>) &&
775*dc37c87aSrobert            indirectly_copyable<I, O> &&
776*dc37c87aSrobert            uniform_random_bit_generator<remove_reference_t<Gen>>
777*dc37c87aSrobert    O sample(I first, S last, O out, iter_difference_t<I> n, Gen&& g);                              // Since C++20
778*dc37c87aSrobert
779*dc37c87aSrobert  template<input_range R, weakly_incrementable O, class Gen>
780*dc37c87aSrobert    requires (forward_range<R> || random_access_iterator<O>) &&
781*dc37c87aSrobert            indirectly_copyable<iterator_t<R>, O> &&
782*dc37c87aSrobert            uniform_random_bit_generator<remove_reference_t<Gen>>
783*dc37c87aSrobert    O sample(R&& r, O out, range_difference_t<R> n, Gen&& g);                                       // Since C++20
784*dc37c87aSrobert
785*dc37c87aSrobert  template<random_access_iterator I, sentinel_for<I> S, class Gen>
786*dc37c87aSrobert    requires permutable<I> &&
787*dc37c87aSrobert            uniform_random_bit_generator<remove_reference_t<Gen>>
788*dc37c87aSrobert    I shuffle(I first, S last, Gen&& g);                                                           // Since C++20
789*dc37c87aSrobert
790*dc37c87aSrobert  template<random_access_range R, class Gen>
791*dc37c87aSrobert    requires permutable<iterator_t<R>> &&
792*dc37c87aSrobert            uniform_random_bit_generator<remove_reference_t<Gen>>
793*dc37c87aSrobert    borrowed_iterator_t<R> shuffle(R&& r, Gen&& g);                                                // Since C++20
794*dc37c87aSrobert
795*dc37c87aSrobert  template<forward_iterator I1, sentinel_for<I1> S1, forward_iterator I2,
796*dc37c87aSrobert         sentinel_for<I2> S2, class Proj1 = identity, class Proj2 = identity,
797*dc37c87aSrobert         indirect_equivalence_relation<projected<I1, Proj1>,
798*dc37c87aSrobert                                       projected<I2, Proj2>> Pred = ranges::equal_to>
799*dc37c87aSrobert  constexpr bool ranges::is_permutation(I1 first1, S1 last1, I2 first2, S2 last2,
800*dc37c87aSrobert                                        Pred pred = {},
801*dc37c87aSrobert                                        Proj1 proj1 = {}, Proj2 proj2 = {});                       // Since C++20
802*dc37c87aSrobert
803*dc37c87aSrobert  template<forward_range R1, forward_range R2,
804*dc37c87aSrobert         class Proj1 = identity, class Proj2 = identity,
805*dc37c87aSrobert         indirect_equivalence_relation<projected<iterator_t<R1>, Proj1>,
806*dc37c87aSrobert                                       projected<iterator_t<R2>, Proj2>> Pred = ranges::equal_to>
807*dc37c87aSrobert  constexpr bool ranges::is_permutation(R1&& r1, R2&& r2, Pred pred = {},
808*dc37c87aSrobert                                        Proj1 proj1 = {}, Proj2 proj2 = {});                       // Since C++20
809*dc37c87aSrobert
810*dc37c87aSrobert  template<forward_iterator I1, sentinel_for<I1> S1, forward_iterator I2,
811*dc37c87aSrobert           sentinel_for<I2> S2, class Pred = ranges::equal_to,
812*dc37c87aSrobert           class Proj1 = identity, class Proj2 = identity>
813*dc37c87aSrobert    requires indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
814*dc37c87aSrobert    constexpr subrange<I1>
815*dc37c87aSrobert      ranges::search(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {},
816*dc37c87aSrobert                     Proj1 proj1 = {}, Proj2 proj2 = {});                                           // since C++20
817*dc37c87aSrobert
818*dc37c87aSrobert  template<forward_range R1, forward_range R2, class Pred = ranges::equal_to,
819*dc37c87aSrobert           class Proj1 = identity, class Proj2 = identity>
820*dc37c87aSrobert    requires indirectly_comparable<iterator_t<R1>, iterator_t<R2>, Pred, Proj1, Proj2>
821*dc37c87aSrobert    constexpr borrowed_subrange_t<R1>
822*dc37c87aSrobert      ranges::search(R1&& r1, R2&& r2, Pred pred = {},
823*dc37c87aSrobert                     Proj1 proj1 = {}, Proj2 proj2 = {});                                           // since C++20
824*dc37c87aSrobert
825*dc37c87aSrobert  template<forward_iterator I, sentinel_for<I> S, class T,
826*dc37c87aSrobert           class Pred = ranges::equal_to, class Proj = identity>
827*dc37c87aSrobert    requires indirectly_comparable<I, const T*, Pred, Proj>
828*dc37c87aSrobert    constexpr subrange<I>
829*dc37c87aSrobert      ranges::search_n(I first, S last, iter_difference_t<I> count,
830*dc37c87aSrobert                       const T& value, Pred pred = {}, Proj proj = {});                             // since C++20
831*dc37c87aSrobert
832*dc37c87aSrobert  template<forward_range R, class T, class Pred = ranges::equal_to,
833*dc37c87aSrobert           class Proj = identity>
834*dc37c87aSrobert    requires indirectly_comparable<iterator_t<R>, const T*, Pred, Proj>
835*dc37c87aSrobert    constexpr borrowed_subrange_t<R>
836*dc37c87aSrobert      ranges::search_n(R&& r, range_difference_t<R> count,
837*dc37c87aSrobert                       const T& value, Pred pred = {}, Proj proj = {});                             // since C++20
838*dc37c87aSrobert
839*dc37c87aSrobert  template<forward_iterator I1, sentinel_for<I1> S1, forward_iterator I2, sentinel_for<I2> S2,
840*dc37c87aSrobert           class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity>
841*dc37c87aSrobert    requires indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
842*dc37c87aSrobert    constexpr subrange<I1>
843*dc37c87aSrobert      ranges::find_end(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {},
844*dc37c87aSrobert                       Proj1 proj1 = {}, Proj2 proj2 = {});                                         // since C++20
845*dc37c87aSrobert
846*dc37c87aSrobert  template<forward_range R1, forward_range R2,
847*dc37c87aSrobert           class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity>
848*dc37c87aSrobert    requires indirectly_comparable<iterator_t<R1>, iterator_t<R2>, Pred, Proj1, Proj2>
849*dc37c87aSrobert    constexpr borrowed_subrange_t<R1>
850*dc37c87aSrobert      ranges::find_end(R1&& r1, R2&& r2, Pred pred = {},
851*dc37c87aSrobert                       Proj1 proj1 = {}, Proj2 proj2 = {});                                         // since C++20
852*dc37c87aSrobert
853*dc37c87aSrobert  template<class I1, class I2, class O>
854*dc37c87aSrobert    using set_symmetric_difference_result = in_in_out_result<I1, I2, O>;                            // since C++20
855*dc37c87aSrobert
856*dc37c87aSrobert  template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2,
857*dc37c87aSrobert           weakly_incrementable O, class Comp = ranges::less,
858*dc37c87aSrobert           class Proj1 = identity, class Proj2 = identity>
859*dc37c87aSrobert    requires mergeable<I1, I2, O, Comp, Proj1, Proj2>
860*dc37c87aSrobert    constexpr set_symmetric_difference_result<I1, I2, O>
861*dc37c87aSrobert      set_symmetric_difference(I1 first1, S1 last1, I2 first2, S2 last2, O result,
862*dc37c87aSrobert                               Comp comp = {}, Proj1 proj1 = {},
863*dc37c87aSrobert                               Proj2 proj2 = {});                                                   // since C++20
864*dc37c87aSrobert
865*dc37c87aSrobert  template<input_range R1, input_range R2, weakly_incrementable O,
866*dc37c87aSrobert           class Comp = ranges::less, class Proj1 = identity, class Proj2 = identity>
867*dc37c87aSrobert    requires mergeable<iterator_t<R1>, iterator_t<R2>, O, Comp, Proj1, Proj2>
868*dc37c87aSrobert    constexpr set_symmetric_difference_result<borrowed_iterator_t<R1>,
869*dc37c87aSrobert                                                      borrowed_iterator_t<R2>, O>
870*dc37c87aSrobert      set_symmetric_difference(R1&& r1, R2&& r2, O result, Comp comp = {},
871*dc37c87aSrobert                               Proj1 proj1 = {}, Proj2 proj2 = {});                                 // since C++20
872*dc37c87aSrobert
873*dc37c87aSrobert  template<forward_iterator I, sentinel_for<I> S, class T, class Proj = identity,
874*dc37c87aSrobert           indirect_strict_weak_order<const T*, projected<I, Proj>> Comp = ranges::less>
875*dc37c87aSrobert    constexpr subrange<I>
876*dc37c87aSrobert      equal_range(I first, S last, const T& value, Comp comp = {}, Proj proj = {});                 // since C++20
877*dc37c87aSrobert
878*dc37c87aSrobert  template<forward_range R, class T, class Proj = identity,
879*dc37c87aSrobert           indirect_strict_weak_order<const T*, projected<iterator_t<R>, Proj>> Comp =
880*dc37c87aSrobert             ranges::less>
881*dc37c87aSrobert    constexpr borrowed_subrange_t<R>
882*dc37c87aSrobert      equal_range(R&& r, const T& value, Comp comp = {}, Proj proj = {});                           // since C++20
883*dc37c87aSrobert
884*dc37c87aSrobert  template<class I1, class I2, class O>
885*dc37c87aSrobert    using set_union_result = in_in_out_result<I1, I2, O>;                                           // since C++20
886*dc37c87aSrobert
887*dc37c87aSrobert  template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2,
888*dc37c87aSrobert           weakly_incrementable O, class Comp = ranges::less,
889*dc37c87aSrobert           class Proj1 = identity, class Proj2 = identity>
890*dc37c87aSrobert    requires mergeable<I1, I2, O, Comp, Proj1, Proj2>
891*dc37c87aSrobert    constexpr set_union_result<I1, I2, O>
892*dc37c87aSrobert      set_union(I1 first1, S1 last1, I2 first2, S2 last2, O result, Comp comp = {},
893*dc37c87aSrobert                Proj1 proj1 = {}, Proj2 proj2 = {});                                                // since C++20
894*dc37c87aSrobert
895*dc37c87aSrobert  template<input_range R1, input_range R2, weakly_incrementable O,
896*dc37c87aSrobert           class Comp = ranges::less, class Proj1 = identity, class Proj2 = identity>
897*dc37c87aSrobert    requires mergeable<iterator_t<R1>, iterator_t<R2>, O, Comp, Proj1, Proj2>
898*dc37c87aSrobert    constexpr set_union_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>, O>
899*dc37c87aSrobert      set_union(R1&& r1, R2&& r2, O result, Comp comp = {},
900*dc37c87aSrobert                Proj1 proj1 = {}, Proj2 proj2 = {});                                                // since C++20
901*dc37c87aSrobert
902*dc37c87aSrobert  template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2,
903*dc37c87aSrobert           class Proj1 = identity, class Proj2 = identity,
904*dc37c87aSrobert           indirect_strict_weak_order<projected<I1, Proj1>, projected<I2, Proj2>> Comp =
905*dc37c87aSrobert             ranges::less>
906*dc37c87aSrobert    constexpr bool includes(I1 first1, S1 last1, I2 first2, S2 last2, Comp comp = {},
907*dc37c87aSrobert                            Proj1 proj1 = {}, Proj2 proj2 = {});                                   // Since C++20
908*dc37c87aSrobert
909*dc37c87aSrobert  template<input_range R1, input_range R2, class Proj1 = identity,
910*dc37c87aSrobert           class Proj2 = identity,
911*dc37c87aSrobert           indirect_strict_weak_order<projected<iterator_t<R1>, Proj1>,
912*dc37c87aSrobert                                      projected<iterator_t<R2>, Proj2>> Comp = ranges::less>
913*dc37c87aSrobert    constexpr bool includes(R1&& r1, R2&& r2, Comp comp = {},
914*dc37c87aSrobert                            Proj1 proj1 = {}, Proj2 proj2 = {});                                   // Since C++20
915*dc37c87aSrobert
916*dc37c87aSrobert  template<bidirectional_iterator I, sentinel_for<I> S, class Comp = ranges::less,
917*dc37c87aSrobert           class Proj = identity>
918*dc37c87aSrobert    requires sortable<I, Comp, Proj>
919*dc37c87aSrobert    I inplace_merge(I first, I middle, S last, Comp comp = {}, Proj proj = {});                    // Since C++20
920*dc37c87aSrobert
921*dc37c87aSrobert  template<bidirectional_range R, class Comp = ranges::less, class Proj = identity>
922*dc37c87aSrobert    requires sortable<iterator_t<R>, Comp, Proj>
923*dc37c87aSrobert    borrowed_iterator_t<R>
924*dc37c87aSrobert      inplace_merge(R&& r, iterator_t<R> middle, Comp comp = {},
925*dc37c87aSrobert                    Proj proj = {});                                                               // Since C++20
926*dc37c87aSrobert
927*dc37c87aSrobert  template<permutable I, sentinel_for<I> S, class Proj = identity,
928*dc37c87aSrobert           indirect_equivalence_relation<projected<I, Proj>> C = ranges::equal_to>
929*dc37c87aSrobert    constexpr subrange<I> unique(I first, S last, C comp = {}, Proj proj = {});                    // Since C++20
930*dc37c87aSrobert
931*dc37c87aSrobert  template<forward_range R, class Proj = identity,
932*dc37c87aSrobert           indirect_equivalence_relation<projected<iterator_t<R>, Proj>> C = ranges::equal_to>
933*dc37c87aSrobert    requires permutable<iterator_t<R>>
934*dc37c87aSrobert    constexpr borrowed_subrange_t<R>
935*dc37c87aSrobert      unique(R&& r, C comp = {}, Proj proj = {});                                                  // Since C++20
936*dc37c87aSrobert
937*dc37c87aSrobert  template<input_iterator I, sentinel_for<I> S, weakly_incrementable O, class Proj = identity,
938*dc37c87aSrobert           indirect_equivalence_relation<projected<I, Proj>> C = ranges::equal_to>
939*dc37c87aSrobert    requires indirectly_copyable<I, O> &&
940*dc37c87aSrobert             (forward_iterator<I> ||
941*dc37c87aSrobert              (input_iterator<O> && same_as<iter_value_t<I>, iter_value_t<O>>) ||
942*dc37c87aSrobert              indirectly_copyable_storable<I, O>)
943*dc37c87aSrobert    constexpr unique_copy_result<I, O>
944*dc37c87aSrobert      unique_copy(I first, S last, O result, C comp = {}, Proj proj = {});                         // Since C++20
945*dc37c87aSrobert
946*dc37c87aSrobert  template<input_range R, weakly_incrementable O, class Proj = identity,
947*dc37c87aSrobert           indirect_equivalence_relation<projected<iterator_t<R>, Proj>> C = ranges::equal_to>
948*dc37c87aSrobert    requires indirectly_copyable<iterator_t<R>, O> &&
949*dc37c87aSrobert             (forward_iterator<iterator_t<R>> ||
950*dc37c87aSrobert              (input_iterator<O> && same_as<range_value_t<R>, iter_value_t<O>>) ||
951*dc37c87aSrobert              indirectly_copyable_storable<iterator_t<R>, O>)
952*dc37c87aSrobert    constexpr unique_copy_result<borrowed_iterator_t<R>, O>
953*dc37c87aSrobert      unique_copy(R&& r, O result, C comp = {}, Proj proj = {});                                   // Since C++20
954*dc37c87aSrobert
955*dc37c87aSrobert  template<class I, class O>
956*dc37c87aSrobert      using remove_copy_result = in_out_result<I, O>;                                              // Since C++20
957*dc37c87aSrobert
958*dc37c87aSrobert  template<input_iterator I, sentinel_for<I> S, weakly_incrementable O, class T,
959*dc37c87aSrobert           class Proj = identity>
960*dc37c87aSrobert             indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T*>
961*dc37c87aSrobert    constexpr remove_copy_result<I, O>
962*dc37c87aSrobert      remove_copy(I first, S last, O result, const T& value, Proj proj = {});                      // Since C++20
963*dc37c87aSrobert
964*dc37c87aSrobert  template<input_range R, weakly_incrementable O, class T, class Proj = identity>
965*dc37c87aSrobert    requires indirectly_copyable<iterator_t<R>, O> &&
966*dc37c87aSrobert             indirect_binary_predicate<ranges::equal_to,
967*dc37c87aSrobert                                       projected<iterator_t<R>, Proj>, const T*>
968*dc37c87aSrobert    constexpr remove_copy_result<borrowed_iterator_t<R>, O>
969*dc37c87aSrobert      remove_copy(R&& r, O result, const T& value, Proj proj = {});                                // Since C++20
970*dc37c87aSrobert
971*dc37c87aSrobert  template<class I, class O>
972*dc37c87aSrobert      using remove_copy_if_result = in_out_result<I, O>;                                           // Since C++20
973*dc37c87aSrobert
974*dc37c87aSrobert  template<input_iterator I, sentinel_for<I> S, weakly_incrementable O,
975*dc37c87aSrobert           class Proj = identity, indirect_unary_predicate<projected<I, Proj>> Pred>
976*dc37c87aSrobert    requires indirectly_copyable<I, O>
977*dc37c87aSrobert    constexpr remove_copy_if_result<I, O>
978*dc37c87aSrobert      remove_copy_if(I first, S last, O result, Pred pred, Proj proj = {});                        // Since C++20
979*dc37c87aSrobert
980*dc37c87aSrobert  template<input_range R, weakly_incrementable O, class Proj = identity,
981*dc37c87aSrobert           indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
982*dc37c87aSrobert    requires indirectly_copyable<iterator_t<R>, O>
983*dc37c87aSrobert    constexpr remove_copy_if_result<borrowed_iterator_t<R>, O>
984*dc37c87aSrobert      remove_copy_if(R&& r, O result, Pred pred, Proj proj = {});                                  // Since C++20
985*dc37c87aSrobert
986*dc37c87aSrobert  template<class I, class O>
987*dc37c87aSrobert      using replace_copy_result = in_out_result<I, O>;                                             // Since C++20
988*dc37c87aSrobert
989*dc37c87aSrobert  template<input_iterator I, sentinel_for<I> S, class T1, class T2,
990*dc37c87aSrobert           output_iterator<const T2&> O, class Proj = identity>
991*dc37c87aSrobert    requires indirectly_copyable<I, O> &&
992*dc37c87aSrobert             indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T1*>
993*dc37c87aSrobert    constexpr replace_copy_result<I, O>
994*dc37c87aSrobert      replace_copy(I first, S last, O result, const T1& old_value, const T2& new_value,
995*dc37c87aSrobert                   Proj proj = {});                                                                // Since C++20
996*dc37c87aSrobert
997*dc37c87aSrobert  template<input_range R, class T1, class T2, output_iterator<const T2&> O,
998*dc37c87aSrobert           class Proj = identity>
999*dc37c87aSrobert    requires indirectly_copyable<iterator_t<R>, O> &&
1000*dc37c87aSrobert             indirect_binary_predicate<ranges::equal_to,
1001*dc37c87aSrobert                                       projected<iterator_t<R>, Proj>, const T1*>
1002*dc37c87aSrobert    constexpr replace_copy_result<borrowed_iterator_t<R>, O>
1003*dc37c87aSrobert      replace_copy(R&& r, O result, const T1& old_value, const T2& new_value,
1004*dc37c87aSrobert                   Proj proj = {});                                                                // Since C++20
1005*dc37c87aSrobert
1006*dc37c87aSrobert  template<class I, class O>
1007*dc37c87aSrobert      using replace_copy_if_result = in_out_result<I, O>;                                          // Since C++20
1008*dc37c87aSrobert
1009*dc37c87aSrobert  template<input_iterator I, sentinel_for<I> S, class T, output_iterator<const T&> O,
1010*dc37c87aSrobert           class Proj = identity, indirect_unary_predicate<projected<I, Proj>> Pred>
1011*dc37c87aSrobert    requires indirectly_copyable<I, O>
1012*dc37c87aSrobert    constexpr replace_copy_if_result<I, O>
1013*dc37c87aSrobert      replace_copy_if(I first, S last, O result, Pred pred, const T& new_value,
1014*dc37c87aSrobert                      Proj proj = {});                                                             // Since C++20
1015*dc37c87aSrobert
1016*dc37c87aSrobert  template<input_range R, class T, output_iterator<const T&> O, class Proj = identity,
1017*dc37c87aSrobert           indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
1018*dc37c87aSrobert    requires indirectly_copyable<iterator_t<R>, O>
1019*dc37c87aSrobert    constexpr replace_copy_if_result<borrowed_iterator_t<R>, O>
1020*dc37c87aSrobert      replace_copy_if(R&& r, O result, Pred pred, const T& new_value,
1021*dc37c87aSrobert                      Proj proj = {});                                                             // Since C++20
1022*dc37c87aSrobert
1023*dc37c87aSrobert  template<class I>
1024*dc37c87aSrobert    using prev_permutation_result = in_found_result<I>;                                            // Since C++20
1025*dc37c87aSrobert
1026*dc37c87aSrobert  template<bidirectional_iterator I, sentinel_for<I> S, class Comp = ranges::less,
1027*dc37c87aSrobert           class Proj = identity>
1028*dc37c87aSrobert    requires sortable<I, Comp, Proj>
1029*dc37c87aSrobert    constexpr ranges::prev_permutation_result<I>
1030*dc37c87aSrobert      ranges::prev_permutation(I first, S last, Comp comp = {}, Proj proj = {});                   // Since C++20
1031*dc37c87aSrobert
1032*dc37c87aSrobert  template<bidirectional_range R, class Comp = ranges::less,
1033*dc37c87aSrobert           class Proj = identity>
1034*dc37c87aSrobert    requires sortable<iterator_t<R>, Comp, Proj>
1035*dc37c87aSrobert    constexpr ranges::prev_permutation_result<borrowed_iterator_t<R>>
1036*dc37c87aSrobert      ranges::prev_permutation(R&& r, Comp comp = {}, Proj proj = {});                             // Since C++20
1037*dc37c87aSrobert
1038*dc37c87aSrobert  template<class I>
1039*dc37c87aSrobert    using next_permutation_result = in_found_result<I>;                                            // Since C++20
1040*dc37c87aSrobert
1041*dc37c87aSrobert  template<bidirectional_iterator I, sentinel_for<I> S, class Comp = ranges::less,
1042*dc37c87aSrobert           class Proj = identity>
1043*dc37c87aSrobert    requires sortable<I, Comp, Proj>
1044*dc37c87aSrobert    constexpr ranges::next_permutation_result<I>
1045*dc37c87aSrobert      ranges::next_permutation(I first, S last, Comp comp = {}, Proj proj = {});                   // Since C++20
1046*dc37c87aSrobert
1047*dc37c87aSrobert  template<bidirectional_range R, class Comp = ranges::less,
1048*dc37c87aSrobert           class Proj = identity>
1049*dc37c87aSrobert    requires sortable<iterator_t<R>, Comp, Proj>
1050*dc37c87aSrobert    constexpr ranges::next_permutation_result<borrowed_iterator_t<R>>
1051*dc37c87aSrobert      ranges::next_permutation(R&& r, Comp comp = {}, Proj proj = {});                             // Since C++20
1052*dc37c87aSrobert
1053dcb03dacSrobert}
1054dcb03dacSrobert
105546035553Spatricktemplate <class InputIterator, class Predicate>
105646035553Spatrick    constexpr bool     // constexpr in C++20
105746035553Spatrick    all_of(InputIterator first, InputIterator last, Predicate pred);
105846035553Spatrick
105946035553Spatricktemplate <class InputIterator, class Predicate>
106046035553Spatrick    constexpr bool     // constexpr in C++20
106146035553Spatrick    any_of(InputIterator first, InputIterator last, Predicate pred);
106246035553Spatrick
106346035553Spatricktemplate <class InputIterator, class Predicate>
106446035553Spatrick    constexpr bool     // constexpr in C++20
106546035553Spatrick    none_of(InputIterator first, InputIterator last, Predicate pred);
106646035553Spatrick
106746035553Spatricktemplate <class InputIterator, class Function>
106846035553Spatrick    constexpr Function          // constexpr in C++20
106946035553Spatrick    for_each(InputIterator first, InputIterator last, Function f);
107046035553Spatrick
107146035553Spatricktemplate<class InputIterator, class Size, class Function>
107246035553Spatrick    constexpr InputIterator     // constexpr in C++20
107346035553Spatrick    for_each_n(InputIterator first, Size n, Function f); // C++17
107446035553Spatrick
107546035553Spatricktemplate <class InputIterator, class T>
107646035553Spatrick    constexpr InputIterator     // constexpr in C++20
107746035553Spatrick    find(InputIterator first, InputIterator last, const T& value);
107846035553Spatrick
107946035553Spatricktemplate <class InputIterator, class Predicate>
108046035553Spatrick    constexpr InputIterator     // constexpr in C++20
108146035553Spatrick    find_if(InputIterator first, InputIterator last, Predicate pred);
108246035553Spatrick
108346035553Spatricktemplate<class InputIterator, class Predicate>
108476d0caaeSpatrick    constexpr InputIterator     // constexpr in C++20
108546035553Spatrick    find_if_not(InputIterator first, InputIterator last, Predicate pred);
108646035553Spatrick
108746035553Spatricktemplate <class ForwardIterator1, class ForwardIterator2>
108876d0caaeSpatrick    constexpr ForwardIterator1  // constexpr in C++20
108946035553Spatrick    find_end(ForwardIterator1 first1, ForwardIterator1 last1,
109046035553Spatrick             ForwardIterator2 first2, ForwardIterator2 last2);
109146035553Spatrick
109246035553Spatricktemplate <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
109376d0caaeSpatrick    constexpr ForwardIterator1  // constexpr in C++20
109446035553Spatrick    find_end(ForwardIterator1 first1, ForwardIterator1 last1,
109546035553Spatrick             ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
109646035553Spatrick
109746035553Spatricktemplate <class ForwardIterator1, class ForwardIterator2>
109846035553Spatrick    constexpr ForwardIterator1  // constexpr in C++20
109946035553Spatrick    find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
110046035553Spatrick                  ForwardIterator2 first2, ForwardIterator2 last2);
110146035553Spatrick
110246035553Spatricktemplate <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
110346035553Spatrick    constexpr ForwardIterator1  // constexpr in C++20
110446035553Spatrick    find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
110546035553Spatrick                  ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
110646035553Spatrick
110746035553Spatricktemplate <class ForwardIterator>
110846035553Spatrick    constexpr ForwardIterator   // constexpr in C++20
110946035553Spatrick    adjacent_find(ForwardIterator first, ForwardIterator last);
111046035553Spatrick
111146035553Spatricktemplate <class ForwardIterator, class BinaryPredicate>
111246035553Spatrick    constexpr ForwardIterator   // constexpr in C++20
111346035553Spatrick    adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
111446035553Spatrick
111546035553Spatricktemplate <class InputIterator, class T>
111646035553Spatrick    constexpr typename iterator_traits<InputIterator>::difference_type  // constexpr in C++20
111746035553Spatrick    count(InputIterator first, InputIterator last, const T& value);
111846035553Spatrick
111946035553Spatricktemplate <class InputIterator, class Predicate>
112046035553Spatrick    constexpr typename iterator_traits<InputIterator>::difference_type // constexpr in C++20
112146035553Spatrick    count_if(InputIterator first, InputIterator last, Predicate pred);
112246035553Spatrick
112346035553Spatricktemplate <class InputIterator1, class InputIterator2>
112446035553Spatrick    constexpr pair<InputIterator1, InputIterator2>   // constexpr in C++20
112546035553Spatrick    mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
112646035553Spatrick
112746035553Spatricktemplate <class InputIterator1, class InputIterator2>
112846035553Spatrick    constexpr pair<InputIterator1, InputIterator2>   // constexpr in C++20
112946035553Spatrick    mismatch(InputIterator1 first1, InputIterator1 last1,
113046035553Spatrick             InputIterator2 first2, InputIterator2 last2); // **C++14**
113146035553Spatrick
113246035553Spatricktemplate <class InputIterator1, class InputIterator2, class BinaryPredicate>
113346035553Spatrick    constexpr pair<InputIterator1, InputIterator2>   // constexpr in C++20
113446035553Spatrick    mismatch(InputIterator1 first1, InputIterator1 last1,
113546035553Spatrick             InputIterator2 first2, BinaryPredicate pred);
113646035553Spatrick
113746035553Spatricktemplate <class InputIterator1, class InputIterator2, class BinaryPredicate>
113846035553Spatrick    constexpr pair<InputIterator1, InputIterator2>   // constexpr in C++20
113946035553Spatrick    mismatch(InputIterator1 first1, InputIterator1 last1,
114046035553Spatrick             InputIterator2 first2, InputIterator2 last2,
114146035553Spatrick             BinaryPredicate pred); // **C++14**
114246035553Spatrick
114346035553Spatricktemplate <class InputIterator1, class InputIterator2>
114446035553Spatrick    constexpr bool      // constexpr in C++20
114546035553Spatrick    equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
114646035553Spatrick
114746035553Spatricktemplate <class InputIterator1, class InputIterator2>
114846035553Spatrick    constexpr bool      // constexpr in C++20
114946035553Spatrick    equal(InputIterator1 first1, InputIterator1 last1,
115046035553Spatrick          InputIterator2 first2, InputIterator2 last2); // **C++14**
115146035553Spatrick
115246035553Spatricktemplate <class InputIterator1, class InputIterator2, class BinaryPredicate>
115346035553Spatrick    constexpr bool      // constexpr in C++20
115446035553Spatrick    equal(InputIterator1 first1, InputIterator1 last1,
115546035553Spatrick          InputIterator2 first2, BinaryPredicate pred);
115646035553Spatrick
115746035553Spatricktemplate <class InputIterator1, class InputIterator2, class BinaryPredicate>
115846035553Spatrick    constexpr bool      // constexpr in C++20
115946035553Spatrick    equal(InputIterator1 first1, InputIterator1 last1,
116046035553Spatrick          InputIterator2 first2, InputIterator2 last2,
116146035553Spatrick          BinaryPredicate pred); // **C++14**
116246035553Spatrick
116346035553Spatricktemplate<class ForwardIterator1, class ForwardIterator2>
116446035553Spatrick    constexpr bool      // constexpr in C++20
116546035553Spatrick    is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
116646035553Spatrick                   ForwardIterator2 first2);
116746035553Spatrick
116846035553Spatricktemplate<class ForwardIterator1, class ForwardIterator2>
116946035553Spatrick    constexpr bool      // constexpr in C++20
117046035553Spatrick    is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
117146035553Spatrick                   ForwardIterator2 first2, ForwardIterator2 last2); // **C++14**
117246035553Spatrick
117346035553Spatricktemplate<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
117446035553Spatrick    constexpr bool      // constexpr in C++20
117546035553Spatrick    is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
117646035553Spatrick                   ForwardIterator2 first2, BinaryPredicate pred);
117746035553Spatrick
117846035553Spatricktemplate<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
117946035553Spatrick    constexpr bool      // constexpr in C++20
118046035553Spatrick    is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
118146035553Spatrick                   ForwardIterator2 first2, ForwardIterator2 last2,
118246035553Spatrick                   BinaryPredicate pred);  // **C++14**
118346035553Spatrick
118446035553Spatricktemplate <class ForwardIterator1, class ForwardIterator2>
118546035553Spatrick    constexpr ForwardIterator1      // constexpr in C++20
118646035553Spatrick    search(ForwardIterator1 first1, ForwardIterator1 last1,
118746035553Spatrick           ForwardIterator2 first2, ForwardIterator2 last2);
118846035553Spatrick
118946035553Spatricktemplate <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
119046035553Spatrick    constexpr ForwardIterator1      // constexpr in C++20
119146035553Spatrick    search(ForwardIterator1 first1, ForwardIterator1 last1,
119246035553Spatrick           ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
119346035553Spatrick
119446035553Spatricktemplate <class ForwardIterator, class Size, class T>
119546035553Spatrick    constexpr ForwardIterator       // constexpr in C++20
119646035553Spatrick    search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value);
119746035553Spatrick
119846035553Spatricktemplate <class ForwardIterator, class Size, class T, class BinaryPredicate>
119946035553Spatrick    constexpr ForwardIterator       // constexpr in C++20
120046035553Spatrick    search_n(ForwardIterator first, ForwardIterator last,
120146035553Spatrick             Size count, const T& value, BinaryPredicate pred);
120246035553Spatrick
120346035553Spatricktemplate <class InputIterator, class OutputIterator>
120446035553Spatrick    constexpr OutputIterator      // constexpr in C++20
120546035553Spatrick    copy(InputIterator first, InputIterator last, OutputIterator result);
120646035553Spatrick
120746035553Spatricktemplate<class InputIterator, class OutputIterator, class Predicate>
120846035553Spatrick    constexpr OutputIterator      // constexpr in C++20
120946035553Spatrick    copy_if(InputIterator first, InputIterator last,
121046035553Spatrick            OutputIterator result, Predicate pred);
121146035553Spatrick
121246035553Spatricktemplate<class InputIterator, class Size, class OutputIterator>
121346035553Spatrick    constexpr OutputIterator      // constexpr in C++20
121446035553Spatrick    copy_n(InputIterator first, Size n, OutputIterator result);
121546035553Spatrick
121646035553Spatricktemplate <class BidirectionalIterator1, class BidirectionalIterator2>
121746035553Spatrick    constexpr BidirectionalIterator2      // constexpr in C++20
121846035553Spatrick    copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last,
121946035553Spatrick                  BidirectionalIterator2 result);
122046035553Spatrick
1221*dc37c87aSrobert// [alg.move], move
1222*dc37c87aSroberttemplate<class InputIterator, class OutputIterator>
1223*dc37c87aSrobert    constexpr OutputIterator move(InputIterator first, InputIterator last,
1224*dc37c87aSrobert                                OutputIterator result);
1225*dc37c87aSrobert
1226*dc37c87aSroberttemplate<class BidirectionalIterator1, class BidirectionalIterator2>
1227*dc37c87aSrobert    constexpr BidirectionalIterator2
1228*dc37c87aSrobert    move_backward(BidirectionalIterator1 first, BidirectionalIterator1 last,
1229*dc37c87aSrobert                  BidirectionalIterator2 result);
1230*dc37c87aSrobert
123146035553Spatricktemplate <class ForwardIterator1, class ForwardIterator2>
123276d0caaeSpatrick    constexpr ForwardIterator2    // constexpr in C++20
123346035553Spatrick    swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2);
123446035553Spatrick
1235*dc37c87aSrobertnamespace ranges {
1236*dc37c87aSrobert    template<class I1, class I2>
1237*dc37c87aSrobert    using swap_ranges_result = in_in_result<I1, I2>;
1238*dc37c87aSrobert
1239*dc37c87aSroberttemplate<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2>
1240*dc37c87aSrobert        requires indirectly_swappable<I1, I2>
1241*dc37c87aSrobert    constexpr ranges::swap_ranges_result<I1, I2>
1242*dc37c87aSrobert        swap_ranges(I1 first1, S1 last1, I2 first2, S2 last2);
1243*dc37c87aSrobert
1244*dc37c87aSroberttemplate<input_range R1, input_range R2>
1245*dc37c87aSrobert        requires indirectly_swappable<iterator_t<R1>, iterator_t<R2>>
1246*dc37c87aSrobert    constexpr ranges::swap_ranges_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>>
1247*dc37c87aSrobert        swap_ranges(R1&& r1, R2&& r2);
1248*dc37c87aSrobert}
1249*dc37c87aSrobert
125046035553Spatricktemplate <class ForwardIterator1, class ForwardIterator2>
125176d0caaeSpatrick    constexpr void                // constexpr in C++20
125246035553Spatrick    iter_swap(ForwardIterator1 a, ForwardIterator2 b);
125346035553Spatrick
125446035553Spatricktemplate <class InputIterator, class OutputIterator, class UnaryOperation>
125546035553Spatrick    constexpr OutputIterator      // constexpr in C++20
125646035553Spatrick    transform(InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op);
125746035553Spatrick
125846035553Spatricktemplate <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation>
125946035553Spatrick    constexpr OutputIterator      // constexpr in C++20
126046035553Spatrick    transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2,
126146035553Spatrick              OutputIterator result, BinaryOperation binary_op);
126246035553Spatrick
126346035553Spatricktemplate <class ForwardIterator, class T>
126446035553Spatrick    constexpr void      // constexpr in C++20
126546035553Spatrick    replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value);
126646035553Spatrick
126746035553Spatricktemplate <class ForwardIterator, class Predicate, class T>
126846035553Spatrick    constexpr void      // constexpr in C++20
126946035553Spatrick    replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value);
127046035553Spatrick
127146035553Spatricktemplate <class InputIterator, class OutputIterator, class T>
127246035553Spatrick    constexpr OutputIterator      // constexpr in C++20
127346035553Spatrick    replace_copy(InputIterator first, InputIterator last, OutputIterator result,
127446035553Spatrick                 const T& old_value, const T& new_value);
127546035553Spatrick
127646035553Spatricktemplate <class InputIterator, class OutputIterator, class Predicate, class T>
127746035553Spatrick    constexpr OutputIterator      // constexpr in C++20
127846035553Spatrick    replace_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value);
127946035553Spatrick
128046035553Spatricktemplate <class ForwardIterator, class T>
128146035553Spatrick    constexpr void      // constexpr in C++20
128246035553Spatrick    fill(ForwardIterator first, ForwardIterator last, const T& value);
128346035553Spatrick
128446035553Spatricktemplate <class OutputIterator, class Size, class T>
128546035553Spatrick    constexpr OutputIterator      // constexpr in C++20
128646035553Spatrick    fill_n(OutputIterator first, Size n, const T& value);
128746035553Spatrick
128846035553Spatricktemplate <class ForwardIterator, class Generator>
128946035553Spatrick    constexpr void      // constexpr in C++20
129046035553Spatrick    generate(ForwardIterator first, ForwardIterator last, Generator gen);
129146035553Spatrick
129246035553Spatricktemplate <class OutputIterator, class Size, class Generator>
129346035553Spatrick    constexpr OutputIterator      // constexpr in C++20
129446035553Spatrick    generate_n(OutputIterator first, Size n, Generator gen);
129546035553Spatrick
129646035553Spatricktemplate <class ForwardIterator, class T>
129746035553Spatrick    constexpr ForwardIterator     // constexpr in C++20
129846035553Spatrick    remove(ForwardIterator first, ForwardIterator last, const T& value);
129946035553Spatrick
130046035553Spatricktemplate <class ForwardIterator, class Predicate>
130146035553Spatrick    constexpr ForwardIterator     // constexpr in C++20
130246035553Spatrick    remove_if(ForwardIterator first, ForwardIterator last, Predicate pred);
130346035553Spatrick
130446035553Spatricktemplate <class InputIterator, class OutputIterator, class T>
130546035553Spatrick    constexpr OutputIterator     // constexpr in C++20
130646035553Spatrick    remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value);
130746035553Spatrick
130846035553Spatricktemplate <class InputIterator, class OutputIterator, class Predicate>
130946035553Spatrick    constexpr OutputIterator     // constexpr in C++20
131046035553Spatrick    remove_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred);
131146035553Spatrick
131246035553Spatricktemplate <class ForwardIterator>
131376d0caaeSpatrick    constexpr ForwardIterator    // constexpr in C++20
131446035553Spatrick    unique(ForwardIterator first, ForwardIterator last);
131546035553Spatrick
131646035553Spatricktemplate <class ForwardIterator, class BinaryPredicate>
131776d0caaeSpatrick    constexpr ForwardIterator    // constexpr in C++20
131846035553Spatrick    unique(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
131946035553Spatrick
132046035553Spatricktemplate <class InputIterator, class OutputIterator>
132176d0caaeSpatrick    constexpr OutputIterator     // constexpr in C++20
132246035553Spatrick    unique_copy(InputIterator first, InputIterator last, OutputIterator result);
132346035553Spatrick
132446035553Spatricktemplate <class InputIterator, class OutputIterator, class BinaryPredicate>
132576d0caaeSpatrick    constexpr OutputIterator     // constexpr in C++20
132646035553Spatrick    unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate pred);
132746035553Spatrick
132846035553Spatricktemplate <class BidirectionalIterator>
132976d0caaeSpatrick    constexpr void               // constexpr in C++20
133046035553Spatrick    reverse(BidirectionalIterator first, BidirectionalIterator last);
133146035553Spatrick
133246035553Spatricktemplate <class BidirectionalIterator, class OutputIterator>
133346035553Spatrick    constexpr OutputIterator       // constexpr in C++20
133446035553Spatrick    reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result);
133546035553Spatrick
133646035553Spatricktemplate <class ForwardIterator>
133776d0caaeSpatrick    constexpr ForwardIterator      // constexpr in C++20
133846035553Spatrick    rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last);
133946035553Spatrick
134046035553Spatricktemplate <class ForwardIterator, class OutputIterator>
134176d0caaeSpatrick    constexpr OutputIterator       // constexpr in C++20
134246035553Spatrick    rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result);
134346035553Spatrick
134446035553Spatricktemplate <class RandomAccessIterator>
134546035553Spatrick    void
134646035553Spatrick    random_shuffle(RandomAccessIterator first, RandomAccessIterator last); // deprecated in C++14, removed in C++17
134746035553Spatrick
134846035553Spatricktemplate <class RandomAccessIterator, class RandomNumberGenerator>
134946035553Spatrick    void
135046035553Spatrick    random_shuffle(RandomAccessIterator first, RandomAccessIterator last,
135146035553Spatrick                   RandomNumberGenerator& rand);  // deprecated in C++14, removed in C++17
135246035553Spatrick
135346035553Spatricktemplate<class PopulationIterator, class SampleIterator,
135446035553Spatrick         class Distance, class UniformRandomBitGenerator>
135546035553Spatrick    SampleIterator sample(PopulationIterator first, PopulationIterator last,
135646035553Spatrick                          SampleIterator out, Distance n,
135746035553Spatrick                          UniformRandomBitGenerator&& g); // C++17
135846035553Spatrick
135946035553Spatricktemplate<class RandomAccessIterator, class UniformRandomNumberGenerator>
136046035553Spatrick    void shuffle(RandomAccessIterator first, RandomAccessIterator last,
136146035553Spatrick                 UniformRandomNumberGenerator&& g);
136246035553Spatrick
136376d0caaeSpatricktemplate<class ForwardIterator>
136476d0caaeSpatrick  constexpr ForwardIterator
136576d0caaeSpatrick    shift_left(ForwardIterator first, ForwardIterator last,
136676d0caaeSpatrick               typename iterator_traits<ForwardIterator>::difference_type n); // C++20
136776d0caaeSpatrick
136876d0caaeSpatricktemplate<class ForwardIterator>
136976d0caaeSpatrick  constexpr ForwardIterator
137076d0caaeSpatrick    shift_right(ForwardIterator first, ForwardIterator last,
137176d0caaeSpatrick                typename iterator_traits<ForwardIterator>::difference_type n); // C++20
137276d0caaeSpatrick
137346035553Spatricktemplate <class InputIterator, class Predicate>
137446035553Spatrick    constexpr bool  // constexpr in C++20
137546035553Spatrick    is_partitioned(InputIterator first, InputIterator last, Predicate pred);
137646035553Spatrick
137746035553Spatricktemplate <class ForwardIterator, class Predicate>
137876d0caaeSpatrick    constexpr ForwardIterator  // constexpr in C++20
137946035553Spatrick    partition(ForwardIterator first, ForwardIterator last, Predicate pred);
138046035553Spatrick
138146035553Spatricktemplate <class InputIterator, class OutputIterator1,
138246035553Spatrick          class OutputIterator2, class Predicate>
138346035553Spatrick    constexpr pair<OutputIterator1, OutputIterator2>   // constexpr in C++20
138446035553Spatrick    partition_copy(InputIterator first, InputIterator last,
138546035553Spatrick                   OutputIterator1 out_true, OutputIterator2 out_false,
138646035553Spatrick                   Predicate pred);
138746035553Spatrick
138846035553Spatricktemplate <class ForwardIterator, class Predicate>
138946035553Spatrick    ForwardIterator
139046035553Spatrick    stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred);
139146035553Spatrick
139246035553Spatricktemplate<class ForwardIterator, class Predicate>
139346035553Spatrick    constexpr ForwardIterator  // constexpr in C++20
139446035553Spatrick    partition_point(ForwardIterator first, ForwardIterator last, Predicate pred);
139546035553Spatrick
139646035553Spatricktemplate <class ForwardIterator>
139746035553Spatrick    constexpr bool  // constexpr in C++20
139846035553Spatrick    is_sorted(ForwardIterator first, ForwardIterator last);
139946035553Spatrick
140046035553Spatricktemplate <class ForwardIterator, class Compare>
140176d0caaeSpatrick    constexpr bool  // constexpr in C++20
140246035553Spatrick    is_sorted(ForwardIterator first, ForwardIterator last, Compare comp);
140346035553Spatrick
140446035553Spatricktemplate<class ForwardIterator>
140546035553Spatrick    constexpr ForwardIterator    // constexpr in C++20
140646035553Spatrick    is_sorted_until(ForwardIterator first, ForwardIterator last);
140746035553Spatrick
140846035553Spatricktemplate <class ForwardIterator, class Compare>
140946035553Spatrick    constexpr ForwardIterator    // constexpr in C++20
141046035553Spatrick    is_sorted_until(ForwardIterator first, ForwardIterator last, Compare comp);
141146035553Spatrick
141246035553Spatricktemplate <class RandomAccessIterator>
141376d0caaeSpatrick    constexpr void               // constexpr in C++20
141446035553Spatrick    sort(RandomAccessIterator first, RandomAccessIterator last);
141546035553Spatrick
141646035553Spatricktemplate <class RandomAccessIterator, class Compare>
141776d0caaeSpatrick    constexpr void               // constexpr in C++20
141846035553Spatrick    sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
141946035553Spatrick
142046035553Spatricktemplate <class RandomAccessIterator>
142146035553Spatrick    void
142246035553Spatrick    stable_sort(RandomAccessIterator first, RandomAccessIterator last);
142346035553Spatrick
142446035553Spatricktemplate <class RandomAccessIterator, class Compare>
142546035553Spatrick    void
142646035553Spatrick    stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
142746035553Spatrick
142846035553Spatricktemplate <class RandomAccessIterator>
142976d0caaeSpatrick    constexpr void                    // constexpr in C++20
143046035553Spatrick    partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last);
143146035553Spatrick
143246035553Spatricktemplate <class RandomAccessIterator, class Compare>
143376d0caaeSpatrick    constexpr void                    // constexpr in C++20
143446035553Spatrick    partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp);
143546035553Spatrick
143646035553Spatricktemplate <class InputIterator, class RandomAccessIterator>
143776d0caaeSpatrick    constexpr RandomAccessIterator    // constexpr in C++20
143846035553Spatrick    partial_sort_copy(InputIterator first, InputIterator last,
143946035553Spatrick                      RandomAccessIterator result_first, RandomAccessIterator result_last);
144046035553Spatrick
144146035553Spatricktemplate <class InputIterator, class RandomAccessIterator, class Compare>
144276d0caaeSpatrick    constexpr RandomAccessIterator    // constexpr in C++20
144346035553Spatrick    partial_sort_copy(InputIterator first, InputIterator last,
144446035553Spatrick                      RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp);
144546035553Spatrick
144646035553Spatricktemplate <class RandomAccessIterator>
144776d0caaeSpatrick    constexpr void                    // constexpr in C++20
144846035553Spatrick    nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last);
144946035553Spatrick
145046035553Spatricktemplate <class RandomAccessIterator, class Compare>
145176d0caaeSpatrick    constexpr void                    // constexpr in C++20
145246035553Spatrick    nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp);
145346035553Spatrick
145446035553Spatricktemplate <class ForwardIterator, class T>
145546035553Spatrick    constexpr ForwardIterator                         // constexpr in C++20
145646035553Spatrick    lower_bound(ForwardIterator first, ForwardIterator last, const T& value);
145746035553Spatrick
145846035553Spatricktemplate <class ForwardIterator, class T, class Compare>
145946035553Spatrick    constexpr ForwardIterator                         // constexpr in C++20
146046035553Spatrick    lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
146146035553Spatrick
146246035553Spatricktemplate <class ForwardIterator, class T>
146346035553Spatrick    constexpr ForwardIterator                         // constexpr in C++20
146446035553Spatrick    upper_bound(ForwardIterator first, ForwardIterator last, const T& value);
146546035553Spatrick
146646035553Spatricktemplate <class ForwardIterator, class T, class Compare>
146746035553Spatrick    constexpr ForwardIterator                         // constexpr in C++20
146846035553Spatrick    upper_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
146946035553Spatrick
147046035553Spatricktemplate <class ForwardIterator, class T>
147146035553Spatrick    constexpr pair<ForwardIterator, ForwardIterator>  // constexpr in C++20
147246035553Spatrick    equal_range(ForwardIterator first, ForwardIterator last, const T& value);
147346035553Spatrick
147446035553Spatricktemplate <class ForwardIterator, class T, class Compare>
147546035553Spatrick    constexpr pair<ForwardIterator, ForwardIterator>  // constexpr in C++20
147646035553Spatrick    equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
147746035553Spatrick
147846035553Spatricktemplate <class ForwardIterator, class T>
147946035553Spatrick    constexpr bool                                    // constexpr in C++20
148046035553Spatrick    binary_search(ForwardIterator first, ForwardIterator last, const T& value);
148146035553Spatrick
148246035553Spatricktemplate <class ForwardIterator, class T, class Compare>
148346035553Spatrick    constexpr bool                                    // constexpr in C++20
148446035553Spatrick    binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
148546035553Spatrick
148646035553Spatricktemplate <class InputIterator1, class InputIterator2, class OutputIterator>
148776d0caaeSpatrick    constexpr OutputIterator                          // constexpr in C++20
148846035553Spatrick    merge(InputIterator1 first1, InputIterator1 last1,
148946035553Spatrick          InputIterator2 first2, InputIterator2 last2, OutputIterator result);
149046035553Spatrick
149146035553Spatricktemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
149276d0caaeSpatrick    constexpr OutputIterator                          // constexpr in C++20
149346035553Spatrick    merge(InputIterator1 first1, InputIterator1 last1,
149446035553Spatrick          InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
149546035553Spatrick
149646035553Spatricktemplate <class BidirectionalIterator>
149746035553Spatrick    void
149846035553Spatrick    inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last);
149946035553Spatrick
150046035553Spatricktemplate <class BidirectionalIterator, class Compare>
150146035553Spatrick    void
150246035553Spatrick    inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp);
150346035553Spatrick
150446035553Spatricktemplate <class InputIterator1, class InputIterator2>
150546035553Spatrick    constexpr bool                                    // constexpr in C++20
150646035553Spatrick    includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
150746035553Spatrick
150846035553Spatricktemplate <class InputIterator1, class InputIterator2, class Compare>
150946035553Spatrick    constexpr bool                                    // constexpr in C++20
151046035553Spatrick    includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp);
151146035553Spatrick
151246035553Spatricktemplate <class InputIterator1, class InputIterator2, class OutputIterator>
151376d0caaeSpatrick    constexpr OutputIterator                          // constexpr in C++20
151446035553Spatrick    set_union(InputIterator1 first1, InputIterator1 last1,
151546035553Spatrick              InputIterator2 first2, InputIterator2 last2, OutputIterator result);
151646035553Spatrick
151746035553Spatricktemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
151876d0caaeSpatrick    constexpr OutputIterator                          // constexpr in C++20
151946035553Spatrick    set_union(InputIterator1 first1, InputIterator1 last1,
152046035553Spatrick              InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
152146035553Spatrick
152246035553Spatricktemplate <class InputIterator1, class InputIterator2, class OutputIterator>
152346035553Spatrick    constexpr OutputIterator                         // constexpr in C++20
152446035553Spatrick    set_intersection(InputIterator1 first1, InputIterator1 last1,
152546035553Spatrick                     InputIterator2 first2, InputIterator2 last2, OutputIterator result);
152646035553Spatrick
152746035553Spatricktemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
152846035553Spatrick    constexpr OutputIterator                         // constexpr in C++20
152946035553Spatrick    set_intersection(InputIterator1 first1, InputIterator1 last1,
153046035553Spatrick                     InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
153146035553Spatrick
153246035553Spatricktemplate <class InputIterator1, class InputIterator2, class OutputIterator>
153376d0caaeSpatrick    constexpr OutputIterator                         // constexpr in C++20
153446035553Spatrick    set_difference(InputIterator1 first1, InputIterator1 last1,
153546035553Spatrick                   InputIterator2 first2, InputIterator2 last2, OutputIterator result);
153646035553Spatrick
153746035553Spatricktemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
153876d0caaeSpatrick    constexpr OutputIterator                         // constexpr in C++20
153946035553Spatrick    set_difference(InputIterator1 first1, InputIterator1 last1,
154046035553Spatrick                   InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
154146035553Spatrick
154246035553Spatricktemplate <class InputIterator1, class InputIterator2, class OutputIterator>
154376d0caaeSpatrick    constexpr OutputIterator                         // constexpr in C++20
154446035553Spatrick    set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
154546035553Spatrick                             InputIterator2 first2, InputIterator2 last2, OutputIterator result);
154646035553Spatrick
154746035553Spatricktemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
154876d0caaeSpatrick    constexpr OutputIterator                         // constexpr in C++20
154946035553Spatrick    set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
155046035553Spatrick                             InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
155146035553Spatrick
155246035553Spatricktemplate <class RandomAccessIterator>
155376d0caaeSpatrick    constexpr void                                   // constexpr in C++20
155446035553Spatrick    push_heap(RandomAccessIterator first, RandomAccessIterator last);
155546035553Spatrick
155646035553Spatricktemplate <class RandomAccessIterator, class Compare>
155776d0caaeSpatrick    constexpr void                                   // constexpr in C++20
155846035553Spatrick    push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
155946035553Spatrick
156046035553Spatricktemplate <class RandomAccessIterator>
156176d0caaeSpatrick    constexpr void                                   // constexpr in C++20
156246035553Spatrick    pop_heap(RandomAccessIterator first, RandomAccessIterator last);
156346035553Spatrick
156446035553Spatricktemplate <class RandomAccessIterator, class Compare>
156576d0caaeSpatrick    constexpr void                                   // constexpr in C++20
156646035553Spatrick    pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
156746035553Spatrick
156846035553Spatricktemplate <class RandomAccessIterator>
156976d0caaeSpatrick    constexpr void                                   // constexpr in C++20
157046035553Spatrick    make_heap(RandomAccessIterator first, RandomAccessIterator last);
157146035553Spatrick
157246035553Spatricktemplate <class RandomAccessIterator, class Compare>
157376d0caaeSpatrick    constexpr void                                   // constexpr in C++20
157446035553Spatrick    make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
157546035553Spatrick
157646035553Spatricktemplate <class RandomAccessIterator>
157776d0caaeSpatrick    constexpr void                                   // constexpr in C++20
157846035553Spatrick    sort_heap(RandomAccessIterator first, RandomAccessIterator last);
157946035553Spatrick
158046035553Spatricktemplate <class RandomAccessIterator, class Compare>
158176d0caaeSpatrick    constexpr void                                   // constexpr in C++20
158246035553Spatrick    sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
158346035553Spatrick
158446035553Spatricktemplate <class RandomAccessIterator>
158546035553Spatrick    constexpr bool   // constexpr in C++20
158646035553Spatrick    is_heap(RandomAccessIterator first, RandomAccessiterator last);
158746035553Spatrick
158846035553Spatricktemplate <class RandomAccessIterator, class Compare>
158946035553Spatrick    constexpr bool   // constexpr in C++20
159046035553Spatrick    is_heap(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
159146035553Spatrick
159246035553Spatricktemplate <class RandomAccessIterator>
159346035553Spatrick    constexpr RandomAccessIterator   // constexpr in C++20
159446035553Spatrick    is_heap_until(RandomAccessIterator first, RandomAccessiterator last);
159546035553Spatrick
159646035553Spatricktemplate <class RandomAccessIterator, class Compare>
159746035553Spatrick    constexpr RandomAccessIterator   // constexpr in C++20
159846035553Spatrick    is_heap_until(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
159946035553Spatrick
160046035553Spatricktemplate <class ForwardIterator>
160176d0caaeSpatrick    constexpr ForwardIterator        // constexpr in C++14
160276d0caaeSpatrick    min_element(ForwardIterator first, ForwardIterator last);
160346035553Spatrick
160446035553Spatricktemplate <class ForwardIterator, class Compare>
160576d0caaeSpatrick    constexpr ForwardIterator        // constexpr in C++14
160676d0caaeSpatrick    min_element(ForwardIterator first, ForwardIterator last, Compare comp);
160746035553Spatrick
160846035553Spatricktemplate <class T>
160976d0caaeSpatrick    constexpr const T&               // constexpr in C++14
161076d0caaeSpatrick    min(const T& a, const T& b);
161146035553Spatrick
161246035553Spatricktemplate <class T, class Compare>
161376d0caaeSpatrick    constexpr const T&               // constexpr in C++14
161476d0caaeSpatrick    min(const T& a, const T& b, Compare comp);
161546035553Spatrick
161646035553Spatricktemplate<class T>
161776d0caaeSpatrick    constexpr T                      // constexpr in C++14
161876d0caaeSpatrick    min(initializer_list<T> t);
161946035553Spatrick
162046035553Spatricktemplate<class T, class Compare>
162176d0caaeSpatrick    constexpr T                      // constexpr in C++14
162276d0caaeSpatrick    min(initializer_list<T> t, Compare comp);
162346035553Spatrick
162446035553Spatricktemplate<class T>
162546035553Spatrick    constexpr const T& clamp(const T& v, const T& lo, const T& hi);               // C++17
162646035553Spatrick
162746035553Spatricktemplate<class T, class Compare>
162846035553Spatrick    constexpr const T& clamp(const T& v, const T& lo, const T& hi, Compare comp); // C++17
162946035553Spatrick
163046035553Spatricktemplate <class ForwardIterator>
163176d0caaeSpatrick    constexpr ForwardIterator        // constexpr in C++14
163276d0caaeSpatrick    max_element(ForwardIterator first, ForwardIterator last);
163346035553Spatrick
163446035553Spatricktemplate <class ForwardIterator, class Compare>
163576d0caaeSpatrick    constexpr ForwardIterator        // constexpr in C++14
163676d0caaeSpatrick    max_element(ForwardIterator first, ForwardIterator last, Compare comp);
163746035553Spatrick
163846035553Spatricktemplate <class T>
163976d0caaeSpatrick    constexpr const T&               // constexpr in C++14
164076d0caaeSpatrick    max(const T& a, const T& b);
164146035553Spatrick
164246035553Spatricktemplate <class T, class Compare>
164376d0caaeSpatrick    constexpr const T&               // constexpr in C++14
164476d0caaeSpatrick    max(const T& a, const T& b, Compare comp);
164546035553Spatrick
164646035553Spatricktemplate<class T>
164776d0caaeSpatrick    constexpr T                      // constexpr in C++14
164876d0caaeSpatrick    max(initializer_list<T> t);
164946035553Spatrick
165046035553Spatricktemplate<class T, class Compare>
165176d0caaeSpatrick    constexpr T                      // constexpr in C++14
165276d0caaeSpatrick    max(initializer_list<T> t, Compare comp);
165346035553Spatrick
165446035553Spatricktemplate<class ForwardIterator>
165576d0caaeSpatrick    constexpr pair<ForwardIterator, ForwardIterator>  // constexpr in C++14
165676d0caaeSpatrick    minmax_element(ForwardIterator first, ForwardIterator last);
165746035553Spatrick
165846035553Spatricktemplate<class ForwardIterator, class Compare>
165976d0caaeSpatrick    constexpr pair<ForwardIterator, ForwardIterator>  // constexpr in C++14
166076d0caaeSpatrick    minmax_element(ForwardIterator first, ForwardIterator last, Compare comp);
166146035553Spatrick
166246035553Spatricktemplate<class T>
166376d0caaeSpatrick    constexpr pair<const T&, const T&>  // constexpr in C++14
166476d0caaeSpatrick    minmax(const T& a, const T& b);
166546035553Spatrick
166646035553Spatricktemplate<class T, class Compare>
166776d0caaeSpatrick    constexpr pair<const T&, const T&>  // constexpr in C++14
166876d0caaeSpatrick    minmax(const T& a, const T& b, Compare comp);
166946035553Spatrick
167046035553Spatricktemplate<class T>
167176d0caaeSpatrick    constexpr pair<T, T>                // constexpr in C++14
167276d0caaeSpatrick    minmax(initializer_list<T> t);
167346035553Spatrick
167446035553Spatricktemplate<class T, class Compare>
167576d0caaeSpatrick    constexpr pair<T, T>                // constexpr in C++14
167676d0caaeSpatrick    minmax(initializer_list<T> t, Compare comp);
167746035553Spatrick
167846035553Spatricktemplate <class InputIterator1, class InputIterator2>
167946035553Spatrick    constexpr bool     // constexpr in C++20
168046035553Spatrick    lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
168146035553Spatrick
168246035553Spatricktemplate <class InputIterator1, class InputIterator2, class Compare>
168346035553Spatrick    constexpr bool     // constexpr in C++20
168446035553Spatrick    lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
168546035553Spatrick                            InputIterator2 first2, InputIterator2 last2, Compare comp);
168646035553Spatrick
168746035553Spatricktemplate <class BidirectionalIterator>
168876d0caaeSpatrick    constexpr bool     // constexpr in C++20
168946035553Spatrick    next_permutation(BidirectionalIterator first, BidirectionalIterator last);
169046035553Spatrick
169146035553Spatricktemplate <class BidirectionalIterator, class Compare>
169276d0caaeSpatrick    constexpr bool     // constexpr in C++20
169346035553Spatrick    next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
169446035553Spatrick
169546035553Spatricktemplate <class BidirectionalIterator>
169676d0caaeSpatrick    constexpr bool     // constexpr in C++20
169746035553Spatrick    prev_permutation(BidirectionalIterator first, BidirectionalIterator last);
169846035553Spatrick
169946035553Spatricktemplate <class BidirectionalIterator, class Compare>
170076d0caaeSpatrick    constexpr bool     // constexpr in C++20
170146035553Spatrick    prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
170246035553Spatrick}  // std
170346035553Spatrick
170446035553Spatrick*/
170546035553Spatrick
1706*dc37c87aSrobert#include <__assert> // all public C++ headers provide the assertion handler
170746035553Spatrick#include <__config>
170876d0caaeSpatrick#include <__debug>
170976d0caaeSpatrick#include <cstddef>
171076d0caaeSpatrick#include <type_traits>
171146035553Spatrick#include <version>
171246035553Spatrick
171376d0caaeSpatrick#include <__algorithm/adjacent_find.h>
171476d0caaeSpatrick#include <__algorithm/all_of.h>
171576d0caaeSpatrick#include <__algorithm/any_of.h>
171676d0caaeSpatrick#include <__algorithm/binary_search.h>
171776d0caaeSpatrick#include <__algorithm/clamp.h>
171876d0caaeSpatrick#include <__algorithm/comp.h>
171976d0caaeSpatrick#include <__algorithm/comp_ref_type.h>
172076d0caaeSpatrick#include <__algorithm/copy.h>
172176d0caaeSpatrick#include <__algorithm/copy_backward.h>
172276d0caaeSpatrick#include <__algorithm/copy_if.h>
172376d0caaeSpatrick#include <__algorithm/copy_n.h>
172476d0caaeSpatrick#include <__algorithm/count.h>
172576d0caaeSpatrick#include <__algorithm/count_if.h>
172676d0caaeSpatrick#include <__algorithm/equal.h>
172776d0caaeSpatrick#include <__algorithm/equal_range.h>
172876d0caaeSpatrick#include <__algorithm/fill.h>
1729*dc37c87aSrobert#include <__algorithm/fill_n.h>
173076d0caaeSpatrick#include <__algorithm/find.h>
173176d0caaeSpatrick#include <__algorithm/find_end.h>
173276d0caaeSpatrick#include <__algorithm/find_first_of.h>
173376d0caaeSpatrick#include <__algorithm/find_if.h>
173476d0caaeSpatrick#include <__algorithm/find_if_not.h>
173576d0caaeSpatrick#include <__algorithm/for_each.h>
173676d0caaeSpatrick#include <__algorithm/for_each_n.h>
173776d0caaeSpatrick#include <__algorithm/generate.h>
1738*dc37c87aSrobert#include <__algorithm/generate_n.h>
173976d0caaeSpatrick#include <__algorithm/half_positive.h>
1740*dc37c87aSrobert#include <__algorithm/in_found_result.h>
1741*dc37c87aSrobert#include <__algorithm/in_fun_result.h>
1742*dc37c87aSrobert#include <__algorithm/in_in_out_result.h>
1743*dc37c87aSrobert#include <__algorithm/in_in_result.h>
1744*dc37c87aSrobert#include <__algorithm/in_out_out_result.h>
1745*dc37c87aSrobert#include <__algorithm/in_out_result.h>
174676d0caaeSpatrick#include <__algorithm/includes.h>
174776d0caaeSpatrick#include <__algorithm/inplace_merge.h>
174876d0caaeSpatrick#include <__algorithm/is_heap.h>
174976d0caaeSpatrick#include <__algorithm/is_heap_until.h>
175076d0caaeSpatrick#include <__algorithm/is_partitioned.h>
175176d0caaeSpatrick#include <__algorithm/is_permutation.h>
175276d0caaeSpatrick#include <__algorithm/is_sorted.h>
175376d0caaeSpatrick#include <__algorithm/is_sorted_until.h>
175476d0caaeSpatrick#include <__algorithm/iter_swap.h>
175576d0caaeSpatrick#include <__algorithm/lexicographical_compare.h>
175676d0caaeSpatrick#include <__algorithm/lower_bound.h>
175776d0caaeSpatrick#include <__algorithm/make_heap.h>
175876d0caaeSpatrick#include <__algorithm/max.h>
175976d0caaeSpatrick#include <__algorithm/max_element.h>
176076d0caaeSpatrick#include <__algorithm/merge.h>
176176d0caaeSpatrick#include <__algorithm/min.h>
176276d0caaeSpatrick#include <__algorithm/min_element.h>
1763*dc37c87aSrobert#include <__algorithm/min_max_result.h>
176476d0caaeSpatrick#include <__algorithm/minmax.h>
176576d0caaeSpatrick#include <__algorithm/minmax_element.h>
176676d0caaeSpatrick#include <__algorithm/mismatch.h>
176776d0caaeSpatrick#include <__algorithm/move.h>
176876d0caaeSpatrick#include <__algorithm/move_backward.h>
176976d0caaeSpatrick#include <__algorithm/next_permutation.h>
177076d0caaeSpatrick#include <__algorithm/none_of.h>
177176d0caaeSpatrick#include <__algorithm/nth_element.h>
177276d0caaeSpatrick#include <__algorithm/partial_sort.h>
177376d0caaeSpatrick#include <__algorithm/partial_sort_copy.h>
177476d0caaeSpatrick#include <__algorithm/partition.h>
177576d0caaeSpatrick#include <__algorithm/partition_copy.h>
177676d0caaeSpatrick#include <__algorithm/partition_point.h>
177776d0caaeSpatrick#include <__algorithm/pop_heap.h>
177876d0caaeSpatrick#include <__algorithm/prev_permutation.h>
177976d0caaeSpatrick#include <__algorithm/push_heap.h>
1780*dc37c87aSrobert#include <__algorithm/ranges_adjacent_find.h>
1781*dc37c87aSrobert#include <__algorithm/ranges_all_of.h>
1782*dc37c87aSrobert#include <__algorithm/ranges_any_of.h>
1783*dc37c87aSrobert#include <__algorithm/ranges_binary_search.h>
1784*dc37c87aSrobert#include <__algorithm/ranges_clamp.h>
1785*dc37c87aSrobert#include <__algorithm/ranges_copy.h>
1786*dc37c87aSrobert#include <__algorithm/ranges_copy_backward.h>
1787*dc37c87aSrobert#include <__algorithm/ranges_copy_if.h>
1788*dc37c87aSrobert#include <__algorithm/ranges_copy_n.h>
1789*dc37c87aSrobert#include <__algorithm/ranges_count.h>
1790*dc37c87aSrobert#include <__algorithm/ranges_count_if.h>
1791*dc37c87aSrobert#include <__algorithm/ranges_equal.h>
1792*dc37c87aSrobert#include <__algorithm/ranges_equal_range.h>
1793*dc37c87aSrobert#include <__algorithm/ranges_fill.h>
1794*dc37c87aSrobert#include <__algorithm/ranges_fill_n.h>
1795dcb03dacSrobert#include <__algorithm/ranges_find.h>
1796*dc37c87aSrobert#include <__algorithm/ranges_find_end.h>
1797*dc37c87aSrobert#include <__algorithm/ranges_find_first_of.h>
1798dcb03dacSrobert#include <__algorithm/ranges_find_if.h>
1799dcb03dacSrobert#include <__algorithm/ranges_find_if_not.h>
1800*dc37c87aSrobert#include <__algorithm/ranges_for_each.h>
1801*dc37c87aSrobert#include <__algorithm/ranges_for_each_n.h>
1802*dc37c87aSrobert#include <__algorithm/ranges_generate.h>
1803*dc37c87aSrobert#include <__algorithm/ranges_generate_n.h>
1804*dc37c87aSrobert#include <__algorithm/ranges_includes.h>
1805*dc37c87aSrobert#include <__algorithm/ranges_inplace_merge.h>
1806*dc37c87aSrobert#include <__algorithm/ranges_is_heap.h>
1807*dc37c87aSrobert#include <__algorithm/ranges_is_heap_until.h>
1808*dc37c87aSrobert#include <__algorithm/ranges_is_partitioned.h>
1809*dc37c87aSrobert#include <__algorithm/ranges_is_permutation.h>
1810*dc37c87aSrobert#include <__algorithm/ranges_is_sorted.h>
1811*dc37c87aSrobert#include <__algorithm/ranges_is_sorted_until.h>
1812*dc37c87aSrobert#include <__algorithm/ranges_lexicographical_compare.h>
1813*dc37c87aSrobert#include <__algorithm/ranges_lower_bound.h>
1814*dc37c87aSrobert#include <__algorithm/ranges_make_heap.h>
1815*dc37c87aSrobert#include <__algorithm/ranges_max.h>
1816*dc37c87aSrobert#include <__algorithm/ranges_max_element.h>
1817*dc37c87aSrobert#include <__algorithm/ranges_merge.h>
1818*dc37c87aSrobert#include <__algorithm/ranges_min.h>
1819*dc37c87aSrobert#include <__algorithm/ranges_min_element.h>
1820*dc37c87aSrobert#include <__algorithm/ranges_minmax.h>
1821*dc37c87aSrobert#include <__algorithm/ranges_minmax_element.h>
1822*dc37c87aSrobert#include <__algorithm/ranges_mismatch.h>
1823*dc37c87aSrobert#include <__algorithm/ranges_move.h>
1824*dc37c87aSrobert#include <__algorithm/ranges_move_backward.h>
1825*dc37c87aSrobert#include <__algorithm/ranges_next_permutation.h>
1826*dc37c87aSrobert#include <__algorithm/ranges_none_of.h>
1827*dc37c87aSrobert#include <__algorithm/ranges_nth_element.h>
1828*dc37c87aSrobert#include <__algorithm/ranges_partial_sort.h>
1829*dc37c87aSrobert#include <__algorithm/ranges_partial_sort_copy.h>
1830*dc37c87aSrobert#include <__algorithm/ranges_partition.h>
1831*dc37c87aSrobert#include <__algorithm/ranges_partition_copy.h>
1832*dc37c87aSrobert#include <__algorithm/ranges_partition_point.h>
1833*dc37c87aSrobert#include <__algorithm/ranges_pop_heap.h>
1834*dc37c87aSrobert#include <__algorithm/ranges_prev_permutation.h>
1835*dc37c87aSrobert#include <__algorithm/ranges_push_heap.h>
1836*dc37c87aSrobert#include <__algorithm/ranges_remove.h>
1837*dc37c87aSrobert#include <__algorithm/ranges_remove_copy.h>
1838*dc37c87aSrobert#include <__algorithm/ranges_remove_copy_if.h>
1839*dc37c87aSrobert#include <__algorithm/ranges_remove_if.h>
1840*dc37c87aSrobert#include <__algorithm/ranges_replace.h>
1841*dc37c87aSrobert#include <__algorithm/ranges_replace_copy.h>
1842*dc37c87aSrobert#include <__algorithm/ranges_replace_copy_if.h>
1843*dc37c87aSrobert#include <__algorithm/ranges_replace_if.h>
1844*dc37c87aSrobert#include <__algorithm/ranges_reverse.h>
1845*dc37c87aSrobert#include <__algorithm/ranges_reverse_copy.h>
1846*dc37c87aSrobert#include <__algorithm/ranges_rotate.h>
1847*dc37c87aSrobert#include <__algorithm/ranges_rotate_copy.h>
1848*dc37c87aSrobert#include <__algorithm/ranges_sample.h>
1849*dc37c87aSrobert#include <__algorithm/ranges_search.h>
1850*dc37c87aSrobert#include <__algorithm/ranges_search_n.h>
1851*dc37c87aSrobert#include <__algorithm/ranges_set_difference.h>
1852*dc37c87aSrobert#include <__algorithm/ranges_set_intersection.h>
1853*dc37c87aSrobert#include <__algorithm/ranges_set_symmetric_difference.h>
1854*dc37c87aSrobert#include <__algorithm/ranges_set_union.h>
1855*dc37c87aSrobert#include <__algorithm/ranges_shuffle.h>
1856*dc37c87aSrobert#include <__algorithm/ranges_sort.h>
1857*dc37c87aSrobert#include <__algorithm/ranges_sort_heap.h>
1858*dc37c87aSrobert#include <__algorithm/ranges_stable_partition.h>
1859*dc37c87aSrobert#include <__algorithm/ranges_stable_sort.h>
1860*dc37c87aSrobert#include <__algorithm/ranges_swap_ranges.h>
1861*dc37c87aSrobert#include <__algorithm/ranges_transform.h>
1862*dc37c87aSrobert#include <__algorithm/ranges_unique.h>
1863*dc37c87aSrobert#include <__algorithm/ranges_unique_copy.h>
1864*dc37c87aSrobert#include <__algorithm/ranges_upper_bound.h>
186576d0caaeSpatrick#include <__algorithm/remove.h>
186676d0caaeSpatrick#include <__algorithm/remove_copy.h>
186776d0caaeSpatrick#include <__algorithm/remove_copy_if.h>
186876d0caaeSpatrick#include <__algorithm/remove_if.h>
186976d0caaeSpatrick#include <__algorithm/replace.h>
187076d0caaeSpatrick#include <__algorithm/replace_copy.h>
187176d0caaeSpatrick#include <__algorithm/replace_copy_if.h>
187276d0caaeSpatrick#include <__algorithm/replace_if.h>
187376d0caaeSpatrick#include <__algorithm/reverse.h>
187476d0caaeSpatrick#include <__algorithm/reverse_copy.h>
187576d0caaeSpatrick#include <__algorithm/rotate.h>
187676d0caaeSpatrick#include <__algorithm/rotate_copy.h>
187776d0caaeSpatrick#include <__algorithm/sample.h>
187876d0caaeSpatrick#include <__algorithm/search.h>
187976d0caaeSpatrick#include <__algorithm/search_n.h>
188076d0caaeSpatrick#include <__algorithm/set_difference.h>
188176d0caaeSpatrick#include <__algorithm/set_intersection.h>
188276d0caaeSpatrick#include <__algorithm/set_symmetric_difference.h>
188376d0caaeSpatrick#include <__algorithm/set_union.h>
188476d0caaeSpatrick#include <__algorithm/shift_left.h>
188576d0caaeSpatrick#include <__algorithm/shift_right.h>
188676d0caaeSpatrick#include <__algorithm/shuffle.h>
188776d0caaeSpatrick#include <__algorithm/sift_down.h>
188876d0caaeSpatrick#include <__algorithm/sort.h>
188976d0caaeSpatrick#include <__algorithm/sort_heap.h>
189076d0caaeSpatrick#include <__algorithm/stable_partition.h>
189176d0caaeSpatrick#include <__algorithm/stable_sort.h>
189276d0caaeSpatrick#include <__algorithm/swap_ranges.h>
189376d0caaeSpatrick#include <__algorithm/transform.h>
189476d0caaeSpatrick#include <__algorithm/unique.h>
1895*dc37c87aSrobert#include <__algorithm/unique_copy.h>
189676d0caaeSpatrick#include <__algorithm/unwrap_iter.h>
189776d0caaeSpatrick#include <__algorithm/upper_bound.h>
189846035553Spatrick
1899*dc37c87aSrobert// standard-mandated includes
1900*dc37c87aSrobert
1901*dc37c87aSrobert// [algorithm.syn]
1902*dc37c87aSrobert#include <initializer_list>
1903*dc37c87aSrobert
190446035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
190546035553Spatrick#  pragma GCC system_header
190646035553Spatrick#endif
190746035553Spatrick
190846035553Spatrick#if defined(_LIBCPP_HAS_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17
190946035553Spatrick#  include <__pstl_algorithm>
191046035553Spatrick#endif
191146035553Spatrick
1912*dc37c87aSrobert#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17
1913*dc37c87aSrobert#  include <chrono>
1914*dc37c87aSrobert#endif
1915*dc37c87aSrobert
1916*dc37c87aSrobert#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
1917*dc37c87aSrobert#  include <atomic>
1918*dc37c87aSrobert#  include <concepts>
1919*dc37c87aSrobert#  include <cstring>
1920*dc37c87aSrobert#  include <iterator>
1921*dc37c87aSrobert#  include <memory>
1922*dc37c87aSrobert#  include <stdexcept>
1923*dc37c87aSrobert#  include <utility>
1924*dc37c87aSrobert#endif
1925*dc37c87aSrobert
192646035553Spatrick#endif // _LIBCPP_ALGORITHM
1927