1*6777b538SAndroid Build Coastguard Worker // Copyright 2020 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_RANGES_ALGORITHM_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_RANGES_ALGORITHM_H_
7*6777b538SAndroid Build Coastguard Worker
8*6777b538SAndroid Build Coastguard Worker #include <algorithm>
9*6777b538SAndroid Build Coastguard Worker #include <functional>
10*6777b538SAndroid Build Coastguard Worker #include <initializer_list>
11*6777b538SAndroid Build Coastguard Worker #include <iterator>
12*6777b538SAndroid Build Coastguard Worker #include <type_traits>
13*6777b538SAndroid Build Coastguard Worker #include <utility>
14*6777b538SAndroid Build Coastguard Worker
15*6777b538SAndroid Build Coastguard Worker #include "base/check.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/compiler_specific.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr_exclusion.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/ranges/functional.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/ranges/ranges.h"
20*6777b538SAndroid Build Coastguard Worker
21*6777b538SAndroid Build Coastguard Worker namespace base {
22*6777b538SAndroid Build Coastguard Worker
23*6777b538SAndroid Build Coastguard Worker namespace internal {
24*6777b538SAndroid Build Coastguard Worker
25*6777b538SAndroid Build Coastguard Worker // Returns a transformed version of the unary predicate `pred` applying `proj`
26*6777b538SAndroid Build Coastguard Worker // to its argument before invoking `pred` on it.
27*6777b538SAndroid Build Coastguard Worker // Ensures that the return type of `invoke(pred, ...)` is convertible to bool.
28*6777b538SAndroid Build Coastguard Worker template <typename Pred, typename Proj>
ProjectedUnaryPredicate(Pred & pred,Proj & proj)29*6777b538SAndroid Build Coastguard Worker constexpr auto ProjectedUnaryPredicate(Pred& pred, Proj& proj) noexcept {
30*6777b538SAndroid Build Coastguard Worker return [&pred, &proj](auto&& arg) -> bool {
31*6777b538SAndroid Build Coastguard Worker return std::invoke(pred,
32*6777b538SAndroid Build Coastguard Worker std::invoke(proj, std::forward<decltype(arg)>(arg)));
33*6777b538SAndroid Build Coastguard Worker };
34*6777b538SAndroid Build Coastguard Worker }
35*6777b538SAndroid Build Coastguard Worker
36*6777b538SAndroid Build Coastguard Worker // Returns a transformed version of the binary predicate `pred` applying `proj1`
37*6777b538SAndroid Build Coastguard Worker // and `proj2` to its arguments before invoking `pred` on them.
38*6777b538SAndroid Build Coastguard Worker //
39*6777b538SAndroid Build Coastguard Worker // Provides an opt-in to considers all four permutations of projections and
40*6777b538SAndroid Build Coastguard Worker // argument types. This is sometimes necessary to allow usage with legacy
41*6777b538SAndroid Build Coastguard Worker // non-ranges std:: algorithms that don't support projections.
42*6777b538SAndroid Build Coastguard Worker //
43*6777b538SAndroid Build Coastguard Worker // These permutations are assigned different priorities to break ambiguities in
44*6777b538SAndroid Build Coastguard Worker // case several permutations are possible, e.g. when Proj1 and Proj2 are the
45*6777b538SAndroid Build Coastguard Worker // same type.
46*6777b538SAndroid Build Coastguard Worker //
47*6777b538SAndroid Build Coastguard Worker // Note that even when opting in to using all permutations of projections,
48*6777b538SAndroid Build Coastguard Worker // calling code should still ensure that the canonical mapping of {Proj1, Proj2}
49*6777b538SAndroid Build Coastguard Worker // to {LHS, RHS} compiles for all members of the range. This can be done by
50*6777b538SAndroid Build Coastguard Worker // adding the following constraint:
51*6777b538SAndroid Build Coastguard Worker //
52*6777b538SAndroid Build Coastguard Worker // typename =
53*6777b538SAndroid Build Coastguard Worker // std::indirect_result_t<Pred&,
54*6777b538SAndroid Build Coastguard Worker // std::projected<iterator_t<Range1>, Proj1>,
55*6777b538SAndroid Build Coastguard Worker // std::projected<iterator_t<Range2>, Proj2>>
56*6777b538SAndroid Build Coastguard Worker //
57*6777b538SAndroid Build Coastguard Worker // Ensures that the return type of `invoke(pred, ...)` is convertible to bool.
58*6777b538SAndroid Build Coastguard Worker template <typename Pred, typename Proj1, typename Proj2, bool kPermute = false>
59*6777b538SAndroid Build Coastguard Worker class BinaryPredicateProjector {
60*6777b538SAndroid Build Coastguard Worker public:
BinaryPredicateProjector(Pred & pred,Proj1 & proj1,Proj2 & proj2)61*6777b538SAndroid Build Coastguard Worker constexpr BinaryPredicateProjector(Pred& pred, Proj1& proj1, Proj2& proj2)
62*6777b538SAndroid Build Coastguard Worker : pred_(pred), proj1_(proj1), proj2_(proj2) {}
63*6777b538SAndroid Build Coastguard Worker
64*6777b538SAndroid Build Coastguard Worker private:
65*6777b538SAndroid Build Coastguard Worker template <typename ProjT, typename ProjU, typename T, typename U>
66*6777b538SAndroid Build Coastguard Worker using InvokeResult = std::invoke_result_t<Pred&,
67*6777b538SAndroid Build Coastguard Worker std::invoke_result_t<ProjT&, T&&>,
68*6777b538SAndroid Build Coastguard Worker std::invoke_result_t<ProjU&, U&&>>;
69*6777b538SAndroid Build Coastguard Worker
70*6777b538SAndroid Build Coastguard Worker template <typename T, typename U, typename = InvokeResult<Proj1, Proj2, T, U>>
GetProjs(priority_tag<3>)71*6777b538SAndroid Build Coastguard Worker constexpr std::pair<Proj1&, Proj2&> GetProjs(priority_tag<3>) const {
72*6777b538SAndroid Build Coastguard Worker return {proj1_, proj2_};
73*6777b538SAndroid Build Coastguard Worker }
74*6777b538SAndroid Build Coastguard Worker
75*6777b538SAndroid Build Coastguard Worker template <typename T,
76*6777b538SAndroid Build Coastguard Worker typename U,
77*6777b538SAndroid Build Coastguard Worker bool LazyPermute = kPermute,
78*6777b538SAndroid Build Coastguard Worker typename = std::enable_if_t<LazyPermute>,
79*6777b538SAndroid Build Coastguard Worker typename = InvokeResult<Proj2, Proj1, T, U>>
GetProjs(priority_tag<2>)80*6777b538SAndroid Build Coastguard Worker constexpr std::pair<Proj2&, Proj1&> GetProjs(priority_tag<2>) const {
81*6777b538SAndroid Build Coastguard Worker return {proj2_, proj1_};
82*6777b538SAndroid Build Coastguard Worker }
83*6777b538SAndroid Build Coastguard Worker
84*6777b538SAndroid Build Coastguard Worker template <typename T,
85*6777b538SAndroid Build Coastguard Worker typename U,
86*6777b538SAndroid Build Coastguard Worker bool LazyPermute = kPermute,
87*6777b538SAndroid Build Coastguard Worker typename = std::enable_if_t<LazyPermute>,
88*6777b538SAndroid Build Coastguard Worker typename = InvokeResult<Proj1, Proj1, T, U>>
GetProjs(priority_tag<1>)89*6777b538SAndroid Build Coastguard Worker constexpr std::pair<Proj1&, Proj1&> GetProjs(priority_tag<1>) const {
90*6777b538SAndroid Build Coastguard Worker return {proj1_, proj1_};
91*6777b538SAndroid Build Coastguard Worker }
92*6777b538SAndroid Build Coastguard Worker
93*6777b538SAndroid Build Coastguard Worker template <typename T,
94*6777b538SAndroid Build Coastguard Worker typename U,
95*6777b538SAndroid Build Coastguard Worker bool LazyPermute = kPermute,
96*6777b538SAndroid Build Coastguard Worker typename = std::enable_if_t<LazyPermute>,
97*6777b538SAndroid Build Coastguard Worker typename = InvokeResult<Proj2, Proj2, T, U>>
GetProjs(priority_tag<0>)98*6777b538SAndroid Build Coastguard Worker constexpr std::pair<Proj2&, Proj2&> GetProjs(priority_tag<0>) const {
99*6777b538SAndroid Build Coastguard Worker return {proj2_, proj2_};
100*6777b538SAndroid Build Coastguard Worker }
101*6777b538SAndroid Build Coastguard Worker
102*6777b538SAndroid Build Coastguard Worker public:
103*6777b538SAndroid Build Coastguard Worker template <typename T, typename U>
operator()104*6777b538SAndroid Build Coastguard Worker constexpr bool operator()(T&& lhs, U&& rhs) const {
105*6777b538SAndroid Build Coastguard Worker auto projs = GetProjs<T, U>(priority_tag<3>());
106*6777b538SAndroid Build Coastguard Worker return std::invoke(pred_, std::invoke(projs.first, std::forward<T>(lhs)),
107*6777b538SAndroid Build Coastguard Worker std::invoke(projs.second, std::forward<U>(rhs)));
108*6777b538SAndroid Build Coastguard Worker }
109*6777b538SAndroid Build Coastguard Worker
110*6777b538SAndroid Build Coastguard Worker private:
111*6777b538SAndroid Build Coastguard Worker // RAW_PTR_EXCLUSION: Binary size increase (~120K on Android).
112*6777b538SAndroid Build Coastguard Worker RAW_PTR_EXCLUSION Pred& pred_;
113*6777b538SAndroid Build Coastguard Worker RAW_PTR_EXCLUSION Proj1& proj1_;
114*6777b538SAndroid Build Coastguard Worker RAW_PTR_EXCLUSION Proj2& proj2_;
115*6777b538SAndroid Build Coastguard Worker };
116*6777b538SAndroid Build Coastguard Worker
117*6777b538SAndroid Build Coastguard Worker // Small wrappers around BinaryPredicateProjector to make the calling side more
118*6777b538SAndroid Build Coastguard Worker // readable.
119*6777b538SAndroid Build Coastguard Worker template <typename Pred, typename Proj1, typename Proj2>
ProjectedBinaryPredicate(Pred & pred,Proj1 & proj1,Proj2 & proj2)120*6777b538SAndroid Build Coastguard Worker constexpr auto ProjectedBinaryPredicate(Pred& pred,
121*6777b538SAndroid Build Coastguard Worker Proj1& proj1,
122*6777b538SAndroid Build Coastguard Worker Proj2& proj2) noexcept {
123*6777b538SAndroid Build Coastguard Worker return BinaryPredicateProjector<Pred, Proj1, Proj2>(pred, proj1, proj2);
124*6777b538SAndroid Build Coastguard Worker }
125*6777b538SAndroid Build Coastguard Worker
126*6777b538SAndroid Build Coastguard Worker template <typename Pred, typename Proj1, typename Proj2>
PermutedProjectedBinaryPredicate(Pred & pred,Proj1 & proj1,Proj2 & proj2)127*6777b538SAndroid Build Coastguard Worker constexpr auto PermutedProjectedBinaryPredicate(Pred& pred,
128*6777b538SAndroid Build Coastguard Worker Proj1& proj1,
129*6777b538SAndroid Build Coastguard Worker Proj2& proj2) noexcept {
130*6777b538SAndroid Build Coastguard Worker return BinaryPredicateProjector<Pred, Proj1, Proj2, true>(pred, proj1, proj2);
131*6777b538SAndroid Build Coastguard Worker }
132*6777b538SAndroid Build Coastguard Worker
133*6777b538SAndroid Build Coastguard Worker // This alias is used below to restrict iterator based APIs to types for which
134*6777b538SAndroid Build Coastguard Worker // `iterator_category` and the pre-increment and post-increment operators are
135*6777b538SAndroid Build Coastguard Worker // defined. This is required in situations where otherwise an undesired overload
136*6777b538SAndroid Build Coastguard Worker // would be chosen, e.g. copy_if. In spirit this is similar to C++20's
137*6777b538SAndroid Build Coastguard Worker // std::input_or_output_iterator, a concept that each iterator should satisfy.
138*6777b538SAndroid Build Coastguard Worker template <typename Iter,
139*6777b538SAndroid Build Coastguard Worker typename = decltype(++std::declval<Iter&>()),
140*6777b538SAndroid Build Coastguard Worker typename = decltype(std::declval<Iter&>()++)>
141*6777b538SAndroid Build Coastguard Worker using iterator_category_t =
142*6777b538SAndroid Build Coastguard Worker typename std::iterator_traits<Iter>::iterator_category;
143*6777b538SAndroid Build Coastguard Worker
144*6777b538SAndroid Build Coastguard Worker // This alias is used below to restrict range based APIs to types for which
145*6777b538SAndroid Build Coastguard Worker // `iterator_category_t` is defined for the underlying iterator. This is
146*6777b538SAndroid Build Coastguard Worker // required in situations where otherwise an undesired overload would be chosen,
147*6777b538SAndroid Build Coastguard Worker // e.g. transform. In spirit this is similar to C++20's std::ranges::range, a
148*6777b538SAndroid Build Coastguard Worker // concept that each range should satisfy.
149*6777b538SAndroid Build Coastguard Worker template <typename Range>
150*6777b538SAndroid Build Coastguard Worker using range_category_t = iterator_category_t<ranges::iterator_t<Range>>;
151*6777b538SAndroid Build Coastguard Worker
152*6777b538SAndroid Build Coastguard Worker } // namespace internal
153*6777b538SAndroid Build Coastguard Worker
154*6777b538SAndroid Build Coastguard Worker namespace ranges {
155*6777b538SAndroid Build Coastguard Worker
156*6777b538SAndroid Build Coastguard Worker // C++14 implementation of std::ranges::in_fun_result.
157*6777b538SAndroid Build Coastguard Worker //
158*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/algorithms.results#:~:text=in_fun_result
159*6777b538SAndroid Build Coastguard Worker template <typename I, typename F>
160*6777b538SAndroid Build Coastguard Worker struct in_fun_result {
161*6777b538SAndroid Build Coastguard Worker NO_UNIQUE_ADDRESS I in;
162*6777b538SAndroid Build Coastguard Worker NO_UNIQUE_ADDRESS F fun;
163*6777b538SAndroid Build Coastguard Worker
164*6777b538SAndroid Build Coastguard Worker template <typename I2,
165*6777b538SAndroid Build Coastguard Worker typename F2,
166*6777b538SAndroid Build Coastguard Worker std::enable_if_t<std::is_convertible<const I&, I2>{} &&
167*6777b538SAndroid Build Coastguard Worker std::is_convertible<const F&, F2>{}>>
in_fun_resultin_fun_result168*6777b538SAndroid Build Coastguard Worker constexpr operator in_fun_result<I2, F2>() const& {
169*6777b538SAndroid Build Coastguard Worker return {in, fun};
170*6777b538SAndroid Build Coastguard Worker }
171*6777b538SAndroid Build Coastguard Worker
172*6777b538SAndroid Build Coastguard Worker template <typename I2,
173*6777b538SAndroid Build Coastguard Worker typename F2,
174*6777b538SAndroid Build Coastguard Worker std::enable_if_t<std::is_convertible<I, I2>{} &&
175*6777b538SAndroid Build Coastguard Worker std::is_convertible<F, F2>{}>>
in_fun_resultin_fun_result176*6777b538SAndroid Build Coastguard Worker constexpr operator in_fun_result<I2, F2>() && {
177*6777b538SAndroid Build Coastguard Worker return {std::move(in), std::move(fun)};
178*6777b538SAndroid Build Coastguard Worker }
179*6777b538SAndroid Build Coastguard Worker };
180*6777b538SAndroid Build Coastguard Worker
181*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/1071094): Implement the other result types.
182*6777b538SAndroid Build Coastguard Worker
183*6777b538SAndroid Build Coastguard Worker // [alg.nonmodifying] Non-modifying sequence operations
184*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.nonmodifying
185*6777b538SAndroid Build Coastguard Worker
186*6777b538SAndroid Build Coastguard Worker // [alg.all.of] All of
187*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.all.of
188*6777b538SAndroid Build Coastguard Worker
189*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `invoke(pred, invoke(proj, *i))`.
190*6777b538SAndroid Build Coastguard Worker //
191*6777b538SAndroid Build Coastguard Worker // Returns: `false` if `E(i)` is `false` for some iterator `i` in the range
192*6777b538SAndroid Build Coastguard Worker // `[first, last)`, and `true` otherwise.
193*6777b538SAndroid Build Coastguard Worker //
194*6777b538SAndroid Build Coastguard Worker // Complexity: At most `last - first` applications of the predicate and any
195*6777b538SAndroid Build Coastguard Worker // projection.
196*6777b538SAndroid Build Coastguard Worker //
197*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.all.of#:~:text=ranges::all_of(I
198*6777b538SAndroid Build Coastguard Worker template <typename InputIterator,
199*6777b538SAndroid Build Coastguard Worker typename Pred,
200*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
201*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator>>
202*6777b538SAndroid Build Coastguard Worker constexpr bool all_of(InputIterator first,
203*6777b538SAndroid Build Coastguard Worker InputIterator last,
204*6777b538SAndroid Build Coastguard Worker Pred pred,
205*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
206*6777b538SAndroid Build Coastguard Worker for (; first != last; ++first) {
207*6777b538SAndroid Build Coastguard Worker if (!std::invoke(pred, std::invoke(proj, *first))) {
208*6777b538SAndroid Build Coastguard Worker return false;
209*6777b538SAndroid Build Coastguard Worker }
210*6777b538SAndroid Build Coastguard Worker }
211*6777b538SAndroid Build Coastguard Worker
212*6777b538SAndroid Build Coastguard Worker return true;
213*6777b538SAndroid Build Coastguard Worker }
214*6777b538SAndroid Build Coastguard Worker
215*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `invoke(pred, invoke(proj, *i))`.
216*6777b538SAndroid Build Coastguard Worker //
217*6777b538SAndroid Build Coastguard Worker // Returns: `false` if `E(i)` is `false` for some iterator `i` in `range`, and
218*6777b538SAndroid Build Coastguard Worker // `true` otherwise.
219*6777b538SAndroid Build Coastguard Worker //
220*6777b538SAndroid Build Coastguard Worker // Complexity: At most `size(range)` applications of the predicate and any
221*6777b538SAndroid Build Coastguard Worker // projection.
222*6777b538SAndroid Build Coastguard Worker //
223*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.all.of#:~:text=ranges::all_of(R
224*6777b538SAndroid Build Coastguard Worker template <typename Range,
225*6777b538SAndroid Build Coastguard Worker typename Pred,
226*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
227*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
228*6777b538SAndroid Build Coastguard Worker constexpr bool all_of(Range&& range, Pred pred, Proj proj = {}) {
229*6777b538SAndroid Build Coastguard Worker return ranges::all_of(ranges::begin(range), ranges::end(range),
230*6777b538SAndroid Build Coastguard Worker std::move(pred), std::move(proj));
231*6777b538SAndroid Build Coastguard Worker }
232*6777b538SAndroid Build Coastguard Worker
233*6777b538SAndroid Build Coastguard Worker // [alg.any.of] Any of
234*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.any.of
235*6777b538SAndroid Build Coastguard Worker
236*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `invoke(pred, invoke(proj, *i))`.
237*6777b538SAndroid Build Coastguard Worker //
238*6777b538SAndroid Build Coastguard Worker // Returns: `true` if `E(i)` is `true` for some iterator `i` in the range
239*6777b538SAndroid Build Coastguard Worker // `[first, last)`, and `false` otherwise.
240*6777b538SAndroid Build Coastguard Worker //
241*6777b538SAndroid Build Coastguard Worker // Complexity: At most `last - first` applications of the predicate and any
242*6777b538SAndroid Build Coastguard Worker // projection.
243*6777b538SAndroid Build Coastguard Worker //
244*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.any.of#:~:text=ranges::any_of(I
245*6777b538SAndroid Build Coastguard Worker template <typename InputIterator,
246*6777b538SAndroid Build Coastguard Worker typename Pred,
247*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
248*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator>>
249*6777b538SAndroid Build Coastguard Worker constexpr bool any_of(InputIterator first,
250*6777b538SAndroid Build Coastguard Worker InputIterator last,
251*6777b538SAndroid Build Coastguard Worker Pred pred,
252*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
253*6777b538SAndroid Build Coastguard Worker for (; first != last; ++first) {
254*6777b538SAndroid Build Coastguard Worker if (std::invoke(pred, std::invoke(proj, *first))) {
255*6777b538SAndroid Build Coastguard Worker return true;
256*6777b538SAndroid Build Coastguard Worker }
257*6777b538SAndroid Build Coastguard Worker }
258*6777b538SAndroid Build Coastguard Worker
259*6777b538SAndroid Build Coastguard Worker return false;
260*6777b538SAndroid Build Coastguard Worker }
261*6777b538SAndroid Build Coastguard Worker
262*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `invoke(pred, invoke(proj, *i))`.
263*6777b538SAndroid Build Coastguard Worker //
264*6777b538SAndroid Build Coastguard Worker // Returns: `true` if `E(i)` is `true` for some iterator `i` in `range`, and
265*6777b538SAndroid Build Coastguard Worker // `false` otherwise.
266*6777b538SAndroid Build Coastguard Worker //
267*6777b538SAndroid Build Coastguard Worker // Complexity: At most `size(range)` applications of the predicate and any
268*6777b538SAndroid Build Coastguard Worker // projection.
269*6777b538SAndroid Build Coastguard Worker //
270*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.any.of#:~:text=ranges::any_of(R
271*6777b538SAndroid Build Coastguard Worker template <typename Range,
272*6777b538SAndroid Build Coastguard Worker typename Pred,
273*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
274*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
275*6777b538SAndroid Build Coastguard Worker constexpr bool any_of(Range&& range, Pred pred, Proj proj = {}) {
276*6777b538SAndroid Build Coastguard Worker return ranges::any_of(ranges::begin(range), ranges::end(range),
277*6777b538SAndroid Build Coastguard Worker std::move(pred), std::move(proj));
278*6777b538SAndroid Build Coastguard Worker }
279*6777b538SAndroid Build Coastguard Worker
280*6777b538SAndroid Build Coastguard Worker // [alg.none.of] None of
281*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.none.of
282*6777b538SAndroid Build Coastguard Worker
283*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `invoke(pred, invoke(proj, *i))`.
284*6777b538SAndroid Build Coastguard Worker //
285*6777b538SAndroid Build Coastguard Worker // Returns: `false` if `E(i)` is `true` for some iterator `i` in the range
286*6777b538SAndroid Build Coastguard Worker // `[first, last)`, and `true` otherwise.
287*6777b538SAndroid Build Coastguard Worker //
288*6777b538SAndroid Build Coastguard Worker // Complexity: At most `last - first` applications of the predicate and any
289*6777b538SAndroid Build Coastguard Worker // projection.
290*6777b538SAndroid Build Coastguard Worker //
291*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.none.of#:~:text=ranges::none_of(I
292*6777b538SAndroid Build Coastguard Worker template <typename InputIterator,
293*6777b538SAndroid Build Coastguard Worker typename Pred,
294*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
295*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator>>
296*6777b538SAndroid Build Coastguard Worker constexpr bool none_of(InputIterator first,
297*6777b538SAndroid Build Coastguard Worker InputIterator last,
298*6777b538SAndroid Build Coastguard Worker Pred pred,
299*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
300*6777b538SAndroid Build Coastguard Worker for (; first != last; ++first) {
301*6777b538SAndroid Build Coastguard Worker if (std::invoke(pred, std::invoke(proj, *first))) {
302*6777b538SAndroid Build Coastguard Worker return false;
303*6777b538SAndroid Build Coastguard Worker }
304*6777b538SAndroid Build Coastguard Worker }
305*6777b538SAndroid Build Coastguard Worker
306*6777b538SAndroid Build Coastguard Worker return true;
307*6777b538SAndroid Build Coastguard Worker }
308*6777b538SAndroid Build Coastguard Worker
309*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `invoke(pred, invoke(proj, *i))`.
310*6777b538SAndroid Build Coastguard Worker //
311*6777b538SAndroid Build Coastguard Worker // Returns: `false` if `E(i)` is `true` for some iterator `i` in `range`, and
312*6777b538SAndroid Build Coastguard Worker // `true` otherwise.
313*6777b538SAndroid Build Coastguard Worker //
314*6777b538SAndroid Build Coastguard Worker // Complexity: At most `size(range)` applications of the predicate and any
315*6777b538SAndroid Build Coastguard Worker // projection.
316*6777b538SAndroid Build Coastguard Worker //
317*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.none.of#:~:text=ranges::none_of(R
318*6777b538SAndroid Build Coastguard Worker template <typename Range,
319*6777b538SAndroid Build Coastguard Worker typename Pred,
320*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
321*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
322*6777b538SAndroid Build Coastguard Worker constexpr bool none_of(Range&& range, Pred pred, Proj proj = {}) {
323*6777b538SAndroid Build Coastguard Worker return ranges::none_of(ranges::begin(range), ranges::end(range),
324*6777b538SAndroid Build Coastguard Worker std::move(pred), std::move(proj));
325*6777b538SAndroid Build Coastguard Worker }
326*6777b538SAndroid Build Coastguard Worker
327*6777b538SAndroid Build Coastguard Worker // [alg.foreach] For each
328*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.foreach
329*6777b538SAndroid Build Coastguard Worker
330*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/algorithm.syn#:~:text=for_each_result
331*6777b538SAndroid Build Coastguard Worker template <typename I, typename F>
332*6777b538SAndroid Build Coastguard Worker using for_each_result = in_fun_result<I, F>;
333*6777b538SAndroid Build Coastguard Worker
334*6777b538SAndroid Build Coastguard Worker // Effects: Calls `invoke(f, invoke(proj, *i))` for every iterator `i` in the
335*6777b538SAndroid Build Coastguard Worker // range `[first, last)`, starting from `first` and proceeding to `last - 1`.
336*6777b538SAndroid Build Coastguard Worker //
337*6777b538SAndroid Build Coastguard Worker // Returns: `{last, std::move(f)}`.
338*6777b538SAndroid Build Coastguard Worker //
339*6777b538SAndroid Build Coastguard Worker // Complexity: Applies `f` and `proj` exactly `last - first` times.
340*6777b538SAndroid Build Coastguard Worker //
341*6777b538SAndroid Build Coastguard Worker // Remarks: If `f` returns a result, the result is ignored.
342*6777b538SAndroid Build Coastguard Worker //
343*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.foreach#:~:text=ranges::for_each(I
344*6777b538SAndroid Build Coastguard Worker template <typename InputIterator,
345*6777b538SAndroid Build Coastguard Worker typename Fun,
346*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
347*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator>>
348*6777b538SAndroid Build Coastguard Worker constexpr auto for_each(InputIterator first,
349*6777b538SAndroid Build Coastguard Worker InputIterator last,
350*6777b538SAndroid Build Coastguard Worker Fun f,
351*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
352*6777b538SAndroid Build Coastguard Worker for (; first != last; ++first)
353*6777b538SAndroid Build Coastguard Worker std::invoke(f, std::invoke(proj, *first));
354*6777b538SAndroid Build Coastguard Worker return for_each_result<InputIterator, Fun>{first, std::move(f)};
355*6777b538SAndroid Build Coastguard Worker }
356*6777b538SAndroid Build Coastguard Worker
357*6777b538SAndroid Build Coastguard Worker // Effects: Calls `invoke(f, invoke(proj, *i))` for every iterator `i` in the
358*6777b538SAndroid Build Coastguard Worker // range `range`, starting from `begin(range)` and proceeding to `end(range) -
359*6777b538SAndroid Build Coastguard Worker // 1`.
360*6777b538SAndroid Build Coastguard Worker //
361*6777b538SAndroid Build Coastguard Worker // Returns: `{last, std::move(f)}`.
362*6777b538SAndroid Build Coastguard Worker //
363*6777b538SAndroid Build Coastguard Worker // Complexity: Applies `f` and `proj` exactly `size(range)` times.
364*6777b538SAndroid Build Coastguard Worker //
365*6777b538SAndroid Build Coastguard Worker // Remarks: If `f` returns a result, the result is ignored.
366*6777b538SAndroid Build Coastguard Worker //
367*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.foreach#:~:text=ranges::for_each(R
368*6777b538SAndroid Build Coastguard Worker template <typename Range,
369*6777b538SAndroid Build Coastguard Worker typename Fun,
370*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
371*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
372*6777b538SAndroid Build Coastguard Worker constexpr auto for_each(Range&& range, Fun f, Proj proj = {}) {
373*6777b538SAndroid Build Coastguard Worker return ranges::for_each(ranges::begin(range), ranges::end(range),
374*6777b538SAndroid Build Coastguard Worker std::move(f), std::move(proj));
375*6777b538SAndroid Build Coastguard Worker }
376*6777b538SAndroid Build Coastguard Worker
377*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/algorithm.syn#:~:text=for_each_n_result
378*6777b538SAndroid Build Coastguard Worker template <typename I, typename F>
379*6777b538SAndroid Build Coastguard Worker using for_each_n_result = in_fun_result<I, F>;
380*6777b538SAndroid Build Coastguard Worker
381*6777b538SAndroid Build Coastguard Worker // Preconditions: `n >= 0` is `true`.
382*6777b538SAndroid Build Coastguard Worker //
383*6777b538SAndroid Build Coastguard Worker // Effects: Calls `invoke(f, invoke(proj, *i))` for every iterator `i` in the
384*6777b538SAndroid Build Coastguard Worker // range `[first, first + n)` in order.
385*6777b538SAndroid Build Coastguard Worker //
386*6777b538SAndroid Build Coastguard Worker // Returns: `{first + n, std::move(f)}`.
387*6777b538SAndroid Build Coastguard Worker //
388*6777b538SAndroid Build Coastguard Worker // Remarks: If `f` returns a result, the result is ignored.
389*6777b538SAndroid Build Coastguard Worker //
390*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.foreach#:~:text=ranges::for_each_n
391*6777b538SAndroid Build Coastguard Worker template <typename InputIterator,
392*6777b538SAndroid Build Coastguard Worker typename Size,
393*6777b538SAndroid Build Coastguard Worker typename Fun,
394*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
395*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator>>
396*6777b538SAndroid Build Coastguard Worker constexpr auto for_each_n(InputIterator first, Size n, Fun f, Proj proj = {}) {
397*6777b538SAndroid Build Coastguard Worker while (n > 0) {
398*6777b538SAndroid Build Coastguard Worker std::invoke(f, std::invoke(proj, *first));
399*6777b538SAndroid Build Coastguard Worker ++first;
400*6777b538SAndroid Build Coastguard Worker --n;
401*6777b538SAndroid Build Coastguard Worker }
402*6777b538SAndroid Build Coastguard Worker
403*6777b538SAndroid Build Coastguard Worker return for_each_n_result<InputIterator, Fun>{first, std::move(f)};
404*6777b538SAndroid Build Coastguard Worker }
405*6777b538SAndroid Build Coastguard Worker
406*6777b538SAndroid Build Coastguard Worker // [alg.find] Find
407*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.find
408*6777b538SAndroid Build Coastguard Worker
409*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(proj, *i) == value)`.
410*6777b538SAndroid Build Coastguard Worker //
411*6777b538SAndroid Build Coastguard Worker // Returns: The first iterator `i` in the range `[first, last)` for which `E(i)`
412*6777b538SAndroid Build Coastguard Worker // is `true`. Returns `last` if no such iterator is found.
413*6777b538SAndroid Build Coastguard Worker //
414*6777b538SAndroid Build Coastguard Worker // Complexity: At most `last - first` applications of the corresponding
415*6777b538SAndroid Build Coastguard Worker // predicate and any projection.
416*6777b538SAndroid Build Coastguard Worker //
417*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.find#:~:text=ranges::find(I
418*6777b538SAndroid Build Coastguard Worker template <typename InputIterator,
419*6777b538SAndroid Build Coastguard Worker typename T,
420*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
421*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator>>
422*6777b538SAndroid Build Coastguard Worker constexpr auto find(InputIterator first,
423*6777b538SAndroid Build Coastguard Worker InputIterator last,
424*6777b538SAndroid Build Coastguard Worker const T& value,
425*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
426*6777b538SAndroid Build Coastguard Worker for (; first != last; ++first) {
427*6777b538SAndroid Build Coastguard Worker if (std::invoke(proj, *first) == value) {
428*6777b538SAndroid Build Coastguard Worker break;
429*6777b538SAndroid Build Coastguard Worker }
430*6777b538SAndroid Build Coastguard Worker }
431*6777b538SAndroid Build Coastguard Worker
432*6777b538SAndroid Build Coastguard Worker return first;
433*6777b538SAndroid Build Coastguard Worker }
434*6777b538SAndroid Build Coastguard Worker
435*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(proj, *i) == value)`.
436*6777b538SAndroid Build Coastguard Worker //
437*6777b538SAndroid Build Coastguard Worker // Returns: The first iterator `i` in `range` for which `E(i)` is `true`.
438*6777b538SAndroid Build Coastguard Worker // Returns `end(range)` if no such iterator is found.
439*6777b538SAndroid Build Coastguard Worker //
440*6777b538SAndroid Build Coastguard Worker // Complexity: At most `size(range)` applications of the corresponding predicate
441*6777b538SAndroid Build Coastguard Worker // and any projection.
442*6777b538SAndroid Build Coastguard Worker //
443*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.find#:~:text=ranges::find(R
444*6777b538SAndroid Build Coastguard Worker template <typename Range,
445*6777b538SAndroid Build Coastguard Worker typename T,
446*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
447*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
448*6777b538SAndroid Build Coastguard Worker constexpr auto find(Range&& range, const T& value, Proj proj = {}) {
449*6777b538SAndroid Build Coastguard Worker return ranges::find(ranges::begin(range), ranges::end(range), value,
450*6777b538SAndroid Build Coastguard Worker std::move(proj));
451*6777b538SAndroid Build Coastguard Worker }
452*6777b538SAndroid Build Coastguard Worker
453*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(pred, invoke(proj, *i)))`.
454*6777b538SAndroid Build Coastguard Worker //
455*6777b538SAndroid Build Coastguard Worker // Returns: The first iterator `i` in the range `[first, last)` for which `E(i)`
456*6777b538SAndroid Build Coastguard Worker // is `true`. Returns `last` if no such iterator is found.
457*6777b538SAndroid Build Coastguard Worker //
458*6777b538SAndroid Build Coastguard Worker // Complexity: At most `last - first` applications of the corresponding
459*6777b538SAndroid Build Coastguard Worker // predicate and any projection.
460*6777b538SAndroid Build Coastguard Worker //
461*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.find#:~:text=ranges::find_if(I
462*6777b538SAndroid Build Coastguard Worker template <typename InputIterator,
463*6777b538SAndroid Build Coastguard Worker typename Pred,
464*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
465*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator>>
466*6777b538SAndroid Build Coastguard Worker constexpr auto find_if(InputIterator first,
467*6777b538SAndroid Build Coastguard Worker InputIterator last,
468*6777b538SAndroid Build Coastguard Worker Pred pred,
469*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
470*6777b538SAndroid Build Coastguard Worker return std::find_if(first, last,
471*6777b538SAndroid Build Coastguard Worker internal::ProjectedUnaryPredicate(pred, proj));
472*6777b538SAndroid Build Coastguard Worker }
473*6777b538SAndroid Build Coastguard Worker
474*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(pred, invoke(proj, *i)))`.
475*6777b538SAndroid Build Coastguard Worker //
476*6777b538SAndroid Build Coastguard Worker // Returns: The first iterator `i` in `range` for which `E(i)` is `true`.
477*6777b538SAndroid Build Coastguard Worker // Returns `end(range)` if no such iterator is found.
478*6777b538SAndroid Build Coastguard Worker //
479*6777b538SAndroid Build Coastguard Worker // Complexity: At most `size(range)` applications of the corresponding predicate
480*6777b538SAndroid Build Coastguard Worker // and any projection.
481*6777b538SAndroid Build Coastguard Worker //
482*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.find#:~:text=ranges::find_if(R
483*6777b538SAndroid Build Coastguard Worker template <typename Range,
484*6777b538SAndroid Build Coastguard Worker typename Pred,
485*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
486*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
487*6777b538SAndroid Build Coastguard Worker constexpr auto find_if(Range&& range, Pred pred, Proj proj = {}) {
488*6777b538SAndroid Build Coastguard Worker return ranges::find_if(ranges::begin(range), ranges::end(range),
489*6777b538SAndroid Build Coastguard Worker std::move(pred), std::move(proj));
490*6777b538SAndroid Build Coastguard Worker }
491*6777b538SAndroid Build Coastguard Worker
492*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(!invoke(pred, invoke(proj, *i)))`.
493*6777b538SAndroid Build Coastguard Worker //
494*6777b538SAndroid Build Coastguard Worker // Returns: The first iterator `i` in the range `[first, last)` for which `E(i)`
495*6777b538SAndroid Build Coastguard Worker // is `true`. Returns `last` if no such iterator is found.
496*6777b538SAndroid Build Coastguard Worker //
497*6777b538SAndroid Build Coastguard Worker // Complexity: At most `last - first` applications of the corresponding
498*6777b538SAndroid Build Coastguard Worker // predicate and any projection.
499*6777b538SAndroid Build Coastguard Worker //
500*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.find#:~:text=ranges::find_if_not(I
501*6777b538SAndroid Build Coastguard Worker template <typename InputIterator,
502*6777b538SAndroid Build Coastguard Worker typename Pred,
503*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
504*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator>>
505*6777b538SAndroid Build Coastguard Worker constexpr auto find_if_not(InputIterator first,
506*6777b538SAndroid Build Coastguard Worker InputIterator last,
507*6777b538SAndroid Build Coastguard Worker Pred pred,
508*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
509*6777b538SAndroid Build Coastguard Worker return std::find_if_not(first, last,
510*6777b538SAndroid Build Coastguard Worker internal::ProjectedUnaryPredicate(pred, proj));
511*6777b538SAndroid Build Coastguard Worker }
512*6777b538SAndroid Build Coastguard Worker
513*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(!invoke(pred, invoke(proj, *i)))`.
514*6777b538SAndroid Build Coastguard Worker //
515*6777b538SAndroid Build Coastguard Worker // Returns: The first iterator `i` in `range` for which `E(i)` is `true`.
516*6777b538SAndroid Build Coastguard Worker // Returns `end(range)` if no such iterator is found.
517*6777b538SAndroid Build Coastguard Worker //
518*6777b538SAndroid Build Coastguard Worker // Complexity: At most `size(range)` applications of the corresponding predicate
519*6777b538SAndroid Build Coastguard Worker // and any projection.
520*6777b538SAndroid Build Coastguard Worker //
521*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.find#:~:text=ranges::find_if_not(R
522*6777b538SAndroid Build Coastguard Worker template <typename Range,
523*6777b538SAndroid Build Coastguard Worker typename Pred,
524*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
525*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
526*6777b538SAndroid Build Coastguard Worker constexpr auto find_if_not(Range&& range, Pred pred, Proj proj = {}) {
527*6777b538SAndroid Build Coastguard Worker return ranges::find_if_not(ranges::begin(range), ranges::end(range),
528*6777b538SAndroid Build Coastguard Worker std::move(pred), std::move(proj));
529*6777b538SAndroid Build Coastguard Worker }
530*6777b538SAndroid Build Coastguard Worker
531*6777b538SAndroid Build Coastguard Worker // [alg.find.end] Find end
532*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.find.end
533*6777b538SAndroid Build Coastguard Worker
534*6777b538SAndroid Build Coastguard Worker // Let:
535*6777b538SAndroid Build Coastguard Worker // - `E(i,n)` be `invoke(pred, invoke(proj1, *(i + n)),
536*6777b538SAndroid Build Coastguard Worker // invoke(proj2, *(first2 + n)))`
537*6777b538SAndroid Build Coastguard Worker //
538*6777b538SAndroid Build Coastguard Worker // - `i` be `last1` if `[first2, last2)` is empty, or if
539*6777b538SAndroid Build Coastguard Worker // `(last2 - first2) > (last1 - first1)` is `true`, or if there is no iterator
540*6777b538SAndroid Build Coastguard Worker // in the range `[first1, last1 - (last2 - first2))` such that for every
541*6777b538SAndroid Build Coastguard Worker // non-negative integer `n < (last2 - first2)`, `E(i,n)` is `true`. Otherwise
542*6777b538SAndroid Build Coastguard Worker // `i` is the last such iterator in `[first1, last1 - (last2 - first2))`.
543*6777b538SAndroid Build Coastguard Worker //
544*6777b538SAndroid Build Coastguard Worker // Returns: `i`
545*6777b538SAndroid Build Coastguard Worker // Note: std::ranges::find_end(I1 first1,...) returns a range, rather than an
546*6777b538SAndroid Build Coastguard Worker // iterator. For simplicitly we match std::find_end's return type instead.
547*6777b538SAndroid Build Coastguard Worker //
548*6777b538SAndroid Build Coastguard Worker // Complexity:
549*6777b538SAndroid Build Coastguard Worker // At most `(last2 - first2) * (last1 - first1 - (last2 - first2) + 1)`
550*6777b538SAndroid Build Coastguard Worker // applications of the corresponding predicate and any projections.
551*6777b538SAndroid Build Coastguard Worker //
552*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.find.end#:~:text=ranges::find_end(I1
553*6777b538SAndroid Build Coastguard Worker template <
554*6777b538SAndroid Build Coastguard Worker typename ForwardIterator1,
555*6777b538SAndroid Build Coastguard Worker typename ForwardIterator2,
556*6777b538SAndroid Build Coastguard Worker typename Pred = ranges::equal_to,
557*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
558*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
559*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator1>,
560*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator2>,
561*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Pred&,
562*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator1, Proj1>,
563*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator2, Proj2>>>
564*6777b538SAndroid Build Coastguard Worker constexpr auto find_end(ForwardIterator1 first1,
565*6777b538SAndroid Build Coastguard Worker ForwardIterator1 last1,
566*6777b538SAndroid Build Coastguard Worker ForwardIterator2 first2,
567*6777b538SAndroid Build Coastguard Worker ForwardIterator2 last2,
568*6777b538SAndroid Build Coastguard Worker Pred pred = {},
569*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
570*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
571*6777b538SAndroid Build Coastguard Worker return std::find_end(first1, last1, first2, last2,
572*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(pred, proj1, proj2));
573*6777b538SAndroid Build Coastguard Worker }
574*6777b538SAndroid Build Coastguard Worker
575*6777b538SAndroid Build Coastguard Worker // Let:
576*6777b538SAndroid Build Coastguard Worker // - `E(i,n)` be `invoke(pred, invoke(proj1, *(i + n)),
577*6777b538SAndroid Build Coastguard Worker // invoke(proj2, *(first2 + n)))`
578*6777b538SAndroid Build Coastguard Worker //
579*6777b538SAndroid Build Coastguard Worker // - `i` be `end(range1)` if `range2` is empty, or if
580*6777b538SAndroid Build Coastguard Worker // `size(range2) > size(range1)` is `true`, or if there is no iterator in the
581*6777b538SAndroid Build Coastguard Worker // range `[begin(range1), end(range1) - size(range2))` such that for every
582*6777b538SAndroid Build Coastguard Worker // non-negative integer `n < size(range2)`, `E(i,n)` is `true`. Otherwise `i`
583*6777b538SAndroid Build Coastguard Worker // is the last such iterator in `[begin(range1), end(range1) - size(range2))`.
584*6777b538SAndroid Build Coastguard Worker //
585*6777b538SAndroid Build Coastguard Worker // Returns: `i`
586*6777b538SAndroid Build Coastguard Worker // Note: std::ranges::find_end(R1&& r1,...) returns a range, rather than an
587*6777b538SAndroid Build Coastguard Worker // iterator. For simplicitly we match std::find_end's return type instead.
588*6777b538SAndroid Build Coastguard Worker //
589*6777b538SAndroid Build Coastguard Worker // Complexity: At most `size(range2) * (size(range1) - size(range2) + 1)`
590*6777b538SAndroid Build Coastguard Worker // applications of the corresponding predicate and any projections.
591*6777b538SAndroid Build Coastguard Worker //
592*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.find.end#:~:text=ranges::find_end(R1
593*6777b538SAndroid Build Coastguard Worker template <typename Range1,
594*6777b538SAndroid Build Coastguard Worker typename Range2,
595*6777b538SAndroid Build Coastguard Worker typename Pred = ranges::equal_to,
596*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
597*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
598*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range1>,
599*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range2>,
600*6777b538SAndroid Build Coastguard Worker typename =
601*6777b538SAndroid Build Coastguard Worker std::indirect_result_t<Pred&,
602*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range1>, Proj1>,
603*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range2>, Proj2>>>
604*6777b538SAndroid Build Coastguard Worker constexpr auto find_end(Range1&& range1,
605*6777b538SAndroid Build Coastguard Worker Range2&& range2,
606*6777b538SAndroid Build Coastguard Worker Pred pred = {},
607*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
608*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
609*6777b538SAndroid Build Coastguard Worker return ranges::find_end(ranges::begin(range1), ranges::end(range1),
610*6777b538SAndroid Build Coastguard Worker ranges::begin(range2), ranges::end(range2),
611*6777b538SAndroid Build Coastguard Worker std::move(pred), std::move(proj1), std::move(proj2));
612*6777b538SAndroid Build Coastguard Worker }
613*6777b538SAndroid Build Coastguard Worker
614*6777b538SAndroid Build Coastguard Worker // [alg.find.first.of] Find first
615*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.find.first.of
616*6777b538SAndroid Build Coastguard Worker
617*6777b538SAndroid Build Coastguard Worker // Let `E(i,j)` be `bool(invoke(pred, invoke(proj1, *i), invoke(proj2, *j)))`.
618*6777b538SAndroid Build Coastguard Worker //
619*6777b538SAndroid Build Coastguard Worker // Effects: Finds an element that matches one of a set of values.
620*6777b538SAndroid Build Coastguard Worker //
621*6777b538SAndroid Build Coastguard Worker // Returns: The first iterator `i` in the range `[first1, last1)` such that for
622*6777b538SAndroid Build Coastguard Worker // some iterator `j` in the range `[first2, last2)` `E(i,j)` holds. Returns
623*6777b538SAndroid Build Coastguard Worker // `last1` if `[first2, last2)` is empty or if no such iterator is found.
624*6777b538SAndroid Build Coastguard Worker //
625*6777b538SAndroid Build Coastguard Worker // Complexity: At most `(last1 - first1) * (last2 - first2)` applications of the
626*6777b538SAndroid Build Coastguard Worker // corresponding predicate and any projections.
627*6777b538SAndroid Build Coastguard Worker //
628*6777b538SAndroid Build Coastguard Worker // Reference:
629*6777b538SAndroid Build Coastguard Worker // https://wg21.link/alg.find.first.of#:~:text=ranges::find_first_of(I1
630*6777b538SAndroid Build Coastguard Worker template <
631*6777b538SAndroid Build Coastguard Worker typename ForwardIterator1,
632*6777b538SAndroid Build Coastguard Worker typename ForwardIterator2,
633*6777b538SAndroid Build Coastguard Worker typename Pred = ranges::equal_to,
634*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
635*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
636*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator1>,
637*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator2>,
638*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Pred&,
639*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator1, Proj1>,
640*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator2, Proj2>>>
641*6777b538SAndroid Build Coastguard Worker constexpr auto find_first_of(ForwardIterator1 first1,
642*6777b538SAndroid Build Coastguard Worker ForwardIterator1 last1,
643*6777b538SAndroid Build Coastguard Worker ForwardIterator2 first2,
644*6777b538SAndroid Build Coastguard Worker ForwardIterator2 last2,
645*6777b538SAndroid Build Coastguard Worker Pred pred = {},
646*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
647*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
648*6777b538SAndroid Build Coastguard Worker return std::find_first_of(
649*6777b538SAndroid Build Coastguard Worker first1, last1, first2, last2,
650*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(pred, proj1, proj2));
651*6777b538SAndroid Build Coastguard Worker }
652*6777b538SAndroid Build Coastguard Worker
653*6777b538SAndroid Build Coastguard Worker // Let `E(i,j)` be `bool(invoke(pred, invoke(proj1, *i), invoke(proj2, *j)))`.
654*6777b538SAndroid Build Coastguard Worker //
655*6777b538SAndroid Build Coastguard Worker // Effects: Finds an element that matches one of a set of values.
656*6777b538SAndroid Build Coastguard Worker //
657*6777b538SAndroid Build Coastguard Worker // Returns: The first iterator `i` in `range1` such that for some iterator `j`
658*6777b538SAndroid Build Coastguard Worker // in `range2` `E(i,j)` holds. Returns `end(range1)` if `range2` is empty or if
659*6777b538SAndroid Build Coastguard Worker // no such iterator is found.
660*6777b538SAndroid Build Coastguard Worker //
661*6777b538SAndroid Build Coastguard Worker // Complexity: At most `size(range1) * size(range2)` applications of the
662*6777b538SAndroid Build Coastguard Worker // corresponding predicate and any projections.
663*6777b538SAndroid Build Coastguard Worker //
664*6777b538SAndroid Build Coastguard Worker // Reference:
665*6777b538SAndroid Build Coastguard Worker // https://wg21.link/alg.find.first.of#:~:text=ranges::find_first_of(R1
666*6777b538SAndroid Build Coastguard Worker template <typename Range1,
667*6777b538SAndroid Build Coastguard Worker typename Range2,
668*6777b538SAndroid Build Coastguard Worker typename Pred = ranges::equal_to,
669*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
670*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
671*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range1>,
672*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range2>,
673*6777b538SAndroid Build Coastguard Worker typename =
674*6777b538SAndroid Build Coastguard Worker std::indirect_result_t<Pred&,
675*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range1>, Proj1>,
676*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range2>, Proj2>>>
677*6777b538SAndroid Build Coastguard Worker constexpr auto find_first_of(Range1&& range1,
678*6777b538SAndroid Build Coastguard Worker Range2&& range2,
679*6777b538SAndroid Build Coastguard Worker Pred pred = {},
680*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
681*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
682*6777b538SAndroid Build Coastguard Worker return ranges::find_first_of(
683*6777b538SAndroid Build Coastguard Worker ranges::begin(range1), ranges::end(range1), ranges::begin(range2),
684*6777b538SAndroid Build Coastguard Worker ranges::end(range2), std::move(pred), std::move(proj1), std::move(proj2));
685*6777b538SAndroid Build Coastguard Worker }
686*6777b538SAndroid Build Coastguard Worker
687*6777b538SAndroid Build Coastguard Worker // [alg.adjacent.find] Adjacent find
688*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.adjacent.find
689*6777b538SAndroid Build Coastguard Worker
690*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(pred, invoke(proj, *i), invoke(proj, *(i + 1))))`.
691*6777b538SAndroid Build Coastguard Worker //
692*6777b538SAndroid Build Coastguard Worker // Returns: The first iterator `i` such that both `i` and `i + 1` are in the
693*6777b538SAndroid Build Coastguard Worker // range `[first, last)` for which `E(i)` holds. Returns `last` if no such
694*6777b538SAndroid Build Coastguard Worker // iterator is found.
695*6777b538SAndroid Build Coastguard Worker //
696*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `min((i - first) + 1, (last - first) - 1)` applications
697*6777b538SAndroid Build Coastguard Worker // of the corresponding predicate, where `i` is `adjacent_find`'s return value.
698*6777b538SAndroid Build Coastguard Worker //
699*6777b538SAndroid Build Coastguard Worker // Reference:
700*6777b538SAndroid Build Coastguard Worker // https://wg21.link/alg.adjacent.find#:~:text=ranges::adjacent_find(I
701*6777b538SAndroid Build Coastguard Worker template <typename ForwardIterator,
702*6777b538SAndroid Build Coastguard Worker typename Pred = ranges::equal_to,
703*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
704*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator>>
705*6777b538SAndroid Build Coastguard Worker constexpr auto adjacent_find(ForwardIterator first,
706*6777b538SAndroid Build Coastguard Worker ForwardIterator last,
707*6777b538SAndroid Build Coastguard Worker Pred pred = {},
708*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
709*6777b538SAndroid Build Coastguard Worker // Implementation inspired by cppreference.com:
710*6777b538SAndroid Build Coastguard Worker // https://en.cppreference.com/w/cpp/algorithm/adjacent_find
711*6777b538SAndroid Build Coastguard Worker //
712*6777b538SAndroid Build Coastguard Worker // A reimplementation is required, because std::adjacent_find is not constexpr
713*6777b538SAndroid Build Coastguard Worker // prior to C++20. Once we have C++20, we should switch to standard library
714*6777b538SAndroid Build Coastguard Worker // implementation.
715*6777b538SAndroid Build Coastguard Worker if (first == last)
716*6777b538SAndroid Build Coastguard Worker return last;
717*6777b538SAndroid Build Coastguard Worker
718*6777b538SAndroid Build Coastguard Worker for (ForwardIterator next = first; ++next != last; ++first) {
719*6777b538SAndroid Build Coastguard Worker if (std::invoke(pred, std::invoke(proj, *first),
720*6777b538SAndroid Build Coastguard Worker std::invoke(proj, *next))) {
721*6777b538SAndroid Build Coastguard Worker return first;
722*6777b538SAndroid Build Coastguard Worker }
723*6777b538SAndroid Build Coastguard Worker }
724*6777b538SAndroid Build Coastguard Worker
725*6777b538SAndroid Build Coastguard Worker return last;
726*6777b538SAndroid Build Coastguard Worker }
727*6777b538SAndroid Build Coastguard Worker
728*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(pred, invoke(proj, *i), invoke(proj, *(i + 1))))`.
729*6777b538SAndroid Build Coastguard Worker //
730*6777b538SAndroid Build Coastguard Worker // Returns: The first iterator `i` such that both `i` and `i + 1` are in the
731*6777b538SAndroid Build Coastguard Worker // range `range` for which `E(i)` holds. Returns `end(range)` if no such
732*6777b538SAndroid Build Coastguard Worker // iterator is found.
733*6777b538SAndroid Build Coastguard Worker //
734*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `min((i - begin(range)) + 1, size(range) - 1)`
735*6777b538SAndroid Build Coastguard Worker // applications of the corresponding predicate, where `i` is `adjacent_find`'s
736*6777b538SAndroid Build Coastguard Worker // return value.
737*6777b538SAndroid Build Coastguard Worker //
738*6777b538SAndroid Build Coastguard Worker // Reference:
739*6777b538SAndroid Build Coastguard Worker // https://wg21.link/alg.adjacent.find#:~:text=ranges::adjacent_find(R
740*6777b538SAndroid Build Coastguard Worker template <typename Range,
741*6777b538SAndroid Build Coastguard Worker typename Pred = ranges::equal_to,
742*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
743*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
744*6777b538SAndroid Build Coastguard Worker constexpr auto adjacent_find(Range&& range, Pred pred = {}, Proj proj = {}) {
745*6777b538SAndroid Build Coastguard Worker return ranges::adjacent_find(ranges::begin(range), ranges::end(range),
746*6777b538SAndroid Build Coastguard Worker std::move(pred), std::move(proj));
747*6777b538SAndroid Build Coastguard Worker }
748*6777b538SAndroid Build Coastguard Worker
749*6777b538SAndroid Build Coastguard Worker // [alg.count] Count
750*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.count
751*6777b538SAndroid Build Coastguard Worker
752*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `invoke(proj, *i) == value`.
753*6777b538SAndroid Build Coastguard Worker //
754*6777b538SAndroid Build Coastguard Worker // Effects: Returns the number of iterators `i` in the range `[first, last)` for
755*6777b538SAndroid Build Coastguard Worker // which `E(i)` holds.
756*6777b538SAndroid Build Coastguard Worker //
757*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `last - first` applications of the corresponding
758*6777b538SAndroid Build Coastguard Worker // predicate and any projection.
759*6777b538SAndroid Build Coastguard Worker //
760*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.count#:~:text=ranges::count(I
761*6777b538SAndroid Build Coastguard Worker template <typename InputIterator,
762*6777b538SAndroid Build Coastguard Worker typename T,
763*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
764*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator>>
765*6777b538SAndroid Build Coastguard Worker constexpr auto count(InputIterator first,
766*6777b538SAndroid Build Coastguard Worker InputIterator last,
767*6777b538SAndroid Build Coastguard Worker const T& value,
768*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
769*6777b538SAndroid Build Coastguard Worker // Note: In order to be able to apply `proj` to each element in [first, last)
770*6777b538SAndroid Build Coastguard Worker // we are dispatching to std::count_if instead of std::count.
771*6777b538SAndroid Build Coastguard Worker return std::count_if(first, last, [&proj, &value](auto&& lhs) {
772*6777b538SAndroid Build Coastguard Worker return std::invoke(proj, std::forward<decltype(lhs)>(lhs)) == value;
773*6777b538SAndroid Build Coastguard Worker });
774*6777b538SAndroid Build Coastguard Worker }
775*6777b538SAndroid Build Coastguard Worker
776*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `invoke(proj, *i) == value`.
777*6777b538SAndroid Build Coastguard Worker //
778*6777b538SAndroid Build Coastguard Worker // Effects: Returns the number of iterators `i` in `range` for which `E(i)`
779*6777b538SAndroid Build Coastguard Worker // holds.
780*6777b538SAndroid Build Coastguard Worker //
781*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `size(range)` applications of the corresponding predicate
782*6777b538SAndroid Build Coastguard Worker // and any projection.
783*6777b538SAndroid Build Coastguard Worker //
784*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.count#:~:text=ranges::count(R
785*6777b538SAndroid Build Coastguard Worker template <typename Range,
786*6777b538SAndroid Build Coastguard Worker typename T,
787*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
788*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
789*6777b538SAndroid Build Coastguard Worker constexpr auto count(Range&& range, const T& value, Proj proj = {}) {
790*6777b538SAndroid Build Coastguard Worker return ranges::count(ranges::begin(range), ranges::end(range), value,
791*6777b538SAndroid Build Coastguard Worker std::move(proj));
792*6777b538SAndroid Build Coastguard Worker }
793*6777b538SAndroid Build Coastguard Worker
794*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(pred, invoke(proj, *i)))`.
795*6777b538SAndroid Build Coastguard Worker //
796*6777b538SAndroid Build Coastguard Worker // Effects: Returns the number of iterators `i` in the range `[first, last)` for
797*6777b538SAndroid Build Coastguard Worker // which `E(i)` holds.
798*6777b538SAndroid Build Coastguard Worker //
799*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `last - first` applications of the corresponding
800*6777b538SAndroid Build Coastguard Worker // predicate and any projection.
801*6777b538SAndroid Build Coastguard Worker //
802*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.count#:~:text=ranges::count_if(I
803*6777b538SAndroid Build Coastguard Worker template <typename InputIterator,
804*6777b538SAndroid Build Coastguard Worker typename Pred,
805*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
806*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator>>
807*6777b538SAndroid Build Coastguard Worker constexpr auto count_if(InputIterator first,
808*6777b538SAndroid Build Coastguard Worker InputIterator last,
809*6777b538SAndroid Build Coastguard Worker Pred pred,
810*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
811*6777b538SAndroid Build Coastguard Worker return std::count_if(first, last,
812*6777b538SAndroid Build Coastguard Worker internal::ProjectedUnaryPredicate(pred, proj));
813*6777b538SAndroid Build Coastguard Worker }
814*6777b538SAndroid Build Coastguard Worker
815*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(pred, invoke(proj, *i)))`.
816*6777b538SAndroid Build Coastguard Worker //
817*6777b538SAndroid Build Coastguard Worker // Effects: Returns the number of iterators `i` in `range` for which `E(i)`
818*6777b538SAndroid Build Coastguard Worker // holds.
819*6777b538SAndroid Build Coastguard Worker //
820*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `size(range)` applications of the corresponding predicate
821*6777b538SAndroid Build Coastguard Worker // and any projection.
822*6777b538SAndroid Build Coastguard Worker //
823*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.count#:~:text=ranges::count_if(R
824*6777b538SAndroid Build Coastguard Worker template <typename Range,
825*6777b538SAndroid Build Coastguard Worker typename Pred,
826*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
827*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
828*6777b538SAndroid Build Coastguard Worker constexpr auto count_if(Range&& range, Pred pred, Proj proj = {}) {
829*6777b538SAndroid Build Coastguard Worker return ranges::count_if(ranges::begin(range), ranges::end(range),
830*6777b538SAndroid Build Coastguard Worker std::move(pred), std::move(proj));
831*6777b538SAndroid Build Coastguard Worker }
832*6777b538SAndroid Build Coastguard Worker
833*6777b538SAndroid Build Coastguard Worker // [mismatch] Mismatch
834*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/mismatch
835*6777b538SAndroid Build Coastguard Worker
836*6777b538SAndroid Build Coastguard Worker // Let `E(n)` be `!invoke(pred, invoke(proj1, *(first1 + n)),
837*6777b538SAndroid Build Coastguard Worker // invoke(proj2, *(first2 + n)))`.
838*6777b538SAndroid Build Coastguard Worker //
839*6777b538SAndroid Build Coastguard Worker // Let `N` be `min(last1 - first1, last2 - first2)`.
840*6777b538SAndroid Build Coastguard Worker //
841*6777b538SAndroid Build Coastguard Worker // Returns: `{ first1 + n, first2 + n }`, where `n` is the smallest integer in
842*6777b538SAndroid Build Coastguard Worker // `[0, N)` such that `E(n)` holds, or `N` if no such integer exists.
843*6777b538SAndroid Build Coastguard Worker //
844*6777b538SAndroid Build Coastguard Worker // Complexity: At most `N` applications of the corresponding predicate and any
845*6777b538SAndroid Build Coastguard Worker // projections.
846*6777b538SAndroid Build Coastguard Worker //
847*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/mismatch#:~:text=ranges::mismatch(I1
848*6777b538SAndroid Build Coastguard Worker template <
849*6777b538SAndroid Build Coastguard Worker typename ForwardIterator1,
850*6777b538SAndroid Build Coastguard Worker typename ForwardIterator2,
851*6777b538SAndroid Build Coastguard Worker typename Pred = ranges::equal_to,
852*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
853*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
854*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator1>,
855*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator2>,
856*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Pred&,
857*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator1, Proj1>,
858*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator2, Proj2>>>
859*6777b538SAndroid Build Coastguard Worker constexpr auto mismatch(ForwardIterator1 first1,
860*6777b538SAndroid Build Coastguard Worker ForwardIterator1 last1,
861*6777b538SAndroid Build Coastguard Worker ForwardIterator2 first2,
862*6777b538SAndroid Build Coastguard Worker ForwardIterator2 last2,
863*6777b538SAndroid Build Coastguard Worker Pred pred = {},
864*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
865*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
866*6777b538SAndroid Build Coastguard Worker return std::mismatch(first1, last1, first2, last2,
867*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(pred, proj1, proj2));
868*6777b538SAndroid Build Coastguard Worker }
869*6777b538SAndroid Build Coastguard Worker
870*6777b538SAndroid Build Coastguard Worker // Let `E(n)` be `!invoke(pred, invoke(proj1, *(begin(range1) + n)),
871*6777b538SAndroid Build Coastguard Worker // invoke(proj2, *(begin(range2) + n)))`.
872*6777b538SAndroid Build Coastguard Worker //
873*6777b538SAndroid Build Coastguard Worker // Let `N` be `min(size(range1), size(range2))`.
874*6777b538SAndroid Build Coastguard Worker //
875*6777b538SAndroid Build Coastguard Worker // Returns: `{ begin(range1) + n, begin(range2) + n }`, where `n` is the
876*6777b538SAndroid Build Coastguard Worker // smallest integer in `[0, N)` such that `E(n)` holds, or `N` if no such
877*6777b538SAndroid Build Coastguard Worker // integer exists.
878*6777b538SAndroid Build Coastguard Worker //
879*6777b538SAndroid Build Coastguard Worker // Complexity: At most `N` applications of the corresponding predicate and any
880*6777b538SAndroid Build Coastguard Worker // projections.
881*6777b538SAndroid Build Coastguard Worker //
882*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/mismatch#:~:text=ranges::mismatch(R1
883*6777b538SAndroid Build Coastguard Worker template <typename Range1,
884*6777b538SAndroid Build Coastguard Worker typename Range2,
885*6777b538SAndroid Build Coastguard Worker typename Pred = ranges::equal_to,
886*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
887*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
888*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range1>,
889*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range2>,
890*6777b538SAndroid Build Coastguard Worker typename =
891*6777b538SAndroid Build Coastguard Worker std::indirect_result_t<Pred&,
892*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range1>, Proj1>,
893*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range2>, Proj2>>>
894*6777b538SAndroid Build Coastguard Worker constexpr auto mismatch(Range1&& range1,
895*6777b538SAndroid Build Coastguard Worker Range2&& range2,
896*6777b538SAndroid Build Coastguard Worker Pred pred = {},
897*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
898*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
899*6777b538SAndroid Build Coastguard Worker return ranges::mismatch(ranges::begin(range1), ranges::end(range1),
900*6777b538SAndroid Build Coastguard Worker ranges::begin(range2), ranges::end(range2),
901*6777b538SAndroid Build Coastguard Worker std::move(pred), std::move(proj1), std::move(proj2));
902*6777b538SAndroid Build Coastguard Worker }
903*6777b538SAndroid Build Coastguard Worker
904*6777b538SAndroid Build Coastguard Worker // [alg.equal] Equal
905*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.equal
906*6777b538SAndroid Build Coastguard Worker
907*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be
908*6777b538SAndroid Build Coastguard Worker // `invoke(pred, invoke(proj1, *i), invoke(proj2, *(first2 + (i - first1))))`.
909*6777b538SAndroid Build Coastguard Worker //
910*6777b538SAndroid Build Coastguard Worker // Returns: If `last1 - first1 != last2 - first2`, return `false.` Otherwise
911*6777b538SAndroid Build Coastguard Worker // return `true` if `E(i)` holds for every iterator `i` in the range `[first1,
912*6777b538SAndroid Build Coastguard Worker // last1)`. Otherwise, returns `false`.
913*6777b538SAndroid Build Coastguard Worker //
914*6777b538SAndroid Build Coastguard Worker // Complexity: If the types of `first1`, `last1`, `first2`, and `last2` meet the
915*6777b538SAndroid Build Coastguard Worker // `RandomAccessIterator` requirements and `last1 - first1 != last2 - first2`,
916*6777b538SAndroid Build Coastguard Worker // then no applications of the corresponding predicate and each projection;
917*6777b538SAndroid Build Coastguard Worker // otherwise, at most `min(last1 - first1, last2 - first2)` applications of the
918*6777b538SAndroid Build Coastguard Worker // corresponding predicate and any projections.
919*6777b538SAndroid Build Coastguard Worker //
920*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.equal#:~:text=ranges::equal(I1
921*6777b538SAndroid Build Coastguard Worker template <
922*6777b538SAndroid Build Coastguard Worker typename ForwardIterator1,
923*6777b538SAndroid Build Coastguard Worker typename ForwardIterator2,
924*6777b538SAndroid Build Coastguard Worker typename Pred = ranges::equal_to,
925*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
926*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
927*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator1>,
928*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator2>,
929*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Pred&,
930*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator1, Proj1>,
931*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator2, Proj2>>>
932*6777b538SAndroid Build Coastguard Worker constexpr bool equal(ForwardIterator1 first1,
933*6777b538SAndroid Build Coastguard Worker ForwardIterator1 last1,
934*6777b538SAndroid Build Coastguard Worker ForwardIterator2 first2,
935*6777b538SAndroid Build Coastguard Worker ForwardIterator2 last2,
936*6777b538SAndroid Build Coastguard Worker Pred pred = {},
937*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
938*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
939*6777b538SAndroid Build Coastguard Worker if (std::is_constant_evaluated()) {
940*6777b538SAndroid Build Coastguard Worker for (; first1 != last1 && first2 != last2; ++first1, ++first2) {
941*6777b538SAndroid Build Coastguard Worker if (!std::invoke(pred, std::invoke(proj1, *first1),
942*6777b538SAndroid Build Coastguard Worker std::invoke(proj2, *first2))) {
943*6777b538SAndroid Build Coastguard Worker return false;
944*6777b538SAndroid Build Coastguard Worker }
945*6777b538SAndroid Build Coastguard Worker }
946*6777b538SAndroid Build Coastguard Worker
947*6777b538SAndroid Build Coastguard Worker return first1 == last1 && first2 == last2;
948*6777b538SAndroid Build Coastguard Worker }
949*6777b538SAndroid Build Coastguard Worker
950*6777b538SAndroid Build Coastguard Worker return std::equal(first1, last1, first2, last2,
951*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(pred, proj1, proj2));
952*6777b538SAndroid Build Coastguard Worker }
953*6777b538SAndroid Build Coastguard Worker
954*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be
955*6777b538SAndroid Build Coastguard Worker // `invoke(pred, invoke(proj1, *i),
956*6777b538SAndroid Build Coastguard Worker // invoke(proj2, *(begin(range2) + (i - begin(range1)))))`.
957*6777b538SAndroid Build Coastguard Worker //
958*6777b538SAndroid Build Coastguard Worker // Returns: If `size(range1) != size(range2)`, return `false.` Otherwise return
959*6777b538SAndroid Build Coastguard Worker // `true` if `E(i)` holds for every iterator `i` in `range1`. Otherwise, returns
960*6777b538SAndroid Build Coastguard Worker // `false`.
961*6777b538SAndroid Build Coastguard Worker //
962*6777b538SAndroid Build Coastguard Worker // Complexity: If the types of `begin(range1)`, `end(range1)`, `begin(range2)`,
963*6777b538SAndroid Build Coastguard Worker // and `end(range2)` meet the `RandomAccessIterator` requirements and
964*6777b538SAndroid Build Coastguard Worker // `size(range1) != size(range2)`, then no applications of the corresponding
965*6777b538SAndroid Build Coastguard Worker // predicate and each projection;
966*6777b538SAndroid Build Coastguard Worker // otherwise, at most `min(size(range1), size(range2))` applications of the
967*6777b538SAndroid Build Coastguard Worker // corresponding predicate and any projections.
968*6777b538SAndroid Build Coastguard Worker //
969*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.equal#:~:text=ranges::equal(R1
970*6777b538SAndroid Build Coastguard Worker template <typename Range1,
971*6777b538SAndroid Build Coastguard Worker typename Range2,
972*6777b538SAndroid Build Coastguard Worker typename Pred = ranges::equal_to,
973*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
974*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
975*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range1>,
976*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range2>,
977*6777b538SAndroid Build Coastguard Worker typename =
978*6777b538SAndroid Build Coastguard Worker std::indirect_result_t<Pred&,
979*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range1>, Proj1>,
980*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range2>, Proj2>>>
981*6777b538SAndroid Build Coastguard Worker constexpr bool equal(Range1&& range1,
982*6777b538SAndroid Build Coastguard Worker Range2&& range2,
983*6777b538SAndroid Build Coastguard Worker Pred pred = {},
984*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
985*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
986*6777b538SAndroid Build Coastguard Worker return ranges::equal(ranges::begin(range1), ranges::end(range1),
987*6777b538SAndroid Build Coastguard Worker ranges::begin(range2), ranges::end(range2),
988*6777b538SAndroid Build Coastguard Worker std::move(pred), std::move(proj1), std::move(proj2));
989*6777b538SAndroid Build Coastguard Worker }
990*6777b538SAndroid Build Coastguard Worker
991*6777b538SAndroid Build Coastguard Worker // [alg.is.permutation] Is permutation
992*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.is.permutation
993*6777b538SAndroid Build Coastguard Worker
994*6777b538SAndroid Build Coastguard Worker // Returns: If `last1 - first1 != last2 - first2`, return `false`. Otherwise
995*6777b538SAndroid Build Coastguard Worker // return `true` if there exists a permutation of the elements in the range
996*6777b538SAndroid Build Coastguard Worker // `[first2, last2)`, bounded by `[pfirst, plast)`, such that
997*6777b538SAndroid Build Coastguard Worker // `ranges::equal(first1, last1, pfirst, plast, pred, proj, proj)` returns
998*6777b538SAndroid Build Coastguard Worker // `true`; otherwise, returns `false`.
999*6777b538SAndroid Build Coastguard Worker //
1000*6777b538SAndroid Build Coastguard Worker // Complexity: No applications of the corresponding predicate if
1001*6777b538SAndroid Build Coastguard Worker // ForwardIterator1 and ForwardIterator2 meet the requirements of random access
1002*6777b538SAndroid Build Coastguard Worker // iterators and `last1 - first1 != last2 - first2`. Otherwise, exactly
1003*6777b538SAndroid Build Coastguard Worker // `last1 - first1` applications of the corresponding predicate and projections
1004*6777b538SAndroid Build Coastguard Worker // if `ranges::equal(first1, last1, first2, last2, pred, proj, proj)` would
1005*6777b538SAndroid Build Coastguard Worker // return true;
1006*6777b538SAndroid Build Coastguard Worker // otherwise, at worst `O(N^2)`, where `N` has the value `last1 - first1`.
1007*6777b538SAndroid Build Coastguard Worker //
1008*6777b538SAndroid Build Coastguard Worker // Reference:
1009*6777b538SAndroid Build Coastguard Worker // https://wg21.link/alg.is.permutation#:~:text=ranges::is_permutation(I1
1010*6777b538SAndroid Build Coastguard Worker template <
1011*6777b538SAndroid Build Coastguard Worker typename ForwardIterator1,
1012*6777b538SAndroid Build Coastguard Worker typename ForwardIterator2,
1013*6777b538SAndroid Build Coastguard Worker typename Pred = ranges::equal_to,
1014*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
1015*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
1016*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator1>,
1017*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator2>,
1018*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Pred&,
1019*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator1, Proj1>,
1020*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator2, Proj2>>>
1021*6777b538SAndroid Build Coastguard Worker constexpr bool is_permutation(ForwardIterator1 first1,
1022*6777b538SAndroid Build Coastguard Worker ForwardIterator1 last1,
1023*6777b538SAndroid Build Coastguard Worker ForwardIterator2 first2,
1024*6777b538SAndroid Build Coastguard Worker ForwardIterator2 last2,
1025*6777b538SAndroid Build Coastguard Worker Pred pred = {},
1026*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
1027*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
1028*6777b538SAndroid Build Coastguard Worker // Needs to opt-in to all permutations, since std::is_permutation expects
1029*6777b538SAndroid Build Coastguard Worker // pred(proj1(lhs), proj1(rhs)) to compile.
1030*6777b538SAndroid Build Coastguard Worker return std::is_permutation(
1031*6777b538SAndroid Build Coastguard Worker first1, last1, first2, last2,
1032*6777b538SAndroid Build Coastguard Worker internal::PermutedProjectedBinaryPredicate(pred, proj1, proj2));
1033*6777b538SAndroid Build Coastguard Worker }
1034*6777b538SAndroid Build Coastguard Worker
1035*6777b538SAndroid Build Coastguard Worker // Returns: If `size(range1) != size(range2)`, return `false`. Otherwise return
1036*6777b538SAndroid Build Coastguard Worker // `true` if there exists a permutation of the elements in `range2`, bounded by
1037*6777b538SAndroid Build Coastguard Worker // `[pbegin, pend)`, such that
1038*6777b538SAndroid Build Coastguard Worker // `ranges::equal(range1, [pbegin, pend), pred, proj, proj)` returns `true`;
1039*6777b538SAndroid Build Coastguard Worker // otherwise, returns `false`.
1040*6777b538SAndroid Build Coastguard Worker //
1041*6777b538SAndroid Build Coastguard Worker // Complexity: No applications of the corresponding predicate if Range1 and
1042*6777b538SAndroid Build Coastguard Worker // Range2 meet the requirements of random access ranges and
1043*6777b538SAndroid Build Coastguard Worker // `size(range1) != size(range2)`. Otherwise, exactly `size(range1)`
1044*6777b538SAndroid Build Coastguard Worker // applications of the corresponding predicate and projections if
1045*6777b538SAndroid Build Coastguard Worker // `ranges::equal(range1, range2, pred, proj, proj)` would return true;
1046*6777b538SAndroid Build Coastguard Worker // otherwise, at worst `O(N^2)`, where `N` has the value `size(range1)`.
1047*6777b538SAndroid Build Coastguard Worker //
1048*6777b538SAndroid Build Coastguard Worker // Reference:
1049*6777b538SAndroid Build Coastguard Worker // https://wg21.link/alg.is.permutation#:~:text=ranges::is_permutation(R1
1050*6777b538SAndroid Build Coastguard Worker template <typename Range1,
1051*6777b538SAndroid Build Coastguard Worker typename Range2,
1052*6777b538SAndroid Build Coastguard Worker typename Pred = ranges::equal_to,
1053*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
1054*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
1055*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range1>,
1056*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range2>,
1057*6777b538SAndroid Build Coastguard Worker typename =
1058*6777b538SAndroid Build Coastguard Worker std::indirect_result_t<Pred&,
1059*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range1>, Proj1>,
1060*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range2>, Proj2>>>
1061*6777b538SAndroid Build Coastguard Worker constexpr bool is_permutation(Range1&& range1,
1062*6777b538SAndroid Build Coastguard Worker Range2&& range2,
1063*6777b538SAndroid Build Coastguard Worker Pred pred = {},
1064*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
1065*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
1066*6777b538SAndroid Build Coastguard Worker return ranges::is_permutation(
1067*6777b538SAndroid Build Coastguard Worker ranges::begin(range1), ranges::end(range1), ranges::begin(range2),
1068*6777b538SAndroid Build Coastguard Worker ranges::end(range2), std::move(pred), std::move(proj1), std::move(proj2));
1069*6777b538SAndroid Build Coastguard Worker }
1070*6777b538SAndroid Build Coastguard Worker
1071*6777b538SAndroid Build Coastguard Worker // [alg.search] Search
1072*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.search
1073*6777b538SAndroid Build Coastguard Worker
1074*6777b538SAndroid Build Coastguard Worker // Returns: `i`, where `i` is the first iterator in the range
1075*6777b538SAndroid Build Coastguard Worker // `[first1, last1 - (last2 - first2))` such that for every non-negative integer
1076*6777b538SAndroid Build Coastguard Worker // `n` less than `last2 - first2` the condition
1077*6777b538SAndroid Build Coastguard Worker // `bool(invoke(pred, invoke(proj1, *(i + n)), invoke(proj2, *(first2 + n))))`
1078*6777b538SAndroid Build Coastguard Worker // is `true`.
1079*6777b538SAndroid Build Coastguard Worker // Returns `last1` if no such iterator exists.
1080*6777b538SAndroid Build Coastguard Worker // Note: std::ranges::search(I1 first1,...) returns a range, rather than an
1081*6777b538SAndroid Build Coastguard Worker // iterator. For simplicitly we match std::search's return type instead.
1082*6777b538SAndroid Build Coastguard Worker //
1083*6777b538SAndroid Build Coastguard Worker // Complexity: At most `(last1 - first1) * (last2 - first2)` applications of the
1084*6777b538SAndroid Build Coastguard Worker // corresponding predicate and projections.
1085*6777b538SAndroid Build Coastguard Worker //
1086*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.search#:~:text=ranges::search(I1
1087*6777b538SAndroid Build Coastguard Worker template <
1088*6777b538SAndroid Build Coastguard Worker typename ForwardIterator1,
1089*6777b538SAndroid Build Coastguard Worker typename ForwardIterator2,
1090*6777b538SAndroid Build Coastguard Worker typename Pred = ranges::equal_to,
1091*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
1092*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
1093*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator1>,
1094*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator2>,
1095*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Pred&,
1096*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator1, Proj1>,
1097*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator2, Proj2>>>
1098*6777b538SAndroid Build Coastguard Worker constexpr auto search(ForwardIterator1 first1,
1099*6777b538SAndroid Build Coastguard Worker ForwardIterator1 last1,
1100*6777b538SAndroid Build Coastguard Worker ForwardIterator2 first2,
1101*6777b538SAndroid Build Coastguard Worker ForwardIterator2 last2,
1102*6777b538SAndroid Build Coastguard Worker Pred pred = {},
1103*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
1104*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
1105*6777b538SAndroid Build Coastguard Worker return std::search(first1, last1, first2, last2,
1106*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(pred, proj1, proj2));
1107*6777b538SAndroid Build Coastguard Worker }
1108*6777b538SAndroid Build Coastguard Worker
1109*6777b538SAndroid Build Coastguard Worker // Returns: `i`, where `i` is the first iterator in the range
1110*6777b538SAndroid Build Coastguard Worker // `[begin(range1), end(range1) - size(range2))` such that for every
1111*6777b538SAndroid Build Coastguard Worker // non-negative integer `n` less than `size(range2)` the condition
1112*6777b538SAndroid Build Coastguard Worker // `bool(invoke(pred, invoke(proj1, *(i + n)),
1113*6777b538SAndroid Build Coastguard Worker // invoke(proj2, *(begin(range2) + n))))` is `true`.
1114*6777b538SAndroid Build Coastguard Worker // Returns `end(range1)` if no such iterator exists.
1115*6777b538SAndroid Build Coastguard Worker // Note: std::ranges::search(R1&& r1,...) returns a range, rather than an
1116*6777b538SAndroid Build Coastguard Worker // iterator. For simplicitly we match std::search's return type instead.
1117*6777b538SAndroid Build Coastguard Worker //
1118*6777b538SAndroid Build Coastguard Worker // Complexity: At most `size(range1) * size(range2)` applications of the
1119*6777b538SAndroid Build Coastguard Worker // corresponding predicate and projections.
1120*6777b538SAndroid Build Coastguard Worker //
1121*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.search#:~:text=ranges::search(R1
1122*6777b538SAndroid Build Coastguard Worker template <typename Range1,
1123*6777b538SAndroid Build Coastguard Worker typename Range2,
1124*6777b538SAndroid Build Coastguard Worker typename Pred = ranges::equal_to,
1125*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
1126*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
1127*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range1>,
1128*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range2>,
1129*6777b538SAndroid Build Coastguard Worker typename =
1130*6777b538SAndroid Build Coastguard Worker std::indirect_result_t<Pred&,
1131*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range1>, Proj1>,
1132*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range2>, Proj2>>>
1133*6777b538SAndroid Build Coastguard Worker constexpr auto search(Range1&& range1,
1134*6777b538SAndroid Build Coastguard Worker Range2&& range2,
1135*6777b538SAndroid Build Coastguard Worker Pred pred = {},
1136*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
1137*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
1138*6777b538SAndroid Build Coastguard Worker return ranges::search(ranges::begin(range1), ranges::end(range1),
1139*6777b538SAndroid Build Coastguard Worker ranges::begin(range2), ranges::end(range2),
1140*6777b538SAndroid Build Coastguard Worker std::move(pred), std::move(proj1), std::move(proj2));
1141*6777b538SAndroid Build Coastguard Worker }
1142*6777b538SAndroid Build Coastguard Worker
1143*6777b538SAndroid Build Coastguard Worker // Mandates: The type `Size` is convertible to an integral type.
1144*6777b538SAndroid Build Coastguard Worker //
1145*6777b538SAndroid Build Coastguard Worker // Returns: `i` where `i` is the first iterator in the range
1146*6777b538SAndroid Build Coastguard Worker // `[first, last - count)` such that for every non-negative integer `n` less
1147*6777b538SAndroid Build Coastguard Worker // than `count`, the following condition holds:
1148*6777b538SAndroid Build Coastguard Worker // `invoke(pred, invoke(proj, *(i + n)), value)`.
1149*6777b538SAndroid Build Coastguard Worker // Returns `last` if no such iterator is found.
1150*6777b538SAndroid Build Coastguard Worker // Note: std::ranges::search_n(I1 first1,...) returns a range, rather than an
1151*6777b538SAndroid Build Coastguard Worker // iterator. For simplicitly we match std::search_n's return type instead.
1152*6777b538SAndroid Build Coastguard Worker //
1153*6777b538SAndroid Build Coastguard Worker // Complexity: At most `last - first` applications of the corresponding
1154*6777b538SAndroid Build Coastguard Worker // predicate and projection.
1155*6777b538SAndroid Build Coastguard Worker //
1156*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.search#:~:text=ranges::search_n(I
1157*6777b538SAndroid Build Coastguard Worker template <typename ForwardIterator,
1158*6777b538SAndroid Build Coastguard Worker typename Size,
1159*6777b538SAndroid Build Coastguard Worker typename T,
1160*6777b538SAndroid Build Coastguard Worker typename Pred = ranges::equal_to,
1161*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
1162*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator>>
1163*6777b538SAndroid Build Coastguard Worker constexpr auto search_n(ForwardIterator first,
1164*6777b538SAndroid Build Coastguard Worker ForwardIterator last,
1165*6777b538SAndroid Build Coastguard Worker Size count,
1166*6777b538SAndroid Build Coastguard Worker const T& value,
1167*6777b538SAndroid Build Coastguard Worker Pred pred = {},
1168*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
1169*6777b538SAndroid Build Coastguard Worker // The second arg is guaranteed to be `value`, so we'll simply apply the
1170*6777b538SAndroid Build Coastguard Worker // std::identity projection.
1171*6777b538SAndroid Build Coastguard Worker std::identity value_proj;
1172*6777b538SAndroid Build Coastguard Worker return std::search_n(
1173*6777b538SAndroid Build Coastguard Worker first, last, count, value,
1174*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(pred, proj, value_proj));
1175*6777b538SAndroid Build Coastguard Worker }
1176*6777b538SAndroid Build Coastguard Worker
1177*6777b538SAndroid Build Coastguard Worker // Mandates: The type `Size` is convertible to an integral type.
1178*6777b538SAndroid Build Coastguard Worker //
1179*6777b538SAndroid Build Coastguard Worker // Returns: `i` where `i` is the first iterator in the range
1180*6777b538SAndroid Build Coastguard Worker // `[begin(range), end(range) - count)` such that for every non-negative integer
1181*6777b538SAndroid Build Coastguard Worker // `n` less than `count`, the following condition holds:
1182*6777b538SAndroid Build Coastguard Worker // `invoke(pred, invoke(proj, *(i + n)), value)`.
1183*6777b538SAndroid Build Coastguard Worker // Returns `end(arnge)` if no such iterator is found.
1184*6777b538SAndroid Build Coastguard Worker // Note: std::ranges::search_n(R1&& r1,...) returns a range, rather than an
1185*6777b538SAndroid Build Coastguard Worker // iterator. For simplicitly we match std::search_n's return type instead.
1186*6777b538SAndroid Build Coastguard Worker //
1187*6777b538SAndroid Build Coastguard Worker // Complexity: At most `size(range)` applications of the corresponding predicate
1188*6777b538SAndroid Build Coastguard Worker // and projection.
1189*6777b538SAndroid Build Coastguard Worker //
1190*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.search#:~:text=ranges::search_n(R
1191*6777b538SAndroid Build Coastguard Worker template <typename Range,
1192*6777b538SAndroid Build Coastguard Worker typename Size,
1193*6777b538SAndroid Build Coastguard Worker typename T,
1194*6777b538SAndroid Build Coastguard Worker typename Pred = ranges::equal_to,
1195*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
1196*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
1197*6777b538SAndroid Build Coastguard Worker constexpr auto search_n(Range&& range,
1198*6777b538SAndroid Build Coastguard Worker Size count,
1199*6777b538SAndroid Build Coastguard Worker const T& value,
1200*6777b538SAndroid Build Coastguard Worker Pred pred = {},
1201*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
1202*6777b538SAndroid Build Coastguard Worker return ranges::search_n(ranges::begin(range), ranges::end(range), count,
1203*6777b538SAndroid Build Coastguard Worker value, std::move(pred), std::move(proj));
1204*6777b538SAndroid Build Coastguard Worker }
1205*6777b538SAndroid Build Coastguard Worker
1206*6777b538SAndroid Build Coastguard Worker // [alg.modifying.operations] Mutating sequence operations
1207*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.modifying.operations
1208*6777b538SAndroid Build Coastguard Worker
1209*6777b538SAndroid Build Coastguard Worker // [alg.copy] Copy
1210*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.copy
1211*6777b538SAndroid Build Coastguard Worker
1212*6777b538SAndroid Build Coastguard Worker // Let N be `last - first`.
1213*6777b538SAndroid Build Coastguard Worker //
1214*6777b538SAndroid Build Coastguard Worker // Preconditions: `result` is not in the range `[first, last)`.
1215*6777b538SAndroid Build Coastguard Worker //
1216*6777b538SAndroid Build Coastguard Worker // Effects: Copies elements in the range `[first, last)` into the range
1217*6777b538SAndroid Build Coastguard Worker // `[result, result + N)` starting from `first` and proceeding to `last`. For
1218*6777b538SAndroid Build Coastguard Worker // each non-negative integer `n < N` , performs `*(result + n) = *(first + n)`.
1219*6777b538SAndroid Build Coastguard Worker //
1220*6777b538SAndroid Build Coastguard Worker // Returns: `result + N`
1221*6777b538SAndroid Build Coastguard Worker //
1222*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `N` assignments.
1223*6777b538SAndroid Build Coastguard Worker //
1224*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.copy#:~:text=ranges::copy(I
1225*6777b538SAndroid Build Coastguard Worker template <typename InputIterator,
1226*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
1227*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator>,
1228*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>>
copy(InputIterator first,InputIterator last,OutputIterator result)1229*6777b538SAndroid Build Coastguard Worker constexpr auto copy(InputIterator first,
1230*6777b538SAndroid Build Coastguard Worker InputIterator last,
1231*6777b538SAndroid Build Coastguard Worker OutputIterator result) {
1232*6777b538SAndroid Build Coastguard Worker return std::copy(first, last, result);
1233*6777b538SAndroid Build Coastguard Worker }
1234*6777b538SAndroid Build Coastguard Worker
1235*6777b538SAndroid Build Coastguard Worker // Let N be `size(range)`.
1236*6777b538SAndroid Build Coastguard Worker //
1237*6777b538SAndroid Build Coastguard Worker // Preconditions: `result` is not in `range`.
1238*6777b538SAndroid Build Coastguard Worker //
1239*6777b538SAndroid Build Coastguard Worker // Effects: Copies elements in `range` into the range `[result, result + N)`
1240*6777b538SAndroid Build Coastguard Worker // starting from `begin(range)` and proceeding to `end(range)`. For each
1241*6777b538SAndroid Build Coastguard Worker // non-negative integer `n < N` , performs
1242*6777b538SAndroid Build Coastguard Worker // *(result + n) = *(begin(range) + n)`.
1243*6777b538SAndroid Build Coastguard Worker //
1244*6777b538SAndroid Build Coastguard Worker // Returns: `result + N`
1245*6777b538SAndroid Build Coastguard Worker //
1246*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `N` assignments.
1247*6777b538SAndroid Build Coastguard Worker //
1248*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.copy#:~:text=ranges::copy(R
1249*6777b538SAndroid Build Coastguard Worker template <typename Range,
1250*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
1251*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
1252*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>>
copy(Range && range,OutputIterator result)1253*6777b538SAndroid Build Coastguard Worker constexpr auto copy(Range&& range, OutputIterator result) {
1254*6777b538SAndroid Build Coastguard Worker return ranges::copy(ranges::begin(range), ranges::end(range), result);
1255*6777b538SAndroid Build Coastguard Worker }
1256*6777b538SAndroid Build Coastguard Worker
1257*6777b538SAndroid Build Coastguard Worker // Let `N` be `max(0, n)`.
1258*6777b538SAndroid Build Coastguard Worker //
1259*6777b538SAndroid Build Coastguard Worker // Mandates: The type `Size` is convertible to an integral type.
1260*6777b538SAndroid Build Coastguard Worker //
1261*6777b538SAndroid Build Coastguard Worker // Effects: For each non-negative integer `i < N`, performs
1262*6777b538SAndroid Build Coastguard Worker // `*(result + i) = *(first + i)`.
1263*6777b538SAndroid Build Coastguard Worker //
1264*6777b538SAndroid Build Coastguard Worker // Returns: `result + N`
1265*6777b538SAndroid Build Coastguard Worker //
1266*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `N` assignments.
1267*6777b538SAndroid Build Coastguard Worker //
1268*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.copy#:~:text=ranges::copy_n
1269*6777b538SAndroid Build Coastguard Worker template <typename InputIterator,
1270*6777b538SAndroid Build Coastguard Worker typename Size,
1271*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
1272*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator>,
1273*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>>
copy_n(InputIterator first,Size n,OutputIterator result)1274*6777b538SAndroid Build Coastguard Worker constexpr auto copy_n(InputIterator first, Size n, OutputIterator result) {
1275*6777b538SAndroid Build Coastguard Worker return std::copy_n(first, n, result);
1276*6777b538SAndroid Build Coastguard Worker }
1277*6777b538SAndroid Build Coastguard Worker
1278*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(pred, invoke(proj, *i)))`, and `N` be the number
1279*6777b538SAndroid Build Coastguard Worker // of iterators `i` in the range `[first, last)` for which the condition `E(i)`
1280*6777b538SAndroid Build Coastguard Worker // holds.
1281*6777b538SAndroid Build Coastguard Worker //
1282*6777b538SAndroid Build Coastguard Worker // Preconditions: The ranges `[first, last)` and
1283*6777b538SAndroid Build Coastguard Worker // `[result, result + (last - first))` do not overlap.
1284*6777b538SAndroid Build Coastguard Worker //
1285*6777b538SAndroid Build Coastguard Worker // Effects: Copies all of the elements referred to by the iterator `i` in the
1286*6777b538SAndroid Build Coastguard Worker // range `[first, last)` for which `E(i)` is true.
1287*6777b538SAndroid Build Coastguard Worker //
1288*6777b538SAndroid Build Coastguard Worker // Returns: `result + N`
1289*6777b538SAndroid Build Coastguard Worker //
1290*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `last - first` applications of the corresponding
1291*6777b538SAndroid Build Coastguard Worker // predicate and any projection.
1292*6777b538SAndroid Build Coastguard Worker //
1293*6777b538SAndroid Build Coastguard Worker // Remarks: Stable.
1294*6777b538SAndroid Build Coastguard Worker //
1295*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.copy#:~:text=ranges::copy_if(I
1296*6777b538SAndroid Build Coastguard Worker template <typename InputIterator,
1297*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
1298*6777b538SAndroid Build Coastguard Worker typename Pred,
1299*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
1300*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator>,
1301*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>>
1302*6777b538SAndroid Build Coastguard Worker constexpr auto copy_if(InputIterator first,
1303*6777b538SAndroid Build Coastguard Worker InputIterator last,
1304*6777b538SAndroid Build Coastguard Worker OutputIterator result,
1305*6777b538SAndroid Build Coastguard Worker Pred pred,
1306*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
1307*6777b538SAndroid Build Coastguard Worker return std::copy_if(first, last, result,
1308*6777b538SAndroid Build Coastguard Worker internal::ProjectedUnaryPredicate(pred, proj));
1309*6777b538SAndroid Build Coastguard Worker }
1310*6777b538SAndroid Build Coastguard Worker
1311*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(pred, invoke(proj, *i)))`, and `N` be the number
1312*6777b538SAndroid Build Coastguard Worker // of iterators `i` in `range` for which the condition `E(i)` holds.
1313*6777b538SAndroid Build Coastguard Worker //
1314*6777b538SAndroid Build Coastguard Worker // Preconditions: `range` and `[result, result + size(range))` do not overlap.
1315*6777b538SAndroid Build Coastguard Worker //
1316*6777b538SAndroid Build Coastguard Worker // Effects: Copies all of the elements referred to by the iterator `i` in
1317*6777b538SAndroid Build Coastguard Worker // `range` for which `E(i)` is true.
1318*6777b538SAndroid Build Coastguard Worker //
1319*6777b538SAndroid Build Coastguard Worker // Returns: `result + N`
1320*6777b538SAndroid Build Coastguard Worker //
1321*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `size(range)` applications of the corresponding predicate
1322*6777b538SAndroid Build Coastguard Worker // and any projection.
1323*6777b538SAndroid Build Coastguard Worker //
1324*6777b538SAndroid Build Coastguard Worker // Remarks: Stable.
1325*6777b538SAndroid Build Coastguard Worker //
1326*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.copy#:~:text=ranges::copy_if(R
1327*6777b538SAndroid Build Coastguard Worker template <typename Range,
1328*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
1329*6777b538SAndroid Build Coastguard Worker typename Pred,
1330*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
1331*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
1332*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>>
1333*6777b538SAndroid Build Coastguard Worker constexpr auto copy_if(Range&& range,
1334*6777b538SAndroid Build Coastguard Worker OutputIterator result,
1335*6777b538SAndroid Build Coastguard Worker Pred pred,
1336*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
1337*6777b538SAndroid Build Coastguard Worker return ranges::copy_if(ranges::begin(range), ranges::end(range), result,
1338*6777b538SAndroid Build Coastguard Worker std::move(pred), std::move(proj));
1339*6777b538SAndroid Build Coastguard Worker }
1340*6777b538SAndroid Build Coastguard Worker
1341*6777b538SAndroid Build Coastguard Worker // Let `N` be `last - first`.
1342*6777b538SAndroid Build Coastguard Worker //
1343*6777b538SAndroid Build Coastguard Worker // Preconditions: `result` is not in the range `(first, last]`.
1344*6777b538SAndroid Build Coastguard Worker //
1345*6777b538SAndroid Build Coastguard Worker // Effects: Copies elements in the range `[first, last)` into the range
1346*6777b538SAndroid Build Coastguard Worker // `[result - N, result)` starting from `last - 1` and proceeding to `first`.
1347*6777b538SAndroid Build Coastguard Worker // For each positive integer `n ≤ N`, performs `*(result - n) = *(last - n)`.
1348*6777b538SAndroid Build Coastguard Worker //
1349*6777b538SAndroid Build Coastguard Worker // Returns: `result - N`
1350*6777b538SAndroid Build Coastguard Worker //
1351*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `N` assignments.
1352*6777b538SAndroid Build Coastguard Worker //
1353*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.copy#:~:text=ranges::copy_backward(I1
1354*6777b538SAndroid Build Coastguard Worker template <typename BidirectionalIterator1,
1355*6777b538SAndroid Build Coastguard Worker typename BidirectionalIterator2,
1356*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<BidirectionalIterator1>,
1357*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<BidirectionalIterator2>>
copy_backward(BidirectionalIterator1 first,BidirectionalIterator1 last,BidirectionalIterator2 result)1358*6777b538SAndroid Build Coastguard Worker constexpr auto copy_backward(BidirectionalIterator1 first,
1359*6777b538SAndroid Build Coastguard Worker BidirectionalIterator1 last,
1360*6777b538SAndroid Build Coastguard Worker BidirectionalIterator2 result) {
1361*6777b538SAndroid Build Coastguard Worker return std::copy_backward(first, last, result);
1362*6777b538SAndroid Build Coastguard Worker }
1363*6777b538SAndroid Build Coastguard Worker
1364*6777b538SAndroid Build Coastguard Worker // Let `N` be `size(range)`.
1365*6777b538SAndroid Build Coastguard Worker //
1366*6777b538SAndroid Build Coastguard Worker // Preconditions: `result` is not in the range `(begin(range), end(range)]`.
1367*6777b538SAndroid Build Coastguard Worker //
1368*6777b538SAndroid Build Coastguard Worker // Effects: Copies elements in `range` into the range `[result - N, result)`
1369*6777b538SAndroid Build Coastguard Worker // starting from `end(range) - 1` and proceeding to `begin(range)`. For each
1370*6777b538SAndroid Build Coastguard Worker // positive integer `n ≤ N`, performs `*(result - n) = *(end(range) - n)`.
1371*6777b538SAndroid Build Coastguard Worker //
1372*6777b538SAndroid Build Coastguard Worker // Returns: `result - N`
1373*6777b538SAndroid Build Coastguard Worker //
1374*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `N` assignments.
1375*6777b538SAndroid Build Coastguard Worker //
1376*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.copy#:~:text=ranges::copy_backward(R
1377*6777b538SAndroid Build Coastguard Worker template <typename Range,
1378*6777b538SAndroid Build Coastguard Worker typename BidirectionalIterator,
1379*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
1380*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<BidirectionalIterator>>
copy_backward(Range && range,BidirectionalIterator result)1381*6777b538SAndroid Build Coastguard Worker constexpr auto copy_backward(Range&& range, BidirectionalIterator result) {
1382*6777b538SAndroid Build Coastguard Worker return ranges::copy_backward(ranges::begin(range), ranges::end(range),
1383*6777b538SAndroid Build Coastguard Worker result);
1384*6777b538SAndroid Build Coastguard Worker }
1385*6777b538SAndroid Build Coastguard Worker
1386*6777b538SAndroid Build Coastguard Worker // [alg.move] Move
1387*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.move
1388*6777b538SAndroid Build Coastguard Worker
1389*6777b538SAndroid Build Coastguard Worker // Let `E(n)` be `std::move(*(first + n))`.
1390*6777b538SAndroid Build Coastguard Worker //
1391*6777b538SAndroid Build Coastguard Worker // Let `N` be `last - first`.
1392*6777b538SAndroid Build Coastguard Worker //
1393*6777b538SAndroid Build Coastguard Worker // Preconditions: `result` is not in the range `[first, last)`.
1394*6777b538SAndroid Build Coastguard Worker //
1395*6777b538SAndroid Build Coastguard Worker // Effects: Moves elements in the range `[first, last)` into the range `[result,
1396*6777b538SAndroid Build Coastguard Worker // result + N)` starting from `first` and proceeding to `last`. For each
1397*6777b538SAndroid Build Coastguard Worker // non-negative integer `n < N`, performs `*(result + n) = E(n)`.
1398*6777b538SAndroid Build Coastguard Worker //
1399*6777b538SAndroid Build Coastguard Worker // Returns: `result + N`
1400*6777b538SAndroid Build Coastguard Worker //
1401*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `N` assignments.
1402*6777b538SAndroid Build Coastguard Worker //
1403*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.move#:~:text=ranges::move(I
1404*6777b538SAndroid Build Coastguard Worker template <typename InputIterator,
1405*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
1406*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator>,
1407*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>>
move(InputIterator first,InputIterator last,OutputIterator result)1408*6777b538SAndroid Build Coastguard Worker constexpr auto move(InputIterator first,
1409*6777b538SAndroid Build Coastguard Worker InputIterator last,
1410*6777b538SAndroid Build Coastguard Worker OutputIterator result) {
1411*6777b538SAndroid Build Coastguard Worker return std::move(first, last, result);
1412*6777b538SAndroid Build Coastguard Worker }
1413*6777b538SAndroid Build Coastguard Worker
1414*6777b538SAndroid Build Coastguard Worker // Let `E(n)` be `std::move(*(begin(range) + n))`.
1415*6777b538SAndroid Build Coastguard Worker //
1416*6777b538SAndroid Build Coastguard Worker // Let `N` be `size(range)`.
1417*6777b538SAndroid Build Coastguard Worker //
1418*6777b538SAndroid Build Coastguard Worker // Preconditions: `result` is not in `range`.
1419*6777b538SAndroid Build Coastguard Worker //
1420*6777b538SAndroid Build Coastguard Worker // Effects: Moves elements in `range` into the range `[result, result + N)`
1421*6777b538SAndroid Build Coastguard Worker // starting from `begin(range)` and proceeding to `end(range)`. For each
1422*6777b538SAndroid Build Coastguard Worker // non-negative integer `n < N`, performs `*(result + n) = E(n)`.
1423*6777b538SAndroid Build Coastguard Worker //
1424*6777b538SAndroid Build Coastguard Worker // Returns: `result + N`
1425*6777b538SAndroid Build Coastguard Worker //
1426*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `N` assignments.
1427*6777b538SAndroid Build Coastguard Worker //
1428*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.move#:~:text=ranges::move(R
1429*6777b538SAndroid Build Coastguard Worker template <typename Range,
1430*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
1431*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
1432*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>>
move(Range && range,OutputIterator result)1433*6777b538SAndroid Build Coastguard Worker constexpr auto move(Range&& range, OutputIterator result) {
1434*6777b538SAndroid Build Coastguard Worker return ranges::move(ranges::begin(range), ranges::end(range), result);
1435*6777b538SAndroid Build Coastguard Worker }
1436*6777b538SAndroid Build Coastguard Worker
1437*6777b538SAndroid Build Coastguard Worker // Let `E(n)` be `std::move(*(last - n))`.
1438*6777b538SAndroid Build Coastguard Worker //
1439*6777b538SAndroid Build Coastguard Worker // Let `N` be `last - first`.
1440*6777b538SAndroid Build Coastguard Worker //
1441*6777b538SAndroid Build Coastguard Worker // Preconditions: `result` is not in the range `(first, last]`.
1442*6777b538SAndroid Build Coastguard Worker //
1443*6777b538SAndroid Build Coastguard Worker // Effects: Moves elements in the range `[first, last)` into the range
1444*6777b538SAndroid Build Coastguard Worker // `[result - N, result)` starting from `last - 1` and proceeding to `first`.
1445*6777b538SAndroid Build Coastguard Worker // For each positive integer `n ≤ N`, performs `*(result - n) = E(n)`.
1446*6777b538SAndroid Build Coastguard Worker //
1447*6777b538SAndroid Build Coastguard Worker // Returns: `result - N`
1448*6777b538SAndroid Build Coastguard Worker //
1449*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `N` assignments.
1450*6777b538SAndroid Build Coastguard Worker //
1451*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.move#:~:text=ranges::move_backward(I1
1452*6777b538SAndroid Build Coastguard Worker template <typename BidirectionalIterator1,
1453*6777b538SAndroid Build Coastguard Worker typename BidirectionalIterator2,
1454*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<BidirectionalIterator1>,
1455*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<BidirectionalIterator2>>
move_backward(BidirectionalIterator1 first,BidirectionalIterator1 last,BidirectionalIterator2 result)1456*6777b538SAndroid Build Coastguard Worker constexpr auto move_backward(BidirectionalIterator1 first,
1457*6777b538SAndroid Build Coastguard Worker BidirectionalIterator1 last,
1458*6777b538SAndroid Build Coastguard Worker BidirectionalIterator2 result) {
1459*6777b538SAndroid Build Coastguard Worker return std::move_backward(first, last, result);
1460*6777b538SAndroid Build Coastguard Worker }
1461*6777b538SAndroid Build Coastguard Worker
1462*6777b538SAndroid Build Coastguard Worker // Let `E(n)` be `std::move(*(end(range) - n))`.
1463*6777b538SAndroid Build Coastguard Worker //
1464*6777b538SAndroid Build Coastguard Worker // Let `N` be `size(range)`.
1465*6777b538SAndroid Build Coastguard Worker //
1466*6777b538SAndroid Build Coastguard Worker // Preconditions: `result` is not in the range `(begin(range), end(range)]`.
1467*6777b538SAndroid Build Coastguard Worker //
1468*6777b538SAndroid Build Coastguard Worker // Effects: Moves elements in `range` into the range `[result - N, result)`
1469*6777b538SAndroid Build Coastguard Worker // starting from `end(range) - 1` and proceeding to `begin(range)`. For each
1470*6777b538SAndroid Build Coastguard Worker // positive integer `n ≤ N`, performs `*(result - n) = E(n)`.
1471*6777b538SAndroid Build Coastguard Worker //
1472*6777b538SAndroid Build Coastguard Worker // Returns: `result - N`
1473*6777b538SAndroid Build Coastguard Worker //
1474*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `N` assignments.
1475*6777b538SAndroid Build Coastguard Worker //
1476*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.move#:~:text=ranges::move_backward(R
1477*6777b538SAndroid Build Coastguard Worker template <typename Range,
1478*6777b538SAndroid Build Coastguard Worker typename BidirectionalIterator,
1479*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
1480*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<BidirectionalIterator>>
move_backward(Range && range,BidirectionalIterator result)1481*6777b538SAndroid Build Coastguard Worker constexpr auto move_backward(Range&& range, BidirectionalIterator result) {
1482*6777b538SAndroid Build Coastguard Worker return ranges::move_backward(ranges::begin(range), ranges::end(range),
1483*6777b538SAndroid Build Coastguard Worker result);
1484*6777b538SAndroid Build Coastguard Worker }
1485*6777b538SAndroid Build Coastguard Worker
1486*6777b538SAndroid Build Coastguard Worker // [alg.swap] Swap
1487*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.swap
1488*6777b538SAndroid Build Coastguard Worker
1489*6777b538SAndroid Build Coastguard Worker // Let `M` be `min(last1 - first1, last2 - first2)`.
1490*6777b538SAndroid Build Coastguard Worker //
1491*6777b538SAndroid Build Coastguard Worker // Preconditions: The two ranges `[first1, last1)` and `[first2, last2)` do not
1492*6777b538SAndroid Build Coastguard Worker // overlap. `*(first1 + n)` is swappable with `*(first2 + n)`.
1493*6777b538SAndroid Build Coastguard Worker //
1494*6777b538SAndroid Build Coastguard Worker // Effects: For each non-negative integer `n < M` performs
1495*6777b538SAndroid Build Coastguard Worker // `swap(*(first1 + n), *(first2 + n))`
1496*6777b538SAndroid Build Coastguard Worker //
1497*6777b538SAndroid Build Coastguard Worker // Returns: `first2 + M`
1498*6777b538SAndroid Build Coastguard Worker //
1499*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `M` swaps.
1500*6777b538SAndroid Build Coastguard Worker //
1501*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.swap#:~:text=ranges::swap_ranges(I1
1502*6777b538SAndroid Build Coastguard Worker template <typename ForwardIterator1,
1503*6777b538SAndroid Build Coastguard Worker typename ForwardIterator2,
1504*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator1>,
1505*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator2>>
swap_ranges(ForwardIterator1 first1,ForwardIterator1 last1,ForwardIterator2 first2,ForwardIterator2 last2)1506*6777b538SAndroid Build Coastguard Worker constexpr auto swap_ranges(ForwardIterator1 first1,
1507*6777b538SAndroid Build Coastguard Worker ForwardIterator1 last1,
1508*6777b538SAndroid Build Coastguard Worker ForwardIterator2 first2,
1509*6777b538SAndroid Build Coastguard Worker ForwardIterator2 last2) {
1510*6777b538SAndroid Build Coastguard Worker // std::swap_ranges does not have a `last2` overload. Thus we need to
1511*6777b538SAndroid Build Coastguard Worker // adjust `last1` to ensure to not read past `last2`.
1512*6777b538SAndroid Build Coastguard Worker last1 = std::next(first1, std::min(std::distance(first1, last1),
1513*6777b538SAndroid Build Coastguard Worker std::distance(first2, last2)));
1514*6777b538SAndroid Build Coastguard Worker return std::swap_ranges(first1, last1, first2);
1515*6777b538SAndroid Build Coastguard Worker }
1516*6777b538SAndroid Build Coastguard Worker
1517*6777b538SAndroid Build Coastguard Worker // Let `M` be `min(size(range1), size(range2))`.
1518*6777b538SAndroid Build Coastguard Worker //
1519*6777b538SAndroid Build Coastguard Worker // Preconditions: The two ranges `range1` and `range2` do not overlap.
1520*6777b538SAndroid Build Coastguard Worker // `*(begin(range1) + n)` is swappable with `*(begin(range2) + n)`.
1521*6777b538SAndroid Build Coastguard Worker //
1522*6777b538SAndroid Build Coastguard Worker // Effects: For each non-negative integer `n < M` performs
1523*6777b538SAndroid Build Coastguard Worker // `swap(*(begin(range1) + n), *(begin(range2) + n))`
1524*6777b538SAndroid Build Coastguard Worker //
1525*6777b538SAndroid Build Coastguard Worker // Returns: `begin(range2) + M`
1526*6777b538SAndroid Build Coastguard Worker //
1527*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `M` swaps.
1528*6777b538SAndroid Build Coastguard Worker //
1529*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.swap#:~:text=ranges::swap_ranges(R1
1530*6777b538SAndroid Build Coastguard Worker template <typename Range1,
1531*6777b538SAndroid Build Coastguard Worker typename Range2,
1532*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range1>,
1533*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range2>>
swap_ranges(Range1 && range1,Range2 && range2)1534*6777b538SAndroid Build Coastguard Worker constexpr auto swap_ranges(Range1&& range1, Range2&& range2) {
1535*6777b538SAndroid Build Coastguard Worker return ranges::swap_ranges(ranges::begin(range1), ranges::end(range1),
1536*6777b538SAndroid Build Coastguard Worker ranges::begin(range2), ranges::end(range2));
1537*6777b538SAndroid Build Coastguard Worker }
1538*6777b538SAndroid Build Coastguard Worker
1539*6777b538SAndroid Build Coastguard Worker // [alg.transform] Transform
1540*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.transform
1541*6777b538SAndroid Build Coastguard Worker
1542*6777b538SAndroid Build Coastguard Worker // Let `N` be `last1 - first1`,
1543*6777b538SAndroid Build Coastguard Worker // `E(i)` be `invoke(op, invoke(proj, *(first1 + (i - result))))`.
1544*6777b538SAndroid Build Coastguard Worker //
1545*6777b538SAndroid Build Coastguard Worker // Preconditions: `op` does not invalidate iterators or subranges, nor modify
1546*6777b538SAndroid Build Coastguard Worker // elements in the ranges `[first1, first1 + N]`, and `[result, result + N]`.
1547*6777b538SAndroid Build Coastguard Worker //
1548*6777b538SAndroid Build Coastguard Worker // Effects: Assigns through every iterator `i` in the range
1549*6777b538SAndroid Build Coastguard Worker // `[result, result + N)` a new corresponding value equal to `E(i)`.
1550*6777b538SAndroid Build Coastguard Worker //
1551*6777b538SAndroid Build Coastguard Worker // Returns: `result + N`
1552*6777b538SAndroid Build Coastguard Worker //
1553*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `N` applications of `op` and any projections.
1554*6777b538SAndroid Build Coastguard Worker //
1555*6777b538SAndroid Build Coastguard Worker // Remarks: result may be equal to `first1`.
1556*6777b538SAndroid Build Coastguard Worker //
1557*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.transform#:~:text=ranges::transform(I
1558*6777b538SAndroid Build Coastguard Worker template <
1559*6777b538SAndroid Build Coastguard Worker typename InputIterator,
1560*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
1561*6777b538SAndroid Build Coastguard Worker typename UnaryOperation,
1562*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
1563*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator>,
1564*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>,
1565*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<UnaryOperation&,
1566*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator, Proj>>>
1567*6777b538SAndroid Build Coastguard Worker constexpr auto transform(InputIterator first1,
1568*6777b538SAndroid Build Coastguard Worker InputIterator last1,
1569*6777b538SAndroid Build Coastguard Worker OutputIterator result,
1570*6777b538SAndroid Build Coastguard Worker UnaryOperation op,
1571*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
1572*6777b538SAndroid Build Coastguard Worker return std::transform(first1, last1, result, [&op, &proj](auto&& arg) {
1573*6777b538SAndroid Build Coastguard Worker return std::invoke(op, std::invoke(proj, std::forward<decltype(arg)>(arg)));
1574*6777b538SAndroid Build Coastguard Worker });
1575*6777b538SAndroid Build Coastguard Worker }
1576*6777b538SAndroid Build Coastguard Worker
1577*6777b538SAndroid Build Coastguard Worker // Let `N` be `size(range)`,
1578*6777b538SAndroid Build Coastguard Worker // `E(i)` be `invoke(op, invoke(proj, *(begin(range) + (i - result))))`.
1579*6777b538SAndroid Build Coastguard Worker //
1580*6777b538SAndroid Build Coastguard Worker // Preconditions: `op` does not invalidate iterators or subranges, nor modify
1581*6777b538SAndroid Build Coastguard Worker // elements in the ranges `[begin(range), end(range)]`, and
1582*6777b538SAndroid Build Coastguard Worker // `[result, result + N]`.
1583*6777b538SAndroid Build Coastguard Worker //
1584*6777b538SAndroid Build Coastguard Worker // Effects: Assigns through every iterator `i` in the range
1585*6777b538SAndroid Build Coastguard Worker // `[result, result + N)` a new corresponding value equal to `E(i)`.
1586*6777b538SAndroid Build Coastguard Worker //
1587*6777b538SAndroid Build Coastguard Worker // Returns: `result + N`
1588*6777b538SAndroid Build Coastguard Worker //
1589*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `N` applications of `op` and any projections.
1590*6777b538SAndroid Build Coastguard Worker //
1591*6777b538SAndroid Build Coastguard Worker // Remarks: result may be equal to `begin(range)`.
1592*6777b538SAndroid Build Coastguard Worker //
1593*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.transform#:~:text=ranges::transform(R
1594*6777b538SAndroid Build Coastguard Worker template <
1595*6777b538SAndroid Build Coastguard Worker typename Range,
1596*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
1597*6777b538SAndroid Build Coastguard Worker typename UnaryOperation,
1598*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
1599*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
1600*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>,
1601*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<UnaryOperation&,
1602*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>>>
1603*6777b538SAndroid Build Coastguard Worker constexpr auto transform(Range&& range,
1604*6777b538SAndroid Build Coastguard Worker OutputIterator result,
1605*6777b538SAndroid Build Coastguard Worker UnaryOperation op,
1606*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
1607*6777b538SAndroid Build Coastguard Worker return ranges::transform(ranges::begin(range), ranges::end(range), result,
1608*6777b538SAndroid Build Coastguard Worker std::move(op), std::move(proj));
1609*6777b538SAndroid Build Coastguard Worker }
1610*6777b538SAndroid Build Coastguard Worker
1611*6777b538SAndroid Build Coastguard Worker // Let:
1612*6777b538SAndroid Build Coastguard Worker // `N` be `min(last1 - first1, last2 - first2)`,
1613*6777b538SAndroid Build Coastguard Worker // `E(i)` be `invoke(binary_op, invoke(proj1, *(first1 + (i - result))),
1614*6777b538SAndroid Build Coastguard Worker // invoke(proj2, *(first2 + (i - result))))`.
1615*6777b538SAndroid Build Coastguard Worker //
1616*6777b538SAndroid Build Coastguard Worker // Preconditions: `binary_op` does not invalidate iterators or subranges, nor
1617*6777b538SAndroid Build Coastguard Worker // modify elements in the ranges `[first1, first1 + N]`, `[first2, first2 + N]`,
1618*6777b538SAndroid Build Coastguard Worker // and `[result, result + N]`.
1619*6777b538SAndroid Build Coastguard Worker //
1620*6777b538SAndroid Build Coastguard Worker // Effects: Assigns through every iterator `i` in the range
1621*6777b538SAndroid Build Coastguard Worker // `[result, result + N)` a new corresponding value equal to `E(i)`.
1622*6777b538SAndroid Build Coastguard Worker //
1623*6777b538SAndroid Build Coastguard Worker // Returns: `result + N`
1624*6777b538SAndroid Build Coastguard Worker //
1625*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `N` applications of `binary_op`, and any projections.
1626*6777b538SAndroid Build Coastguard Worker //
1627*6777b538SAndroid Build Coastguard Worker // Remarks: `result` may be equal to `first1` or `first2`.
1628*6777b538SAndroid Build Coastguard Worker //
1629*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.transform#:~:text=ranges::transform(I1
1630*6777b538SAndroid Build Coastguard Worker template <
1631*6777b538SAndroid Build Coastguard Worker typename ForwardIterator1,
1632*6777b538SAndroid Build Coastguard Worker typename ForwardIterator2,
1633*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
1634*6777b538SAndroid Build Coastguard Worker typename BinaryOperation,
1635*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
1636*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
1637*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator1>,
1638*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator2>,
1639*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>,
1640*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<BinaryOperation&,
1641*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator1, Proj1>,
1642*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator2, Proj2>>>
1643*6777b538SAndroid Build Coastguard Worker constexpr auto transform(ForwardIterator1 first1,
1644*6777b538SAndroid Build Coastguard Worker ForwardIterator1 last1,
1645*6777b538SAndroid Build Coastguard Worker ForwardIterator2 first2,
1646*6777b538SAndroid Build Coastguard Worker ForwardIterator2 last2,
1647*6777b538SAndroid Build Coastguard Worker OutputIterator result,
1648*6777b538SAndroid Build Coastguard Worker BinaryOperation binary_op,
1649*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
1650*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
1651*6777b538SAndroid Build Coastguard Worker // std::transform does not have a `last2` overload. Thus we need to adjust
1652*6777b538SAndroid Build Coastguard Worker // `last1` to ensure to not read past `last2`.
1653*6777b538SAndroid Build Coastguard Worker last1 = std::next(first1, std::min(std::distance(first1, last1),
1654*6777b538SAndroid Build Coastguard Worker std::distance(first2, last2)));
1655*6777b538SAndroid Build Coastguard Worker return std::transform(
1656*6777b538SAndroid Build Coastguard Worker first1, last1, first2, result,
1657*6777b538SAndroid Build Coastguard Worker [&binary_op, &proj1, &proj2](auto&& lhs, auto&& rhs) {
1658*6777b538SAndroid Build Coastguard Worker return std::invoke(
1659*6777b538SAndroid Build Coastguard Worker binary_op, std::invoke(proj1, std::forward<decltype(lhs)>(lhs)),
1660*6777b538SAndroid Build Coastguard Worker std::invoke(proj2, std::forward<decltype(rhs)>(rhs)));
1661*6777b538SAndroid Build Coastguard Worker });
1662*6777b538SAndroid Build Coastguard Worker }
1663*6777b538SAndroid Build Coastguard Worker
1664*6777b538SAndroid Build Coastguard Worker // Let:
1665*6777b538SAndroid Build Coastguard Worker // `N` be `min(size(range1), size(range2)`,
1666*6777b538SAndroid Build Coastguard Worker // `E(i)` be `invoke(binary_op, invoke(proj1, *(begin(range1) + (i - result))),
1667*6777b538SAndroid Build Coastguard Worker // invoke(proj2, *(begin(range2) + (i - result))))`
1668*6777b538SAndroid Build Coastguard Worker //
1669*6777b538SAndroid Build Coastguard Worker // Preconditions: `binary_op` does not invalidate iterators or subranges, nor
1670*6777b538SAndroid Build Coastguard Worker // modify elements in the ranges `[begin(range1), end(range1)]`,
1671*6777b538SAndroid Build Coastguard Worker // `[begin(range2), end(range2)]`, and `[result, result + N]`.
1672*6777b538SAndroid Build Coastguard Worker //
1673*6777b538SAndroid Build Coastguard Worker // Effects: Assigns through every iterator `i` in the range
1674*6777b538SAndroid Build Coastguard Worker // `[result, result + N)` a new corresponding value equal to `E(i)`.
1675*6777b538SAndroid Build Coastguard Worker //
1676*6777b538SAndroid Build Coastguard Worker // Returns: `result + N`
1677*6777b538SAndroid Build Coastguard Worker //
1678*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `N` applications of `binary_op`, and any projections.
1679*6777b538SAndroid Build Coastguard Worker //
1680*6777b538SAndroid Build Coastguard Worker // Remarks: `result` may be equal to `begin(range1)` or `begin(range2)`.
1681*6777b538SAndroid Build Coastguard Worker //
1682*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.transform#:~:text=ranges::transform(R1
1683*6777b538SAndroid Build Coastguard Worker template <typename Range1,
1684*6777b538SAndroid Build Coastguard Worker typename Range2,
1685*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
1686*6777b538SAndroid Build Coastguard Worker typename BinaryOperation,
1687*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
1688*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
1689*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range1>,
1690*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range2>,
1691*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>,
1692*6777b538SAndroid Build Coastguard Worker typename =
1693*6777b538SAndroid Build Coastguard Worker std::indirect_result_t<BinaryOperation&,
1694*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range1>, Proj1>,
1695*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range2>, Proj2>>>
1696*6777b538SAndroid Build Coastguard Worker constexpr auto transform(Range1&& range1,
1697*6777b538SAndroid Build Coastguard Worker Range2&& range2,
1698*6777b538SAndroid Build Coastguard Worker OutputIterator result,
1699*6777b538SAndroid Build Coastguard Worker BinaryOperation binary_op,
1700*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
1701*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
1702*6777b538SAndroid Build Coastguard Worker return ranges::transform(ranges::begin(range1), ranges::end(range1),
1703*6777b538SAndroid Build Coastguard Worker ranges::begin(range2), ranges::end(range2), result,
1704*6777b538SAndroid Build Coastguard Worker std::move(binary_op), std::move(proj1),
1705*6777b538SAndroid Build Coastguard Worker std::move(proj2));
1706*6777b538SAndroid Build Coastguard Worker }
1707*6777b538SAndroid Build Coastguard Worker
1708*6777b538SAndroid Build Coastguard Worker // [alg.replace] Replace
1709*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.replace
1710*6777b538SAndroid Build Coastguard Worker
1711*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(proj, *i) == old_value)`.
1712*6777b538SAndroid Build Coastguard Worker //
1713*6777b538SAndroid Build Coastguard Worker // Mandates: `new_value` is writable to `first`.
1714*6777b538SAndroid Build Coastguard Worker //
1715*6777b538SAndroid Build Coastguard Worker // Effects: Substitutes elements referred by the iterator `i` in the range
1716*6777b538SAndroid Build Coastguard Worker // `[first, last)` with `new_value`, when `E(i)` is true.
1717*6777b538SAndroid Build Coastguard Worker //
1718*6777b538SAndroid Build Coastguard Worker // Returns: `last`
1719*6777b538SAndroid Build Coastguard Worker //
1720*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `last - first` applications of the corresponding
1721*6777b538SAndroid Build Coastguard Worker // predicate and any projection.
1722*6777b538SAndroid Build Coastguard Worker //
1723*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.replace#:~:text=ranges::replace(I
1724*6777b538SAndroid Build Coastguard Worker template <typename ForwardIterator,
1725*6777b538SAndroid Build Coastguard Worker typename T,
1726*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
1727*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator>>
1728*6777b538SAndroid Build Coastguard Worker constexpr auto replace(ForwardIterator first,
1729*6777b538SAndroid Build Coastguard Worker ForwardIterator last,
1730*6777b538SAndroid Build Coastguard Worker const T& old_value,
1731*6777b538SAndroid Build Coastguard Worker const T& new_value,
1732*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
1733*6777b538SAndroid Build Coastguard Worker // Note: In order to be able to apply `proj` to each element in [first, last)
1734*6777b538SAndroid Build Coastguard Worker // we are dispatching to std::replace_if instead of std::replace.
1735*6777b538SAndroid Build Coastguard Worker std::replace_if(
1736*6777b538SAndroid Build Coastguard Worker first, last,
1737*6777b538SAndroid Build Coastguard Worker [&proj, &old_value](auto&& lhs) {
1738*6777b538SAndroid Build Coastguard Worker return std::invoke(proj, std::forward<decltype(lhs)>(lhs)) == old_value;
1739*6777b538SAndroid Build Coastguard Worker },
1740*6777b538SAndroid Build Coastguard Worker new_value);
1741*6777b538SAndroid Build Coastguard Worker return last;
1742*6777b538SAndroid Build Coastguard Worker }
1743*6777b538SAndroid Build Coastguard Worker
1744*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(proj, *i) == old_value)`.
1745*6777b538SAndroid Build Coastguard Worker //
1746*6777b538SAndroid Build Coastguard Worker // Mandates: `new_value` is writable to `begin(range)`.
1747*6777b538SAndroid Build Coastguard Worker //
1748*6777b538SAndroid Build Coastguard Worker // Effects: Substitutes elements referred by the iterator `i` in `range` with
1749*6777b538SAndroid Build Coastguard Worker // `new_value`, when `E(i)` is true.
1750*6777b538SAndroid Build Coastguard Worker //
1751*6777b538SAndroid Build Coastguard Worker // Returns: `end(range)`
1752*6777b538SAndroid Build Coastguard Worker //
1753*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `size(range)` applications of the corresponding predicate
1754*6777b538SAndroid Build Coastguard Worker // and any projection.
1755*6777b538SAndroid Build Coastguard Worker //
1756*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.replace#:~:text=ranges::replace(R
1757*6777b538SAndroid Build Coastguard Worker template <typename Range,
1758*6777b538SAndroid Build Coastguard Worker typename T,
1759*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
1760*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
1761*6777b538SAndroid Build Coastguard Worker constexpr auto replace(Range&& range,
1762*6777b538SAndroid Build Coastguard Worker const T& old_value,
1763*6777b538SAndroid Build Coastguard Worker const T& new_value,
1764*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
1765*6777b538SAndroid Build Coastguard Worker return ranges::replace(ranges::begin(range), ranges::end(range), old_value,
1766*6777b538SAndroid Build Coastguard Worker new_value, std::move(proj));
1767*6777b538SAndroid Build Coastguard Worker }
1768*6777b538SAndroid Build Coastguard Worker
1769*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(pred, invoke(proj, *i)))`.
1770*6777b538SAndroid Build Coastguard Worker //
1771*6777b538SAndroid Build Coastguard Worker // Mandates: `new_value` is writable to `first`.
1772*6777b538SAndroid Build Coastguard Worker //
1773*6777b538SAndroid Build Coastguard Worker // Effects: Substitutes elements referred by the iterator `i` in the range
1774*6777b538SAndroid Build Coastguard Worker // `[first, last)` with `new_value`, when `E(i)` is true.
1775*6777b538SAndroid Build Coastguard Worker //
1776*6777b538SAndroid Build Coastguard Worker // Returns: `last`
1777*6777b538SAndroid Build Coastguard Worker //
1778*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `last - first` applications of the corresponding
1779*6777b538SAndroid Build Coastguard Worker // predicate and any projection.
1780*6777b538SAndroid Build Coastguard Worker //
1781*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.replace#:~:text=ranges::replace_if(I
1782*6777b538SAndroid Build Coastguard Worker template <typename ForwardIterator,
1783*6777b538SAndroid Build Coastguard Worker typename Predicate,
1784*6777b538SAndroid Build Coastguard Worker typename T,
1785*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
1786*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator>>
1787*6777b538SAndroid Build Coastguard Worker constexpr auto replace_if(ForwardIterator first,
1788*6777b538SAndroid Build Coastguard Worker ForwardIterator last,
1789*6777b538SAndroid Build Coastguard Worker Predicate pred,
1790*6777b538SAndroid Build Coastguard Worker const T& new_value,
1791*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
1792*6777b538SAndroid Build Coastguard Worker std::replace_if(first, last, internal::ProjectedUnaryPredicate(pred, proj),
1793*6777b538SAndroid Build Coastguard Worker new_value);
1794*6777b538SAndroid Build Coastguard Worker return last;
1795*6777b538SAndroid Build Coastguard Worker }
1796*6777b538SAndroid Build Coastguard Worker
1797*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(pred, invoke(proj, *i)))`.
1798*6777b538SAndroid Build Coastguard Worker //
1799*6777b538SAndroid Build Coastguard Worker // Mandates: `new_value` is writable to `begin(range)`.
1800*6777b538SAndroid Build Coastguard Worker //
1801*6777b538SAndroid Build Coastguard Worker // Effects: Substitutes elements referred by the iterator `i` in `range` with
1802*6777b538SAndroid Build Coastguard Worker // `new_value`, when `E(i)` is true.
1803*6777b538SAndroid Build Coastguard Worker //
1804*6777b538SAndroid Build Coastguard Worker // Returns: `end(range)`
1805*6777b538SAndroid Build Coastguard Worker //
1806*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `size(range)` applications of the corresponding predicate
1807*6777b538SAndroid Build Coastguard Worker // and any projection.
1808*6777b538SAndroid Build Coastguard Worker //
1809*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.replace#:~:text=ranges::replace_if(R
1810*6777b538SAndroid Build Coastguard Worker template <typename Range,
1811*6777b538SAndroid Build Coastguard Worker typename Predicate,
1812*6777b538SAndroid Build Coastguard Worker typename T,
1813*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
1814*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
1815*6777b538SAndroid Build Coastguard Worker constexpr auto replace_if(Range&& range,
1816*6777b538SAndroid Build Coastguard Worker Predicate pred,
1817*6777b538SAndroid Build Coastguard Worker const T& new_value,
1818*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
1819*6777b538SAndroid Build Coastguard Worker return ranges::replace_if(ranges::begin(range), ranges::end(range),
1820*6777b538SAndroid Build Coastguard Worker std::move(pred), new_value, std::move(proj));
1821*6777b538SAndroid Build Coastguard Worker }
1822*6777b538SAndroid Build Coastguard Worker
1823*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(proj, *(first + (i - result))) == old_value)`.
1824*6777b538SAndroid Build Coastguard Worker //
1825*6777b538SAndroid Build Coastguard Worker // Mandates: The results of the expressions `*first` and `new_value` are
1826*6777b538SAndroid Build Coastguard Worker // writable to `result`.
1827*6777b538SAndroid Build Coastguard Worker //
1828*6777b538SAndroid Build Coastguard Worker // Preconditions: The ranges `[first, last)` and `[result, result + (last -
1829*6777b538SAndroid Build Coastguard Worker // first))` do not overlap.
1830*6777b538SAndroid Build Coastguard Worker //
1831*6777b538SAndroid Build Coastguard Worker // Effects: Assigns through every iterator `i` in the range `[result, result +
1832*6777b538SAndroid Build Coastguard Worker // (last - first))` a new corresponding value, `new_value` if `E(i)` is true, or
1833*6777b538SAndroid Build Coastguard Worker // `*(first + (i - result))` otherwise.
1834*6777b538SAndroid Build Coastguard Worker //
1835*6777b538SAndroid Build Coastguard Worker // Returns: `result + (last - first)`.
1836*6777b538SAndroid Build Coastguard Worker //
1837*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `last - first` applications of the corresponding
1838*6777b538SAndroid Build Coastguard Worker // predicate and any projection.
1839*6777b538SAndroid Build Coastguard Worker //
1840*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.replace#:~:text=ranges::replace_copy(I
1841*6777b538SAndroid Build Coastguard Worker template <typename InputIterator,
1842*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
1843*6777b538SAndroid Build Coastguard Worker typename T,
1844*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
1845*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator>,
1846*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>>
1847*6777b538SAndroid Build Coastguard Worker constexpr auto replace_copy(InputIterator first,
1848*6777b538SAndroid Build Coastguard Worker InputIterator last,
1849*6777b538SAndroid Build Coastguard Worker OutputIterator result,
1850*6777b538SAndroid Build Coastguard Worker const T& old_value,
1851*6777b538SAndroid Build Coastguard Worker const T& new_value,
1852*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
1853*6777b538SAndroid Build Coastguard Worker // Note: In order to be able to apply `proj` to each element in [first, last)
1854*6777b538SAndroid Build Coastguard Worker // we are dispatching to std::replace_copy_if instead of std::replace_copy.
1855*6777b538SAndroid Build Coastguard Worker std::replace_copy_if(
1856*6777b538SAndroid Build Coastguard Worker first, last, result,
1857*6777b538SAndroid Build Coastguard Worker [&proj, &old_value](auto&& lhs) {
1858*6777b538SAndroid Build Coastguard Worker return std::invoke(proj, std::forward<decltype(lhs)>(lhs)) == old_value;
1859*6777b538SAndroid Build Coastguard Worker },
1860*6777b538SAndroid Build Coastguard Worker new_value);
1861*6777b538SAndroid Build Coastguard Worker return last;
1862*6777b538SAndroid Build Coastguard Worker }
1863*6777b538SAndroid Build Coastguard Worker
1864*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be
1865*6777b538SAndroid Build Coastguard Worker // `bool(invoke(proj, *(begin(range) + (i - result))) == old_value)`.
1866*6777b538SAndroid Build Coastguard Worker //
1867*6777b538SAndroid Build Coastguard Worker // Mandates: The results of the expressions `*begin(range)` and `new_value` are
1868*6777b538SAndroid Build Coastguard Worker // writable to `result`.
1869*6777b538SAndroid Build Coastguard Worker //
1870*6777b538SAndroid Build Coastguard Worker // Preconditions: The ranges `range` and `[result, result + size(range))` do not
1871*6777b538SAndroid Build Coastguard Worker // overlap.
1872*6777b538SAndroid Build Coastguard Worker //
1873*6777b538SAndroid Build Coastguard Worker // Effects: Assigns through every iterator `i` in the range `[result, result +
1874*6777b538SAndroid Build Coastguard Worker // size(range))` a new corresponding value, `new_value` if `E(i)` is true, or
1875*6777b538SAndroid Build Coastguard Worker // `*(begin(range) + (i - result))` otherwise.
1876*6777b538SAndroid Build Coastguard Worker //
1877*6777b538SAndroid Build Coastguard Worker // Returns: `result + size(range)`.
1878*6777b538SAndroid Build Coastguard Worker //
1879*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `size(range)` applications of the corresponding
1880*6777b538SAndroid Build Coastguard Worker // predicate and any projection.
1881*6777b538SAndroid Build Coastguard Worker //
1882*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.replace#:~:text=ranges::replace_copy(R
1883*6777b538SAndroid Build Coastguard Worker template <typename Range,
1884*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
1885*6777b538SAndroid Build Coastguard Worker typename T,
1886*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
1887*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
1888*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>>
1889*6777b538SAndroid Build Coastguard Worker constexpr auto replace_copy(Range&& range,
1890*6777b538SAndroid Build Coastguard Worker OutputIterator result,
1891*6777b538SAndroid Build Coastguard Worker const T& old_value,
1892*6777b538SAndroid Build Coastguard Worker const T& new_value,
1893*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
1894*6777b538SAndroid Build Coastguard Worker return ranges::replace_copy(ranges::begin(range), ranges::end(range), result,
1895*6777b538SAndroid Build Coastguard Worker old_value, new_value, std::move(proj));
1896*6777b538SAndroid Build Coastguard Worker }
1897*6777b538SAndroid Build Coastguard Worker
1898*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(pred, invoke(proj, *(first + (i - result)))))`.
1899*6777b538SAndroid Build Coastguard Worker //
1900*6777b538SAndroid Build Coastguard Worker // Mandates: The results of the expressions `*first` and `new_value` are
1901*6777b538SAndroid Build Coastguard Worker // writable to `result`.
1902*6777b538SAndroid Build Coastguard Worker //
1903*6777b538SAndroid Build Coastguard Worker // Preconditions: The ranges `[first, last)` and `[result, result + (last -
1904*6777b538SAndroid Build Coastguard Worker // first))` do not overlap.
1905*6777b538SAndroid Build Coastguard Worker //
1906*6777b538SAndroid Build Coastguard Worker // Effects: Assigns through every iterator `i` in the range `[result, result +
1907*6777b538SAndroid Build Coastguard Worker // (last - first))` a new corresponding value, `new_value` if `E(i)` is true, or
1908*6777b538SAndroid Build Coastguard Worker // `*(first + (i - result))` otherwise.
1909*6777b538SAndroid Build Coastguard Worker //
1910*6777b538SAndroid Build Coastguard Worker // Returns: `result + (last - first)`.
1911*6777b538SAndroid Build Coastguard Worker //
1912*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `last - first` applications of the corresponding
1913*6777b538SAndroid Build Coastguard Worker // predicate and any projection.
1914*6777b538SAndroid Build Coastguard Worker //
1915*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.replace#:~:text=ranges::replace_copy_if(I
1916*6777b538SAndroid Build Coastguard Worker template <typename InputIterator,
1917*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
1918*6777b538SAndroid Build Coastguard Worker typename Predicate,
1919*6777b538SAndroid Build Coastguard Worker typename T,
1920*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
1921*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator>,
1922*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>>
1923*6777b538SAndroid Build Coastguard Worker constexpr auto replace_copy_if(InputIterator first,
1924*6777b538SAndroid Build Coastguard Worker InputIterator last,
1925*6777b538SAndroid Build Coastguard Worker OutputIterator result,
1926*6777b538SAndroid Build Coastguard Worker Predicate pred,
1927*6777b538SAndroid Build Coastguard Worker const T& new_value,
1928*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
1929*6777b538SAndroid Build Coastguard Worker return std::replace_copy_if(first, last, result,
1930*6777b538SAndroid Build Coastguard Worker internal::ProjectedUnaryPredicate(pred, proj),
1931*6777b538SAndroid Build Coastguard Worker new_value);
1932*6777b538SAndroid Build Coastguard Worker }
1933*6777b538SAndroid Build Coastguard Worker
1934*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be
1935*6777b538SAndroid Build Coastguard Worker // `bool(invoke(pred, invoke(proj, *(begin(range) + (i - result)))))`.
1936*6777b538SAndroid Build Coastguard Worker //
1937*6777b538SAndroid Build Coastguard Worker // Mandates: The results of the expressions `*begin(range)` and `new_value` are
1938*6777b538SAndroid Build Coastguard Worker // writable to `result`.
1939*6777b538SAndroid Build Coastguard Worker //
1940*6777b538SAndroid Build Coastguard Worker // Preconditions: The ranges `range` and `[result, result + size(range))` do not
1941*6777b538SAndroid Build Coastguard Worker // overlap.
1942*6777b538SAndroid Build Coastguard Worker //
1943*6777b538SAndroid Build Coastguard Worker // Effects: Assigns through every iterator `i` in the range `[result, result +
1944*6777b538SAndroid Build Coastguard Worker // size(range))` a new corresponding value, `new_value` if `E(i)` is true, or
1945*6777b538SAndroid Build Coastguard Worker // `*(begin(range) + (i - result))` otherwise.
1946*6777b538SAndroid Build Coastguard Worker //
1947*6777b538SAndroid Build Coastguard Worker // Returns: `result + size(range)`.
1948*6777b538SAndroid Build Coastguard Worker //
1949*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `size(range)` applications of the corresponding
1950*6777b538SAndroid Build Coastguard Worker // predicate and any projection.
1951*6777b538SAndroid Build Coastguard Worker //
1952*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.replace#:~:text=ranges::replace_copy_if(R
1953*6777b538SAndroid Build Coastguard Worker template <typename Range,
1954*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
1955*6777b538SAndroid Build Coastguard Worker typename Predicate,
1956*6777b538SAndroid Build Coastguard Worker typename T,
1957*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
1958*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
1959*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>>
1960*6777b538SAndroid Build Coastguard Worker constexpr auto replace_copy_if(Range&& range,
1961*6777b538SAndroid Build Coastguard Worker OutputIterator result,
1962*6777b538SAndroid Build Coastguard Worker Predicate pred,
1963*6777b538SAndroid Build Coastguard Worker const T& new_value,
1964*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
1965*6777b538SAndroid Build Coastguard Worker return ranges::replace_copy_if(ranges::begin(range), ranges::end(range),
1966*6777b538SAndroid Build Coastguard Worker result, pred, new_value, std::move(proj));
1967*6777b538SAndroid Build Coastguard Worker }
1968*6777b538SAndroid Build Coastguard Worker
1969*6777b538SAndroid Build Coastguard Worker // [alg.fill] Fill
1970*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.fill
1971*6777b538SAndroid Build Coastguard Worker
1972*6777b538SAndroid Build Coastguard Worker // Let `N` be `last - first`.
1973*6777b538SAndroid Build Coastguard Worker //
1974*6777b538SAndroid Build Coastguard Worker // Mandates: The expression `value` is writable to the output iterator.
1975*6777b538SAndroid Build Coastguard Worker //
1976*6777b538SAndroid Build Coastguard Worker // Effects: Assigns `value` through all the iterators in the range
1977*6777b538SAndroid Build Coastguard Worker // `[first, last)`.
1978*6777b538SAndroid Build Coastguard Worker //
1979*6777b538SAndroid Build Coastguard Worker // Returns: `last`.
1980*6777b538SAndroid Build Coastguard Worker //
1981*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `N` assignments.
1982*6777b538SAndroid Build Coastguard Worker //
1983*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.fill#:~:text=ranges::fill(O
1984*6777b538SAndroid Build Coastguard Worker template <typename OutputIterator,
1985*6777b538SAndroid Build Coastguard Worker typename T,
1986*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>>
fill(OutputIterator first,OutputIterator last,const T & value)1987*6777b538SAndroid Build Coastguard Worker constexpr auto fill(OutputIterator first, OutputIterator last, const T& value) {
1988*6777b538SAndroid Build Coastguard Worker std::fill(first, last, value);
1989*6777b538SAndroid Build Coastguard Worker return last;
1990*6777b538SAndroid Build Coastguard Worker }
1991*6777b538SAndroid Build Coastguard Worker
1992*6777b538SAndroid Build Coastguard Worker // Let `N` be `size(range)`.
1993*6777b538SAndroid Build Coastguard Worker //
1994*6777b538SAndroid Build Coastguard Worker // Mandates: The expression `value` is writable to the output iterator.
1995*6777b538SAndroid Build Coastguard Worker //
1996*6777b538SAndroid Build Coastguard Worker // Effects: Assigns `value` through all the iterators in `range`.
1997*6777b538SAndroid Build Coastguard Worker //
1998*6777b538SAndroid Build Coastguard Worker // Returns: `end(range)`.
1999*6777b538SAndroid Build Coastguard Worker //
2000*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `N` assignments.
2001*6777b538SAndroid Build Coastguard Worker //
2002*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.fill#:~:text=ranges::fill(R
2003*6777b538SAndroid Build Coastguard Worker template <typename Range,
2004*6777b538SAndroid Build Coastguard Worker typename T,
2005*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
fill(Range && range,const T & value)2006*6777b538SAndroid Build Coastguard Worker constexpr auto fill(Range&& range, const T& value) {
2007*6777b538SAndroid Build Coastguard Worker return ranges::fill(ranges::begin(range), ranges::end(range), value);
2008*6777b538SAndroid Build Coastguard Worker }
2009*6777b538SAndroid Build Coastguard Worker
2010*6777b538SAndroid Build Coastguard Worker // Let `N` be `max(0, n)`.
2011*6777b538SAndroid Build Coastguard Worker //
2012*6777b538SAndroid Build Coastguard Worker // Mandates: The expression `value` is writable to the output iterator.
2013*6777b538SAndroid Build Coastguard Worker // The type `Size` is convertible to an integral type.
2014*6777b538SAndroid Build Coastguard Worker //
2015*6777b538SAndroid Build Coastguard Worker // Effects: Assigns `value` through all the iterators in `[first, first + N)`.
2016*6777b538SAndroid Build Coastguard Worker //
2017*6777b538SAndroid Build Coastguard Worker // Returns: `first + N`.
2018*6777b538SAndroid Build Coastguard Worker //
2019*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `N` assignments.
2020*6777b538SAndroid Build Coastguard Worker //
2021*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.fill#:~:text=ranges::fill_n(O
2022*6777b538SAndroid Build Coastguard Worker template <typename OutputIterator,
2023*6777b538SAndroid Build Coastguard Worker typename Size,
2024*6777b538SAndroid Build Coastguard Worker typename T,
2025*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>>
fill_n(OutputIterator first,Size n,const T & value)2026*6777b538SAndroid Build Coastguard Worker constexpr auto fill_n(OutputIterator first, Size n, const T& value) {
2027*6777b538SAndroid Build Coastguard Worker return std::fill_n(first, n, value);
2028*6777b538SAndroid Build Coastguard Worker }
2029*6777b538SAndroid Build Coastguard Worker
2030*6777b538SAndroid Build Coastguard Worker // [alg.generate] Generate
2031*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.generate
2032*6777b538SAndroid Build Coastguard Worker
2033*6777b538SAndroid Build Coastguard Worker // Let `N` be `last - first`.
2034*6777b538SAndroid Build Coastguard Worker //
2035*6777b538SAndroid Build Coastguard Worker // Effects: Assigns the result of successive evaluations of gen() through each
2036*6777b538SAndroid Build Coastguard Worker // iterator in the range `[first, last)`.
2037*6777b538SAndroid Build Coastguard Worker //
2038*6777b538SAndroid Build Coastguard Worker // Returns: `last`.
2039*6777b538SAndroid Build Coastguard Worker //
2040*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `N` evaluations of `gen()` and assignments.
2041*6777b538SAndroid Build Coastguard Worker //
2042*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.generate#:~:text=ranges::generate(O
2043*6777b538SAndroid Build Coastguard Worker template <typename OutputIterator,
2044*6777b538SAndroid Build Coastguard Worker typename Generator,
2045*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>>
generate(OutputIterator first,OutputIterator last,Generator gen)2046*6777b538SAndroid Build Coastguard Worker constexpr auto generate(OutputIterator first,
2047*6777b538SAndroid Build Coastguard Worker OutputIterator last,
2048*6777b538SAndroid Build Coastguard Worker Generator gen) {
2049*6777b538SAndroid Build Coastguard Worker std::generate(first, last, std::move(gen));
2050*6777b538SAndroid Build Coastguard Worker return last;
2051*6777b538SAndroid Build Coastguard Worker }
2052*6777b538SAndroid Build Coastguard Worker
2053*6777b538SAndroid Build Coastguard Worker // Let `N` be `size(range)`.
2054*6777b538SAndroid Build Coastguard Worker //
2055*6777b538SAndroid Build Coastguard Worker // Effects: Assigns the result of successive evaluations of gen() through each
2056*6777b538SAndroid Build Coastguard Worker // iterator in `range`.
2057*6777b538SAndroid Build Coastguard Worker //
2058*6777b538SAndroid Build Coastguard Worker // Returns: `end(range)`.
2059*6777b538SAndroid Build Coastguard Worker //
2060*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `N` evaluations of `gen()` and assignments.
2061*6777b538SAndroid Build Coastguard Worker //
2062*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.generate#:~:text=ranges::generate(R
2063*6777b538SAndroid Build Coastguard Worker template <typename Range,
2064*6777b538SAndroid Build Coastguard Worker typename Generator,
2065*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
generate(Range && range,Generator gen)2066*6777b538SAndroid Build Coastguard Worker constexpr auto generate(Range&& range, Generator gen) {
2067*6777b538SAndroid Build Coastguard Worker return ranges::generate(ranges::begin(range), ranges::end(range),
2068*6777b538SAndroid Build Coastguard Worker std::move(gen));
2069*6777b538SAndroid Build Coastguard Worker }
2070*6777b538SAndroid Build Coastguard Worker
2071*6777b538SAndroid Build Coastguard Worker // Let `N` be `max(0, n)`.
2072*6777b538SAndroid Build Coastguard Worker //
2073*6777b538SAndroid Build Coastguard Worker // Mandates: `Size` is convertible to an integral type.
2074*6777b538SAndroid Build Coastguard Worker //
2075*6777b538SAndroid Build Coastguard Worker // Effects: Assigns the result of successive evaluations of gen() through each
2076*6777b538SAndroid Build Coastguard Worker // iterator in the range `[first, first + N)`.
2077*6777b538SAndroid Build Coastguard Worker //
2078*6777b538SAndroid Build Coastguard Worker // Returns: `first + N`.
2079*6777b538SAndroid Build Coastguard Worker //
2080*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `N` evaluations of `gen()` and assignments.
2081*6777b538SAndroid Build Coastguard Worker //
2082*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.generate#:~:text=ranges::generate_n(O
2083*6777b538SAndroid Build Coastguard Worker template <typename OutputIterator,
2084*6777b538SAndroid Build Coastguard Worker typename Size,
2085*6777b538SAndroid Build Coastguard Worker typename Generator,
2086*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>>
generate_n(OutputIterator first,Size n,Generator gen)2087*6777b538SAndroid Build Coastguard Worker constexpr auto generate_n(OutputIterator first, Size n, Generator gen) {
2088*6777b538SAndroid Build Coastguard Worker return std::generate_n(first, n, std::move(gen));
2089*6777b538SAndroid Build Coastguard Worker }
2090*6777b538SAndroid Build Coastguard Worker
2091*6777b538SAndroid Build Coastguard Worker // [alg.remove] Remove
2092*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.remove
2093*6777b538SAndroid Build Coastguard Worker
2094*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(proj, *i) == value)`.
2095*6777b538SAndroid Build Coastguard Worker //
2096*6777b538SAndroid Build Coastguard Worker // Effects: Eliminates all the elements referred to by iterator `i` in the range
2097*6777b538SAndroid Build Coastguard Worker // `[first, last)` for which `E(i)` holds.
2098*6777b538SAndroid Build Coastguard Worker //
2099*6777b538SAndroid Build Coastguard Worker // Returns: The end of the resulting range.
2100*6777b538SAndroid Build Coastguard Worker //
2101*6777b538SAndroid Build Coastguard Worker // Remarks: Stable.
2102*6777b538SAndroid Build Coastguard Worker //
2103*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `last - first` applications of the corresponding
2104*6777b538SAndroid Build Coastguard Worker // predicate and any projection.
2105*6777b538SAndroid Build Coastguard Worker //
2106*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.remove#:~:text=ranges::remove(I
2107*6777b538SAndroid Build Coastguard Worker template <typename ForwardIterator,
2108*6777b538SAndroid Build Coastguard Worker typename T,
2109*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
2110*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator>>
2111*6777b538SAndroid Build Coastguard Worker constexpr auto remove(ForwardIterator first,
2112*6777b538SAndroid Build Coastguard Worker ForwardIterator last,
2113*6777b538SAndroid Build Coastguard Worker const T& value,
2114*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
2115*6777b538SAndroid Build Coastguard Worker // Note: In order to be able to apply `proj` to each element in [first, last)
2116*6777b538SAndroid Build Coastguard Worker // we are dispatching to std::remove_if instead of std::remove.
2117*6777b538SAndroid Build Coastguard Worker return std::remove_if(first, last, [&proj, &value](auto&& lhs) {
2118*6777b538SAndroid Build Coastguard Worker return std::invoke(proj, std::forward<decltype(lhs)>(lhs)) == value;
2119*6777b538SAndroid Build Coastguard Worker });
2120*6777b538SAndroid Build Coastguard Worker }
2121*6777b538SAndroid Build Coastguard Worker
2122*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(proj, *i) == value)`.
2123*6777b538SAndroid Build Coastguard Worker //
2124*6777b538SAndroid Build Coastguard Worker // Effects: Eliminates all the elements referred to by iterator `i` in `range`
2125*6777b538SAndroid Build Coastguard Worker // for which `E(i)` holds.
2126*6777b538SAndroid Build Coastguard Worker //
2127*6777b538SAndroid Build Coastguard Worker // Returns: The end of the resulting range.
2128*6777b538SAndroid Build Coastguard Worker //
2129*6777b538SAndroid Build Coastguard Worker // Remarks: Stable.
2130*6777b538SAndroid Build Coastguard Worker //
2131*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `size(range)` applications of the corresponding predicate
2132*6777b538SAndroid Build Coastguard Worker // and any projection.
2133*6777b538SAndroid Build Coastguard Worker //
2134*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.remove#:~:text=ranges::remove(R
2135*6777b538SAndroid Build Coastguard Worker template <typename Range,
2136*6777b538SAndroid Build Coastguard Worker typename T,
2137*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
2138*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
2139*6777b538SAndroid Build Coastguard Worker constexpr auto remove(Range&& range, const T& value, Proj proj = {}) {
2140*6777b538SAndroid Build Coastguard Worker return ranges::remove(ranges::begin(range), ranges::end(range), value,
2141*6777b538SAndroid Build Coastguard Worker std::move(proj));
2142*6777b538SAndroid Build Coastguard Worker }
2143*6777b538SAndroid Build Coastguard Worker
2144*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(pred, invoke(proj, *i)))`.
2145*6777b538SAndroid Build Coastguard Worker //
2146*6777b538SAndroid Build Coastguard Worker // Effects: Eliminates all the elements referred to by iterator `i` in the range
2147*6777b538SAndroid Build Coastguard Worker // `[first, last)` for which `E(i)` holds.
2148*6777b538SAndroid Build Coastguard Worker //
2149*6777b538SAndroid Build Coastguard Worker // Returns: The end of the resulting range.
2150*6777b538SAndroid Build Coastguard Worker //
2151*6777b538SAndroid Build Coastguard Worker // Remarks: Stable.
2152*6777b538SAndroid Build Coastguard Worker //
2153*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `last - first` applications of the corresponding
2154*6777b538SAndroid Build Coastguard Worker // predicate and any projection.
2155*6777b538SAndroid Build Coastguard Worker //
2156*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.remove#:~:text=ranges::remove_if(I
2157*6777b538SAndroid Build Coastguard Worker template <typename ForwardIterator,
2158*6777b538SAndroid Build Coastguard Worker typename Predicate,
2159*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
2160*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator>>
2161*6777b538SAndroid Build Coastguard Worker constexpr auto remove_if(ForwardIterator first,
2162*6777b538SAndroid Build Coastguard Worker ForwardIterator last,
2163*6777b538SAndroid Build Coastguard Worker Predicate pred,
2164*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
2165*6777b538SAndroid Build Coastguard Worker return std::remove_if(first, last,
2166*6777b538SAndroid Build Coastguard Worker internal::ProjectedUnaryPredicate(pred, proj));
2167*6777b538SAndroid Build Coastguard Worker }
2168*6777b538SAndroid Build Coastguard Worker
2169*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(pred, invoke(proj, *i)))`.
2170*6777b538SAndroid Build Coastguard Worker //
2171*6777b538SAndroid Build Coastguard Worker // Effects: Eliminates all the elements referred to by iterator `i` in `range`.
2172*6777b538SAndroid Build Coastguard Worker //
2173*6777b538SAndroid Build Coastguard Worker // Returns: The end of the resulting range.
2174*6777b538SAndroid Build Coastguard Worker //
2175*6777b538SAndroid Build Coastguard Worker // Remarks: Stable.
2176*6777b538SAndroid Build Coastguard Worker //
2177*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `size(range)` applications of the corresponding predicate
2178*6777b538SAndroid Build Coastguard Worker // and any projection.
2179*6777b538SAndroid Build Coastguard Worker //
2180*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.remove#:~:text=ranges::remove_if(R
2181*6777b538SAndroid Build Coastguard Worker template <typename Range,
2182*6777b538SAndroid Build Coastguard Worker typename Predicate,
2183*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
2184*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
2185*6777b538SAndroid Build Coastguard Worker constexpr auto remove_if(Range&& range, Predicate pred, Proj proj = {}) {
2186*6777b538SAndroid Build Coastguard Worker return ranges::remove_if(ranges::begin(range), ranges::end(range),
2187*6777b538SAndroid Build Coastguard Worker std::move(pred), std::move(proj));
2188*6777b538SAndroid Build Coastguard Worker }
2189*6777b538SAndroid Build Coastguard Worker
2190*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(proj, *i) == value)`.
2191*6777b538SAndroid Build Coastguard Worker //
2192*6777b538SAndroid Build Coastguard Worker // Let `N` be the number of elements in `[first, last)` for which `E(i)` is
2193*6777b538SAndroid Build Coastguard Worker // false.
2194*6777b538SAndroid Build Coastguard Worker //
2195*6777b538SAndroid Build Coastguard Worker // Mandates: `*first` is writable to `result`.
2196*6777b538SAndroid Build Coastguard Worker //
2197*6777b538SAndroid Build Coastguard Worker // Preconditions: The ranges `[first, last)` and `[result, result + (last -
2198*6777b538SAndroid Build Coastguard Worker // first))` do not overlap.
2199*6777b538SAndroid Build Coastguard Worker //
2200*6777b538SAndroid Build Coastguard Worker // Effects: Copies all the elements referred to by the iterator `i` in the range
2201*6777b538SAndroid Build Coastguard Worker // `[first, last)` for which `E(i)` is false.
2202*6777b538SAndroid Build Coastguard Worker //
2203*6777b538SAndroid Build Coastguard Worker // Returns: `result + N`.
2204*6777b538SAndroid Build Coastguard Worker //
2205*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `last - first` applications of the corresponding
2206*6777b538SAndroid Build Coastguard Worker // predicate and any projection.
2207*6777b538SAndroid Build Coastguard Worker //
2208*6777b538SAndroid Build Coastguard Worker // Remarks: Stable.
2209*6777b538SAndroid Build Coastguard Worker //
2210*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.remove#:~:text=ranges::remove_copy(I
2211*6777b538SAndroid Build Coastguard Worker template <typename InputIterator,
2212*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
2213*6777b538SAndroid Build Coastguard Worker typename T,
2214*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
2215*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator>,
2216*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>>
2217*6777b538SAndroid Build Coastguard Worker constexpr auto remove_copy(InputIterator first,
2218*6777b538SAndroid Build Coastguard Worker InputIterator last,
2219*6777b538SAndroid Build Coastguard Worker OutputIterator result,
2220*6777b538SAndroid Build Coastguard Worker const T& value,
2221*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
2222*6777b538SAndroid Build Coastguard Worker // Note: In order to be able to apply `proj` to each element in [first, last)
2223*6777b538SAndroid Build Coastguard Worker // we are dispatching to std::remove_copy_if instead of std::remove_copy.
2224*6777b538SAndroid Build Coastguard Worker return std::remove_copy_if(first, last, result, [&proj, &value](auto&& lhs) {
2225*6777b538SAndroid Build Coastguard Worker return std::invoke(proj, std::forward<decltype(lhs)>(lhs)) == value;
2226*6777b538SAndroid Build Coastguard Worker });
2227*6777b538SAndroid Build Coastguard Worker }
2228*6777b538SAndroid Build Coastguard Worker
2229*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(proj, *i) == value)`.
2230*6777b538SAndroid Build Coastguard Worker //
2231*6777b538SAndroid Build Coastguard Worker // Let `N` be the number of elements in `range` for which `E(i)` is false.
2232*6777b538SAndroid Build Coastguard Worker //
2233*6777b538SAndroid Build Coastguard Worker // Mandates: `*begin(range)` is writable to `result`.
2234*6777b538SAndroid Build Coastguard Worker //
2235*6777b538SAndroid Build Coastguard Worker // Preconditions: The ranges `range` and `[result, result + size(range))` do not
2236*6777b538SAndroid Build Coastguard Worker // overlap.
2237*6777b538SAndroid Build Coastguard Worker //
2238*6777b538SAndroid Build Coastguard Worker // Effects: Copies all the elements referred to by the iterator `i` in `range`
2239*6777b538SAndroid Build Coastguard Worker // for which `E(i)` is false.
2240*6777b538SAndroid Build Coastguard Worker //
2241*6777b538SAndroid Build Coastguard Worker // Returns: `result + N`.
2242*6777b538SAndroid Build Coastguard Worker //
2243*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `size(range)` applications of the corresponding
2244*6777b538SAndroid Build Coastguard Worker // predicate and any projection.
2245*6777b538SAndroid Build Coastguard Worker //
2246*6777b538SAndroid Build Coastguard Worker // Remarks: Stable.
2247*6777b538SAndroid Build Coastguard Worker //
2248*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.remove#:~:text=ranges::remove_copy(R
2249*6777b538SAndroid Build Coastguard Worker template <typename Range,
2250*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
2251*6777b538SAndroid Build Coastguard Worker typename T,
2252*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
2253*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
2254*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>>
2255*6777b538SAndroid Build Coastguard Worker constexpr auto remove_copy(Range&& range,
2256*6777b538SAndroid Build Coastguard Worker OutputIterator result,
2257*6777b538SAndroid Build Coastguard Worker const T& value,
2258*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
2259*6777b538SAndroid Build Coastguard Worker return ranges::remove_copy(ranges::begin(range), ranges::end(range), result,
2260*6777b538SAndroid Build Coastguard Worker value, std::move(proj));
2261*6777b538SAndroid Build Coastguard Worker }
2262*6777b538SAndroid Build Coastguard Worker
2263*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(pred, invoke(proj, *i)))`.
2264*6777b538SAndroid Build Coastguard Worker //
2265*6777b538SAndroid Build Coastguard Worker // Let `N` be the number of elements in `[first, last)` for which `E(i)` is
2266*6777b538SAndroid Build Coastguard Worker // false.
2267*6777b538SAndroid Build Coastguard Worker //
2268*6777b538SAndroid Build Coastguard Worker // Mandates: `*first` is writable to `result`.
2269*6777b538SAndroid Build Coastguard Worker //
2270*6777b538SAndroid Build Coastguard Worker // Preconditions: The ranges `[first, last)` and `[result, result + (last -
2271*6777b538SAndroid Build Coastguard Worker // first))` do not overlap.
2272*6777b538SAndroid Build Coastguard Worker //
2273*6777b538SAndroid Build Coastguard Worker // Effects: Copies all the elements referred to by the iterator `i` in the range
2274*6777b538SAndroid Build Coastguard Worker // `[first, last)` for which `E(i)` is false.
2275*6777b538SAndroid Build Coastguard Worker //
2276*6777b538SAndroid Build Coastguard Worker // Returns: `result + N`.
2277*6777b538SAndroid Build Coastguard Worker //
2278*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `last - first` applications of the corresponding
2279*6777b538SAndroid Build Coastguard Worker // predicate and any projection.
2280*6777b538SAndroid Build Coastguard Worker //
2281*6777b538SAndroid Build Coastguard Worker // Remarks: Stable.
2282*6777b538SAndroid Build Coastguard Worker //
2283*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.remove#:~:text=ranges::remove_copy_if(I
2284*6777b538SAndroid Build Coastguard Worker template <typename InputIterator,
2285*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
2286*6777b538SAndroid Build Coastguard Worker typename Pred,
2287*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
2288*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator>,
2289*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>>
2290*6777b538SAndroid Build Coastguard Worker constexpr auto remove_copy_if(InputIterator first,
2291*6777b538SAndroid Build Coastguard Worker InputIterator last,
2292*6777b538SAndroid Build Coastguard Worker OutputIterator result,
2293*6777b538SAndroid Build Coastguard Worker Pred pred,
2294*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
2295*6777b538SAndroid Build Coastguard Worker return std::remove_copy_if(first, last, result,
2296*6777b538SAndroid Build Coastguard Worker internal::ProjectedUnaryPredicate(pred, proj));
2297*6777b538SAndroid Build Coastguard Worker }
2298*6777b538SAndroid Build Coastguard Worker
2299*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(pred, invoke(proj, *i)))`.
2300*6777b538SAndroid Build Coastguard Worker //
2301*6777b538SAndroid Build Coastguard Worker // Let `N` be the number of elements in `range` for which `E(i)` is false.
2302*6777b538SAndroid Build Coastguard Worker //
2303*6777b538SAndroid Build Coastguard Worker // Mandates: `*begin(range)` is writable to `result`.
2304*6777b538SAndroid Build Coastguard Worker //
2305*6777b538SAndroid Build Coastguard Worker // Preconditions: The ranges `range` and `[result, result + size(range))` do not
2306*6777b538SAndroid Build Coastguard Worker // overlap.
2307*6777b538SAndroid Build Coastguard Worker //
2308*6777b538SAndroid Build Coastguard Worker // Effects: Copies all the elements referred to by the iterator `i` in `range`
2309*6777b538SAndroid Build Coastguard Worker // for which `E(i)` is false.
2310*6777b538SAndroid Build Coastguard Worker //
2311*6777b538SAndroid Build Coastguard Worker // Returns: `result + N`.
2312*6777b538SAndroid Build Coastguard Worker //
2313*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `size(range)` applications of the corresponding
2314*6777b538SAndroid Build Coastguard Worker // predicate and any projection.
2315*6777b538SAndroid Build Coastguard Worker //
2316*6777b538SAndroid Build Coastguard Worker // Remarks: Stable.
2317*6777b538SAndroid Build Coastguard Worker //
2318*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.remove#:~:text=ranges::remove_copy(R
2319*6777b538SAndroid Build Coastguard Worker template <typename Range,
2320*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
2321*6777b538SAndroid Build Coastguard Worker typename Pred,
2322*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
2323*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
2324*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>>
2325*6777b538SAndroid Build Coastguard Worker constexpr auto remove_copy_if(Range&& range,
2326*6777b538SAndroid Build Coastguard Worker OutputIterator result,
2327*6777b538SAndroid Build Coastguard Worker Pred pred,
2328*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
2329*6777b538SAndroid Build Coastguard Worker return ranges::remove_copy_if(ranges::begin(range), ranges::end(range),
2330*6777b538SAndroid Build Coastguard Worker result, std::move(pred), std::move(proj));
2331*6777b538SAndroid Build Coastguard Worker }
2332*6777b538SAndroid Build Coastguard Worker
2333*6777b538SAndroid Build Coastguard Worker // [alg.unique] Unique
2334*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.unique
2335*6777b538SAndroid Build Coastguard Worker
2336*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(comp, invoke(proj, *(i - 1)), invoke(proj, *i)))`.
2337*6777b538SAndroid Build Coastguard Worker //
2338*6777b538SAndroid Build Coastguard Worker // Effects: For a nonempty range, eliminates all but the first element from
2339*6777b538SAndroid Build Coastguard Worker // every consecutive group of equivalent elements referred to by the iterator
2340*6777b538SAndroid Build Coastguard Worker // `i` in the range `[first + 1, last)` for which `E(i)` is true.
2341*6777b538SAndroid Build Coastguard Worker //
2342*6777b538SAndroid Build Coastguard Worker // Returns: The end of the resulting range.
2343*6777b538SAndroid Build Coastguard Worker //
2344*6777b538SAndroid Build Coastguard Worker // Complexity: For nonempty ranges, exactly `(last - first) - 1` applications of
2345*6777b538SAndroid Build Coastguard Worker // the corresponding predicate and no more than twice as many applications of
2346*6777b538SAndroid Build Coastguard Worker // any projection.
2347*6777b538SAndroid Build Coastguard Worker //
2348*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.unique#:~:text=ranges::unique(I
2349*6777b538SAndroid Build Coastguard Worker template <
2350*6777b538SAndroid Build Coastguard Worker typename ForwardIterator,
2351*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::equal_to,
2352*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
2353*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator>,
2354*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
2355*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator, Proj>,
2356*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator, Proj>>>
2357*6777b538SAndroid Build Coastguard Worker constexpr auto unique(ForwardIterator first,
2358*6777b538SAndroid Build Coastguard Worker ForwardIterator last,
2359*6777b538SAndroid Build Coastguard Worker Comp comp = {},
2360*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
2361*6777b538SAndroid Build Coastguard Worker return std::unique(first, last,
2362*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(comp, proj, proj));
2363*6777b538SAndroid Build Coastguard Worker }
2364*6777b538SAndroid Build Coastguard Worker
2365*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(comp, invoke(proj, *(i - 1)), invoke(proj, *i)))`.
2366*6777b538SAndroid Build Coastguard Worker //
2367*6777b538SAndroid Build Coastguard Worker // Effects: For a nonempty range, eliminates all but the first element from
2368*6777b538SAndroid Build Coastguard Worker // every consecutive group of equivalent elements referred to by the iterator
2369*6777b538SAndroid Build Coastguard Worker // `i` in the range `[begin(range) + 1, end(range))` for which `E(i)` is true.
2370*6777b538SAndroid Build Coastguard Worker //
2371*6777b538SAndroid Build Coastguard Worker // Returns: The end of the resulting range.
2372*6777b538SAndroid Build Coastguard Worker //
2373*6777b538SAndroid Build Coastguard Worker // Complexity: For nonempty ranges, exactly `size(range) - 1` applications of
2374*6777b538SAndroid Build Coastguard Worker // the corresponding predicate and no more than twice as many applications of
2375*6777b538SAndroid Build Coastguard Worker // any projection.
2376*6777b538SAndroid Build Coastguard Worker //
2377*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.unique#:~:text=ranges::unique(R
2378*6777b538SAndroid Build Coastguard Worker template <
2379*6777b538SAndroid Build Coastguard Worker typename Range,
2380*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::equal_to,
2381*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
2382*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
2383*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
2384*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>,
2385*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>>>
2386*6777b538SAndroid Build Coastguard Worker constexpr auto unique(Range&& range, Comp comp = {}, Proj proj = {}) {
2387*6777b538SAndroid Build Coastguard Worker return ranges::unique(ranges::begin(range), ranges::end(range),
2388*6777b538SAndroid Build Coastguard Worker std::move(comp), std::move(proj));
2389*6777b538SAndroid Build Coastguard Worker }
2390*6777b538SAndroid Build Coastguard Worker
2391*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(comp, invoke(proj, *i), invoke(proj, *(i - 1))))`.
2392*6777b538SAndroid Build Coastguard Worker //
2393*6777b538SAndroid Build Coastguard Worker // Mandates: `*first` is writable to `result`.
2394*6777b538SAndroid Build Coastguard Worker //
2395*6777b538SAndroid Build Coastguard Worker // Preconditions: The ranges `[first, last)` and
2396*6777b538SAndroid Build Coastguard Worker // `[result, result + (last - first))` do not overlap.
2397*6777b538SAndroid Build Coastguard Worker //
2398*6777b538SAndroid Build Coastguard Worker // Effects: Copies only the first element from every consecutive group of equal
2399*6777b538SAndroid Build Coastguard Worker // elements referred to by the iterator `i` in the range `[first, last)` for
2400*6777b538SAndroid Build Coastguard Worker // which `E(i)` holds.
2401*6777b538SAndroid Build Coastguard Worker //
2402*6777b538SAndroid Build Coastguard Worker // Returns: `result + N`.
2403*6777b538SAndroid Build Coastguard Worker //
2404*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `last - first - 1` applications of the corresponding
2405*6777b538SAndroid Build Coastguard Worker // predicate and no more than twice as many applications of any projection.
2406*6777b538SAndroid Build Coastguard Worker //
2407*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.unique#:~:text=ranges::unique_copy(I
2408*6777b538SAndroid Build Coastguard Worker template <typename ForwardIterator,
2409*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
2410*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::equal_to,
2411*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
2412*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator>,
2413*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>>
2414*6777b538SAndroid Build Coastguard Worker constexpr auto unique_copy(ForwardIterator first,
2415*6777b538SAndroid Build Coastguard Worker ForwardIterator last,
2416*6777b538SAndroid Build Coastguard Worker OutputIterator result,
2417*6777b538SAndroid Build Coastguard Worker Comp comp = {},
2418*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
2419*6777b538SAndroid Build Coastguard Worker return std::unique_copy(first, last, result,
2420*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(comp, proj, proj));
2421*6777b538SAndroid Build Coastguard Worker }
2422*6777b538SAndroid Build Coastguard Worker
2423*6777b538SAndroid Build Coastguard Worker // Let `E(i)` be `bool(invoke(comp, invoke(proj, *i), invoke(proj, *(i - 1))))`.
2424*6777b538SAndroid Build Coastguard Worker //
2425*6777b538SAndroid Build Coastguard Worker // Mandates: `*begin(range)` is writable to `result`.
2426*6777b538SAndroid Build Coastguard Worker //
2427*6777b538SAndroid Build Coastguard Worker // Preconditions: The ranges `range` and `[result, result + size(range))` do not
2428*6777b538SAndroid Build Coastguard Worker // overlap.
2429*6777b538SAndroid Build Coastguard Worker //
2430*6777b538SAndroid Build Coastguard Worker // Effects: Copies only the first element from every consecutive group of equal
2431*6777b538SAndroid Build Coastguard Worker // elements referred to by the iterator `i` in `range` for which `E(i)` holds.
2432*6777b538SAndroid Build Coastguard Worker //
2433*6777b538SAndroid Build Coastguard Worker // Returns: `result + N`.
2434*6777b538SAndroid Build Coastguard Worker //
2435*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `size(range) - 1` applications of the corresponding
2436*6777b538SAndroid Build Coastguard Worker // predicate and no more than twice as many applications of any projection.
2437*6777b538SAndroid Build Coastguard Worker //
2438*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.unique#:~:text=ranges::unique_copy(R
2439*6777b538SAndroid Build Coastguard Worker template <typename Range,
2440*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
2441*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::equal_to,
2442*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
2443*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
2444*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>>
2445*6777b538SAndroid Build Coastguard Worker constexpr auto unique_copy(Range&& range,
2446*6777b538SAndroid Build Coastguard Worker OutputIterator result,
2447*6777b538SAndroid Build Coastguard Worker Comp comp = {},
2448*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
2449*6777b538SAndroid Build Coastguard Worker return ranges::unique_copy(ranges::begin(range), ranges::end(range), result,
2450*6777b538SAndroid Build Coastguard Worker std::move(comp), std::move(proj));
2451*6777b538SAndroid Build Coastguard Worker }
2452*6777b538SAndroid Build Coastguard Worker
2453*6777b538SAndroid Build Coastguard Worker // [alg.reverse] Reverse
2454*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.reverse
2455*6777b538SAndroid Build Coastguard Worker
2456*6777b538SAndroid Build Coastguard Worker // Effects: For each non-negative integer `i < (last - first) / 2`, applies
2457*6777b538SAndroid Build Coastguard Worker // `std::iter_swap` to all pairs of iterators `first + i, (last - i) - 1`.
2458*6777b538SAndroid Build Coastguard Worker //
2459*6777b538SAndroid Build Coastguard Worker // Returns: `last`.
2460*6777b538SAndroid Build Coastguard Worker //
2461*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `(last - first)/2` swaps.
2462*6777b538SAndroid Build Coastguard Worker //
2463*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.reverse#:~:text=ranges::reverse(I
2464*6777b538SAndroid Build Coastguard Worker template <typename BidirectionalIterator,
2465*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<BidirectionalIterator>>
reverse(BidirectionalIterator first,BidirectionalIterator last)2466*6777b538SAndroid Build Coastguard Worker constexpr auto reverse(BidirectionalIterator first,
2467*6777b538SAndroid Build Coastguard Worker BidirectionalIterator last) {
2468*6777b538SAndroid Build Coastguard Worker std::reverse(first, last);
2469*6777b538SAndroid Build Coastguard Worker return last;
2470*6777b538SAndroid Build Coastguard Worker }
2471*6777b538SAndroid Build Coastguard Worker
2472*6777b538SAndroid Build Coastguard Worker // Effects: For each non-negative integer `i < size(range) / 2`, applies
2473*6777b538SAndroid Build Coastguard Worker // `std::iter_swap` to all pairs of iterators
2474*6777b538SAndroid Build Coastguard Worker // `begin(range) + i, (end(range) - i) - 1`.
2475*6777b538SAndroid Build Coastguard Worker //
2476*6777b538SAndroid Build Coastguard Worker // Returns: `end(range)`.
2477*6777b538SAndroid Build Coastguard Worker //
2478*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `size(range)/2` swaps.
2479*6777b538SAndroid Build Coastguard Worker //
2480*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.reverse#:~:text=ranges::reverse(R
2481*6777b538SAndroid Build Coastguard Worker template <typename Range, typename = internal::range_category_t<Range>>
reverse(Range && range)2482*6777b538SAndroid Build Coastguard Worker constexpr auto reverse(Range&& range) {
2483*6777b538SAndroid Build Coastguard Worker return ranges::reverse(ranges::begin(range), ranges::end(range));
2484*6777b538SAndroid Build Coastguard Worker }
2485*6777b538SAndroid Build Coastguard Worker
2486*6777b538SAndroid Build Coastguard Worker // Let `N` be `last - first`.
2487*6777b538SAndroid Build Coastguard Worker //
2488*6777b538SAndroid Build Coastguard Worker // Preconditions: The ranges `[first, last)` and `[result, result + N)` do not
2489*6777b538SAndroid Build Coastguard Worker // overlap.
2490*6777b538SAndroid Build Coastguard Worker //
2491*6777b538SAndroid Build Coastguard Worker // Effects: Copies the range `[first, last)` to the range `[result, result + N)`
2492*6777b538SAndroid Build Coastguard Worker // such that for every non-negative integer `i < N` the following assignment
2493*6777b538SAndroid Build Coastguard Worker // takes place: `*(result + N - 1 - i) = *(first + i)`.
2494*6777b538SAndroid Build Coastguard Worker //
2495*6777b538SAndroid Build Coastguard Worker // Returns: `result + N`.
2496*6777b538SAndroid Build Coastguard Worker //
2497*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `N` assignments.
2498*6777b538SAndroid Build Coastguard Worker //
2499*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.reverse#:~:text=ranges::reverse_copy(I
2500*6777b538SAndroid Build Coastguard Worker template <typename BidirectionalIterator,
2501*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
2502*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<BidirectionalIterator>,
2503*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>>
reverse_copy(BidirectionalIterator first,BidirectionalIterator last,OutputIterator result)2504*6777b538SAndroid Build Coastguard Worker constexpr auto reverse_copy(BidirectionalIterator first,
2505*6777b538SAndroid Build Coastguard Worker BidirectionalIterator last,
2506*6777b538SAndroid Build Coastguard Worker OutputIterator result) {
2507*6777b538SAndroid Build Coastguard Worker return std::reverse_copy(first, last, result);
2508*6777b538SAndroid Build Coastguard Worker }
2509*6777b538SAndroid Build Coastguard Worker
2510*6777b538SAndroid Build Coastguard Worker // Let `N` be `size(range)`.
2511*6777b538SAndroid Build Coastguard Worker //
2512*6777b538SAndroid Build Coastguard Worker // Preconditions: The ranges `range` and `[result, result + N)` do not
2513*6777b538SAndroid Build Coastguard Worker // overlap.
2514*6777b538SAndroid Build Coastguard Worker //
2515*6777b538SAndroid Build Coastguard Worker // Effects: Copies `range` to the range `[result, result + N)` such that for
2516*6777b538SAndroid Build Coastguard Worker // every non-negative integer `i < N` the following assignment takes place:
2517*6777b538SAndroid Build Coastguard Worker // `*(result + N - 1 - i) = *(begin(range) + i)`.
2518*6777b538SAndroid Build Coastguard Worker //
2519*6777b538SAndroid Build Coastguard Worker // Returns: `result + N`.
2520*6777b538SAndroid Build Coastguard Worker //
2521*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `N` assignments.
2522*6777b538SAndroid Build Coastguard Worker //
2523*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.reverse#:~:text=ranges::reverse_copy(R
2524*6777b538SAndroid Build Coastguard Worker template <typename Range,
2525*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
2526*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
2527*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>>
reverse_copy(Range && range,OutputIterator result)2528*6777b538SAndroid Build Coastguard Worker constexpr auto reverse_copy(Range&& range, OutputIterator result) {
2529*6777b538SAndroid Build Coastguard Worker return ranges::reverse_copy(ranges::begin(range), ranges::end(range), result);
2530*6777b538SAndroid Build Coastguard Worker }
2531*6777b538SAndroid Build Coastguard Worker
2532*6777b538SAndroid Build Coastguard Worker // [alg.rotate] Rotate
2533*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.rotate
2534*6777b538SAndroid Build Coastguard Worker
2535*6777b538SAndroid Build Coastguard Worker // Preconditions: `[first, middle)` and `[middle, last)` are valid ranges.
2536*6777b538SAndroid Build Coastguard Worker //
2537*6777b538SAndroid Build Coastguard Worker // Effects: For each non-negative integer `i < (last - first)`, places the
2538*6777b538SAndroid Build Coastguard Worker // element from the position `first + i` into position
2539*6777b538SAndroid Build Coastguard Worker // `first + (i + (last - middle)) % (last - first)`.
2540*6777b538SAndroid Build Coastguard Worker //
2541*6777b538SAndroid Build Coastguard Worker // Returns: `first + (last - middle)`.
2542*6777b538SAndroid Build Coastguard Worker //
2543*6777b538SAndroid Build Coastguard Worker // Complexity: At most `last - first` swaps.
2544*6777b538SAndroid Build Coastguard Worker //
2545*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.rotate#:~:text=ranges::rotate(I
2546*6777b538SAndroid Build Coastguard Worker template <typename ForwardIterator,
2547*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator>>
rotate(ForwardIterator first,ForwardIterator middle,ForwardIterator last)2548*6777b538SAndroid Build Coastguard Worker constexpr auto rotate(ForwardIterator first,
2549*6777b538SAndroid Build Coastguard Worker ForwardIterator middle,
2550*6777b538SAndroid Build Coastguard Worker ForwardIterator last) {
2551*6777b538SAndroid Build Coastguard Worker return std::rotate(first, middle, last);
2552*6777b538SAndroid Build Coastguard Worker }
2553*6777b538SAndroid Build Coastguard Worker
2554*6777b538SAndroid Build Coastguard Worker // Preconditions: `[begin(range), middle)` and `[middle, end(range))` are valid
2555*6777b538SAndroid Build Coastguard Worker // ranges.
2556*6777b538SAndroid Build Coastguard Worker //
2557*6777b538SAndroid Build Coastguard Worker // Effects: For each non-negative integer `i < size(range)`, places the element
2558*6777b538SAndroid Build Coastguard Worker // from the position `begin(range) + i` into position
2559*6777b538SAndroid Build Coastguard Worker // `begin(range) + (i + (end(range) - middle)) % size(range)`.
2560*6777b538SAndroid Build Coastguard Worker //
2561*6777b538SAndroid Build Coastguard Worker // Returns: `begin(range) + (end(range) - middle)`.
2562*6777b538SAndroid Build Coastguard Worker //
2563*6777b538SAndroid Build Coastguard Worker // Complexity: At most `size(range)` swaps.
2564*6777b538SAndroid Build Coastguard Worker //
2565*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.rotate#:~:text=ranges::rotate(R
2566*6777b538SAndroid Build Coastguard Worker template <typename Range, typename = internal::range_category_t<Range>>
rotate(Range && range,iterator_t<Range> middle)2567*6777b538SAndroid Build Coastguard Worker constexpr auto rotate(Range&& range, iterator_t<Range> middle) {
2568*6777b538SAndroid Build Coastguard Worker return ranges::rotate(ranges::begin(range), middle, ranges::end(range));
2569*6777b538SAndroid Build Coastguard Worker }
2570*6777b538SAndroid Build Coastguard Worker
2571*6777b538SAndroid Build Coastguard Worker // Let `N` be `last - first`.
2572*6777b538SAndroid Build Coastguard Worker //
2573*6777b538SAndroid Build Coastguard Worker // Preconditions: `[first, middle)` and `[middle, last)` are valid ranges. The
2574*6777b538SAndroid Build Coastguard Worker // ranges `[first, last)` and `[result, result + N)` do not overlap.
2575*6777b538SAndroid Build Coastguard Worker //
2576*6777b538SAndroid Build Coastguard Worker // Effects: Copies the range `[first, last)` to the range `[result, result + N)`
2577*6777b538SAndroid Build Coastguard Worker // such that for each non-negative integer `i < N` the following assignment
2578*6777b538SAndroid Build Coastguard Worker // takes place: `*(result + i) = *(first + (i + (middle - first)) % N)`.
2579*6777b538SAndroid Build Coastguard Worker //
2580*6777b538SAndroid Build Coastguard Worker // Returns: `result + N`.
2581*6777b538SAndroid Build Coastguard Worker //
2582*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `N` assignments.
2583*6777b538SAndroid Build Coastguard Worker //
2584*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.rotate#:~:text=ranges::rotate_copy(I
2585*6777b538SAndroid Build Coastguard Worker template <typename ForwardIterator,
2586*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
2587*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator>,
2588*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>>
rotate_copy(ForwardIterator first,ForwardIterator middle,ForwardIterator last,OutputIterator result)2589*6777b538SAndroid Build Coastguard Worker constexpr auto rotate_copy(ForwardIterator first,
2590*6777b538SAndroid Build Coastguard Worker ForwardIterator middle,
2591*6777b538SAndroid Build Coastguard Worker ForwardIterator last,
2592*6777b538SAndroid Build Coastguard Worker OutputIterator result) {
2593*6777b538SAndroid Build Coastguard Worker return std::rotate_copy(first, middle, last, result);
2594*6777b538SAndroid Build Coastguard Worker }
2595*6777b538SAndroid Build Coastguard Worker
2596*6777b538SAndroid Build Coastguard Worker // Let `N` be `size(range)`.
2597*6777b538SAndroid Build Coastguard Worker //
2598*6777b538SAndroid Build Coastguard Worker // Preconditions: `[begin(range), middle)` and `[middle, end(range))` are valid
2599*6777b538SAndroid Build Coastguard Worker // ranges. The ranges `range` and `[result, result + N)` do not overlap.
2600*6777b538SAndroid Build Coastguard Worker //
2601*6777b538SAndroid Build Coastguard Worker // Effects: Copies `range` to the range `[result, result + N)` such that for
2602*6777b538SAndroid Build Coastguard Worker // each non-negative integer `i < N` the following assignment takes place:
2603*6777b538SAndroid Build Coastguard Worker // `*(result + i) = *(begin(range) + (i + (middle - begin(range))) % N)`.
2604*6777b538SAndroid Build Coastguard Worker //
2605*6777b538SAndroid Build Coastguard Worker // Returns: `result + N`.
2606*6777b538SAndroid Build Coastguard Worker //
2607*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `N` assignments.
2608*6777b538SAndroid Build Coastguard Worker //
2609*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.rotate#:~:text=ranges::rotate_copy(R
2610*6777b538SAndroid Build Coastguard Worker template <typename Range,
2611*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
2612*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
2613*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>>
rotate_copy(Range && range,iterator_t<Range> middle,OutputIterator result)2614*6777b538SAndroid Build Coastguard Worker constexpr auto rotate_copy(Range&& range,
2615*6777b538SAndroid Build Coastguard Worker iterator_t<Range> middle,
2616*6777b538SAndroid Build Coastguard Worker OutputIterator result) {
2617*6777b538SAndroid Build Coastguard Worker return ranges::rotate_copy(ranges::begin(range), middle, ranges::end(range),
2618*6777b538SAndroid Build Coastguard Worker result);
2619*6777b538SAndroid Build Coastguard Worker }
2620*6777b538SAndroid Build Coastguard Worker
2621*6777b538SAndroid Build Coastguard Worker // [alg.random.sample] Sample
2622*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.random.sample
2623*6777b538SAndroid Build Coastguard Worker
2624*6777b538SAndroid Build Coastguard Worker // Currently not implemented due to lack of std::sample in C++14.
2625*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/1071094): Consider implementing a hand-rolled version.
2626*6777b538SAndroid Build Coastguard Worker
2627*6777b538SAndroid Build Coastguard Worker // [alg.random.shuffle] Shuffle
2628*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.random.shuffle
2629*6777b538SAndroid Build Coastguard Worker
2630*6777b538SAndroid Build Coastguard Worker // Preconditions: The type `std::remove_reference_t<UniformRandomBitGenerator>`
2631*6777b538SAndroid Build Coastguard Worker // meets the uniform random bit generator requirements.
2632*6777b538SAndroid Build Coastguard Worker //
2633*6777b538SAndroid Build Coastguard Worker // Effects: Permutes the elements in the range `[first, last)` such that each
2634*6777b538SAndroid Build Coastguard Worker // possible permutation of those elements has equal probability of appearance.
2635*6777b538SAndroid Build Coastguard Worker //
2636*6777b538SAndroid Build Coastguard Worker // Returns: `last`.
2637*6777b538SAndroid Build Coastguard Worker //
2638*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `(last - first) - 1` swaps.
2639*6777b538SAndroid Build Coastguard Worker //
2640*6777b538SAndroid Build Coastguard Worker // Remarks: To the extent that the implementation of this function makes use of
2641*6777b538SAndroid Build Coastguard Worker // random numbers, the object referenced by g shall serve as the
2642*6777b538SAndroid Build Coastguard Worker // implementation's source of randomness.
2643*6777b538SAndroid Build Coastguard Worker //
2644*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.random.shuffle#:~:text=ranges::shuffle(I
2645*6777b538SAndroid Build Coastguard Worker template <typename RandomAccessIterator,
2646*6777b538SAndroid Build Coastguard Worker typename UniformRandomBitGenerator,
2647*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<RandomAccessIterator>>
shuffle(RandomAccessIterator first,RandomAccessIterator last,UniformRandomBitGenerator && g)2648*6777b538SAndroid Build Coastguard Worker constexpr auto shuffle(RandomAccessIterator first,
2649*6777b538SAndroid Build Coastguard Worker RandomAccessIterator last,
2650*6777b538SAndroid Build Coastguard Worker UniformRandomBitGenerator&& g) {
2651*6777b538SAndroid Build Coastguard Worker std::shuffle(first, last, std::forward<UniformRandomBitGenerator>(g));
2652*6777b538SAndroid Build Coastguard Worker return last;
2653*6777b538SAndroid Build Coastguard Worker }
2654*6777b538SAndroid Build Coastguard Worker
2655*6777b538SAndroid Build Coastguard Worker // Preconditions: The type `std::remove_reference_t<UniformRandomBitGenerator>`
2656*6777b538SAndroid Build Coastguard Worker // meets the uniform random bit generator requirements.
2657*6777b538SAndroid Build Coastguard Worker //
2658*6777b538SAndroid Build Coastguard Worker // Effects: Permutes the elements in `range` such that each possible permutation
2659*6777b538SAndroid Build Coastguard Worker // of those elements has equal probability of appearance.
2660*6777b538SAndroid Build Coastguard Worker //
2661*6777b538SAndroid Build Coastguard Worker // Returns: `end(range)`.
2662*6777b538SAndroid Build Coastguard Worker //
2663*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `size(range) - 1` swaps.
2664*6777b538SAndroid Build Coastguard Worker //
2665*6777b538SAndroid Build Coastguard Worker // Remarks: To the extent that the implementation of this function makes use of
2666*6777b538SAndroid Build Coastguard Worker // random numbers, the object referenced by g shall serve as the
2667*6777b538SAndroid Build Coastguard Worker // implementation's source of randomness.
2668*6777b538SAndroid Build Coastguard Worker //
2669*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.random.shuffle#:~:text=ranges::shuffle(R
2670*6777b538SAndroid Build Coastguard Worker template <typename Range,
2671*6777b538SAndroid Build Coastguard Worker typename UniformRandomBitGenerator,
2672*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
shuffle(Range && range,UniformRandomBitGenerator && g)2673*6777b538SAndroid Build Coastguard Worker constexpr auto shuffle(Range&& range, UniformRandomBitGenerator&& g) {
2674*6777b538SAndroid Build Coastguard Worker return ranges::shuffle(ranges::begin(range), ranges::end(range),
2675*6777b538SAndroid Build Coastguard Worker std::forward<UniformRandomBitGenerator>(g));
2676*6777b538SAndroid Build Coastguard Worker }
2677*6777b538SAndroid Build Coastguard Worker
2678*6777b538SAndroid Build Coastguard Worker // [alg.nonmodifying] Sorting and related operations
2679*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.sorting
2680*6777b538SAndroid Build Coastguard Worker
2681*6777b538SAndroid Build Coastguard Worker // [alg.sort] Sorting
2682*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.sort
2683*6777b538SAndroid Build Coastguard Worker
2684*6777b538SAndroid Build Coastguard Worker // [sort] sort
2685*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/sort
2686*6777b538SAndroid Build Coastguard Worker
2687*6777b538SAndroid Build Coastguard Worker // Effects: Sorts the elements in the range `[first, last)` with respect to
2688*6777b538SAndroid Build Coastguard Worker // `comp` and `proj`.
2689*6777b538SAndroid Build Coastguard Worker //
2690*6777b538SAndroid Build Coastguard Worker // Returns: `last`.
2691*6777b538SAndroid Build Coastguard Worker //
2692*6777b538SAndroid Build Coastguard Worker // Complexity: Let `N` be `last - first`. `O(N log N)` comparisons and
2693*6777b538SAndroid Build Coastguard Worker // projections.
2694*6777b538SAndroid Build Coastguard Worker //
2695*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/sort#:~:text=ranges::sort(I
2696*6777b538SAndroid Build Coastguard Worker template <typename RandomAccessIterator,
2697*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
2698*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
2699*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<RandomAccessIterator>,
2700*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<
2701*6777b538SAndroid Build Coastguard Worker Comp&,
2702*6777b538SAndroid Build Coastguard Worker std::projected<RandomAccessIterator, Proj>,
2703*6777b538SAndroid Build Coastguard Worker std::projected<RandomAccessIterator, Proj>>>
2704*6777b538SAndroid Build Coastguard Worker constexpr auto sort(RandomAccessIterator first,
2705*6777b538SAndroid Build Coastguard Worker RandomAccessIterator last,
2706*6777b538SAndroid Build Coastguard Worker Comp comp = {},
2707*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
2708*6777b538SAndroid Build Coastguard Worker std::sort(first, last, internal::ProjectedBinaryPredicate(comp, proj, proj));
2709*6777b538SAndroid Build Coastguard Worker return last;
2710*6777b538SAndroid Build Coastguard Worker }
2711*6777b538SAndroid Build Coastguard Worker
2712*6777b538SAndroid Build Coastguard Worker // Effects: Sorts the elements in `range` with respect to `comp` and `proj`.
2713*6777b538SAndroid Build Coastguard Worker //
2714*6777b538SAndroid Build Coastguard Worker // Returns: `end(range)`.
2715*6777b538SAndroid Build Coastguard Worker //
2716*6777b538SAndroid Build Coastguard Worker // Complexity: Let `N` be `size(range)`. `O(N log N)` comparisons and
2717*6777b538SAndroid Build Coastguard Worker // projections.
2718*6777b538SAndroid Build Coastguard Worker //
2719*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/sort#:~:text=ranges::sort(R
2720*6777b538SAndroid Build Coastguard Worker template <
2721*6777b538SAndroid Build Coastguard Worker typename Range,
2722*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
2723*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
2724*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
2725*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
2726*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>,
2727*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>>>
2728*6777b538SAndroid Build Coastguard Worker constexpr auto sort(Range&& range, Comp comp = {}, Proj proj = {}) {
2729*6777b538SAndroid Build Coastguard Worker return ranges::sort(ranges::begin(range), ranges::end(range), std::move(comp),
2730*6777b538SAndroid Build Coastguard Worker std::move(proj));
2731*6777b538SAndroid Build Coastguard Worker }
2732*6777b538SAndroid Build Coastguard Worker
2733*6777b538SAndroid Build Coastguard Worker // [stable.sort] stable_sort
2734*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/stable.sort
2735*6777b538SAndroid Build Coastguard Worker
2736*6777b538SAndroid Build Coastguard Worker // Effects: Sorts the elements in the range `[first, last)` with respect to
2737*6777b538SAndroid Build Coastguard Worker // `comp` and `proj`.
2738*6777b538SAndroid Build Coastguard Worker //
2739*6777b538SAndroid Build Coastguard Worker // Returns: `last`.
2740*6777b538SAndroid Build Coastguard Worker //
2741*6777b538SAndroid Build Coastguard Worker // Complexity: Let `N` be `last - first`. If enough extra memory is available,
2742*6777b538SAndroid Build Coastguard Worker // `N log (N)` comparisons. Otherwise, at most `N log^2 (N)` comparisons. In
2743*6777b538SAndroid Build Coastguard Worker // either case, twice as many projections as the number of comparisons.
2744*6777b538SAndroid Build Coastguard Worker //
2745*6777b538SAndroid Build Coastguard Worker // Remarks: Stable.
2746*6777b538SAndroid Build Coastguard Worker //
2747*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/stable.sort#:~:text=ranges::stable_sort(I
2748*6777b538SAndroid Build Coastguard Worker template <typename RandomAccessIterator,
2749*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
2750*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
2751*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<RandomAccessIterator>,
2752*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<
2753*6777b538SAndroid Build Coastguard Worker Comp&,
2754*6777b538SAndroid Build Coastguard Worker std::projected<RandomAccessIterator, Proj>,
2755*6777b538SAndroid Build Coastguard Worker std::projected<RandomAccessIterator, Proj>>>
2756*6777b538SAndroid Build Coastguard Worker constexpr auto stable_sort(RandomAccessIterator first,
2757*6777b538SAndroid Build Coastguard Worker RandomAccessIterator last,
2758*6777b538SAndroid Build Coastguard Worker Comp comp = {},
2759*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
2760*6777b538SAndroid Build Coastguard Worker std::stable_sort(first, last,
2761*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(comp, proj, proj));
2762*6777b538SAndroid Build Coastguard Worker return last;
2763*6777b538SAndroid Build Coastguard Worker }
2764*6777b538SAndroid Build Coastguard Worker
2765*6777b538SAndroid Build Coastguard Worker // Effects: Sorts the elements in `range` with respect to `comp` and `proj`.
2766*6777b538SAndroid Build Coastguard Worker //
2767*6777b538SAndroid Build Coastguard Worker // Returns: `end(rang)`.
2768*6777b538SAndroid Build Coastguard Worker //
2769*6777b538SAndroid Build Coastguard Worker // Complexity: Let `N` be `size(range)`. If enough extra memory is available,
2770*6777b538SAndroid Build Coastguard Worker // `N log (N)` comparisons. Otherwise, at most `N log^2 (N)` comparisons. In
2771*6777b538SAndroid Build Coastguard Worker // either case, twice as many projections as the number of comparisons.
2772*6777b538SAndroid Build Coastguard Worker //
2773*6777b538SAndroid Build Coastguard Worker // Remarks: Stable.
2774*6777b538SAndroid Build Coastguard Worker //
2775*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/stable.sort#:~:text=ranges::stable_sort(R
2776*6777b538SAndroid Build Coastguard Worker template <
2777*6777b538SAndroid Build Coastguard Worker typename Range,
2778*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
2779*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
2780*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
2781*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
2782*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>,
2783*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>>>
2784*6777b538SAndroid Build Coastguard Worker constexpr auto stable_sort(Range&& range, Comp comp = {}, Proj proj = {}) {
2785*6777b538SAndroid Build Coastguard Worker return ranges::stable_sort(ranges::begin(range), ranges::end(range),
2786*6777b538SAndroid Build Coastguard Worker std::move(comp), std::move(proj));
2787*6777b538SAndroid Build Coastguard Worker }
2788*6777b538SAndroid Build Coastguard Worker
2789*6777b538SAndroid Build Coastguard Worker // [partial.sort] partial_sort
2790*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/partial.sort
2791*6777b538SAndroid Build Coastguard Worker
2792*6777b538SAndroid Build Coastguard Worker // Preconditions: `[first, middle)` and `[middle, last)` are valid ranges.
2793*6777b538SAndroid Build Coastguard Worker //
2794*6777b538SAndroid Build Coastguard Worker // Effects: Places the first `middle - first` elements from the range
2795*6777b538SAndroid Build Coastguard Worker // `[first, last)` as sorted with respect to `comp` and `proj` into the range
2796*6777b538SAndroid Build Coastguard Worker // `[first, middle)`. The rest of the elements in the range `[middle, last)` are
2797*6777b538SAndroid Build Coastguard Worker // placed in an unspecified order.
2798*6777b538SAndroid Build Coastguard Worker //
2799*6777b538SAndroid Build Coastguard Worker // Returns: `last`.
2800*6777b538SAndroid Build Coastguard Worker //
2801*6777b538SAndroid Build Coastguard Worker // Complexity: Approximately `(last - first) * log(middle - first)` comparisons,
2802*6777b538SAndroid Build Coastguard Worker // and twice as many projections.
2803*6777b538SAndroid Build Coastguard Worker //
2804*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/partial.sort#:~:text=ranges::partial_sort(I
2805*6777b538SAndroid Build Coastguard Worker template <typename RandomAccessIterator,
2806*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
2807*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
2808*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<RandomAccessIterator>,
2809*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<
2810*6777b538SAndroid Build Coastguard Worker Comp&,
2811*6777b538SAndroid Build Coastguard Worker std::projected<RandomAccessIterator, Proj>,
2812*6777b538SAndroid Build Coastguard Worker std::projected<RandomAccessIterator, Proj>>>
2813*6777b538SAndroid Build Coastguard Worker constexpr auto partial_sort(RandomAccessIterator first,
2814*6777b538SAndroid Build Coastguard Worker RandomAccessIterator middle,
2815*6777b538SAndroid Build Coastguard Worker RandomAccessIterator last,
2816*6777b538SAndroid Build Coastguard Worker Comp comp = {},
2817*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
2818*6777b538SAndroid Build Coastguard Worker std::partial_sort(first, middle, last,
2819*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(comp, proj, proj));
2820*6777b538SAndroid Build Coastguard Worker return last;
2821*6777b538SAndroid Build Coastguard Worker }
2822*6777b538SAndroid Build Coastguard Worker
2823*6777b538SAndroid Build Coastguard Worker // Preconditions: `[begin(range), middle)` and `[middle, end(range))` are valid
2824*6777b538SAndroid Build Coastguard Worker // ranges.
2825*6777b538SAndroid Build Coastguard Worker //
2826*6777b538SAndroid Build Coastguard Worker // Effects: Places the first `middle - begin(range)` elements from `range` as
2827*6777b538SAndroid Build Coastguard Worker // sorted with respect to `comp` and `proj` into the range
2828*6777b538SAndroid Build Coastguard Worker // `[begin(range), middle)`. The rest of the elements in the range
2829*6777b538SAndroid Build Coastguard Worker // `[middle, end(range))` are placed in an unspecified order.
2830*6777b538SAndroid Build Coastguard Worker //
2831*6777b538SAndroid Build Coastguard Worker // Returns: `end(range)`.
2832*6777b538SAndroid Build Coastguard Worker //
2833*6777b538SAndroid Build Coastguard Worker // Complexity: Approximately `size(range) * log(middle - begin(range))`
2834*6777b538SAndroid Build Coastguard Worker // comparisons, and twice as many projections.
2835*6777b538SAndroid Build Coastguard Worker //
2836*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/partial.sort#:~:text=ranges::partial_sort(R
2837*6777b538SAndroid Build Coastguard Worker template <
2838*6777b538SAndroid Build Coastguard Worker typename Range,
2839*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
2840*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
2841*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
2842*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
2843*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>,
2844*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>>>
2845*6777b538SAndroid Build Coastguard Worker constexpr auto partial_sort(Range&& range,
2846*6777b538SAndroid Build Coastguard Worker iterator_t<Range> middle,
2847*6777b538SAndroid Build Coastguard Worker Comp comp = {},
2848*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
2849*6777b538SAndroid Build Coastguard Worker return ranges::partial_sort(ranges::begin(range), middle, ranges::end(range),
2850*6777b538SAndroid Build Coastguard Worker std::move(comp), std::move(proj));
2851*6777b538SAndroid Build Coastguard Worker }
2852*6777b538SAndroid Build Coastguard Worker
2853*6777b538SAndroid Build Coastguard Worker // [partial.sort.copy] partial_sort_copy
2854*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/partial.sort.copy
2855*6777b538SAndroid Build Coastguard Worker
2856*6777b538SAndroid Build Coastguard Worker // Let `N` be `min(last - first, result_last - result_first)`.
2857*6777b538SAndroid Build Coastguard Worker //
2858*6777b538SAndroid Build Coastguard Worker // Preconditions: For iterators `a1` and `b1` in `[first, last)`, and iterators
2859*6777b538SAndroid Build Coastguard Worker // `x2` and `y2` in `[result_first, result_last)`, after evaluating the
2860*6777b538SAndroid Build Coastguard Worker // assignment `*y2 = *b1`, let `E` be the value of `bool(invoke(comp,
2861*6777b538SAndroid Build Coastguard Worker // invoke(proj1, *a1), invoke(proj2, *y2)))`. Then, after evaluating the
2862*6777b538SAndroid Build Coastguard Worker // assignment `*x2 = *a1`, `E` is equal to `bool(invoke(comp, invoke(proj2,
2863*6777b538SAndroid Build Coastguard Worker // *x2), invoke(proj2, *y2)))`.
2864*6777b538SAndroid Build Coastguard Worker //
2865*6777b538SAndroid Build Coastguard Worker // Effects: Places the first `N` elements as sorted with respect to `comp` and
2866*6777b538SAndroid Build Coastguard Worker // `proj2` into the range `[result_first, result_first + N)`.
2867*6777b538SAndroid Build Coastguard Worker //
2868*6777b538SAndroid Build Coastguard Worker // Returns: `result_first + N`.
2869*6777b538SAndroid Build Coastguard Worker //
2870*6777b538SAndroid Build Coastguard Worker // Complexity: Approximately `(last - first) * log N` comparisons, and twice as
2871*6777b538SAndroid Build Coastguard Worker // many projections.
2872*6777b538SAndroid Build Coastguard Worker //
2873*6777b538SAndroid Build Coastguard Worker // Reference:
2874*6777b538SAndroid Build Coastguard Worker // https://wg21.link/partial.sort.copy#:~:text=ranges::partial_sort_copy(I1
2875*6777b538SAndroid Build Coastguard Worker template <
2876*6777b538SAndroid Build Coastguard Worker typename InputIterator,
2877*6777b538SAndroid Build Coastguard Worker typename RandomAccessIterator,
2878*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
2879*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
2880*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
2881*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator>,
2882*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<RandomAccessIterator>,
2883*6777b538SAndroid Build Coastguard Worker typename =
2884*6777b538SAndroid Build Coastguard Worker std::indirect_result_t<Comp&,
2885*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator, Proj1>,
2886*6777b538SAndroid Build Coastguard Worker std::projected<RandomAccessIterator, Proj2>>,
2887*6777b538SAndroid Build Coastguard Worker typename =
2888*6777b538SAndroid Build Coastguard Worker std::indirect_result_t<Comp&,
2889*6777b538SAndroid Build Coastguard Worker std::projected<RandomAccessIterator, Proj2>,
2890*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator, Proj1>>>
2891*6777b538SAndroid Build Coastguard Worker constexpr auto partial_sort_copy(InputIterator first,
2892*6777b538SAndroid Build Coastguard Worker InputIterator last,
2893*6777b538SAndroid Build Coastguard Worker RandomAccessIterator result_first,
2894*6777b538SAndroid Build Coastguard Worker RandomAccessIterator result_last,
2895*6777b538SAndroid Build Coastguard Worker Comp comp = {},
2896*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
2897*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
2898*6777b538SAndroid Build Coastguard Worker // Needs to opt-in to all permutations, since std::partial_sort_copy expects
2899*6777b538SAndroid Build Coastguard Worker // comp(proj2(lhs), proj1(rhs)) to compile.
2900*6777b538SAndroid Build Coastguard Worker return std::partial_sort_copy(
2901*6777b538SAndroid Build Coastguard Worker first, last, result_first, result_last,
2902*6777b538SAndroid Build Coastguard Worker internal::PermutedProjectedBinaryPredicate(comp, proj1, proj2));
2903*6777b538SAndroid Build Coastguard Worker }
2904*6777b538SAndroid Build Coastguard Worker
2905*6777b538SAndroid Build Coastguard Worker // Let `N` be `min(size(range), size(result_range))`.
2906*6777b538SAndroid Build Coastguard Worker //
2907*6777b538SAndroid Build Coastguard Worker // Preconditions: For iterators `a1` and `b1` in `range`, and iterators
2908*6777b538SAndroid Build Coastguard Worker // `x2` and `y2` in `result_range`, after evaluating the assignment
2909*6777b538SAndroid Build Coastguard Worker // `*y2 = *b1`, let `E` be the value of
2910*6777b538SAndroid Build Coastguard Worker // `bool(invoke(comp, invoke(proj1, *a1), invoke(proj2, *y2)))`. Then, after
2911*6777b538SAndroid Build Coastguard Worker // evaluating the assignment `*x2 = *a1`, `E` is equal to
2912*6777b538SAndroid Build Coastguard Worker // `bool(invoke(comp, invoke(proj2, *x2), invoke(proj2, *y2)))`.
2913*6777b538SAndroid Build Coastguard Worker //
2914*6777b538SAndroid Build Coastguard Worker // Effects: Places the first `N` elements as sorted with respect to `comp` and
2915*6777b538SAndroid Build Coastguard Worker // `proj2` into the range `[begin(result_range), begin(result_range) + N)`.
2916*6777b538SAndroid Build Coastguard Worker //
2917*6777b538SAndroid Build Coastguard Worker // Returns: `begin(result_range) + N`.
2918*6777b538SAndroid Build Coastguard Worker //
2919*6777b538SAndroid Build Coastguard Worker // Complexity: Approximately `size(range) * log N` comparisons, and twice as
2920*6777b538SAndroid Build Coastguard Worker // many projections.
2921*6777b538SAndroid Build Coastguard Worker //
2922*6777b538SAndroid Build Coastguard Worker // Reference:
2923*6777b538SAndroid Build Coastguard Worker // https://wg21.link/partial.sort.copy#:~:text=ranges::partial_sort_copy(R1
2924*6777b538SAndroid Build Coastguard Worker template <typename Range1,
2925*6777b538SAndroid Build Coastguard Worker typename Range2,
2926*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
2927*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
2928*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
2929*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range1>,
2930*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range2>,
2931*6777b538SAndroid Build Coastguard Worker typename =
2932*6777b538SAndroid Build Coastguard Worker std::indirect_result_t<Comp&,
2933*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range1>, Proj1>,
2934*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range2>, Proj2>>,
2935*6777b538SAndroid Build Coastguard Worker typename =
2936*6777b538SAndroid Build Coastguard Worker std::indirect_result_t<Comp&,
2937*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range2>, Proj2>,
2938*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range1>, Proj1>>>
2939*6777b538SAndroid Build Coastguard Worker constexpr auto partial_sort_copy(Range1&& range,
2940*6777b538SAndroid Build Coastguard Worker Range2&& result_range,
2941*6777b538SAndroid Build Coastguard Worker Comp comp = {},
2942*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
2943*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
2944*6777b538SAndroid Build Coastguard Worker return ranges::partial_sort_copy(ranges::begin(range), ranges::end(range),
2945*6777b538SAndroid Build Coastguard Worker ranges::begin(result_range),
2946*6777b538SAndroid Build Coastguard Worker ranges::end(result_range), std::move(comp),
2947*6777b538SAndroid Build Coastguard Worker std::move(proj1), std::move(proj2));
2948*6777b538SAndroid Build Coastguard Worker }
2949*6777b538SAndroid Build Coastguard Worker
2950*6777b538SAndroid Build Coastguard Worker // [is.sorted] is_sorted
2951*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/is.sorted
2952*6777b538SAndroid Build Coastguard Worker
2953*6777b538SAndroid Build Coastguard Worker // Returns: The last iterator `i` in `[first, last]` for which the range
2954*6777b538SAndroid Build Coastguard Worker // `[first, i)` is sorted with respect to `comp` and `proj`.
2955*6777b538SAndroid Build Coastguard Worker //
2956*6777b538SAndroid Build Coastguard Worker // Complexity: Linear.
2957*6777b538SAndroid Build Coastguard Worker //
2958*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/is.sorted#:~:text=ranges::is_sorted_until(I
2959*6777b538SAndroid Build Coastguard Worker template <
2960*6777b538SAndroid Build Coastguard Worker typename ForwardIterator,
2961*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
2962*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
2963*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator>,
2964*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
2965*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator, Proj>,
2966*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator, Proj>>>
2967*6777b538SAndroid Build Coastguard Worker constexpr auto is_sorted_until(ForwardIterator first,
2968*6777b538SAndroid Build Coastguard Worker ForwardIterator last,
2969*6777b538SAndroid Build Coastguard Worker Comp comp = {},
2970*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
2971*6777b538SAndroid Build Coastguard Worker // Implementation inspired by cppreference.com:
2972*6777b538SAndroid Build Coastguard Worker // https://en.cppreference.com/w/cpp/algorithm/is_sorted_until
2973*6777b538SAndroid Build Coastguard Worker //
2974*6777b538SAndroid Build Coastguard Worker // A reimplementation is required, because std::is_sorted_until is not
2975*6777b538SAndroid Build Coastguard Worker // constexpr prior to C++20. Once we have C++20, we should switch to standard
2976*6777b538SAndroid Build Coastguard Worker // library implementation.
2977*6777b538SAndroid Build Coastguard Worker if (first == last)
2978*6777b538SAndroid Build Coastguard Worker return last;
2979*6777b538SAndroid Build Coastguard Worker
2980*6777b538SAndroid Build Coastguard Worker for (ForwardIterator next = first; ++next != last; ++first) {
2981*6777b538SAndroid Build Coastguard Worker if (std::invoke(comp, std::invoke(proj, *next),
2982*6777b538SAndroid Build Coastguard Worker std::invoke(proj, *first))) {
2983*6777b538SAndroid Build Coastguard Worker return next;
2984*6777b538SAndroid Build Coastguard Worker }
2985*6777b538SAndroid Build Coastguard Worker }
2986*6777b538SAndroid Build Coastguard Worker
2987*6777b538SAndroid Build Coastguard Worker return last;
2988*6777b538SAndroid Build Coastguard Worker }
2989*6777b538SAndroid Build Coastguard Worker
2990*6777b538SAndroid Build Coastguard Worker // Returns: The last iterator `i` in `[begin(range), end(range)]` for which the
2991*6777b538SAndroid Build Coastguard Worker // range `[begin(range), i)` is sorted with respect to `comp` and `proj`.
2992*6777b538SAndroid Build Coastguard Worker //
2993*6777b538SAndroid Build Coastguard Worker // Complexity: Linear.
2994*6777b538SAndroid Build Coastguard Worker //
2995*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/is.sorted#:~:text=ranges::is_sorted_until(R
2996*6777b538SAndroid Build Coastguard Worker template <
2997*6777b538SAndroid Build Coastguard Worker typename Range,
2998*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
2999*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
3000*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
3001*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
3002*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>,
3003*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>>>
3004*6777b538SAndroid Build Coastguard Worker constexpr auto is_sorted_until(Range&& range, Comp comp = {}, Proj proj = {}) {
3005*6777b538SAndroid Build Coastguard Worker return ranges::is_sorted_until(ranges::begin(range), ranges::end(range),
3006*6777b538SAndroid Build Coastguard Worker std::move(comp), std::move(proj));
3007*6777b538SAndroid Build Coastguard Worker }
3008*6777b538SAndroid Build Coastguard Worker
3009*6777b538SAndroid Build Coastguard Worker // Returns: Whether the range `[first, last)` is sorted with respect to `comp`
3010*6777b538SAndroid Build Coastguard Worker // and `proj`.
3011*6777b538SAndroid Build Coastguard Worker //
3012*6777b538SAndroid Build Coastguard Worker // Complexity: Linear.
3013*6777b538SAndroid Build Coastguard Worker //
3014*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/is.sorted#:~:text=ranges::is_sorted(I
3015*6777b538SAndroid Build Coastguard Worker template <
3016*6777b538SAndroid Build Coastguard Worker typename ForwardIterator,
3017*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
3018*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
3019*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator>,
3020*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
3021*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator, Proj>,
3022*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator, Proj>>>
3023*6777b538SAndroid Build Coastguard Worker constexpr auto is_sorted(ForwardIterator first,
3024*6777b538SAndroid Build Coastguard Worker ForwardIterator last,
3025*6777b538SAndroid Build Coastguard Worker Comp comp = {},
3026*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
3027*6777b538SAndroid Build Coastguard Worker return ranges::is_sorted_until(first, last, std::move(comp),
3028*6777b538SAndroid Build Coastguard Worker std::move(proj)) == last;
3029*6777b538SAndroid Build Coastguard Worker }
3030*6777b538SAndroid Build Coastguard Worker
3031*6777b538SAndroid Build Coastguard Worker // Returns: Whether `range` is sorted with respect to `comp` and `proj`.
3032*6777b538SAndroid Build Coastguard Worker //
3033*6777b538SAndroid Build Coastguard Worker // Complexity: Linear.
3034*6777b538SAndroid Build Coastguard Worker //
3035*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/is.sorted#:~:text=ranges::is_sorted(R
3036*6777b538SAndroid Build Coastguard Worker template <
3037*6777b538SAndroid Build Coastguard Worker typename Range,
3038*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
3039*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
3040*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
3041*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
3042*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>,
3043*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>>>
3044*6777b538SAndroid Build Coastguard Worker constexpr auto is_sorted(Range&& range, Comp comp = {}, Proj proj = {}) {
3045*6777b538SAndroid Build Coastguard Worker return ranges::is_sorted(ranges::begin(range), ranges::end(range),
3046*6777b538SAndroid Build Coastguard Worker std::move(comp), std::move(proj));
3047*6777b538SAndroid Build Coastguard Worker }
3048*6777b538SAndroid Build Coastguard Worker
3049*6777b538SAndroid Build Coastguard Worker // [alg.nth.element] Nth element
3050*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.nth.element
3051*6777b538SAndroid Build Coastguard Worker
3052*6777b538SAndroid Build Coastguard Worker // Preconditions: `[first, nth)` and `[nth, last)` are valid ranges.
3053*6777b538SAndroid Build Coastguard Worker //
3054*6777b538SAndroid Build Coastguard Worker // Effects: After `nth_element` the element in the position pointed to by `nth`
3055*6777b538SAndroid Build Coastguard Worker // is the element that would be in that position if the whole range were sorted
3056*6777b538SAndroid Build Coastguard Worker // with respect to `comp` and `proj`, unless `nth == last`. Also for every
3057*6777b538SAndroid Build Coastguard Worker // iterator `i` in the range `[first, nth)` and every iterator `j` in the range
3058*6777b538SAndroid Build Coastguard Worker // `[nth, last)` it holds that:
3059*6777b538SAndroid Build Coastguard Worker // `bool(invoke(comp, invoke(proj, *j), invoke(proj, *i)))` is false.
3060*6777b538SAndroid Build Coastguard Worker //
3061*6777b538SAndroid Build Coastguard Worker // Returns: `last`.
3062*6777b538SAndroid Build Coastguard Worker //
3063*6777b538SAndroid Build Coastguard Worker // Complexity: Linear on average.
3064*6777b538SAndroid Build Coastguard Worker //
3065*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.nth.element#:~:text=ranges::nth_element(I
3066*6777b538SAndroid Build Coastguard Worker template <typename RandomAccessIterator,
3067*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
3068*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
3069*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<RandomAccessIterator>,
3070*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<
3071*6777b538SAndroid Build Coastguard Worker Comp&,
3072*6777b538SAndroid Build Coastguard Worker std::projected<RandomAccessIterator, Proj>,
3073*6777b538SAndroid Build Coastguard Worker std::projected<RandomAccessIterator, Proj>>>
3074*6777b538SAndroid Build Coastguard Worker constexpr auto nth_element(RandomAccessIterator first,
3075*6777b538SAndroid Build Coastguard Worker RandomAccessIterator nth,
3076*6777b538SAndroid Build Coastguard Worker RandomAccessIterator last,
3077*6777b538SAndroid Build Coastguard Worker Comp comp = {},
3078*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
3079*6777b538SAndroid Build Coastguard Worker std::nth_element(first, nth, last,
3080*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(comp, proj, proj));
3081*6777b538SAndroid Build Coastguard Worker return last;
3082*6777b538SAndroid Build Coastguard Worker }
3083*6777b538SAndroid Build Coastguard Worker
3084*6777b538SAndroid Build Coastguard Worker // Preconditions: `[begin(range), nth)` and `[nth, end(range))` are valid
3085*6777b538SAndroid Build Coastguard Worker // ranges.
3086*6777b538SAndroid Build Coastguard Worker //
3087*6777b538SAndroid Build Coastguard Worker // Effects: After `nth_element` the element in the position pointed to by `nth`
3088*6777b538SAndroid Build Coastguard Worker // is the element that would be in that position if the whole range were sorted
3089*6777b538SAndroid Build Coastguard Worker // with respect to `comp` and `proj`, unless `nth == end(range)`. Also for every
3090*6777b538SAndroid Build Coastguard Worker // iterator `i` in the range `[begin(range), nth)` and every iterator `j` in the
3091*6777b538SAndroid Build Coastguard Worker // range `[nth, end(range))` it holds that:
3092*6777b538SAndroid Build Coastguard Worker // `bool(invoke(comp, invoke(proj, *j), invoke(proj, *i)))` is false.
3093*6777b538SAndroid Build Coastguard Worker //
3094*6777b538SAndroid Build Coastguard Worker // Returns: `end(range)`.
3095*6777b538SAndroid Build Coastguard Worker //
3096*6777b538SAndroid Build Coastguard Worker // Complexity: Linear on average.
3097*6777b538SAndroid Build Coastguard Worker //
3098*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.nth.element#:~:text=ranges::nth_element(R
3099*6777b538SAndroid Build Coastguard Worker template <
3100*6777b538SAndroid Build Coastguard Worker typename Range,
3101*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
3102*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
3103*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
3104*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
3105*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>,
3106*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>>>
3107*6777b538SAndroid Build Coastguard Worker constexpr auto nth_element(Range&& range,
3108*6777b538SAndroid Build Coastguard Worker iterator_t<Range> nth,
3109*6777b538SAndroid Build Coastguard Worker Comp comp = {},
3110*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
3111*6777b538SAndroid Build Coastguard Worker return ranges::nth_element(ranges::begin(range), nth, ranges::end(range),
3112*6777b538SAndroid Build Coastguard Worker std::move(comp), std::move(proj));
3113*6777b538SAndroid Build Coastguard Worker }
3114*6777b538SAndroid Build Coastguard Worker
3115*6777b538SAndroid Build Coastguard Worker // [alg.binary.search] Binary search
3116*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.binary.search
3117*6777b538SAndroid Build Coastguard Worker
3118*6777b538SAndroid Build Coastguard Worker // [lower.bound] lower_bound
3119*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/lower.bound
3120*6777b538SAndroid Build Coastguard Worker
3121*6777b538SAndroid Build Coastguard Worker // Preconditions: The elements `e` of `[first, last)` are partitioned with
3122*6777b538SAndroid Build Coastguard Worker // respect to the expression `bool(invoke(comp, invoke(proj, e), value))`.
3123*6777b538SAndroid Build Coastguard Worker //
3124*6777b538SAndroid Build Coastguard Worker // Returns: The furthermost iterator `i` in the range `[first, last]` such that
3125*6777b538SAndroid Build Coastguard Worker // for every iterator `j` in the range `[first, i)`,
3126*6777b538SAndroid Build Coastguard Worker // `bool(invoke(comp, invoke(proj, *j), value))` is true.
3127*6777b538SAndroid Build Coastguard Worker //
3128*6777b538SAndroid Build Coastguard Worker // Complexity: At most `log_2(last - first) + O(1)` comparisons and projections.
3129*6777b538SAndroid Build Coastguard Worker //
3130*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/lower.bound#:~:text=ranges::lower_bound(I
3131*6777b538SAndroid Build Coastguard Worker template <typename ForwardIterator,
3132*6777b538SAndroid Build Coastguard Worker typename T,
3133*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
3134*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
3135*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator>>
3136*6777b538SAndroid Build Coastguard Worker constexpr auto lower_bound(ForwardIterator first,
3137*6777b538SAndroid Build Coastguard Worker ForwardIterator last,
3138*6777b538SAndroid Build Coastguard Worker const T& value,
3139*6777b538SAndroid Build Coastguard Worker Comp comp = {},
3140*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
3141*6777b538SAndroid Build Coastguard Worker // The second arg is guaranteed to be `value`, so we'll simply apply the
3142*6777b538SAndroid Build Coastguard Worker // std::identity projection.
3143*6777b538SAndroid Build Coastguard Worker std::identity value_proj;
3144*6777b538SAndroid Build Coastguard Worker return std::lower_bound(
3145*6777b538SAndroid Build Coastguard Worker first, last, value,
3146*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(comp, proj, value_proj));
3147*6777b538SAndroid Build Coastguard Worker }
3148*6777b538SAndroid Build Coastguard Worker
3149*6777b538SAndroid Build Coastguard Worker // Preconditions: The elements `e` of `range` are partitioned with respect to
3150*6777b538SAndroid Build Coastguard Worker // the expression `bool(invoke(comp, invoke(proj, e), value))`.
3151*6777b538SAndroid Build Coastguard Worker //
3152*6777b538SAndroid Build Coastguard Worker // Returns: The furthermost iterator `i` in the range
3153*6777b538SAndroid Build Coastguard Worker // `[begin(range), end(range)]` such that for every iterator `j` in the range
3154*6777b538SAndroid Build Coastguard Worker // `[begin(range), i)`, `bool(invoke(comp, invoke(proj, *j), value))` is true.
3155*6777b538SAndroid Build Coastguard Worker //
3156*6777b538SAndroid Build Coastguard Worker // Complexity: At most `log_2(size(range)) + O(1)` comparisons and projections.
3157*6777b538SAndroid Build Coastguard Worker //
3158*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/lower.bound#:~:text=ranges::lower_bound(R
3159*6777b538SAndroid Build Coastguard Worker template <typename Range,
3160*6777b538SAndroid Build Coastguard Worker typename T,
3161*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
3162*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
3163*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
3164*6777b538SAndroid Build Coastguard Worker constexpr auto lower_bound(Range&& range,
3165*6777b538SAndroid Build Coastguard Worker const T& value,
3166*6777b538SAndroid Build Coastguard Worker Comp comp = {},
3167*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
3168*6777b538SAndroid Build Coastguard Worker return ranges::lower_bound(ranges::begin(range), ranges::end(range), value,
3169*6777b538SAndroid Build Coastguard Worker std::move(comp), std::move(proj));
3170*6777b538SAndroid Build Coastguard Worker }
3171*6777b538SAndroid Build Coastguard Worker
3172*6777b538SAndroid Build Coastguard Worker // [upper.bound] upper_bound
3173*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/upper.bound
3174*6777b538SAndroid Build Coastguard Worker
3175*6777b538SAndroid Build Coastguard Worker // Preconditions: The elements `e` of `[first, last)` are partitioned with
3176*6777b538SAndroid Build Coastguard Worker // respect to the expression `!bool(invoke(comp, value, invoke(proj, e)))`.
3177*6777b538SAndroid Build Coastguard Worker //
3178*6777b538SAndroid Build Coastguard Worker // Returns: The furthermost iterator `i` in the range `[first, last]` such that
3179*6777b538SAndroid Build Coastguard Worker // for every iterator `j` in the range `[first, i)`,
3180*6777b538SAndroid Build Coastguard Worker // `!bool(invoke(comp, value, invoke(proj, *j)))` is true.
3181*6777b538SAndroid Build Coastguard Worker //
3182*6777b538SAndroid Build Coastguard Worker // Complexity: At most `log_2(last - first) + O(1)` comparisons and projections.
3183*6777b538SAndroid Build Coastguard Worker //
3184*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/upper.bound#:~:text=ranges::upper_bound(I
3185*6777b538SAndroid Build Coastguard Worker template <typename ForwardIterator,
3186*6777b538SAndroid Build Coastguard Worker typename T,
3187*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
3188*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
3189*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator>>
3190*6777b538SAndroid Build Coastguard Worker constexpr auto upper_bound(ForwardIterator first,
3191*6777b538SAndroid Build Coastguard Worker ForwardIterator last,
3192*6777b538SAndroid Build Coastguard Worker const T& value,
3193*6777b538SAndroid Build Coastguard Worker Comp comp = {},
3194*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
3195*6777b538SAndroid Build Coastguard Worker // The first arg is guaranteed to be `value`, so we'll simply apply the
3196*6777b538SAndroid Build Coastguard Worker // std::identity projection.
3197*6777b538SAndroid Build Coastguard Worker std::identity value_proj;
3198*6777b538SAndroid Build Coastguard Worker return std::upper_bound(
3199*6777b538SAndroid Build Coastguard Worker first, last, value,
3200*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(comp, value_proj, proj));
3201*6777b538SAndroid Build Coastguard Worker }
3202*6777b538SAndroid Build Coastguard Worker
3203*6777b538SAndroid Build Coastguard Worker // Preconditions: The elements `e` of `range` are partitioned with
3204*6777b538SAndroid Build Coastguard Worker // respect to the expression `!bool(invoke(comp, value, invoke(proj, e)))`.
3205*6777b538SAndroid Build Coastguard Worker //
3206*6777b538SAndroid Build Coastguard Worker // Returns: The furthermost iterator `i` in the range
3207*6777b538SAndroid Build Coastguard Worker // `[begin(range), end(range)]` such that for every iterator `j` in the range
3208*6777b538SAndroid Build Coastguard Worker // `[begin(range), i)`, `!bool(invoke(comp, value, invoke(proj, *j)))` is true.
3209*6777b538SAndroid Build Coastguard Worker //
3210*6777b538SAndroid Build Coastguard Worker // Complexity: At most `log_2(size(range)) + O(1)` comparisons and projections.
3211*6777b538SAndroid Build Coastguard Worker //
3212*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/upper.bound#:~:text=ranges::upper_bound(R
3213*6777b538SAndroid Build Coastguard Worker template <typename Range,
3214*6777b538SAndroid Build Coastguard Worker typename T,
3215*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
3216*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
3217*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
3218*6777b538SAndroid Build Coastguard Worker constexpr auto upper_bound(Range&& range,
3219*6777b538SAndroid Build Coastguard Worker const T& value,
3220*6777b538SAndroid Build Coastguard Worker Comp comp = {},
3221*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
3222*6777b538SAndroid Build Coastguard Worker return ranges::upper_bound(ranges::begin(range), ranges::end(range), value,
3223*6777b538SAndroid Build Coastguard Worker std::move(comp), std::move(proj));
3224*6777b538SAndroid Build Coastguard Worker }
3225*6777b538SAndroid Build Coastguard Worker
3226*6777b538SAndroid Build Coastguard Worker // [equal.range] equal_range
3227*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/equal.range
3228*6777b538SAndroid Build Coastguard Worker
3229*6777b538SAndroid Build Coastguard Worker // Preconditions: The elements `e` of `[first, last)` are partitioned with
3230*6777b538SAndroid Build Coastguard Worker // respect to the expressions `bool(invoke(comp, invoke(proj, e), value))` and
3231*6777b538SAndroid Build Coastguard Worker // `!bool(invoke(comp, value, invoke(proj, e)))`.
3232*6777b538SAndroid Build Coastguard Worker //
3233*6777b538SAndroid Build Coastguard Worker // Returns: `{ranges::lower_bound(first, last, value, comp, proj),
3234*6777b538SAndroid Build Coastguard Worker // ranges::upper_bound(first, last, value, comp, proj)}`.
3235*6777b538SAndroid Build Coastguard Worker //
3236*6777b538SAndroid Build Coastguard Worker // Complexity: At most 2 ∗ log_2(last - first) + O(1) comparisons and
3237*6777b538SAndroid Build Coastguard Worker // projections.
3238*6777b538SAndroid Build Coastguard Worker //
3239*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/equal.range#:~:text=ranges::equal_range(I
3240*6777b538SAndroid Build Coastguard Worker template <typename ForwardIterator,
3241*6777b538SAndroid Build Coastguard Worker typename T,
3242*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
3243*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
3244*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator>>
3245*6777b538SAndroid Build Coastguard Worker constexpr auto equal_range(ForwardIterator first,
3246*6777b538SAndroid Build Coastguard Worker ForwardIterator last,
3247*6777b538SAndroid Build Coastguard Worker const T& value,
3248*6777b538SAndroid Build Coastguard Worker Comp comp = {},
3249*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
3250*6777b538SAndroid Build Coastguard Worker // Note: This does not dispatch to std::equal_range, as otherwise it would not
3251*6777b538SAndroid Build Coastguard Worker // be possible to prevent applying `proj` to `value`, which can result in
3252*6777b538SAndroid Build Coastguard Worker // unintended behavior.
3253*6777b538SAndroid Build Coastguard Worker return std::make_pair(ranges::lower_bound(first, last, value, comp, proj),
3254*6777b538SAndroid Build Coastguard Worker ranges::upper_bound(first, last, value, comp, proj));
3255*6777b538SAndroid Build Coastguard Worker }
3256*6777b538SAndroid Build Coastguard Worker
3257*6777b538SAndroid Build Coastguard Worker // Preconditions: The elements `e` of `range` are partitioned with
3258*6777b538SAndroid Build Coastguard Worker // respect to the expressions `bool(invoke(comp, invoke(proj, e), value))` and
3259*6777b538SAndroid Build Coastguard Worker // `!bool(invoke(comp, value, invoke(proj, e)))`.
3260*6777b538SAndroid Build Coastguard Worker //
3261*6777b538SAndroid Build Coastguard Worker // Returns: `{ranges::lower_bound(range, value, comp, proj),
3262*6777b538SAndroid Build Coastguard Worker // ranges::upper_bound(range, value, comp, proj)}`.
3263*6777b538SAndroid Build Coastguard Worker //
3264*6777b538SAndroid Build Coastguard Worker // Complexity: At most 2 ∗ log_2(size(range)) + O(1) comparisons and
3265*6777b538SAndroid Build Coastguard Worker // projections.
3266*6777b538SAndroid Build Coastguard Worker //
3267*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/equal.range#:~:text=ranges::equal_range(R
3268*6777b538SAndroid Build Coastguard Worker template <typename Range,
3269*6777b538SAndroid Build Coastguard Worker typename T,
3270*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
3271*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
3272*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
3273*6777b538SAndroid Build Coastguard Worker constexpr auto equal_range(Range&& range,
3274*6777b538SAndroid Build Coastguard Worker const T& value,
3275*6777b538SAndroid Build Coastguard Worker Comp comp = {},
3276*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
3277*6777b538SAndroid Build Coastguard Worker return ranges::equal_range(ranges::begin(range), ranges::end(range), value,
3278*6777b538SAndroid Build Coastguard Worker std::move(comp), std::move(proj));
3279*6777b538SAndroid Build Coastguard Worker }
3280*6777b538SAndroid Build Coastguard Worker
3281*6777b538SAndroid Build Coastguard Worker // [binary.search] binary_search
3282*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/binary.search
3283*6777b538SAndroid Build Coastguard Worker
3284*6777b538SAndroid Build Coastguard Worker // Preconditions: The elements `e` of `[first, last)` are partitioned with
3285*6777b538SAndroid Build Coastguard Worker // respect to the expressions `bool(invoke(comp, invoke(proj, e), value))` and
3286*6777b538SAndroid Build Coastguard Worker // `!bool(invoke(comp, value, invoke(proj, e)))`.
3287*6777b538SAndroid Build Coastguard Worker //
3288*6777b538SAndroid Build Coastguard Worker // Returns: `true` if and only if for some iterator `i` in the range
3289*6777b538SAndroid Build Coastguard Worker // `[first, last)`, `!bool(invoke(comp, invoke(proj, *i), value)) &&
3290*6777b538SAndroid Build Coastguard Worker // !bool(invoke(comp, value, invoke(proj, *i)))` is true.
3291*6777b538SAndroid Build Coastguard Worker //
3292*6777b538SAndroid Build Coastguard Worker // Complexity: At most `log_2(last - first) + O(1)` comparisons and projections.
3293*6777b538SAndroid Build Coastguard Worker //
3294*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/binary.search#:~:text=ranges::binary_search(I
3295*6777b538SAndroid Build Coastguard Worker template <typename ForwardIterator,
3296*6777b538SAndroid Build Coastguard Worker typename T,
3297*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
3298*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
3299*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator>>
3300*6777b538SAndroid Build Coastguard Worker constexpr auto binary_search(ForwardIterator first,
3301*6777b538SAndroid Build Coastguard Worker ForwardIterator last,
3302*6777b538SAndroid Build Coastguard Worker const T& value,
3303*6777b538SAndroid Build Coastguard Worker Comp comp = {},
3304*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
3305*6777b538SAndroid Build Coastguard Worker first = ranges::lower_bound(first, last, value, comp, proj);
3306*6777b538SAndroid Build Coastguard Worker return first != last && !std::invoke(comp, value, std::invoke(proj, *first));
3307*6777b538SAndroid Build Coastguard Worker }
3308*6777b538SAndroid Build Coastguard Worker
3309*6777b538SAndroid Build Coastguard Worker // Preconditions: The elements `e` of `range` are partitioned with
3310*6777b538SAndroid Build Coastguard Worker // respect to the expressions `bool(invoke(comp, invoke(proj, e), value))` and
3311*6777b538SAndroid Build Coastguard Worker // `!bool(invoke(comp, value, invoke(proj, e)))`.
3312*6777b538SAndroid Build Coastguard Worker //
3313*6777b538SAndroid Build Coastguard Worker // Returns: `true` if and only if for some iterator `i` in `range`
3314*6777b538SAndroid Build Coastguard Worker // `!bool(invoke(comp, invoke(proj, *i), value)) &&
3315*6777b538SAndroid Build Coastguard Worker // !bool(invoke(comp, value, invoke(proj, *i)))` is true.
3316*6777b538SAndroid Build Coastguard Worker //
3317*6777b538SAndroid Build Coastguard Worker // Complexity: At most `log_2(size(range)) + O(1)` comparisons and projections.
3318*6777b538SAndroid Build Coastguard Worker //
3319*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/binary.search#:~:text=ranges::binary_search(R
3320*6777b538SAndroid Build Coastguard Worker template <typename Range,
3321*6777b538SAndroid Build Coastguard Worker typename T,
3322*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
3323*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
3324*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
3325*6777b538SAndroid Build Coastguard Worker constexpr auto binary_search(Range&& range,
3326*6777b538SAndroid Build Coastguard Worker const T& value,
3327*6777b538SAndroid Build Coastguard Worker Comp comp = {},
3328*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
3329*6777b538SAndroid Build Coastguard Worker return ranges::binary_search(ranges::begin(range), ranges::end(range), value,
3330*6777b538SAndroid Build Coastguard Worker std::move(comp), std::move(proj));
3331*6777b538SAndroid Build Coastguard Worker }
3332*6777b538SAndroid Build Coastguard Worker
3333*6777b538SAndroid Build Coastguard Worker // [alg.partitions] Partitions
3334*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.partitions
3335*6777b538SAndroid Build Coastguard Worker
3336*6777b538SAndroid Build Coastguard Worker // Returns: `true` if and only if the elements `e` of `[first, last)` are
3337*6777b538SAndroid Build Coastguard Worker // partitioned with respect to the expression
3338*6777b538SAndroid Build Coastguard Worker // `bool(invoke(pred, invoke(proj, e)))`.
3339*6777b538SAndroid Build Coastguard Worker //
3340*6777b538SAndroid Build Coastguard Worker // Complexity: Linear. At most `last - first` applications of `pred` and `proj`.
3341*6777b538SAndroid Build Coastguard Worker //
3342*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.partitions#:~:text=ranges::is_partitioned(I
3343*6777b538SAndroid Build Coastguard Worker template <typename ForwardIterator,
3344*6777b538SAndroid Build Coastguard Worker typename Pred,
3345*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
3346*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator>>
3347*6777b538SAndroid Build Coastguard Worker constexpr auto is_partitioned(ForwardIterator first,
3348*6777b538SAndroid Build Coastguard Worker ForwardIterator last,
3349*6777b538SAndroid Build Coastguard Worker Pred pred,
3350*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
3351*6777b538SAndroid Build Coastguard Worker return std::is_partitioned(first, last,
3352*6777b538SAndroid Build Coastguard Worker internal::ProjectedUnaryPredicate(pred, proj));
3353*6777b538SAndroid Build Coastguard Worker }
3354*6777b538SAndroid Build Coastguard Worker
3355*6777b538SAndroid Build Coastguard Worker // Returns: `true` if and only if the elements `e` of `range` are partitioned
3356*6777b538SAndroid Build Coastguard Worker // with respect to the expression `bool(invoke(pred, invoke(proj, e)))`.
3357*6777b538SAndroid Build Coastguard Worker //
3358*6777b538SAndroid Build Coastguard Worker // Complexity: Linear. At most `size(range)` applications of `pred` and `proj`.
3359*6777b538SAndroid Build Coastguard Worker //
3360*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.partitions#:~:text=ranges::is_partitioned(R
3361*6777b538SAndroid Build Coastguard Worker template <typename Range,
3362*6777b538SAndroid Build Coastguard Worker typename Pred,
3363*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
3364*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
3365*6777b538SAndroid Build Coastguard Worker constexpr auto is_partitioned(Range&& range, Pred pred, Proj proj = {}) {
3366*6777b538SAndroid Build Coastguard Worker return ranges::is_partitioned(ranges::begin(range), ranges::end(range),
3367*6777b538SAndroid Build Coastguard Worker std::move(pred), std::move(proj));
3368*6777b538SAndroid Build Coastguard Worker }
3369*6777b538SAndroid Build Coastguard Worker
3370*6777b538SAndroid Build Coastguard Worker // Let `E(x)` be `bool(invoke(pred, invoke(proj, x)))`.
3371*6777b538SAndroid Build Coastguard Worker //
3372*6777b538SAndroid Build Coastguard Worker // Effects: Places all the elements `e` in `[first, last)` that satisfy `E(e)`
3373*6777b538SAndroid Build Coastguard Worker // before all the elements that do not.
3374*6777b538SAndroid Build Coastguard Worker //
3375*6777b538SAndroid Build Coastguard Worker // Returns: Let `i` be an iterator such that `E(*j)` is `true` for every
3376*6777b538SAndroid Build Coastguard Worker // iterator `j` in `[first, i)` and `false` for every iterator `j` in
3377*6777b538SAndroid Build Coastguard Worker // `[i, last)`. Returns: i.
3378*6777b538SAndroid Build Coastguard Worker //
3379*6777b538SAndroid Build Coastguard Worker // Complexity: Let `N = last - first`:
3380*6777b538SAndroid Build Coastguard Worker // Exactly `N` applications of the predicate and projection. At most `N / 2`
3381*6777b538SAndroid Build Coastguard Worker // swaps if the type of `first` models `bidirectional_iterator`, and at most `N`
3382*6777b538SAndroid Build Coastguard Worker // swaps otherwise.
3383*6777b538SAndroid Build Coastguard Worker //
3384*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.partitions#:~:text=ranges::partition(I
3385*6777b538SAndroid Build Coastguard Worker template <typename ForwardIterator,
3386*6777b538SAndroid Build Coastguard Worker typename Pred,
3387*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
3388*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator>>
3389*6777b538SAndroid Build Coastguard Worker constexpr auto partition(ForwardIterator first,
3390*6777b538SAndroid Build Coastguard Worker ForwardIterator last,
3391*6777b538SAndroid Build Coastguard Worker Pred pred,
3392*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
3393*6777b538SAndroid Build Coastguard Worker return std::partition(first, last,
3394*6777b538SAndroid Build Coastguard Worker internal::ProjectedUnaryPredicate(pred, proj));
3395*6777b538SAndroid Build Coastguard Worker }
3396*6777b538SAndroid Build Coastguard Worker
3397*6777b538SAndroid Build Coastguard Worker // Let `E(x)` be `bool(invoke(pred, invoke(proj, x)))`.
3398*6777b538SAndroid Build Coastguard Worker //
3399*6777b538SAndroid Build Coastguard Worker // Effects: Places all the elements `e` in `range` that satisfy `E(e)` before
3400*6777b538SAndroid Build Coastguard Worker // all the elements that do not.
3401*6777b538SAndroid Build Coastguard Worker //
3402*6777b538SAndroid Build Coastguard Worker // Returns: Let `i` be an iterator such that `E(*j)` is `true` for every
3403*6777b538SAndroid Build Coastguard Worker // iterator `j` in `[begin(range), i)` and `false` for every iterator `j` in
3404*6777b538SAndroid Build Coastguard Worker // `[i, last)`. Returns: i.
3405*6777b538SAndroid Build Coastguard Worker //
3406*6777b538SAndroid Build Coastguard Worker // Complexity: Let `N = size(range)`:
3407*6777b538SAndroid Build Coastguard Worker // Exactly `N` applications of the predicate and projection. At most `N / 2`
3408*6777b538SAndroid Build Coastguard Worker // swaps if the type of `first` models `bidirectional_iterator`, and at most `N`
3409*6777b538SAndroid Build Coastguard Worker // swaps otherwise.
3410*6777b538SAndroid Build Coastguard Worker //
3411*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.partitions#:~:text=ranges::partition(R
3412*6777b538SAndroid Build Coastguard Worker template <typename Range,
3413*6777b538SAndroid Build Coastguard Worker typename Pred,
3414*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
3415*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
3416*6777b538SAndroid Build Coastguard Worker constexpr auto partition(Range&& range, Pred pred, Proj proj = {}) {
3417*6777b538SAndroid Build Coastguard Worker return ranges::partition(ranges::begin(range), ranges::end(range),
3418*6777b538SAndroid Build Coastguard Worker std::move(pred), std::move(proj));
3419*6777b538SAndroid Build Coastguard Worker }
3420*6777b538SAndroid Build Coastguard Worker
3421*6777b538SAndroid Build Coastguard Worker // Let `E(x)` be `bool(invoke(pred, invoke(proj, x)))`.
3422*6777b538SAndroid Build Coastguard Worker //
3423*6777b538SAndroid Build Coastguard Worker // Effects: Places all the elements `e` in `[first, last)` that satisfy `E(e)`
3424*6777b538SAndroid Build Coastguard Worker // before all the elements that do not. The relative order of the elements in
3425*6777b538SAndroid Build Coastguard Worker // both groups is preserved.
3426*6777b538SAndroid Build Coastguard Worker //
3427*6777b538SAndroid Build Coastguard Worker // Returns: Let `i` be an iterator such that for every iterator `j` in
3428*6777b538SAndroid Build Coastguard Worker // `[first, i)`, `E(*j)` is `true`, and for every iterator `j` in the range
3429*6777b538SAndroid Build Coastguard Worker // `[i, last)`, `E(*j)` is `false`. Returns: `i`.
3430*6777b538SAndroid Build Coastguard Worker //
3431*6777b538SAndroid Build Coastguard Worker // Complexity: Let `N = last - first`:
3432*6777b538SAndroid Build Coastguard Worker // At most `N log N` swaps, but only `O(N)` swaps if there is enough extra
3433*6777b538SAndroid Build Coastguard Worker // memory. Exactly `N` applications of the predicate and projection.
3434*6777b538SAndroid Build Coastguard Worker //
3435*6777b538SAndroid Build Coastguard Worker // Reference:
3436*6777b538SAndroid Build Coastguard Worker // https://wg21.link/alg.partitions#:~:text=ranges::stable_partition(I
3437*6777b538SAndroid Build Coastguard Worker template <typename BidirectionalIterator,
3438*6777b538SAndroid Build Coastguard Worker typename Pred,
3439*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
3440*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<BidirectionalIterator>>
3441*6777b538SAndroid Build Coastguard Worker constexpr auto stable_partition(BidirectionalIterator first,
3442*6777b538SAndroid Build Coastguard Worker BidirectionalIterator last,
3443*6777b538SAndroid Build Coastguard Worker Pred pred,
3444*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
3445*6777b538SAndroid Build Coastguard Worker return std::stable_partition(first, last,
3446*6777b538SAndroid Build Coastguard Worker internal::ProjectedUnaryPredicate(pred, proj));
3447*6777b538SAndroid Build Coastguard Worker }
3448*6777b538SAndroid Build Coastguard Worker
3449*6777b538SAndroid Build Coastguard Worker // Let `E(x)` be `bool(invoke(pred, invoke(proj, x)))`.
3450*6777b538SAndroid Build Coastguard Worker //
3451*6777b538SAndroid Build Coastguard Worker // Effects: Places all the elements `e` in `range` that satisfy `E(e)` before
3452*6777b538SAndroid Build Coastguard Worker // all the elements that do not. The relative order of the elements in both
3453*6777b538SAndroid Build Coastguard Worker // groups is preserved.
3454*6777b538SAndroid Build Coastguard Worker //
3455*6777b538SAndroid Build Coastguard Worker // Returns: Let `i` be an iterator such that for every iterator `j` in
3456*6777b538SAndroid Build Coastguard Worker // `[begin(range), i)`, `E(*j)` is `true`, and for every iterator `j` in the
3457*6777b538SAndroid Build Coastguard Worker // range `[i, end(range))`, `E(*j)` is `false`. Returns: `i`.
3458*6777b538SAndroid Build Coastguard Worker //
3459*6777b538SAndroid Build Coastguard Worker // Complexity: Let `N = size(range)`:
3460*6777b538SAndroid Build Coastguard Worker // At most `N log N` swaps, but only `O(N)` swaps if there is enough extra
3461*6777b538SAndroid Build Coastguard Worker // memory. Exactly `N` applications of the predicate and projection.
3462*6777b538SAndroid Build Coastguard Worker //
3463*6777b538SAndroid Build Coastguard Worker // Reference:
3464*6777b538SAndroid Build Coastguard Worker // https://wg21.link/alg.partitions#:~:text=ranges::stable_partition(R
3465*6777b538SAndroid Build Coastguard Worker template <typename Range,
3466*6777b538SAndroid Build Coastguard Worker typename Pred,
3467*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
3468*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
3469*6777b538SAndroid Build Coastguard Worker constexpr auto stable_partition(Range&& range, Pred pred, Proj proj = {}) {
3470*6777b538SAndroid Build Coastguard Worker return ranges::stable_partition(ranges::begin(range), ranges::end(range),
3471*6777b538SAndroid Build Coastguard Worker std::move(pred), std::move(proj));
3472*6777b538SAndroid Build Coastguard Worker }
3473*6777b538SAndroid Build Coastguard Worker
3474*6777b538SAndroid Build Coastguard Worker // Let `E(x)` be `bool(invoke(pred, invoke(proj, x)))`.
3475*6777b538SAndroid Build Coastguard Worker //
3476*6777b538SAndroid Build Coastguard Worker // Mandates: The expression `*first` is writable to `out_true` and `out_false`.
3477*6777b538SAndroid Build Coastguard Worker //
3478*6777b538SAndroid Build Coastguard Worker // Preconditions: The input range and output ranges do not overlap.
3479*6777b538SAndroid Build Coastguard Worker //
3480*6777b538SAndroid Build Coastguard Worker // Effects: For each iterator `i` in `[first, last)`, copies `*i` to the output
3481*6777b538SAndroid Build Coastguard Worker // range beginning with `out_true` if `E(*i)` is `true`, or to the output range
3482*6777b538SAndroid Build Coastguard Worker // beginning with `out_false` otherwise.
3483*6777b538SAndroid Build Coastguard Worker //
3484*6777b538SAndroid Build Coastguard Worker // Returns: Let `o1` be the end of the output range beginning at `out_true`, and
3485*6777b538SAndroid Build Coastguard Worker // `o2` the end of the output range beginning at `out_false`.
3486*6777b538SAndroid Build Coastguard Worker // Returns `{o1, o2}`.
3487*6777b538SAndroid Build Coastguard Worker //
3488*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `last - first` applications of `pred` and `proj`.
3489*6777b538SAndroid Build Coastguard Worker //
3490*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.partitions#:~:text=ranges::partition_copy(I
3491*6777b538SAndroid Build Coastguard Worker template <typename InputIterator,
3492*6777b538SAndroid Build Coastguard Worker typename OutputIterator1,
3493*6777b538SAndroid Build Coastguard Worker typename OutputIterator2,
3494*6777b538SAndroid Build Coastguard Worker typename Pred,
3495*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
3496*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator>,
3497*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator1>,
3498*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator2>>
3499*6777b538SAndroid Build Coastguard Worker constexpr auto partition_copy(InputIterator first,
3500*6777b538SAndroid Build Coastguard Worker InputIterator last,
3501*6777b538SAndroid Build Coastguard Worker OutputIterator1 out_true,
3502*6777b538SAndroid Build Coastguard Worker OutputIterator2 out_false,
3503*6777b538SAndroid Build Coastguard Worker Pred pred,
3504*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
3505*6777b538SAndroid Build Coastguard Worker return std::partition_copy(first, last, out_true, out_false,
3506*6777b538SAndroid Build Coastguard Worker internal::ProjectedUnaryPredicate(pred, proj));
3507*6777b538SAndroid Build Coastguard Worker }
3508*6777b538SAndroid Build Coastguard Worker
3509*6777b538SAndroid Build Coastguard Worker // Let `E(x)` be `bool(invoke(pred, invoke(proj, x)))`.
3510*6777b538SAndroid Build Coastguard Worker //
3511*6777b538SAndroid Build Coastguard Worker // Mandates: The expression `*begin(range)` is writable to `out_true` and
3512*6777b538SAndroid Build Coastguard Worker // `out_false`.
3513*6777b538SAndroid Build Coastguard Worker //
3514*6777b538SAndroid Build Coastguard Worker // Preconditions: The input range and output ranges do not overlap.
3515*6777b538SAndroid Build Coastguard Worker //
3516*6777b538SAndroid Build Coastguard Worker // Effects: For each iterator `i` in `range`, copies `*i` to the output range
3517*6777b538SAndroid Build Coastguard Worker // beginning with `out_true` if `E(*i)` is `true`, or to the output range
3518*6777b538SAndroid Build Coastguard Worker // beginning with `out_false` otherwise.
3519*6777b538SAndroid Build Coastguard Worker //
3520*6777b538SAndroid Build Coastguard Worker // Returns: Let `o1` be the end of the output range beginning at `out_true`, and
3521*6777b538SAndroid Build Coastguard Worker // `o2` the end of the output range beginning at `out_false`.
3522*6777b538SAndroid Build Coastguard Worker // Returns `{o1, o2}`.
3523*6777b538SAndroid Build Coastguard Worker //
3524*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `size(range)` applications of `pred` and `proj`.
3525*6777b538SAndroid Build Coastguard Worker //
3526*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.partitions#:~:text=ranges::partition_copy(R
3527*6777b538SAndroid Build Coastguard Worker template <typename Range,
3528*6777b538SAndroid Build Coastguard Worker typename OutputIterator1,
3529*6777b538SAndroid Build Coastguard Worker typename OutputIterator2,
3530*6777b538SAndroid Build Coastguard Worker typename Pred,
3531*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
3532*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
3533*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator1>,
3534*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator2>>
3535*6777b538SAndroid Build Coastguard Worker constexpr auto partition_copy(Range&& range,
3536*6777b538SAndroid Build Coastguard Worker OutputIterator1 out_true,
3537*6777b538SAndroid Build Coastguard Worker OutputIterator2 out_false,
3538*6777b538SAndroid Build Coastguard Worker Pred pred,
3539*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
3540*6777b538SAndroid Build Coastguard Worker return ranges::partition_copy(ranges::begin(range), ranges::end(range),
3541*6777b538SAndroid Build Coastguard Worker out_true, out_false, std::move(pred),
3542*6777b538SAndroid Build Coastguard Worker std::move(proj));
3543*6777b538SAndroid Build Coastguard Worker }
3544*6777b538SAndroid Build Coastguard Worker
3545*6777b538SAndroid Build Coastguard Worker // let `E(x)` be `bool(invoke(pred, invoke(proj, x)))`.
3546*6777b538SAndroid Build Coastguard Worker //
3547*6777b538SAndroid Build Coastguard Worker // Preconditions: The elements `e` of `[first, last)` are partitioned with
3548*6777b538SAndroid Build Coastguard Worker // respect to `E(e)`.
3549*6777b538SAndroid Build Coastguard Worker //
3550*6777b538SAndroid Build Coastguard Worker // Returns: An iterator `mid` such that `E(*i)` is `true` for all iterators `i`
3551*6777b538SAndroid Build Coastguard Worker // in `[first, mid)`, and `false` for all iterators `i` in `[mid, last)`.
3552*6777b538SAndroid Build Coastguard Worker //
3553*6777b538SAndroid Build Coastguard Worker // Complexity: `O(log(last - first))` applications of `pred` and `proj`.
3554*6777b538SAndroid Build Coastguard Worker //
3555*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.partitions#:~:text=ranges::partition_point(I
3556*6777b538SAndroid Build Coastguard Worker template <typename ForwardIterator,
3557*6777b538SAndroid Build Coastguard Worker typename Pred,
3558*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
3559*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator>>
3560*6777b538SAndroid Build Coastguard Worker constexpr auto partition_point(ForwardIterator first,
3561*6777b538SAndroid Build Coastguard Worker ForwardIterator last,
3562*6777b538SAndroid Build Coastguard Worker Pred pred,
3563*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
3564*6777b538SAndroid Build Coastguard Worker return std::partition_point(first, last,
3565*6777b538SAndroid Build Coastguard Worker internal::ProjectedUnaryPredicate(pred, proj));
3566*6777b538SAndroid Build Coastguard Worker }
3567*6777b538SAndroid Build Coastguard Worker
3568*6777b538SAndroid Build Coastguard Worker // let `E(x)` be `bool(invoke(pred, invoke(proj, x)))`.
3569*6777b538SAndroid Build Coastguard Worker //
3570*6777b538SAndroid Build Coastguard Worker // Preconditions: The elements `e` of `range` are partitioned with respect to
3571*6777b538SAndroid Build Coastguard Worker // `E(e)`.
3572*6777b538SAndroid Build Coastguard Worker //
3573*6777b538SAndroid Build Coastguard Worker // Returns: An iterator `mid` such that `E(*i)` is `true` for all iterators `i`
3574*6777b538SAndroid Build Coastguard Worker // in `[begin(range), mid)`, and `false` for all iterators `i` in
3575*6777b538SAndroid Build Coastguard Worker // `[mid, end(range))`.
3576*6777b538SAndroid Build Coastguard Worker //
3577*6777b538SAndroid Build Coastguard Worker // Complexity: `O(log(size(range)))` applications of `pred` and `proj`.
3578*6777b538SAndroid Build Coastguard Worker //
3579*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.partitions#:~:text=ranges::partition_point(R
3580*6777b538SAndroid Build Coastguard Worker template <typename Range,
3581*6777b538SAndroid Build Coastguard Worker typename Pred,
3582*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
3583*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
3584*6777b538SAndroid Build Coastguard Worker constexpr auto partition_point(Range&& range, Pred pred, Proj proj = {}) {
3585*6777b538SAndroid Build Coastguard Worker return ranges::partition_point(ranges::begin(range), ranges::end(range),
3586*6777b538SAndroid Build Coastguard Worker std::move(pred), std::move(proj));
3587*6777b538SAndroid Build Coastguard Worker }
3588*6777b538SAndroid Build Coastguard Worker
3589*6777b538SAndroid Build Coastguard Worker // [alg.merge] Merge
3590*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.merge
3591*6777b538SAndroid Build Coastguard Worker
3592*6777b538SAndroid Build Coastguard Worker // Let `N` be `(last1 - first1) + (last2 - first2)`.
3593*6777b538SAndroid Build Coastguard Worker //
3594*6777b538SAndroid Build Coastguard Worker // Preconditions: The ranges `[first1, last1)` and `[first2, last2)` are sorted
3595*6777b538SAndroid Build Coastguard Worker // with respect to `comp` and `proj1` or `proj2`, respectively. The resulting
3596*6777b538SAndroid Build Coastguard Worker // range does not overlap with either of the original ranges.
3597*6777b538SAndroid Build Coastguard Worker //
3598*6777b538SAndroid Build Coastguard Worker // Effects: Copies all the elements of the two ranges `[first1, last1)` and
3599*6777b538SAndroid Build Coastguard Worker // `[first2, last2)` into the range `[result, result_last)`, where `result_last`
3600*6777b538SAndroid Build Coastguard Worker // is `result + N`. If an element `a` precedes `b` in an input range, `a` is
3601*6777b538SAndroid Build Coastguard Worker // copied into the output range before `b`. If `e1` is an element of
3602*6777b538SAndroid Build Coastguard Worker // `[first1, last1)` and `e2` of `[first2, last2)`, `e2` is copied into the
3603*6777b538SAndroid Build Coastguard Worker // output range before `e1` if and only if
3604*6777b538SAndroid Build Coastguard Worker // `bool(invoke(comp, invoke(proj2, e2), invoke(proj1, e1)))` is `true`.
3605*6777b538SAndroid Build Coastguard Worker //
3606*6777b538SAndroid Build Coastguard Worker // Returns: `result_last`.
3607*6777b538SAndroid Build Coastguard Worker //
3608*6777b538SAndroid Build Coastguard Worker // Complexity: At most `N - 1` comparisons and applications of each projection.
3609*6777b538SAndroid Build Coastguard Worker //
3610*6777b538SAndroid Build Coastguard Worker // Remarks: Stable.
3611*6777b538SAndroid Build Coastguard Worker //
3612*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.merge#:~:text=ranges::merge(I1
3613*6777b538SAndroid Build Coastguard Worker template <
3614*6777b538SAndroid Build Coastguard Worker typename InputIterator1,
3615*6777b538SAndroid Build Coastguard Worker typename InputIterator2,
3616*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
3617*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
3618*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
3619*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
3620*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator1>,
3621*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator2>,
3622*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>,
3623*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
3624*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator1, Proj1>,
3625*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator2, Proj2>>,
3626*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
3627*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator2, Proj2>,
3628*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator1, Proj1>>>
3629*6777b538SAndroid Build Coastguard Worker constexpr auto merge(InputIterator1 first1,
3630*6777b538SAndroid Build Coastguard Worker InputIterator1 last1,
3631*6777b538SAndroid Build Coastguard Worker InputIterator2 first2,
3632*6777b538SAndroid Build Coastguard Worker InputIterator2 last2,
3633*6777b538SAndroid Build Coastguard Worker OutputIterator result,
3634*6777b538SAndroid Build Coastguard Worker Comp comp = {},
3635*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
3636*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
3637*6777b538SAndroid Build Coastguard Worker // Needs to opt-in to all permutations, since std::merge expects
3638*6777b538SAndroid Build Coastguard Worker // comp(proj2(lhs), proj1(rhs)) to compile.
3639*6777b538SAndroid Build Coastguard Worker return std::merge(
3640*6777b538SAndroid Build Coastguard Worker first1, last1, first2, last2, result,
3641*6777b538SAndroid Build Coastguard Worker internal::PermutedProjectedBinaryPredicate(comp, proj1, proj2));
3642*6777b538SAndroid Build Coastguard Worker }
3643*6777b538SAndroid Build Coastguard Worker
3644*6777b538SAndroid Build Coastguard Worker // Let `N` be `size(range1) + size(range2)`.
3645*6777b538SAndroid Build Coastguard Worker //
3646*6777b538SAndroid Build Coastguard Worker // Preconditions: The ranges `range1` and `range2` are sorted with respect to
3647*6777b538SAndroid Build Coastguard Worker // `comp` and `proj1` or `proj2`, respectively. The resulting range does not
3648*6777b538SAndroid Build Coastguard Worker // overlap with either of the original ranges.
3649*6777b538SAndroid Build Coastguard Worker //
3650*6777b538SAndroid Build Coastguard Worker // Effects: Copies all the elements of the two ranges `range1` and `range2` into
3651*6777b538SAndroid Build Coastguard Worker // the range `[result, result_last)`, where `result_last` is `result + N`. If an
3652*6777b538SAndroid Build Coastguard Worker // element `a` precedes `b` in an input range, `a` is copied into the output
3653*6777b538SAndroid Build Coastguard Worker // range before `b`. If `e1` is an element of `range1` and `e2` of `range2`,
3654*6777b538SAndroid Build Coastguard Worker // `e2` is copied into the output range before `e1` if and only if
3655*6777b538SAndroid Build Coastguard Worker // `bool(invoke(comp, invoke(proj2, e2), invoke(proj1, e1)))` is `true`.
3656*6777b538SAndroid Build Coastguard Worker //
3657*6777b538SAndroid Build Coastguard Worker // Returns: `result_last`.
3658*6777b538SAndroid Build Coastguard Worker //
3659*6777b538SAndroid Build Coastguard Worker // Complexity: At most `N - 1` comparisons and applications of each projection.
3660*6777b538SAndroid Build Coastguard Worker //
3661*6777b538SAndroid Build Coastguard Worker // Remarks: Stable.
3662*6777b538SAndroid Build Coastguard Worker //
3663*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.merge#:~:text=ranges::merge(R1
3664*6777b538SAndroid Build Coastguard Worker template <typename Range1,
3665*6777b538SAndroid Build Coastguard Worker typename Range2,
3666*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
3667*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
3668*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
3669*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
3670*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range1>,
3671*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range2>,
3672*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>,
3673*6777b538SAndroid Build Coastguard Worker typename =
3674*6777b538SAndroid Build Coastguard Worker std::indirect_result_t<Comp&,
3675*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range1>, Proj1>,
3676*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range2>, Proj2>>,
3677*6777b538SAndroid Build Coastguard Worker typename =
3678*6777b538SAndroid Build Coastguard Worker std::indirect_result_t<Comp&,
3679*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range2>, Proj2>,
3680*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range1>, Proj1>>>
3681*6777b538SAndroid Build Coastguard Worker constexpr auto merge(Range1&& range1,
3682*6777b538SAndroid Build Coastguard Worker Range2&& range2,
3683*6777b538SAndroid Build Coastguard Worker OutputIterator result,
3684*6777b538SAndroid Build Coastguard Worker Comp comp = {},
3685*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
3686*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
3687*6777b538SAndroid Build Coastguard Worker return ranges::merge(ranges::begin(range1), ranges::end(range1),
3688*6777b538SAndroid Build Coastguard Worker ranges::begin(range2), ranges::end(range2), result,
3689*6777b538SAndroid Build Coastguard Worker std::move(comp), std::move(proj1), std::move(proj2));
3690*6777b538SAndroid Build Coastguard Worker }
3691*6777b538SAndroid Build Coastguard Worker
3692*6777b538SAndroid Build Coastguard Worker // Preconditions: `[first, middle)` and `[middle, last)` are valid ranges sorted
3693*6777b538SAndroid Build Coastguard Worker // with respect to `comp` and `proj`.
3694*6777b538SAndroid Build Coastguard Worker //
3695*6777b538SAndroid Build Coastguard Worker // Effects: Merges two sorted consecutive ranges `[first, middle)` and
3696*6777b538SAndroid Build Coastguard Worker // `[middle, last)`, putting the result of the merge into the range
3697*6777b538SAndroid Build Coastguard Worker // `[first, last)`. The resulting range is sorted with respect to `comp` and
3698*6777b538SAndroid Build Coastguard Worker // `proj`.
3699*6777b538SAndroid Build Coastguard Worker //
3700*6777b538SAndroid Build Coastguard Worker // Returns: `last`.
3701*6777b538SAndroid Build Coastguard Worker //
3702*6777b538SAndroid Build Coastguard Worker // Complexity: Let `N = last - first`: If enough additional memory is available,
3703*6777b538SAndroid Build Coastguard Worker // exactly `N - 1` comparisons. Otherwise, `O(N log N)` comparisons. In either
3704*6777b538SAndroid Build Coastguard Worker // case, twice as many projections as comparisons.
3705*6777b538SAndroid Build Coastguard Worker //
3706*6777b538SAndroid Build Coastguard Worker // Remarks: Stable.
3707*6777b538SAndroid Build Coastguard Worker //
3708*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.merge#:~:text=ranges::inplace_merge(I
3709*6777b538SAndroid Build Coastguard Worker template <typename BidirectionalIterator,
3710*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
3711*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
3712*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<BidirectionalIterator>>
3713*6777b538SAndroid Build Coastguard Worker constexpr auto inplace_merge(BidirectionalIterator first,
3714*6777b538SAndroid Build Coastguard Worker BidirectionalIterator middle,
3715*6777b538SAndroid Build Coastguard Worker BidirectionalIterator last,
3716*6777b538SAndroid Build Coastguard Worker Comp comp = {},
3717*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
3718*6777b538SAndroid Build Coastguard Worker std::inplace_merge(first, middle, last,
3719*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(comp, proj, proj));
3720*6777b538SAndroid Build Coastguard Worker return last;
3721*6777b538SAndroid Build Coastguard Worker }
3722*6777b538SAndroid Build Coastguard Worker
3723*6777b538SAndroid Build Coastguard Worker // Preconditions: `[begin(range), middle)` and `[middle, end(range))` are valid
3724*6777b538SAndroid Build Coastguard Worker // ranges sorted with respect to `comp` and `proj`.
3725*6777b538SAndroid Build Coastguard Worker //
3726*6777b538SAndroid Build Coastguard Worker // Effects: Merges two sorted consecutive ranges `[begin(range), middle)` and
3727*6777b538SAndroid Build Coastguard Worker // `[middle, end(range))`, putting the result of the merge into `range`. The
3728*6777b538SAndroid Build Coastguard Worker // resulting range is sorted with respect to `comp` and `proj`.
3729*6777b538SAndroid Build Coastguard Worker //
3730*6777b538SAndroid Build Coastguard Worker // Returns: `end(range)`.
3731*6777b538SAndroid Build Coastguard Worker //
3732*6777b538SAndroid Build Coastguard Worker // Complexity: Let `N = size(range)`: If enough additional memory is available,
3733*6777b538SAndroid Build Coastguard Worker // exactly `N - 1` comparisons. Otherwise, `O(N log N)` comparisons. In either
3734*6777b538SAndroid Build Coastguard Worker // case, twice as many projections as comparisons.
3735*6777b538SAndroid Build Coastguard Worker //
3736*6777b538SAndroid Build Coastguard Worker // Remarks: Stable.
3737*6777b538SAndroid Build Coastguard Worker //
3738*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.merge#:~:text=ranges::inplace_merge(R
3739*6777b538SAndroid Build Coastguard Worker template <typename Range,
3740*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
3741*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
3742*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
3743*6777b538SAndroid Build Coastguard Worker constexpr auto inplace_merge(Range&& range,
3744*6777b538SAndroid Build Coastguard Worker iterator_t<Range> middle,
3745*6777b538SAndroid Build Coastguard Worker Comp comp = {},
3746*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
3747*6777b538SAndroid Build Coastguard Worker return ranges::inplace_merge(ranges::begin(range), middle, ranges::end(range),
3748*6777b538SAndroid Build Coastguard Worker std::move(comp), std::move(proj));
3749*6777b538SAndroid Build Coastguard Worker }
3750*6777b538SAndroid Build Coastguard Worker
3751*6777b538SAndroid Build Coastguard Worker // [alg.set.operations] Set operations on sorted structures
3752*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.set.operations
3753*6777b538SAndroid Build Coastguard Worker
3754*6777b538SAndroid Build Coastguard Worker // [includes] includes
3755*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/includes
3756*6777b538SAndroid Build Coastguard Worker
3757*6777b538SAndroid Build Coastguard Worker // Preconditions: The ranges `[first1, last1)` and `[first2, last2)` are sorted
3758*6777b538SAndroid Build Coastguard Worker // with respect to `comp` and `proj1` or `proj2`, respectively.
3759*6777b538SAndroid Build Coastguard Worker //
3760*6777b538SAndroid Build Coastguard Worker // Returns: `true` if and only if `[first2, last2)` is a subsequence of
3761*6777b538SAndroid Build Coastguard Worker // `[first1, last1)`.
3762*6777b538SAndroid Build Coastguard Worker //
3763*6777b538SAndroid Build Coastguard Worker // Complexity: At most `2 * ((last1 - first1) + (last2 - first2)) - 1`
3764*6777b538SAndroid Build Coastguard Worker // comparisons and applications of each projection.
3765*6777b538SAndroid Build Coastguard Worker //
3766*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/includes#:~:text=ranges::includes(I1
3767*6777b538SAndroid Build Coastguard Worker template <
3768*6777b538SAndroid Build Coastguard Worker typename InputIterator1,
3769*6777b538SAndroid Build Coastguard Worker typename InputIterator2,
3770*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
3771*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
3772*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
3773*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator1>,
3774*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator2>,
3775*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
3776*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator1, Proj1>,
3777*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator2, Proj2>>,
3778*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
3779*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator2, Proj2>,
3780*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator1, Proj1>>>
3781*6777b538SAndroid Build Coastguard Worker constexpr auto includes(InputIterator1 first1,
3782*6777b538SAndroid Build Coastguard Worker InputIterator1 last1,
3783*6777b538SAndroid Build Coastguard Worker InputIterator2 first2,
3784*6777b538SAndroid Build Coastguard Worker InputIterator2 last2,
3785*6777b538SAndroid Build Coastguard Worker Comp comp = {},
3786*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
3787*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
3788*6777b538SAndroid Build Coastguard Worker DCHECK(ranges::is_sorted(first1, last1, comp, proj1));
3789*6777b538SAndroid Build Coastguard Worker DCHECK(ranges::is_sorted(first2, last2, comp, proj2));
3790*6777b538SAndroid Build Coastguard Worker // Needs to opt-in to all permutations, since std::includes expects
3791*6777b538SAndroid Build Coastguard Worker // comp(proj1(lhs), proj2(rhs)) and comp(proj2(lhs), proj1(rhs)) to compile.
3792*6777b538SAndroid Build Coastguard Worker return std::includes(
3793*6777b538SAndroid Build Coastguard Worker first1, last1, first2, last2,
3794*6777b538SAndroid Build Coastguard Worker internal::PermutedProjectedBinaryPredicate(comp, proj1, proj2));
3795*6777b538SAndroid Build Coastguard Worker }
3796*6777b538SAndroid Build Coastguard Worker
3797*6777b538SAndroid Build Coastguard Worker // Preconditions: The ranges `range1` and `range2` are sorted with respect to
3798*6777b538SAndroid Build Coastguard Worker // `comp` and `proj1` or `proj2`, respectively.
3799*6777b538SAndroid Build Coastguard Worker //
3800*6777b538SAndroid Build Coastguard Worker // Returns: `true` if and only if `range2` is a subsequence of `range1`.
3801*6777b538SAndroid Build Coastguard Worker //
3802*6777b538SAndroid Build Coastguard Worker // Complexity: At most `2 * (size(range1) + size(range2)) - 1` comparisons and
3803*6777b538SAndroid Build Coastguard Worker // applications of each projection.
3804*6777b538SAndroid Build Coastguard Worker //
3805*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/includes#:~:text=ranges::includes(R1
3806*6777b538SAndroid Build Coastguard Worker template <typename Range1,
3807*6777b538SAndroid Build Coastguard Worker typename Range2,
3808*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
3809*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
3810*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
3811*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range1>,
3812*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range2>,
3813*6777b538SAndroid Build Coastguard Worker typename =
3814*6777b538SAndroid Build Coastguard Worker std::indirect_result_t<Comp&,
3815*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range1>, Proj1>,
3816*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range2>, Proj2>>,
3817*6777b538SAndroid Build Coastguard Worker typename =
3818*6777b538SAndroid Build Coastguard Worker std::indirect_result_t<Comp&,
3819*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range2>, Proj2>,
3820*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range1>, Proj1>>>
3821*6777b538SAndroid Build Coastguard Worker constexpr auto includes(Range1&& range1,
3822*6777b538SAndroid Build Coastguard Worker Range2&& range2,
3823*6777b538SAndroid Build Coastguard Worker Comp comp = {},
3824*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
3825*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
3826*6777b538SAndroid Build Coastguard Worker return ranges::includes(ranges::begin(range1), ranges::end(range1),
3827*6777b538SAndroid Build Coastguard Worker ranges::begin(range2), ranges::end(range2),
3828*6777b538SAndroid Build Coastguard Worker std::move(comp), std::move(proj1), std::move(proj2));
3829*6777b538SAndroid Build Coastguard Worker }
3830*6777b538SAndroid Build Coastguard Worker
3831*6777b538SAndroid Build Coastguard Worker // [set.union] set_union
3832*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/set.union
3833*6777b538SAndroid Build Coastguard Worker
3834*6777b538SAndroid Build Coastguard Worker // Preconditions: The ranges `[first1, last1)` and `[first2, last2)` are sorted
3835*6777b538SAndroid Build Coastguard Worker // with respect to `comp` and `proj1` or `proj2`, respectively. The resulting
3836*6777b538SAndroid Build Coastguard Worker // range does not overlap with either of the original ranges.
3837*6777b538SAndroid Build Coastguard Worker //
3838*6777b538SAndroid Build Coastguard Worker // Effects: Constructs a sorted union of the elements from the two ranges; that
3839*6777b538SAndroid Build Coastguard Worker // is, the set of elements that are present in one or both of the ranges.
3840*6777b538SAndroid Build Coastguard Worker //
3841*6777b538SAndroid Build Coastguard Worker // Returns: The end of the constructed range.
3842*6777b538SAndroid Build Coastguard Worker //
3843*6777b538SAndroid Build Coastguard Worker // Complexity: At most `2 * ((last1 - first1) + (last2 - first2)) - 1`
3844*6777b538SAndroid Build Coastguard Worker // comparisons and applications of each projection.
3845*6777b538SAndroid Build Coastguard Worker //
3846*6777b538SAndroid Build Coastguard Worker // Remarks: Stable. If `[first1, last1)` contains `m` elements that are
3847*6777b538SAndroid Build Coastguard Worker // equivalent to each other and `[first2, last2)` contains `n` elements that are
3848*6777b538SAndroid Build Coastguard Worker // equivalent to them, then all `m` elements from the first range are copied to
3849*6777b538SAndroid Build Coastguard Worker // the output range, in order, and then the final `max(n - m , 0)` elements from
3850*6777b538SAndroid Build Coastguard Worker // the second range are copied to the output range, in order.
3851*6777b538SAndroid Build Coastguard Worker //
3852*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/set.union#:~:text=ranges::set_union(I1
3853*6777b538SAndroid Build Coastguard Worker template <
3854*6777b538SAndroid Build Coastguard Worker typename InputIterator1,
3855*6777b538SAndroid Build Coastguard Worker typename InputIterator2,
3856*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
3857*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
3858*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
3859*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
3860*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator1>,
3861*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator2>,
3862*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>,
3863*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
3864*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator1, Proj1>,
3865*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator2, Proj2>>,
3866*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
3867*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator2, Proj2>,
3868*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator1, Proj1>>>
3869*6777b538SAndroid Build Coastguard Worker constexpr auto set_union(InputIterator1 first1,
3870*6777b538SAndroid Build Coastguard Worker InputIterator1 last1,
3871*6777b538SAndroid Build Coastguard Worker InputIterator2 first2,
3872*6777b538SAndroid Build Coastguard Worker InputIterator2 last2,
3873*6777b538SAndroid Build Coastguard Worker OutputIterator result,
3874*6777b538SAndroid Build Coastguard Worker Comp comp = {},
3875*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
3876*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
3877*6777b538SAndroid Build Coastguard Worker // Needs to opt-in to all permutations, since std::set_union expects
3878*6777b538SAndroid Build Coastguard Worker // comp(proj1(lhs), proj2(rhs)) and comp(proj2(lhs), proj1(rhs)) to compile.
3879*6777b538SAndroid Build Coastguard Worker return std::set_union(
3880*6777b538SAndroid Build Coastguard Worker first1, last1, first2, last2, result,
3881*6777b538SAndroid Build Coastguard Worker internal::PermutedProjectedBinaryPredicate(comp, proj1, proj2));
3882*6777b538SAndroid Build Coastguard Worker }
3883*6777b538SAndroid Build Coastguard Worker
3884*6777b538SAndroid Build Coastguard Worker // Preconditions: The ranges `range1` and `range2` are sorted with respect to
3885*6777b538SAndroid Build Coastguard Worker // `comp` and `proj1` or `proj2`, respectively. The resulting range does not
3886*6777b538SAndroid Build Coastguard Worker // overlap with either of the original ranges.
3887*6777b538SAndroid Build Coastguard Worker //
3888*6777b538SAndroid Build Coastguard Worker // Effects: Constructs a sorted union of the elements from the two ranges; that
3889*6777b538SAndroid Build Coastguard Worker // is, the set of elements that are present in one or both of the ranges.
3890*6777b538SAndroid Build Coastguard Worker //
3891*6777b538SAndroid Build Coastguard Worker // Returns: The end of the constructed range.
3892*6777b538SAndroid Build Coastguard Worker //
3893*6777b538SAndroid Build Coastguard Worker // Complexity: At most `2 * (size(range1) + size(range2)) - 1` comparisons and
3894*6777b538SAndroid Build Coastguard Worker // applications of each projection.
3895*6777b538SAndroid Build Coastguard Worker //
3896*6777b538SAndroid Build Coastguard Worker // Remarks: Stable. If `range1` contains `m` elements that are equivalent to
3897*6777b538SAndroid Build Coastguard Worker // each other and `range2` contains `n` elements that are equivalent to them,
3898*6777b538SAndroid Build Coastguard Worker // then all `m` elements from the first range are copied to the output range, in
3899*6777b538SAndroid Build Coastguard Worker // order, and then the final `max(n - m , 0)` elements from the second range are
3900*6777b538SAndroid Build Coastguard Worker // copied to the output range, in order.
3901*6777b538SAndroid Build Coastguard Worker //
3902*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/set.union#:~:text=ranges::set_union(R1
3903*6777b538SAndroid Build Coastguard Worker template <typename Range1,
3904*6777b538SAndroid Build Coastguard Worker typename Range2,
3905*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
3906*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
3907*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
3908*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
3909*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range1>,
3910*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range2>,
3911*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>,
3912*6777b538SAndroid Build Coastguard Worker typename =
3913*6777b538SAndroid Build Coastguard Worker std::indirect_result_t<Comp&,
3914*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range1>, Proj1>,
3915*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range2>, Proj2>>,
3916*6777b538SAndroid Build Coastguard Worker typename =
3917*6777b538SAndroid Build Coastguard Worker std::indirect_result_t<Comp&,
3918*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range2>, Proj2>,
3919*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range1>, Proj1>>>
3920*6777b538SAndroid Build Coastguard Worker constexpr auto set_union(Range1&& range1,
3921*6777b538SAndroid Build Coastguard Worker Range2&& range2,
3922*6777b538SAndroid Build Coastguard Worker OutputIterator result,
3923*6777b538SAndroid Build Coastguard Worker Comp comp = {},
3924*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
3925*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
3926*6777b538SAndroid Build Coastguard Worker return ranges::set_union(ranges::begin(range1), ranges::end(range1),
3927*6777b538SAndroid Build Coastguard Worker ranges::begin(range2), ranges::end(range2), result,
3928*6777b538SAndroid Build Coastguard Worker std::move(comp), std::move(proj1), std::move(proj2));
3929*6777b538SAndroid Build Coastguard Worker }
3930*6777b538SAndroid Build Coastguard Worker
3931*6777b538SAndroid Build Coastguard Worker // [set.intersection] set_intersection
3932*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/set.intersection
3933*6777b538SAndroid Build Coastguard Worker
3934*6777b538SAndroid Build Coastguard Worker // Preconditions: The ranges `[first1, last1)` and `[first2, last2)` are sorted
3935*6777b538SAndroid Build Coastguard Worker // with respect to `comp` and `proj1` or `proj2`, respectively. The resulting
3936*6777b538SAndroid Build Coastguard Worker // range does not overlap with either of the original ranges.
3937*6777b538SAndroid Build Coastguard Worker //
3938*6777b538SAndroid Build Coastguard Worker // Effects: Constructs a sorted intersection of the elements from the two
3939*6777b538SAndroid Build Coastguard Worker // ranges; that is, the set of elements that are present in both of the ranges.
3940*6777b538SAndroid Build Coastguard Worker //
3941*6777b538SAndroid Build Coastguard Worker // Returns: The end of the constructed range.
3942*6777b538SAndroid Build Coastguard Worker //
3943*6777b538SAndroid Build Coastguard Worker // Complexity: At most `2 * ((last1 - first1) + (last2 - first2)) - 1`
3944*6777b538SAndroid Build Coastguard Worker // comparisons and applications of each projection.
3945*6777b538SAndroid Build Coastguard Worker //
3946*6777b538SAndroid Build Coastguard Worker // Remarks: Stable. If `[first1, last1)` contains `m` elements that are
3947*6777b538SAndroid Build Coastguard Worker // equivalent to each other and `[first2, last2)` contains `n` elements that are
3948*6777b538SAndroid Build Coastguard Worker // equivalent to them, the first `min(m, n)` elements are copied from the first
3949*6777b538SAndroid Build Coastguard Worker // range to the output range, in order.
3950*6777b538SAndroid Build Coastguard Worker //
3951*6777b538SAndroid Build Coastguard Worker // Reference:
3952*6777b538SAndroid Build Coastguard Worker // https://wg21.link/set.intersection#:~:text=ranges::set_intersection(I1
3953*6777b538SAndroid Build Coastguard Worker template <
3954*6777b538SAndroid Build Coastguard Worker typename InputIterator1,
3955*6777b538SAndroid Build Coastguard Worker typename InputIterator2,
3956*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
3957*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
3958*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
3959*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
3960*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator1>,
3961*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator2>,
3962*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>,
3963*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
3964*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator1, Proj1>,
3965*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator2, Proj2>>,
3966*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
3967*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator2, Proj2>,
3968*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator1, Proj1>>>
3969*6777b538SAndroid Build Coastguard Worker constexpr auto set_intersection(InputIterator1 first1,
3970*6777b538SAndroid Build Coastguard Worker InputIterator1 last1,
3971*6777b538SAndroid Build Coastguard Worker InputIterator2 first2,
3972*6777b538SAndroid Build Coastguard Worker InputIterator2 last2,
3973*6777b538SAndroid Build Coastguard Worker OutputIterator result,
3974*6777b538SAndroid Build Coastguard Worker Comp comp = {},
3975*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
3976*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
3977*6777b538SAndroid Build Coastguard Worker // Needs to opt-in to all permutations, since std::set_intersection expects
3978*6777b538SAndroid Build Coastguard Worker // comp(proj1(lhs), proj2(rhs)) and comp(proj2(lhs), proj1(rhs)) to compile.
3979*6777b538SAndroid Build Coastguard Worker return std::set_intersection(
3980*6777b538SAndroid Build Coastguard Worker first1, last1, first2, last2, result,
3981*6777b538SAndroid Build Coastguard Worker internal::PermutedProjectedBinaryPredicate(comp, proj1, proj2));
3982*6777b538SAndroid Build Coastguard Worker }
3983*6777b538SAndroid Build Coastguard Worker
3984*6777b538SAndroid Build Coastguard Worker // Preconditions: The ranges `range1` and `range2` are sorted with respect to
3985*6777b538SAndroid Build Coastguard Worker // `comp` and `proj1` or `proj2`, respectively. The resulting range does not
3986*6777b538SAndroid Build Coastguard Worker // overlap with either of the original ranges.
3987*6777b538SAndroid Build Coastguard Worker //
3988*6777b538SAndroid Build Coastguard Worker // Effects: Constructs a sorted intersection of the elements from the two
3989*6777b538SAndroid Build Coastguard Worker // ranges; that is, the set of elements that are present in both of the ranges.
3990*6777b538SAndroid Build Coastguard Worker //
3991*6777b538SAndroid Build Coastguard Worker // Returns: The end of the constructed range.
3992*6777b538SAndroid Build Coastguard Worker //
3993*6777b538SAndroid Build Coastguard Worker // Complexity: At most `2 * (size(range1) + size(range2)) - 1` comparisons and
3994*6777b538SAndroid Build Coastguard Worker // applications of each projection.
3995*6777b538SAndroid Build Coastguard Worker //
3996*6777b538SAndroid Build Coastguard Worker // Remarks: Stable. If `range1` contains `m` elements that are equivalent to
3997*6777b538SAndroid Build Coastguard Worker // each other and `range2` contains `n` elements that are equivalent to them,
3998*6777b538SAndroid Build Coastguard Worker // the first `min(m, n)` elements are copied from the first range to the output
3999*6777b538SAndroid Build Coastguard Worker // range, in order.
4000*6777b538SAndroid Build Coastguard Worker //
4001*6777b538SAndroid Build Coastguard Worker // Reference:
4002*6777b538SAndroid Build Coastguard Worker // https://wg21.link/set.intersection#:~:text=ranges::set_intersection(R1
4003*6777b538SAndroid Build Coastguard Worker template <typename Range1,
4004*6777b538SAndroid Build Coastguard Worker typename Range2,
4005*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
4006*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4007*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
4008*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
4009*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range1>,
4010*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range2>,
4011*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>,
4012*6777b538SAndroid Build Coastguard Worker typename =
4013*6777b538SAndroid Build Coastguard Worker std::indirect_result_t<Comp&,
4014*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range1>, Proj1>,
4015*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range2>, Proj2>>,
4016*6777b538SAndroid Build Coastguard Worker typename =
4017*6777b538SAndroid Build Coastguard Worker std::indirect_result_t<Comp&,
4018*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range2>, Proj2>,
4019*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range1>, Proj1>>>
4020*6777b538SAndroid Build Coastguard Worker constexpr auto set_intersection(Range1&& range1,
4021*6777b538SAndroid Build Coastguard Worker Range2&& range2,
4022*6777b538SAndroid Build Coastguard Worker OutputIterator result,
4023*6777b538SAndroid Build Coastguard Worker Comp comp = {},
4024*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
4025*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
4026*6777b538SAndroid Build Coastguard Worker return ranges::set_intersection(ranges::begin(range1), ranges::end(range1),
4027*6777b538SAndroid Build Coastguard Worker ranges::begin(range2), ranges::end(range2),
4028*6777b538SAndroid Build Coastguard Worker result, std::move(comp), std::move(proj1),
4029*6777b538SAndroid Build Coastguard Worker std::move(proj2));
4030*6777b538SAndroid Build Coastguard Worker }
4031*6777b538SAndroid Build Coastguard Worker
4032*6777b538SAndroid Build Coastguard Worker // [set.difference] set_difference
4033*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/set.difference
4034*6777b538SAndroid Build Coastguard Worker
4035*6777b538SAndroid Build Coastguard Worker // Preconditions: The ranges `[first1, last1)` and `[first2, last2)` are sorted
4036*6777b538SAndroid Build Coastguard Worker // with respect to `comp` and `proj1` or `proj2`, respectively. The resulting
4037*6777b538SAndroid Build Coastguard Worker // range does not overlap with either of the original ranges.
4038*6777b538SAndroid Build Coastguard Worker //
4039*6777b538SAndroid Build Coastguard Worker // Effects: Copies the elements of the range `[first1, last1)` which are not
4040*6777b538SAndroid Build Coastguard Worker // present in the range `[first2, last2)` to the range beginning at `result`.
4041*6777b538SAndroid Build Coastguard Worker // The elements in the constructed range are sorted.
4042*6777b538SAndroid Build Coastguard Worker //
4043*6777b538SAndroid Build Coastguard Worker // Returns: The end of the constructed range.
4044*6777b538SAndroid Build Coastguard Worker //
4045*6777b538SAndroid Build Coastguard Worker // Complexity: At most `2 * ((last1 - first1) + (last2 - first2)) - 1`
4046*6777b538SAndroid Build Coastguard Worker // comparisons and applications of each projection.
4047*6777b538SAndroid Build Coastguard Worker //
4048*6777b538SAndroid Build Coastguard Worker // Remarks: If `[first1, last1)` contains `m` elements that are equivalent to
4049*6777b538SAndroid Build Coastguard Worker // each other and `[first2, last2)` contains `n` elements that are equivalent to
4050*6777b538SAndroid Build Coastguard Worker // them, the last `max(m - n, 0)` elements from `[first1, last1)` are copied to
4051*6777b538SAndroid Build Coastguard Worker // the output range, in order.
4052*6777b538SAndroid Build Coastguard Worker //
4053*6777b538SAndroid Build Coastguard Worker // Reference:
4054*6777b538SAndroid Build Coastguard Worker // https://wg21.link/set.difference#:~:text=ranges::set_difference(I1
4055*6777b538SAndroid Build Coastguard Worker template <
4056*6777b538SAndroid Build Coastguard Worker typename InputIterator1,
4057*6777b538SAndroid Build Coastguard Worker typename InputIterator2,
4058*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
4059*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4060*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
4061*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
4062*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator1>,
4063*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator2>,
4064*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>,
4065*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
4066*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator1, Proj1>,
4067*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator2, Proj2>>,
4068*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
4069*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator2, Proj2>,
4070*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator1, Proj1>>>
4071*6777b538SAndroid Build Coastguard Worker constexpr auto set_difference(InputIterator1 first1,
4072*6777b538SAndroid Build Coastguard Worker InputIterator1 last1,
4073*6777b538SAndroid Build Coastguard Worker InputIterator2 first2,
4074*6777b538SAndroid Build Coastguard Worker InputIterator2 last2,
4075*6777b538SAndroid Build Coastguard Worker OutputIterator result,
4076*6777b538SAndroid Build Coastguard Worker Comp comp = {},
4077*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
4078*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
4079*6777b538SAndroid Build Coastguard Worker // Needs to opt-in to all permutations, since std::set_difference expects
4080*6777b538SAndroid Build Coastguard Worker // comp(proj1(lhs), proj2(rhs)) and comp(proj2(lhs), proj1(rhs)) to compile.
4081*6777b538SAndroid Build Coastguard Worker return std::set_difference(
4082*6777b538SAndroid Build Coastguard Worker first1, last1, first2, last2, result,
4083*6777b538SAndroid Build Coastguard Worker internal::PermutedProjectedBinaryPredicate(comp, proj1, proj2));
4084*6777b538SAndroid Build Coastguard Worker }
4085*6777b538SAndroid Build Coastguard Worker
4086*6777b538SAndroid Build Coastguard Worker // Preconditions: The ranges `range1` and `range2` are sorted with respect to
4087*6777b538SAndroid Build Coastguard Worker // `comp` and `proj1` or `proj2`, respectively. The resulting range does not
4088*6777b538SAndroid Build Coastguard Worker // overlap with either of the original ranges.
4089*6777b538SAndroid Build Coastguard Worker //
4090*6777b538SAndroid Build Coastguard Worker // Effects: Copies the elements of `range1` which are not present in `range2`
4091*6777b538SAndroid Build Coastguard Worker // to the range beginning at `result`. The elements in the constructed range are
4092*6777b538SAndroid Build Coastguard Worker // sorted.
4093*6777b538SAndroid Build Coastguard Worker //
4094*6777b538SAndroid Build Coastguard Worker // Returns: The end of the constructed range.
4095*6777b538SAndroid Build Coastguard Worker //
4096*6777b538SAndroid Build Coastguard Worker // Complexity: At most `2 * (size(range1) + size(range2)) - 1` comparisons and
4097*6777b538SAndroid Build Coastguard Worker // applications of each projection.
4098*6777b538SAndroid Build Coastguard Worker //
4099*6777b538SAndroid Build Coastguard Worker // Remarks: Stable. If `range1` contains `m` elements that are equivalent to
4100*6777b538SAndroid Build Coastguard Worker // each other and `range2` contains `n` elements that are equivalent to them,
4101*6777b538SAndroid Build Coastguard Worker // the last `max(m - n, 0)` elements from `range1` are copied to the output
4102*6777b538SAndroid Build Coastguard Worker // range, in order.
4103*6777b538SAndroid Build Coastguard Worker //
4104*6777b538SAndroid Build Coastguard Worker // Reference:
4105*6777b538SAndroid Build Coastguard Worker // https://wg21.link/set.difference#:~:text=ranges::set_difference(R1
4106*6777b538SAndroid Build Coastguard Worker template <typename Range1,
4107*6777b538SAndroid Build Coastguard Worker typename Range2,
4108*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
4109*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4110*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
4111*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
4112*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range1>,
4113*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range2>,
4114*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>,
4115*6777b538SAndroid Build Coastguard Worker typename =
4116*6777b538SAndroid Build Coastguard Worker std::indirect_result_t<Comp&,
4117*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range1>, Proj1>,
4118*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range2>, Proj2>>,
4119*6777b538SAndroid Build Coastguard Worker typename =
4120*6777b538SAndroid Build Coastguard Worker std::indirect_result_t<Comp&,
4121*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range2>, Proj2>,
4122*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range1>, Proj1>>>
4123*6777b538SAndroid Build Coastguard Worker constexpr auto set_difference(Range1&& range1,
4124*6777b538SAndroid Build Coastguard Worker Range2&& range2,
4125*6777b538SAndroid Build Coastguard Worker OutputIterator result,
4126*6777b538SAndroid Build Coastguard Worker Comp comp = {},
4127*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
4128*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
4129*6777b538SAndroid Build Coastguard Worker return ranges::set_difference(ranges::begin(range1), ranges::end(range1),
4130*6777b538SAndroid Build Coastguard Worker ranges::begin(range2), ranges::end(range2),
4131*6777b538SAndroid Build Coastguard Worker result, std::move(comp), std::move(proj1),
4132*6777b538SAndroid Build Coastguard Worker std::move(proj2));
4133*6777b538SAndroid Build Coastguard Worker }
4134*6777b538SAndroid Build Coastguard Worker
4135*6777b538SAndroid Build Coastguard Worker // [set.symmetric.difference] set_symmetric_difference
4136*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/set.symmetric.difference
4137*6777b538SAndroid Build Coastguard Worker
4138*6777b538SAndroid Build Coastguard Worker // Preconditions: The ranges `[first1, last1)` and `[first2, last2)` are sorted
4139*6777b538SAndroid Build Coastguard Worker // with respect to `comp` and `proj1` or `proj2`, respectively. The resulting
4140*6777b538SAndroid Build Coastguard Worker // range does not overlap with either of the original ranges.
4141*6777b538SAndroid Build Coastguard Worker //
4142*6777b538SAndroid Build Coastguard Worker // Effects: Copies the elements of the range `[first1, last1)` that are not
4143*6777b538SAndroid Build Coastguard Worker // present in the range `[first2, last2)`, and the elements of the range
4144*6777b538SAndroid Build Coastguard Worker // `[first2, last2)` that are not present in the range `[first1, last1)` to the
4145*6777b538SAndroid Build Coastguard Worker // range beginning at `result`. The elements in the constructed range are
4146*6777b538SAndroid Build Coastguard Worker // sorted.
4147*6777b538SAndroid Build Coastguard Worker //
4148*6777b538SAndroid Build Coastguard Worker // Returns: The end of the constructed range.
4149*6777b538SAndroid Build Coastguard Worker //
4150*6777b538SAndroid Build Coastguard Worker // Complexity: At most `2 * ((last1 - first1) + (last2 - first2)) - 1`
4151*6777b538SAndroid Build Coastguard Worker // comparisons and applications of each projection.
4152*6777b538SAndroid Build Coastguard Worker //
4153*6777b538SAndroid Build Coastguard Worker // Remarks: Stable. If `[first1, last1)` contains `m` elements that are
4154*6777b538SAndroid Build Coastguard Worker // equivalent to each other and `[first2, last2)` contains `n` elements that are
4155*6777b538SAndroid Build Coastguard Worker // equivalent to them, then `|m - n|` of those elements shall be copied to the
4156*6777b538SAndroid Build Coastguard Worker // output range: the last `m - n` of these elements from `[first1, last1)` if
4157*6777b538SAndroid Build Coastguard Worker // `m > n`, and the last `n - m` of these elements from `[first2, last2)` if
4158*6777b538SAndroid Build Coastguard Worker // `m < n`. In either case, the elements are copied in order.
4159*6777b538SAndroid Build Coastguard Worker //
4160*6777b538SAndroid Build Coastguard Worker // Reference:
4161*6777b538SAndroid Build Coastguard Worker // https://wg21.link/set.symmetric.difference#:~:text=set_symmetric_difference(I1
4162*6777b538SAndroid Build Coastguard Worker template <
4163*6777b538SAndroid Build Coastguard Worker typename InputIterator1,
4164*6777b538SAndroid Build Coastguard Worker typename InputIterator2,
4165*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
4166*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4167*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
4168*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
4169*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator1>,
4170*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<InputIterator2>,
4171*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>,
4172*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
4173*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator1, Proj1>,
4174*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator2, Proj2>>,
4175*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
4176*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator2, Proj2>,
4177*6777b538SAndroid Build Coastguard Worker std::projected<InputIterator1, Proj1>>>
4178*6777b538SAndroid Build Coastguard Worker constexpr auto set_symmetric_difference(InputIterator1 first1,
4179*6777b538SAndroid Build Coastguard Worker InputIterator1 last1,
4180*6777b538SAndroid Build Coastguard Worker InputIterator2 first2,
4181*6777b538SAndroid Build Coastguard Worker InputIterator2 last2,
4182*6777b538SAndroid Build Coastguard Worker OutputIterator result,
4183*6777b538SAndroid Build Coastguard Worker Comp comp = {},
4184*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
4185*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
4186*6777b538SAndroid Build Coastguard Worker // Needs to opt-in to all permutations, since std::set_symmetric_difference
4187*6777b538SAndroid Build Coastguard Worker // expects comp(proj1(lhs), proj2(rhs)) and comp(proj2(lhs), proj1(rhs)) to
4188*6777b538SAndroid Build Coastguard Worker // compile.
4189*6777b538SAndroid Build Coastguard Worker return std::set_symmetric_difference(
4190*6777b538SAndroid Build Coastguard Worker first1, last1, first2, last2, result,
4191*6777b538SAndroid Build Coastguard Worker internal::PermutedProjectedBinaryPredicate(comp, proj1, proj2));
4192*6777b538SAndroid Build Coastguard Worker }
4193*6777b538SAndroid Build Coastguard Worker
4194*6777b538SAndroid Build Coastguard Worker // Preconditions: The ranges `range1` and `range2` are sorted with respect to
4195*6777b538SAndroid Build Coastguard Worker // `comp` and `proj1` or `proj2`, respectively. The resulting range does not
4196*6777b538SAndroid Build Coastguard Worker // overlap with either of the original ranges.
4197*6777b538SAndroid Build Coastguard Worker //
4198*6777b538SAndroid Build Coastguard Worker // Effects: Copies the elements of `range1` that are not present in `range2`,
4199*6777b538SAndroid Build Coastguard Worker // and the elements of `range2` that are not present in `range1` to the range
4200*6777b538SAndroid Build Coastguard Worker // beginning at `result`. The elements in the constructed range are sorted.
4201*6777b538SAndroid Build Coastguard Worker //
4202*6777b538SAndroid Build Coastguard Worker // Returns: The end of the constructed range.
4203*6777b538SAndroid Build Coastguard Worker //
4204*6777b538SAndroid Build Coastguard Worker // Complexity: At most `2 * (size(range1) + size(range2)) - 1` comparisons and
4205*6777b538SAndroid Build Coastguard Worker // applications of each projection.
4206*6777b538SAndroid Build Coastguard Worker //
4207*6777b538SAndroid Build Coastguard Worker // Remarks: Stable. If `range1` contains `m` elements that are equivalent to
4208*6777b538SAndroid Build Coastguard Worker // each other and `range2` contains `n` elements that are equivalent to them,
4209*6777b538SAndroid Build Coastguard Worker // then `|m - n|` of those elements shall be copied to the output range: the
4210*6777b538SAndroid Build Coastguard Worker // last `m - n` of these elements from `range1` if `m > n`, and the last `n - m`
4211*6777b538SAndroid Build Coastguard Worker // of these elements from `range2` if `m < n`. In either case, the elements are
4212*6777b538SAndroid Build Coastguard Worker // copied in order.
4213*6777b538SAndroid Build Coastguard Worker //
4214*6777b538SAndroid Build Coastguard Worker // Reference:
4215*6777b538SAndroid Build Coastguard Worker // https://wg21.link/set.symmetric.difference#:~:text=set_symmetric_difference(R1
4216*6777b538SAndroid Build Coastguard Worker template <typename Range1,
4217*6777b538SAndroid Build Coastguard Worker typename Range2,
4218*6777b538SAndroid Build Coastguard Worker typename OutputIterator,
4219*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4220*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
4221*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
4222*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range1>,
4223*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range2>,
4224*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<OutputIterator>,
4225*6777b538SAndroid Build Coastguard Worker typename =
4226*6777b538SAndroid Build Coastguard Worker std::indirect_result_t<Comp&,
4227*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range1>, Proj1>,
4228*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range2>, Proj2>>,
4229*6777b538SAndroid Build Coastguard Worker typename =
4230*6777b538SAndroid Build Coastguard Worker std::indirect_result_t<Comp&,
4231*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range2>, Proj2>,
4232*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range1>, Proj1>>>
4233*6777b538SAndroid Build Coastguard Worker constexpr auto set_symmetric_difference(Range1&& range1,
4234*6777b538SAndroid Build Coastguard Worker Range2&& range2,
4235*6777b538SAndroid Build Coastguard Worker OutputIterator result,
4236*6777b538SAndroid Build Coastguard Worker Comp comp = {},
4237*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
4238*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
4239*6777b538SAndroid Build Coastguard Worker return ranges::set_symmetric_difference(
4240*6777b538SAndroid Build Coastguard Worker ranges::begin(range1), ranges::end(range1), ranges::begin(range2),
4241*6777b538SAndroid Build Coastguard Worker ranges::end(range2), result, std::move(comp), std::move(proj1),
4242*6777b538SAndroid Build Coastguard Worker std::move(proj2));
4243*6777b538SAndroid Build Coastguard Worker }
4244*6777b538SAndroid Build Coastguard Worker
4245*6777b538SAndroid Build Coastguard Worker // [alg.heap.operations] Heap operations
4246*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.heap.operations
4247*6777b538SAndroid Build Coastguard Worker
4248*6777b538SAndroid Build Coastguard Worker // [push.heap] push_heap
4249*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/push.heap
4250*6777b538SAndroid Build Coastguard Worker
4251*6777b538SAndroid Build Coastguard Worker // Preconditions: The range `[first, last - 1)` is a valid heap with respect to
4252*6777b538SAndroid Build Coastguard Worker // `comp` and `proj`.
4253*6777b538SAndroid Build Coastguard Worker //
4254*6777b538SAndroid Build Coastguard Worker // Effects: Places the value in the location `last - 1` into the resulting heap
4255*6777b538SAndroid Build Coastguard Worker // `[first, last)`.
4256*6777b538SAndroid Build Coastguard Worker //
4257*6777b538SAndroid Build Coastguard Worker // Returns: `last`.
4258*6777b538SAndroid Build Coastguard Worker //
4259*6777b538SAndroid Build Coastguard Worker // Complexity: At most `log(last - first)` comparisons and twice as many
4260*6777b538SAndroid Build Coastguard Worker // projections.
4261*6777b538SAndroid Build Coastguard Worker //
4262*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/push.heap#:~:text=ranges::push_heap(I
4263*6777b538SAndroid Build Coastguard Worker template <typename RandomAccessIterator,
4264*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4265*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
4266*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<RandomAccessIterator>,
4267*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<
4268*6777b538SAndroid Build Coastguard Worker Comp&,
4269*6777b538SAndroid Build Coastguard Worker std::projected<RandomAccessIterator, Proj>,
4270*6777b538SAndroid Build Coastguard Worker std::projected<RandomAccessIterator, Proj>>>
4271*6777b538SAndroid Build Coastguard Worker constexpr auto push_heap(RandomAccessIterator first,
4272*6777b538SAndroid Build Coastguard Worker RandomAccessIterator last,
4273*6777b538SAndroid Build Coastguard Worker Comp comp = {},
4274*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
4275*6777b538SAndroid Build Coastguard Worker std::push_heap(first, last,
4276*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(comp, proj, proj));
4277*6777b538SAndroid Build Coastguard Worker return last;
4278*6777b538SAndroid Build Coastguard Worker }
4279*6777b538SAndroid Build Coastguard Worker
4280*6777b538SAndroid Build Coastguard Worker // Preconditions: The range `[begin(range), end(range) - 1)` is a valid heap
4281*6777b538SAndroid Build Coastguard Worker // with respect to `comp` and `proj`.
4282*6777b538SAndroid Build Coastguard Worker //
4283*6777b538SAndroid Build Coastguard Worker // Effects: Places the value in the location `end(range) - 1` into the resulting
4284*6777b538SAndroid Build Coastguard Worker // heap `range`.
4285*6777b538SAndroid Build Coastguard Worker //
4286*6777b538SAndroid Build Coastguard Worker // Returns: `end(range)`.
4287*6777b538SAndroid Build Coastguard Worker //
4288*6777b538SAndroid Build Coastguard Worker // Complexity: At most `log(size(range))` comparisons and twice as many
4289*6777b538SAndroid Build Coastguard Worker // projections.
4290*6777b538SAndroid Build Coastguard Worker //
4291*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/push.heap#:~:text=ranges::push_heap(R
4292*6777b538SAndroid Build Coastguard Worker template <
4293*6777b538SAndroid Build Coastguard Worker typename Range,
4294*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4295*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
4296*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
4297*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
4298*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>,
4299*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>>>
4300*6777b538SAndroid Build Coastguard Worker constexpr auto push_heap(Range&& range, Comp comp = {}, Proj proj = {}) {
4301*6777b538SAndroid Build Coastguard Worker return ranges::push_heap(ranges::begin(range), ranges::end(range),
4302*6777b538SAndroid Build Coastguard Worker std::move(comp), std::move(proj));
4303*6777b538SAndroid Build Coastguard Worker }
4304*6777b538SAndroid Build Coastguard Worker
4305*6777b538SAndroid Build Coastguard Worker // [pop.heap] pop_heap
4306*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/pop.heap
4307*6777b538SAndroid Build Coastguard Worker
4308*6777b538SAndroid Build Coastguard Worker // Preconditions: The range `[first, last)` is a valid non-empty heap with
4309*6777b538SAndroid Build Coastguard Worker // respect to `comp` and `proj`.
4310*6777b538SAndroid Build Coastguard Worker //
4311*6777b538SAndroid Build Coastguard Worker // Effects: Swaps the value in the location `first` with the value in the
4312*6777b538SAndroid Build Coastguard Worker // location `last - 1` and makes `[first, last - 1)` into a heap with respect to
4313*6777b538SAndroid Build Coastguard Worker // `comp` and `proj`.
4314*6777b538SAndroid Build Coastguard Worker //
4315*6777b538SAndroid Build Coastguard Worker // Returns: `last`.
4316*6777b538SAndroid Build Coastguard Worker //
4317*6777b538SAndroid Build Coastguard Worker // Complexity: At most `2 log(last - first)` comparisons and twice as many
4318*6777b538SAndroid Build Coastguard Worker // projections.
4319*6777b538SAndroid Build Coastguard Worker //
4320*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/pop.heap#:~:text=ranges::pop_heap(I
4321*6777b538SAndroid Build Coastguard Worker template <typename RandomAccessIterator,
4322*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4323*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
4324*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<RandomAccessIterator>,
4325*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<
4326*6777b538SAndroid Build Coastguard Worker Comp&,
4327*6777b538SAndroid Build Coastguard Worker std::projected<RandomAccessIterator, Proj>,
4328*6777b538SAndroid Build Coastguard Worker std::projected<RandomAccessIterator, Proj>>>
4329*6777b538SAndroid Build Coastguard Worker constexpr auto pop_heap(RandomAccessIterator first,
4330*6777b538SAndroid Build Coastguard Worker RandomAccessIterator last,
4331*6777b538SAndroid Build Coastguard Worker Comp comp = {},
4332*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
4333*6777b538SAndroid Build Coastguard Worker std::pop_heap(first, last,
4334*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(comp, proj, proj));
4335*6777b538SAndroid Build Coastguard Worker return last;
4336*6777b538SAndroid Build Coastguard Worker }
4337*6777b538SAndroid Build Coastguard Worker
4338*6777b538SAndroid Build Coastguard Worker // Preconditions: `range` is a valid non-empty heap with respect to `comp` and
4339*6777b538SAndroid Build Coastguard Worker // `proj`.
4340*6777b538SAndroid Build Coastguard Worker //
4341*6777b538SAndroid Build Coastguard Worker // Effects: Swaps the value in the location `begin(range)` with the value in the
4342*6777b538SAndroid Build Coastguard Worker // location `end(range) - 1` and makes `[begin(range), end(range) - 1)` into a
4343*6777b538SAndroid Build Coastguard Worker // heap with respect to `comp` and `proj`.
4344*6777b538SAndroid Build Coastguard Worker //
4345*6777b538SAndroid Build Coastguard Worker // Returns: `end(range)`.
4346*6777b538SAndroid Build Coastguard Worker //
4347*6777b538SAndroid Build Coastguard Worker // Complexity: At most `2 log(size(range))` comparisons and twice as many
4348*6777b538SAndroid Build Coastguard Worker // projections.
4349*6777b538SAndroid Build Coastguard Worker //
4350*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/pop.heap#:~:text=ranges::pop_heap(R
4351*6777b538SAndroid Build Coastguard Worker template <
4352*6777b538SAndroid Build Coastguard Worker typename Range,
4353*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4354*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
4355*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
4356*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
4357*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>,
4358*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>>>
4359*6777b538SAndroid Build Coastguard Worker constexpr auto pop_heap(Range&& range, Comp comp = {}, Proj proj = {}) {
4360*6777b538SAndroid Build Coastguard Worker return ranges::pop_heap(ranges::begin(range), ranges::end(range),
4361*6777b538SAndroid Build Coastguard Worker std::move(comp), std::move(proj));
4362*6777b538SAndroid Build Coastguard Worker }
4363*6777b538SAndroid Build Coastguard Worker
4364*6777b538SAndroid Build Coastguard Worker // [make.heap] make_heap
4365*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/make.heap
4366*6777b538SAndroid Build Coastguard Worker
4367*6777b538SAndroid Build Coastguard Worker // Effects: Constructs a heap with respect to `comp` and `proj` out of the range
4368*6777b538SAndroid Build Coastguard Worker // `[first, last)`.
4369*6777b538SAndroid Build Coastguard Worker //
4370*6777b538SAndroid Build Coastguard Worker // Returns: `last`.
4371*6777b538SAndroid Build Coastguard Worker //
4372*6777b538SAndroid Build Coastguard Worker // Complexity: At most `3 * (last - first)` comparisons and twice as many
4373*6777b538SAndroid Build Coastguard Worker // projections.
4374*6777b538SAndroid Build Coastguard Worker //
4375*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/make.heap#:~:text=ranges::make_heap(I
4376*6777b538SAndroid Build Coastguard Worker template <typename RandomAccessIterator,
4377*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4378*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
4379*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<RandomAccessIterator>,
4380*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<
4381*6777b538SAndroid Build Coastguard Worker Comp&,
4382*6777b538SAndroid Build Coastguard Worker std::projected<RandomAccessIterator, Proj>,
4383*6777b538SAndroid Build Coastguard Worker std::projected<RandomAccessIterator, Proj>>>
4384*6777b538SAndroid Build Coastguard Worker constexpr auto make_heap(RandomAccessIterator first,
4385*6777b538SAndroid Build Coastguard Worker RandomAccessIterator last,
4386*6777b538SAndroid Build Coastguard Worker Comp comp = {},
4387*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
4388*6777b538SAndroid Build Coastguard Worker std::make_heap(first, last,
4389*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(comp, proj, proj));
4390*6777b538SAndroid Build Coastguard Worker return last;
4391*6777b538SAndroid Build Coastguard Worker }
4392*6777b538SAndroid Build Coastguard Worker
4393*6777b538SAndroid Build Coastguard Worker // Effects: Constructs a heap with respect to `comp` and `proj` out of `range`.
4394*6777b538SAndroid Build Coastguard Worker //
4395*6777b538SAndroid Build Coastguard Worker // Returns: `end(range)`.
4396*6777b538SAndroid Build Coastguard Worker //
4397*6777b538SAndroid Build Coastguard Worker // Complexity: At most `3 * size(range)` comparisons and twice as many
4398*6777b538SAndroid Build Coastguard Worker // projections.
4399*6777b538SAndroid Build Coastguard Worker //
4400*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/make.heap#:~:text=ranges::make_heap(R
4401*6777b538SAndroid Build Coastguard Worker template <
4402*6777b538SAndroid Build Coastguard Worker typename Range,
4403*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4404*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
4405*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
4406*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
4407*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>,
4408*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>>>
4409*6777b538SAndroid Build Coastguard Worker constexpr auto make_heap(Range&& range, Comp comp = {}, Proj proj = {}) {
4410*6777b538SAndroid Build Coastguard Worker return ranges::make_heap(ranges::begin(range), ranges::end(range),
4411*6777b538SAndroid Build Coastguard Worker std::move(comp), std::move(proj));
4412*6777b538SAndroid Build Coastguard Worker }
4413*6777b538SAndroid Build Coastguard Worker
4414*6777b538SAndroid Build Coastguard Worker // [sort.heap] sort_heap
4415*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/sort.heap
4416*6777b538SAndroid Build Coastguard Worker
4417*6777b538SAndroid Build Coastguard Worker // Preconditions: The range `[first, last)` is a valid heap with respect to
4418*6777b538SAndroid Build Coastguard Worker // `comp` and `proj`.
4419*6777b538SAndroid Build Coastguard Worker //
4420*6777b538SAndroid Build Coastguard Worker // Effects: Sorts elements in the heap `[first, last)` with respect to `comp`
4421*6777b538SAndroid Build Coastguard Worker // and `proj`.
4422*6777b538SAndroid Build Coastguard Worker //
4423*6777b538SAndroid Build Coastguard Worker // Returns: `last`.
4424*6777b538SAndroid Build Coastguard Worker //
4425*6777b538SAndroid Build Coastguard Worker // Complexity: At most `2 N log N` comparisons, where `N = last - first`, and
4426*6777b538SAndroid Build Coastguard Worker // twice as many projections.
4427*6777b538SAndroid Build Coastguard Worker //
4428*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/sort.heap#:~:text=ranges::sort_heap(I
4429*6777b538SAndroid Build Coastguard Worker template <typename RandomAccessIterator,
4430*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4431*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
4432*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<RandomAccessIterator>,
4433*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<
4434*6777b538SAndroid Build Coastguard Worker Comp&,
4435*6777b538SAndroid Build Coastguard Worker std::projected<RandomAccessIterator, Proj>,
4436*6777b538SAndroid Build Coastguard Worker std::projected<RandomAccessIterator, Proj>>>
4437*6777b538SAndroid Build Coastguard Worker constexpr auto sort_heap(RandomAccessIterator first,
4438*6777b538SAndroid Build Coastguard Worker RandomAccessIterator last,
4439*6777b538SAndroid Build Coastguard Worker Comp comp = {},
4440*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
4441*6777b538SAndroid Build Coastguard Worker std::sort_heap(first, last,
4442*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(comp, proj, proj));
4443*6777b538SAndroid Build Coastguard Worker return last;
4444*6777b538SAndroid Build Coastguard Worker }
4445*6777b538SAndroid Build Coastguard Worker
4446*6777b538SAndroid Build Coastguard Worker // Preconditions: `range` is a valid heap with respect to `comp` and `proj`.
4447*6777b538SAndroid Build Coastguard Worker //
4448*6777b538SAndroid Build Coastguard Worker // Effects: Sorts elements in the heap `range` with respect to `comp` and
4449*6777b538SAndroid Build Coastguard Worker // `proj`.
4450*6777b538SAndroid Build Coastguard Worker //
4451*6777b538SAndroid Build Coastguard Worker // Returns: `end(range)`.
4452*6777b538SAndroid Build Coastguard Worker //
4453*6777b538SAndroid Build Coastguard Worker // Complexity: At most `2 N log N` comparisons, where `N = size(range)`, and
4454*6777b538SAndroid Build Coastguard Worker // twice as many projections.
4455*6777b538SAndroid Build Coastguard Worker //
4456*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/sort.heap#:~:text=ranges::sort_heap(R
4457*6777b538SAndroid Build Coastguard Worker template <
4458*6777b538SAndroid Build Coastguard Worker typename Range,
4459*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4460*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
4461*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
4462*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
4463*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>,
4464*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>>>
4465*6777b538SAndroid Build Coastguard Worker constexpr auto sort_heap(Range&& range, Comp comp = {}, Proj proj = {}) {
4466*6777b538SAndroid Build Coastguard Worker return ranges::sort_heap(ranges::begin(range), ranges::end(range),
4467*6777b538SAndroid Build Coastguard Worker std::move(comp), std::move(proj));
4468*6777b538SAndroid Build Coastguard Worker }
4469*6777b538SAndroid Build Coastguard Worker
4470*6777b538SAndroid Build Coastguard Worker // [is.heap] is_heap
4471*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/is.heap
4472*6777b538SAndroid Build Coastguard Worker
4473*6777b538SAndroid Build Coastguard Worker // Returns: Whether the range `[first, last)` is a heap with respect to `comp`
4474*6777b538SAndroid Build Coastguard Worker // and `proj`.
4475*6777b538SAndroid Build Coastguard Worker //
4476*6777b538SAndroid Build Coastguard Worker // Complexity: Linear.
4477*6777b538SAndroid Build Coastguard Worker //
4478*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/is.heap#:~:text=ranges::is_heap(I
4479*6777b538SAndroid Build Coastguard Worker template <typename RandomAccessIterator,
4480*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4481*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
4482*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<RandomAccessIterator>,
4483*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<
4484*6777b538SAndroid Build Coastguard Worker Comp&,
4485*6777b538SAndroid Build Coastguard Worker std::projected<RandomAccessIterator, Proj>,
4486*6777b538SAndroid Build Coastguard Worker std::projected<RandomAccessIterator, Proj>>>
4487*6777b538SAndroid Build Coastguard Worker constexpr auto is_heap(RandomAccessIterator first,
4488*6777b538SAndroid Build Coastguard Worker RandomAccessIterator last,
4489*6777b538SAndroid Build Coastguard Worker Comp comp = {},
4490*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
4491*6777b538SAndroid Build Coastguard Worker return std::is_heap(first, last,
4492*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(comp, proj, proj));
4493*6777b538SAndroid Build Coastguard Worker }
4494*6777b538SAndroid Build Coastguard Worker
4495*6777b538SAndroid Build Coastguard Worker // Returns: Whether `range` is a heap with respect to `comp` and `proj`.
4496*6777b538SAndroid Build Coastguard Worker //
4497*6777b538SAndroid Build Coastguard Worker // Complexity: Linear.
4498*6777b538SAndroid Build Coastguard Worker //
4499*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/is.heap#:~:text=ranges::is_heap(R
4500*6777b538SAndroid Build Coastguard Worker template <
4501*6777b538SAndroid Build Coastguard Worker typename Range,
4502*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4503*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
4504*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
4505*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
4506*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>,
4507*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>>>
4508*6777b538SAndroid Build Coastguard Worker constexpr auto is_heap(Range&& range, Comp comp = {}, Proj proj = {}) {
4509*6777b538SAndroid Build Coastguard Worker return ranges::is_heap(ranges::begin(range), ranges::end(range),
4510*6777b538SAndroid Build Coastguard Worker std::move(comp), std::move(proj));
4511*6777b538SAndroid Build Coastguard Worker }
4512*6777b538SAndroid Build Coastguard Worker
4513*6777b538SAndroid Build Coastguard Worker // Returns: The last iterator `i` in `[first, last]` for which the range
4514*6777b538SAndroid Build Coastguard Worker // `[first, i)` is a heap with respect to `comp` and `proj`.
4515*6777b538SAndroid Build Coastguard Worker //
4516*6777b538SAndroid Build Coastguard Worker // Complexity: Linear.
4517*6777b538SAndroid Build Coastguard Worker //
4518*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/is.heap#:~:text=ranges::is_heap_until(I
4519*6777b538SAndroid Build Coastguard Worker template <typename RandomAccessIterator,
4520*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4521*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
4522*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<RandomAccessIterator>,
4523*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<
4524*6777b538SAndroid Build Coastguard Worker Comp&,
4525*6777b538SAndroid Build Coastguard Worker std::projected<RandomAccessIterator, Proj>,
4526*6777b538SAndroid Build Coastguard Worker std::projected<RandomAccessIterator, Proj>>>
4527*6777b538SAndroid Build Coastguard Worker constexpr auto is_heap_until(RandomAccessIterator first,
4528*6777b538SAndroid Build Coastguard Worker RandomAccessIterator last,
4529*6777b538SAndroid Build Coastguard Worker Comp comp = {},
4530*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
4531*6777b538SAndroid Build Coastguard Worker return std::is_heap_until(
4532*6777b538SAndroid Build Coastguard Worker first, last, internal::ProjectedBinaryPredicate(comp, proj, proj));
4533*6777b538SAndroid Build Coastguard Worker }
4534*6777b538SAndroid Build Coastguard Worker
4535*6777b538SAndroid Build Coastguard Worker // Returns: The last iterator `i` in `[begin(range), end(range)]` for which the
4536*6777b538SAndroid Build Coastguard Worker // range `[begin(range), i)` is a heap with respect to `comp` and `proj`.
4537*6777b538SAndroid Build Coastguard Worker //
4538*6777b538SAndroid Build Coastguard Worker // Complexity: Linear.
4539*6777b538SAndroid Build Coastguard Worker //
4540*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/is.heap#:~:text=ranges::is_heap_until(R
4541*6777b538SAndroid Build Coastguard Worker template <
4542*6777b538SAndroid Build Coastguard Worker typename Range,
4543*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4544*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
4545*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
4546*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
4547*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>,
4548*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>>>
4549*6777b538SAndroid Build Coastguard Worker constexpr auto is_heap_until(Range&& range, Comp comp = {}, Proj proj = {}) {
4550*6777b538SAndroid Build Coastguard Worker return ranges::is_heap_until(ranges::begin(range), ranges::end(range),
4551*6777b538SAndroid Build Coastguard Worker std::move(comp), std::move(proj));
4552*6777b538SAndroid Build Coastguard Worker }
4553*6777b538SAndroid Build Coastguard Worker
4554*6777b538SAndroid Build Coastguard Worker // [alg.min.max] Minimum and maximum
4555*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.min.max
4556*6777b538SAndroid Build Coastguard Worker
4557*6777b538SAndroid Build Coastguard Worker // Returns: The smaller value. Returns the first argument when the arguments are
4558*6777b538SAndroid Build Coastguard Worker // equivalent.
4559*6777b538SAndroid Build Coastguard Worker //
4560*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly one comparison and two applications of the projection, if
4561*6777b538SAndroid Build Coastguard Worker // any.
4562*6777b538SAndroid Build Coastguard Worker //
4563*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.min.max#:~:text=ranges::min
4564*6777b538SAndroid Build Coastguard Worker template <typename T,
4565*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4566*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity>
4567*6777b538SAndroid Build Coastguard Worker constexpr const T& min(const T& a, const T& b, Comp comp = {}, Proj proj = {}) {
4568*6777b538SAndroid Build Coastguard Worker return std::invoke(comp, std::invoke(proj, b), std::invoke(proj, a)) ? b : a;
4569*6777b538SAndroid Build Coastguard Worker }
4570*6777b538SAndroid Build Coastguard Worker
4571*6777b538SAndroid Build Coastguard Worker // Preconditions: `!empty(ilist)`.
4572*6777b538SAndroid Build Coastguard Worker //
4573*6777b538SAndroid Build Coastguard Worker // Returns: The smallest value in the input range. Returns a copy of the
4574*6777b538SAndroid Build Coastguard Worker // leftmost element when several elements are equivalent to the smallest.
4575*6777b538SAndroid Build Coastguard Worker //
4576*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `size(ilist) - 1` comparisons and twice as many
4577*6777b538SAndroid Build Coastguard Worker // applications of the projection, if any.
4578*6777b538SAndroid Build Coastguard Worker //
4579*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.min.max#:~:text=ranges::min(initializer_list
4580*6777b538SAndroid Build Coastguard Worker template <typename T,
4581*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4582*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity>
4583*6777b538SAndroid Build Coastguard Worker constexpr T min(std::initializer_list<T> ilist,
4584*6777b538SAndroid Build Coastguard Worker Comp comp = {},
4585*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
4586*6777b538SAndroid Build Coastguard Worker return *std::min_element(
4587*6777b538SAndroid Build Coastguard Worker ilist.begin(), ilist.end(),
4588*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(comp, proj, proj));
4589*6777b538SAndroid Build Coastguard Worker }
4590*6777b538SAndroid Build Coastguard Worker
4591*6777b538SAndroid Build Coastguard Worker // Preconditions: `!empty(range)`.
4592*6777b538SAndroid Build Coastguard Worker //
4593*6777b538SAndroid Build Coastguard Worker // Returns: The smallest value in the input range. Returns a copy of the
4594*6777b538SAndroid Build Coastguard Worker // leftmost element when several elements are equivalent to the smallest.
4595*6777b538SAndroid Build Coastguard Worker //
4596*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `size(range) - 1` comparisons and twice as many
4597*6777b538SAndroid Build Coastguard Worker // applications of the projection, if any.
4598*6777b538SAndroid Build Coastguard Worker //
4599*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.min.max#:~:text=ranges::min(R
4600*6777b538SAndroid Build Coastguard Worker template <typename Range,
4601*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4602*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
4603*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
4604*6777b538SAndroid Build Coastguard Worker constexpr auto min(Range&& range, Comp comp = {}, Proj proj = {}) {
4605*6777b538SAndroid Build Coastguard Worker return *std::min_element(
4606*6777b538SAndroid Build Coastguard Worker ranges::begin(range), ranges::end(range),
4607*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(comp, proj, proj));
4608*6777b538SAndroid Build Coastguard Worker }
4609*6777b538SAndroid Build Coastguard Worker
4610*6777b538SAndroid Build Coastguard Worker // Returns: The larger value. Returns the first argument when the arguments are
4611*6777b538SAndroid Build Coastguard Worker // equivalent.
4612*6777b538SAndroid Build Coastguard Worker //
4613*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly one comparison and two applications of the projection, if
4614*6777b538SAndroid Build Coastguard Worker // any.
4615*6777b538SAndroid Build Coastguard Worker //
4616*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.min.max#:~:text=ranges::max
4617*6777b538SAndroid Build Coastguard Worker template <typename T,
4618*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4619*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity>
4620*6777b538SAndroid Build Coastguard Worker constexpr const T& max(const T& a, const T& b, Comp comp = {}, Proj proj = {}) {
4621*6777b538SAndroid Build Coastguard Worker return std::invoke(comp, std::invoke(proj, a), std::invoke(proj, b)) ? b : a;
4622*6777b538SAndroid Build Coastguard Worker }
4623*6777b538SAndroid Build Coastguard Worker
4624*6777b538SAndroid Build Coastguard Worker // Preconditions: `!empty(ilist)`.
4625*6777b538SAndroid Build Coastguard Worker //
4626*6777b538SAndroid Build Coastguard Worker // Returns: The largest value in the input range. Returns a copy of the leftmost
4627*6777b538SAndroid Build Coastguard Worker // element when several elements are equivalent to the largest.
4628*6777b538SAndroid Build Coastguard Worker //
4629*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `size(ilist) - 1` comparisons and twice as many
4630*6777b538SAndroid Build Coastguard Worker // applications of the projection, if any.
4631*6777b538SAndroid Build Coastguard Worker //
4632*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.min.max#:~:text=ranges::max(initializer_list
4633*6777b538SAndroid Build Coastguard Worker template <typename T,
4634*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4635*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity>
4636*6777b538SAndroid Build Coastguard Worker constexpr T max(std::initializer_list<T> ilist,
4637*6777b538SAndroid Build Coastguard Worker Comp comp = {},
4638*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
4639*6777b538SAndroid Build Coastguard Worker return *std::max_element(
4640*6777b538SAndroid Build Coastguard Worker ilist.begin(), ilist.end(),
4641*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(comp, proj, proj));
4642*6777b538SAndroid Build Coastguard Worker }
4643*6777b538SAndroid Build Coastguard Worker
4644*6777b538SAndroid Build Coastguard Worker // Preconditions: `!empty(range)`.
4645*6777b538SAndroid Build Coastguard Worker //
4646*6777b538SAndroid Build Coastguard Worker // Returns: The largest value in the input range. Returns a copy of the leftmost
4647*6777b538SAndroid Build Coastguard Worker // element when several elements are equivalent to the smallest.
4648*6777b538SAndroid Build Coastguard Worker //
4649*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `size(range) - 1` comparisons and twice as many
4650*6777b538SAndroid Build Coastguard Worker // applications of the projection, if any.
4651*6777b538SAndroid Build Coastguard Worker //
4652*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.min.max#:~:text=ranges::max(R
4653*6777b538SAndroid Build Coastguard Worker template <typename Range,
4654*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4655*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
4656*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
4657*6777b538SAndroid Build Coastguard Worker constexpr auto max(Range&& range, Comp comp = {}, Proj proj = {}) {
4658*6777b538SAndroid Build Coastguard Worker return *std::max_element(
4659*6777b538SAndroid Build Coastguard Worker ranges::begin(range), ranges::end(range),
4660*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(comp, proj, proj));
4661*6777b538SAndroid Build Coastguard Worker }
4662*6777b538SAndroid Build Coastguard Worker
4663*6777b538SAndroid Build Coastguard Worker // Returns: `{b, a}` if `b` is smaller than `a`, and `{a, b}` otherwise.
4664*6777b538SAndroid Build Coastguard Worker //
4665*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly one comparison and two applications of the projection, if
4666*6777b538SAndroid Build Coastguard Worker // any.
4667*6777b538SAndroid Build Coastguard Worker //
4668*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.min.max#:~:text=ranges::minmax
4669*6777b538SAndroid Build Coastguard Worker template <typename T,
4670*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4671*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity>
4672*6777b538SAndroid Build Coastguard Worker constexpr auto minmax(const T& a, const T& b, Comp comp = {}, Proj proj = {}) {
4673*6777b538SAndroid Build Coastguard Worker return std::minmax(a, b,
4674*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(comp, proj, proj));
4675*6777b538SAndroid Build Coastguard Worker }
4676*6777b538SAndroid Build Coastguard Worker
4677*6777b538SAndroid Build Coastguard Worker // Preconditions: `!empty(ilist)`.
4678*6777b538SAndroid Build Coastguard Worker //
4679*6777b538SAndroid Build Coastguard Worker // Returns: Let `X` be the return type. Returns `X{x, y}`, where `x` is a copy
4680*6777b538SAndroid Build Coastguard Worker // of the leftmost element with the smallest value and `y` a copy of the
4681*6777b538SAndroid Build Coastguard Worker // rightmost element with the largest value in the input range.
4682*6777b538SAndroid Build Coastguard Worker //
4683*6777b538SAndroid Build Coastguard Worker // Complexity: At most `(3/2) size(ilist)` applications of the corresponding
4684*6777b538SAndroid Build Coastguard Worker // predicate and twice as many applications of the projection, if any.
4685*6777b538SAndroid Build Coastguard Worker //
4686*6777b538SAndroid Build Coastguard Worker // Reference:
4687*6777b538SAndroid Build Coastguard Worker // https://wg21.link/alg.min.max#:~:text=ranges::minmax(initializer_list
4688*6777b538SAndroid Build Coastguard Worker template <typename T,
4689*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4690*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity>
4691*6777b538SAndroid Build Coastguard Worker constexpr auto minmax(std::initializer_list<T> ilist,
4692*6777b538SAndroid Build Coastguard Worker Comp comp = {},
4693*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
4694*6777b538SAndroid Build Coastguard Worker auto it =
4695*6777b538SAndroid Build Coastguard Worker std::minmax_element(ranges::begin(ilist), ranges::end(ilist),
4696*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(comp, proj, proj));
4697*6777b538SAndroid Build Coastguard Worker return std::pair<T, T>{*it.first, *it.second};
4698*6777b538SAndroid Build Coastguard Worker }
4699*6777b538SAndroid Build Coastguard Worker
4700*6777b538SAndroid Build Coastguard Worker // Preconditions: `!empty(range)`.
4701*6777b538SAndroid Build Coastguard Worker //
4702*6777b538SAndroid Build Coastguard Worker // Returns: Let `X` be the return type. Returns `X{x, y}`, where `x` is a copy
4703*6777b538SAndroid Build Coastguard Worker // of the leftmost element with the smallest value and `y` a copy of the
4704*6777b538SAndroid Build Coastguard Worker // rightmost element with the largest value in the input range.
4705*6777b538SAndroid Build Coastguard Worker //
4706*6777b538SAndroid Build Coastguard Worker // Complexity: At most `(3/2) size(range)` applications of the corresponding
4707*6777b538SAndroid Build Coastguard Worker // predicate and twice as many applications of the projection, if any.
4708*6777b538SAndroid Build Coastguard Worker //
4709*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.min.max#:~:text=ranges::minmax(R
4710*6777b538SAndroid Build Coastguard Worker template <typename Range,
4711*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4712*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
4713*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>>
4714*6777b538SAndroid Build Coastguard Worker constexpr auto minmax(Range&& range, Comp comp = {}, Proj proj = {}) {
4715*6777b538SAndroid Build Coastguard Worker using T = range_value_t<Range>;
4716*6777b538SAndroid Build Coastguard Worker auto it =
4717*6777b538SAndroid Build Coastguard Worker std::minmax_element(ranges::begin(range), ranges::end(range),
4718*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(comp, proj, proj));
4719*6777b538SAndroid Build Coastguard Worker return std::pair<T, T>{*it.first, *it.second};
4720*6777b538SAndroid Build Coastguard Worker }
4721*6777b538SAndroid Build Coastguard Worker
4722*6777b538SAndroid Build Coastguard Worker // Returns: The first iterator i in the range `[first, last)` such that for
4723*6777b538SAndroid Build Coastguard Worker // every iterator `j` in the range `[first, last)`,
4724*6777b538SAndroid Build Coastguard Worker // `bool(invoke(comp, invoke(proj, *j), invoke(proj, *i)))` is `false`. Returns
4725*6777b538SAndroid Build Coastguard Worker // `last` if `first == last`.
4726*6777b538SAndroid Build Coastguard Worker //
4727*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `max(last - first - 1, 0)` comparisons and twice as
4728*6777b538SAndroid Build Coastguard Worker // many projections.
4729*6777b538SAndroid Build Coastguard Worker //
4730*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.min.max#:~:text=ranges::min_element(I
4731*6777b538SAndroid Build Coastguard Worker template <
4732*6777b538SAndroid Build Coastguard Worker typename ForwardIterator,
4733*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4734*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
4735*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator>,
4736*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
4737*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator, Proj>,
4738*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator, Proj>>>
4739*6777b538SAndroid Build Coastguard Worker constexpr auto min_element(ForwardIterator first,
4740*6777b538SAndroid Build Coastguard Worker ForwardIterator last,
4741*6777b538SAndroid Build Coastguard Worker Comp comp = {},
4742*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
4743*6777b538SAndroid Build Coastguard Worker return std::min_element(first, last,
4744*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(comp, proj, proj));
4745*6777b538SAndroid Build Coastguard Worker }
4746*6777b538SAndroid Build Coastguard Worker
4747*6777b538SAndroid Build Coastguard Worker // Returns: The first iterator i in `range` such that for every iterator `j` in
4748*6777b538SAndroid Build Coastguard Worker // `range`, `bool(invoke(comp, invoke(proj, *j), invoke(proj, *i)))` is `false`.
4749*6777b538SAndroid Build Coastguard Worker // Returns `end(range)` if `empty(range)`.
4750*6777b538SAndroid Build Coastguard Worker //
4751*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `max(size(range) - 1, 0)` comparisons and twice as many
4752*6777b538SAndroid Build Coastguard Worker // projections.
4753*6777b538SAndroid Build Coastguard Worker //
4754*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.min.max#:~:text=ranges::min_element(R
4755*6777b538SAndroid Build Coastguard Worker template <
4756*6777b538SAndroid Build Coastguard Worker typename Range,
4757*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4758*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
4759*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
4760*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
4761*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>,
4762*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>>>
4763*6777b538SAndroid Build Coastguard Worker constexpr auto min_element(Range&& range, Comp comp = {}, Proj proj = {}) {
4764*6777b538SAndroid Build Coastguard Worker return ranges::min_element(ranges::begin(range), ranges::end(range),
4765*6777b538SAndroid Build Coastguard Worker std::move(comp), std::move(proj));
4766*6777b538SAndroid Build Coastguard Worker }
4767*6777b538SAndroid Build Coastguard Worker
4768*6777b538SAndroid Build Coastguard Worker // Returns: The first iterator i in the range `[first, last)` such that for
4769*6777b538SAndroid Build Coastguard Worker // every iterator `j` in the range `[first, last)`,
4770*6777b538SAndroid Build Coastguard Worker // `bool(invoke(comp, invoke(proj, *i), invoke(proj, *j)))` is `false`.
4771*6777b538SAndroid Build Coastguard Worker // Returns `last` if `first == last`.
4772*6777b538SAndroid Build Coastguard Worker //
4773*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `max(last - first - 1, 0)` comparisons and twice as
4774*6777b538SAndroid Build Coastguard Worker // many projections.
4775*6777b538SAndroid Build Coastguard Worker //
4776*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.min.max#:~:text=ranges::max_element(I
4777*6777b538SAndroid Build Coastguard Worker template <
4778*6777b538SAndroid Build Coastguard Worker typename ForwardIterator,
4779*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4780*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
4781*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator>,
4782*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
4783*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator, Proj>,
4784*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator, Proj>>>
4785*6777b538SAndroid Build Coastguard Worker constexpr auto max_element(ForwardIterator first,
4786*6777b538SAndroid Build Coastguard Worker ForwardIterator last,
4787*6777b538SAndroid Build Coastguard Worker Comp comp = {},
4788*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
4789*6777b538SAndroid Build Coastguard Worker return std::max_element(first, last,
4790*6777b538SAndroid Build Coastguard Worker internal::ProjectedBinaryPredicate(comp, proj, proj));
4791*6777b538SAndroid Build Coastguard Worker }
4792*6777b538SAndroid Build Coastguard Worker
4793*6777b538SAndroid Build Coastguard Worker // Returns: The first iterator i in `range` such that for every iterator `j`
4794*6777b538SAndroid Build Coastguard Worker // in `range`, `bool(invoke(comp, invoke(proj, *j), invoke(proj, *j)))` is
4795*6777b538SAndroid Build Coastguard Worker // `false`. Returns `end(range)` if `empty(range)`.
4796*6777b538SAndroid Build Coastguard Worker //
4797*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `max(size(range) - 1, 0)` comparisons and twice as many
4798*6777b538SAndroid Build Coastguard Worker // projections.
4799*6777b538SAndroid Build Coastguard Worker //
4800*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.min.max#:~:text=ranges::max_element(R
4801*6777b538SAndroid Build Coastguard Worker template <
4802*6777b538SAndroid Build Coastguard Worker typename Range,
4803*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4804*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
4805*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
4806*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
4807*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>,
4808*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>>>
4809*6777b538SAndroid Build Coastguard Worker constexpr auto max_element(Range&& range, Comp comp = {}, Proj proj = {}) {
4810*6777b538SAndroid Build Coastguard Worker return ranges::max_element(ranges::begin(range), ranges::end(range),
4811*6777b538SAndroid Build Coastguard Worker std::move(comp), std::move(proj));
4812*6777b538SAndroid Build Coastguard Worker }
4813*6777b538SAndroid Build Coastguard Worker
4814*6777b538SAndroid Build Coastguard Worker // Returns: `{first, first}` if `[first, last)` is empty, otherwise `{m, M}`,
4815*6777b538SAndroid Build Coastguard Worker // where `m` is the first iterator in `[first, last)` such that no iterator in
4816*6777b538SAndroid Build Coastguard Worker // the range refers to a smaller element, and where `M` is the last iterator
4817*6777b538SAndroid Build Coastguard Worker // in
4818*6777b538SAndroid Build Coastguard Worker // `[first, last)` such that no iterator in the range refers to a larger
4819*6777b538SAndroid Build Coastguard Worker // element.
4820*6777b538SAndroid Build Coastguard Worker //
4821*6777b538SAndroid Build Coastguard Worker // Complexity: Let `N` be `last - first`. At most `max(3/2 (N − 1), 0)`
4822*6777b538SAndroid Build Coastguard Worker // comparisons and twice as many applications of the projection, if any.
4823*6777b538SAndroid Build Coastguard Worker //
4824*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.min.max#:~:text=ranges::minmax_element(I
4825*6777b538SAndroid Build Coastguard Worker template <
4826*6777b538SAndroid Build Coastguard Worker typename ForwardIterator,
4827*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4828*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
4829*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator>,
4830*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
4831*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator, Proj>,
4832*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator, Proj>>>
4833*6777b538SAndroid Build Coastguard Worker constexpr auto minmax_element(ForwardIterator first,
4834*6777b538SAndroid Build Coastguard Worker ForwardIterator last,
4835*6777b538SAndroid Build Coastguard Worker Comp comp = {},
4836*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
4837*6777b538SAndroid Build Coastguard Worker return std::minmax_element(
4838*6777b538SAndroid Build Coastguard Worker first, last, internal::ProjectedBinaryPredicate(comp, proj, proj));
4839*6777b538SAndroid Build Coastguard Worker }
4840*6777b538SAndroid Build Coastguard Worker
4841*6777b538SAndroid Build Coastguard Worker // Returns: `{begin(range), begin(range)}` if `range` is empty, otherwise
4842*6777b538SAndroid Build Coastguard Worker // `{m, M}`, where `m` is the first iterator in `range` such that no iterator
4843*6777b538SAndroid Build Coastguard Worker // in the range refers to a smaller element, and where `M` is the last
4844*6777b538SAndroid Build Coastguard Worker // iterator in `range` such that no iterator in the range refers to a larger
4845*6777b538SAndroid Build Coastguard Worker // element.
4846*6777b538SAndroid Build Coastguard Worker //
4847*6777b538SAndroid Build Coastguard Worker // Complexity: Let `N` be `size(range)`. At most `max(3/2 (N − 1), 0)`
4848*6777b538SAndroid Build Coastguard Worker // comparisons and twice as many applications of the projection, if any.
4849*6777b538SAndroid Build Coastguard Worker //
4850*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.min.max#:~:text=ranges::minmax_element(R
4851*6777b538SAndroid Build Coastguard Worker template <
4852*6777b538SAndroid Build Coastguard Worker typename Range,
4853*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4854*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
4855*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
4856*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
4857*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>,
4858*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>>>
4859*6777b538SAndroid Build Coastguard Worker constexpr auto minmax_element(Range&& range, Comp comp = {}, Proj proj = {}) {
4860*6777b538SAndroid Build Coastguard Worker return ranges::minmax_element(ranges::begin(range), ranges::end(range),
4861*6777b538SAndroid Build Coastguard Worker std::move(comp), std::move(proj));
4862*6777b538SAndroid Build Coastguard Worker }
4863*6777b538SAndroid Build Coastguard Worker
4864*6777b538SAndroid Build Coastguard Worker // [alg.clamp] Bounded value
4865*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.clamp
4866*6777b538SAndroid Build Coastguard Worker
4867*6777b538SAndroid Build Coastguard Worker // Preconditions: `bool(invoke(comp, invoke(proj, hi), invoke(proj, lo)))` is
4868*6777b538SAndroid Build Coastguard Worker // `false`.
4869*6777b538SAndroid Build Coastguard Worker //
4870*6777b538SAndroid Build Coastguard Worker // Returns: `lo` if `bool(invoke(comp, invoke(proj, v), invoke(proj, lo)))` is
4871*6777b538SAndroid Build Coastguard Worker // `true`, `hi` if `bool(invoke(comp, invoke(proj, hi), invoke(proj, v)))` is
4872*6777b538SAndroid Build Coastguard Worker // `true`, otherwise `v`.
4873*6777b538SAndroid Build Coastguard Worker //
4874*6777b538SAndroid Build Coastguard Worker // Complexity: At most two comparisons and three applications of the
4875*6777b538SAndroid Build Coastguard Worker // projection.
4876*6777b538SAndroid Build Coastguard Worker //
4877*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.clamp#:~:text=ranges::clamp
4878*6777b538SAndroid Build Coastguard Worker template <typename T,
4879*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4880*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity>
4881*6777b538SAndroid Build Coastguard Worker constexpr const T& clamp(const T& v,
4882*6777b538SAndroid Build Coastguard Worker const T& lo,
4883*6777b538SAndroid Build Coastguard Worker const T& hi,
4884*6777b538SAndroid Build Coastguard Worker Comp comp = {},
4885*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
4886*6777b538SAndroid Build Coastguard Worker auto&& projected_v = std::invoke(proj, v);
4887*6777b538SAndroid Build Coastguard Worker if (std::invoke(comp, projected_v, std::invoke(proj, lo))) {
4888*6777b538SAndroid Build Coastguard Worker return lo;
4889*6777b538SAndroid Build Coastguard Worker }
4890*6777b538SAndroid Build Coastguard Worker
4891*6777b538SAndroid Build Coastguard Worker return std::invoke(comp, std::invoke(proj, hi), projected_v) ? hi : v;
4892*6777b538SAndroid Build Coastguard Worker }
4893*6777b538SAndroid Build Coastguard Worker
4894*6777b538SAndroid Build Coastguard Worker // [alg.lex.comparison] Lexicographical comparison
4895*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.lex.comparison
4896*6777b538SAndroid Build Coastguard Worker
4897*6777b538SAndroid Build Coastguard Worker // Returns: `true` if and only if the sequence of elements defined by the range
4898*6777b538SAndroid Build Coastguard Worker // `[first1, last1)` is lexicographically less than the sequence of elements
4899*6777b538SAndroid Build Coastguard Worker // defined by the range `[first2, last2)`.
4900*6777b538SAndroid Build Coastguard Worker //
4901*6777b538SAndroid Build Coastguard Worker // Complexity: At most `2 min(last1 - first1, last2 - first2)` applications of
4902*6777b538SAndroid Build Coastguard Worker // the corresponding comparison and each projection, if any.
4903*6777b538SAndroid Build Coastguard Worker //
4904*6777b538SAndroid Build Coastguard Worker // Remarks: If two sequences have the same number of elements and their
4905*6777b538SAndroid Build Coastguard Worker // corresponding elements (if any) are equivalent, then neither sequence is
4906*6777b538SAndroid Build Coastguard Worker // lexicographically less than the other. If one sequence is a proper prefix of
4907*6777b538SAndroid Build Coastguard Worker // the other, then the shorter sequence is lexicographically less than the
4908*6777b538SAndroid Build Coastguard Worker // longer sequence. Otherwise, the lexicographical comparison of the sequences
4909*6777b538SAndroid Build Coastguard Worker // yields the same result as the comparison of the first corresponding pair of
4910*6777b538SAndroid Build Coastguard Worker // elements that are not equivalent.
4911*6777b538SAndroid Build Coastguard Worker //
4912*6777b538SAndroid Build Coastguard Worker // Reference:
4913*6777b538SAndroid Build Coastguard Worker // https://wg21.link/alg.lex.comparison#:~:text=lexicographical_compare(I1
4914*6777b538SAndroid Build Coastguard Worker template <
4915*6777b538SAndroid Build Coastguard Worker typename ForwardIterator1,
4916*6777b538SAndroid Build Coastguard Worker typename ForwardIterator2,
4917*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4918*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
4919*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
4920*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator1>,
4921*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<ForwardIterator2>,
4922*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
4923*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator1, Proj1>,
4924*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator2, Proj2>>,
4925*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
4926*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator2, Proj2>,
4927*6777b538SAndroid Build Coastguard Worker std::projected<ForwardIterator1, Proj1>>>
4928*6777b538SAndroid Build Coastguard Worker constexpr bool lexicographical_compare(ForwardIterator1 first1,
4929*6777b538SAndroid Build Coastguard Worker ForwardIterator1 last1,
4930*6777b538SAndroid Build Coastguard Worker ForwardIterator2 first2,
4931*6777b538SAndroid Build Coastguard Worker ForwardIterator2 last2,
4932*6777b538SAndroid Build Coastguard Worker Comp comp = {},
4933*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
4934*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
4935*6777b538SAndroid Build Coastguard Worker for (; first1 != last1 && first2 != last2; ++first1, ++first2) {
4936*6777b538SAndroid Build Coastguard Worker auto&& projected_first1 = std::invoke(proj1, *first1);
4937*6777b538SAndroid Build Coastguard Worker auto&& projected_first2 = std::invoke(proj2, *first2);
4938*6777b538SAndroid Build Coastguard Worker if (std::invoke(comp, projected_first1, projected_first2)) {
4939*6777b538SAndroid Build Coastguard Worker return true;
4940*6777b538SAndroid Build Coastguard Worker }
4941*6777b538SAndroid Build Coastguard Worker if (std::invoke(comp, projected_first2, projected_first1)) {
4942*6777b538SAndroid Build Coastguard Worker return false;
4943*6777b538SAndroid Build Coastguard Worker }
4944*6777b538SAndroid Build Coastguard Worker }
4945*6777b538SAndroid Build Coastguard Worker
4946*6777b538SAndroid Build Coastguard Worker // `first2 != last2` is equivalent to `first1 == last1 && first2 != last2`
4947*6777b538SAndroid Build Coastguard Worker // here, since we broke out of the loop above.
4948*6777b538SAndroid Build Coastguard Worker return first2 != last2;
4949*6777b538SAndroid Build Coastguard Worker }
4950*6777b538SAndroid Build Coastguard Worker
4951*6777b538SAndroid Build Coastguard Worker // Returns: `true` if and only if the sequence of elements defined by `range1`
4952*6777b538SAndroid Build Coastguard Worker // is lexicographically less than the sequence of elements defined by `range2`.
4953*6777b538SAndroid Build Coastguard Worker //
4954*6777b538SAndroid Build Coastguard Worker // Complexity: At most `2 min(size(range1), size(range2))` applications of the
4955*6777b538SAndroid Build Coastguard Worker // corresponding comparison and each projection, if any.
4956*6777b538SAndroid Build Coastguard Worker //
4957*6777b538SAndroid Build Coastguard Worker // Remarks: If two sequences have the same number of elements and their
4958*6777b538SAndroid Build Coastguard Worker // corresponding elements (if any) are equivalent, then neither sequence is
4959*6777b538SAndroid Build Coastguard Worker // lexicographically less than the other. If one sequence is a proper prefix of
4960*6777b538SAndroid Build Coastguard Worker // the other, then the shorter sequence is lexicographically less than the
4961*6777b538SAndroid Build Coastguard Worker // longer sequence. Otherwise, the lexicographical comparison of the sequences
4962*6777b538SAndroid Build Coastguard Worker // yields the same result as the comparison of the first corresponding pair of
4963*6777b538SAndroid Build Coastguard Worker // elements that are not equivalent.
4964*6777b538SAndroid Build Coastguard Worker //
4965*6777b538SAndroid Build Coastguard Worker // Reference:
4966*6777b538SAndroid Build Coastguard Worker // https://wg21.link/alg.lex.comparison#:~:text=lexicographical_compare(R1
4967*6777b538SAndroid Build Coastguard Worker template <typename Range1,
4968*6777b538SAndroid Build Coastguard Worker typename Range2,
4969*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
4970*6777b538SAndroid Build Coastguard Worker typename Proj1 = std::identity,
4971*6777b538SAndroid Build Coastguard Worker typename Proj2 = std::identity,
4972*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range1>,
4973*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range2>,
4974*6777b538SAndroid Build Coastguard Worker typename =
4975*6777b538SAndroid Build Coastguard Worker std::indirect_result_t<Comp&,
4976*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range1>, Proj1>,
4977*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range2>, Proj2>>,
4978*6777b538SAndroid Build Coastguard Worker typename =
4979*6777b538SAndroid Build Coastguard Worker std::indirect_result_t<Comp&,
4980*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range2>, Proj2>,
4981*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range1>, Proj1>>>
4982*6777b538SAndroid Build Coastguard Worker constexpr bool lexicographical_compare(Range1&& range1,
4983*6777b538SAndroid Build Coastguard Worker Range2&& range2,
4984*6777b538SAndroid Build Coastguard Worker Comp comp = {},
4985*6777b538SAndroid Build Coastguard Worker Proj1 proj1 = {},
4986*6777b538SAndroid Build Coastguard Worker Proj2 proj2 = {}) {
4987*6777b538SAndroid Build Coastguard Worker return ranges::lexicographical_compare(
4988*6777b538SAndroid Build Coastguard Worker ranges::begin(range1), ranges::end(range1), ranges::begin(range2),
4989*6777b538SAndroid Build Coastguard Worker ranges::end(range2), std::move(comp), std::move(proj1), std::move(proj2));
4990*6777b538SAndroid Build Coastguard Worker }
4991*6777b538SAndroid Build Coastguard Worker
4992*6777b538SAndroid Build Coastguard Worker // [alg.permutation.generators] Permutation generators
4993*6777b538SAndroid Build Coastguard Worker // Reference: https://wg21.link/alg.permutation.generators
4994*6777b538SAndroid Build Coastguard Worker
4995*6777b538SAndroid Build Coastguard Worker // Effects: Takes a sequence defined by the range `[first, last)` and transforms
4996*6777b538SAndroid Build Coastguard Worker // it into the next permutation. The next permutation is found by assuming that
4997*6777b538SAndroid Build Coastguard Worker // the set of all permutations is lexicographically sorted with respect to
4998*6777b538SAndroid Build Coastguard Worker // `comp` and `proj`. If no such permutation exists, transforms the sequence
4999*6777b538SAndroid Build Coastguard Worker // into the first permutation; that is, the ascendingly-sorted one.
5000*6777b538SAndroid Build Coastguard Worker //
5001*6777b538SAndroid Build Coastguard Worker // Returns: `true` if a next permutation was found and otherwise `false`.
5002*6777b538SAndroid Build Coastguard Worker //
5003*6777b538SAndroid Build Coastguard Worker // Complexity: At most `(last - first) / 2` swaps.
5004*6777b538SAndroid Build Coastguard Worker //
5005*6777b538SAndroid Build Coastguard Worker // Reference:
5006*6777b538SAndroid Build Coastguard Worker // https://wg21.link/alg.permutation.generators#:~:text=next_permutation(I
5007*6777b538SAndroid Build Coastguard Worker template <typename BidirectionalIterator,
5008*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
5009*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
5010*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<BidirectionalIterator>,
5011*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<
5012*6777b538SAndroid Build Coastguard Worker Comp&,
5013*6777b538SAndroid Build Coastguard Worker std::projected<BidirectionalIterator, Proj>,
5014*6777b538SAndroid Build Coastguard Worker std::projected<BidirectionalIterator, Proj>>>
5015*6777b538SAndroid Build Coastguard Worker constexpr auto next_permutation(BidirectionalIterator first,
5016*6777b538SAndroid Build Coastguard Worker BidirectionalIterator last,
5017*6777b538SAndroid Build Coastguard Worker Comp comp = {},
5018*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
5019*6777b538SAndroid Build Coastguard Worker return std::next_permutation(
5020*6777b538SAndroid Build Coastguard Worker first, last, internal::ProjectedBinaryPredicate(comp, proj, proj));
5021*6777b538SAndroid Build Coastguard Worker }
5022*6777b538SAndroid Build Coastguard Worker
5023*6777b538SAndroid Build Coastguard Worker // Effects: Takes a sequence defined by `range` and transforms it into the next
5024*6777b538SAndroid Build Coastguard Worker // permutation. The next permutation is found by assuming that the set of all
5025*6777b538SAndroid Build Coastguard Worker // permutations is lexicographically sorted with respect to `comp` and `proj`.
5026*6777b538SAndroid Build Coastguard Worker // If no such permutation exists, transforms the sequence into the first
5027*6777b538SAndroid Build Coastguard Worker // permutation; that is, the ascendingly-sorted one.
5028*6777b538SAndroid Build Coastguard Worker //
5029*6777b538SAndroid Build Coastguard Worker // Returns: `true` if a next permutation was found and otherwise `false`.
5030*6777b538SAndroid Build Coastguard Worker //
5031*6777b538SAndroid Build Coastguard Worker // Complexity: At most `size(range) / 2` swaps.
5032*6777b538SAndroid Build Coastguard Worker //
5033*6777b538SAndroid Build Coastguard Worker // Reference:
5034*6777b538SAndroid Build Coastguard Worker // https://wg21.link/alg.permutation.generators#:~:text=next_permutation(R
5035*6777b538SAndroid Build Coastguard Worker template <
5036*6777b538SAndroid Build Coastguard Worker typename Range,
5037*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
5038*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
5039*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
5040*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
5041*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>,
5042*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>>>
5043*6777b538SAndroid Build Coastguard Worker constexpr auto next_permutation(Range&& range, Comp comp = {}, Proj proj = {}) {
5044*6777b538SAndroid Build Coastguard Worker return ranges::next_permutation(ranges::begin(range), ranges::end(range),
5045*6777b538SAndroid Build Coastguard Worker std::move(comp), std::move(proj));
5046*6777b538SAndroid Build Coastguard Worker }
5047*6777b538SAndroid Build Coastguard Worker
5048*6777b538SAndroid Build Coastguard Worker // Effects: Takes a sequence defined by the range `[first, last)` and transforms
5049*6777b538SAndroid Build Coastguard Worker // it into the previous permutation. The previous permutation is found by
5050*6777b538SAndroid Build Coastguard Worker // assuming that the set of all permutations is lexicographically sorted with
5051*6777b538SAndroid Build Coastguard Worker // respect to `comp` and `proj`. If no such permutation exists, transforms the
5052*6777b538SAndroid Build Coastguard Worker // sequence into the last permutation; that is, the decreasingly-sorted one.
5053*6777b538SAndroid Build Coastguard Worker //
5054*6777b538SAndroid Build Coastguard Worker // Returns: `true` if a next permutation was found and otherwise `false`.
5055*6777b538SAndroid Build Coastguard Worker //
5056*6777b538SAndroid Build Coastguard Worker // Complexity: At most `(last - first) / 2` swaps.
5057*6777b538SAndroid Build Coastguard Worker //
5058*6777b538SAndroid Build Coastguard Worker // Reference:
5059*6777b538SAndroid Build Coastguard Worker // https://wg21.link/alg.permutation.generators#:~:text=prev_permutation(I
5060*6777b538SAndroid Build Coastguard Worker template <typename BidirectionalIterator,
5061*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
5062*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
5063*6777b538SAndroid Build Coastguard Worker typename = internal::iterator_category_t<BidirectionalIterator>,
5064*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<
5065*6777b538SAndroid Build Coastguard Worker Comp&,
5066*6777b538SAndroid Build Coastguard Worker std::projected<BidirectionalIterator, Proj>,
5067*6777b538SAndroid Build Coastguard Worker std::projected<BidirectionalIterator, Proj>>>
5068*6777b538SAndroid Build Coastguard Worker constexpr auto prev_permutation(BidirectionalIterator first,
5069*6777b538SAndroid Build Coastguard Worker BidirectionalIterator last,
5070*6777b538SAndroid Build Coastguard Worker Comp comp = {},
5071*6777b538SAndroid Build Coastguard Worker Proj proj = {}) {
5072*6777b538SAndroid Build Coastguard Worker return std::prev_permutation(
5073*6777b538SAndroid Build Coastguard Worker first, last, internal::ProjectedBinaryPredicate(comp, proj, proj));
5074*6777b538SAndroid Build Coastguard Worker }
5075*6777b538SAndroid Build Coastguard Worker
5076*6777b538SAndroid Build Coastguard Worker // Effects: Takes a sequence defined by `range` and transforms it into the
5077*6777b538SAndroid Build Coastguard Worker // previous permutation. The previous permutation is found by assuming that the
5078*6777b538SAndroid Build Coastguard Worker // set of all permutations is lexicographically sorted with respect to `comp`
5079*6777b538SAndroid Build Coastguard Worker // and `proj`. If no such permutation exists, transforms the sequence into the
5080*6777b538SAndroid Build Coastguard Worker // last permutation; that is, the decreasingly-sorted one.
5081*6777b538SAndroid Build Coastguard Worker //
5082*6777b538SAndroid Build Coastguard Worker // Returns: `true` if a previous permutation was found and otherwise `false`.
5083*6777b538SAndroid Build Coastguard Worker //
5084*6777b538SAndroid Build Coastguard Worker // Complexity: At most `size(range) / 2` swaps.
5085*6777b538SAndroid Build Coastguard Worker //
5086*6777b538SAndroid Build Coastguard Worker // Reference:
5087*6777b538SAndroid Build Coastguard Worker // https://wg21.link/alg.permutation.generators#:~:text=prev_permutation(R
5088*6777b538SAndroid Build Coastguard Worker template <
5089*6777b538SAndroid Build Coastguard Worker typename Range,
5090*6777b538SAndroid Build Coastguard Worker typename Comp = ranges::less,
5091*6777b538SAndroid Build Coastguard Worker typename Proj = std::identity,
5092*6777b538SAndroid Build Coastguard Worker typename = internal::range_category_t<Range>,
5093*6777b538SAndroid Build Coastguard Worker typename = std::indirect_result_t<Comp&,
5094*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>,
5095*6777b538SAndroid Build Coastguard Worker std::projected<iterator_t<Range>, Proj>>>
5096*6777b538SAndroid Build Coastguard Worker constexpr auto prev_permutation(Range&& range, Comp comp = {}, Proj proj = {}) {
5097*6777b538SAndroid Build Coastguard Worker return ranges::prev_permutation(ranges::begin(range), ranges::end(range),
5098*6777b538SAndroid Build Coastguard Worker std::move(comp), std::move(proj));
5099*6777b538SAndroid Build Coastguard Worker }
5100*6777b538SAndroid Build Coastguard Worker
5101*6777b538SAndroid Build Coastguard Worker } // namespace ranges
5102*6777b538SAndroid Build Coastguard Worker
5103*6777b538SAndroid Build Coastguard Worker } // namespace base
5104*6777b538SAndroid Build Coastguard Worker
5105*6777b538SAndroid Build Coastguard Worker #endif // BASE_RANGES_ALGORITHM_H_
5106