xref: /aosp_15_r20/external/abseil-cpp/absl/algorithm/container.h (revision 9356374a3709195abf420251b3e825997ff56c0f)
1*9356374aSAndroid Build Coastguard Worker // Copyright 2017 The Abseil Authors.
2*9356374aSAndroid Build Coastguard Worker //
3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*9356374aSAndroid Build Coastguard Worker //
7*9356374aSAndroid Build Coastguard Worker //      https://www.apache.org/licenses/LICENSE-2.0
8*9356374aSAndroid Build Coastguard Worker //
9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*9356374aSAndroid Build Coastguard Worker // limitations under the License.
14*9356374aSAndroid Build Coastguard Worker //
15*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
16*9356374aSAndroid Build Coastguard Worker // File: container.h
17*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
18*9356374aSAndroid Build Coastguard Worker //
19*9356374aSAndroid Build Coastguard Worker // This header file provides Container-based versions of algorithmic functions
20*9356374aSAndroid Build Coastguard Worker // within the C++ standard library. The following standard library sets of
21*9356374aSAndroid Build Coastguard Worker // functions are covered within this file:
22*9356374aSAndroid Build Coastguard Worker //
23*9356374aSAndroid Build Coastguard Worker //   * Algorithmic <iterator> functions
24*9356374aSAndroid Build Coastguard Worker //   * Algorithmic <numeric> functions
25*9356374aSAndroid Build Coastguard Worker //   * <algorithm> functions
26*9356374aSAndroid Build Coastguard Worker //
27*9356374aSAndroid Build Coastguard Worker // The standard library functions operate on iterator ranges; the functions
28*9356374aSAndroid Build Coastguard Worker // within this API operate on containers, though many return iterator ranges.
29*9356374aSAndroid Build Coastguard Worker //
30*9356374aSAndroid Build Coastguard Worker // All functions within this API are named with a `c_` prefix. Calls such as
31*9356374aSAndroid Build Coastguard Worker // `absl::c_xx(container, ...) are equivalent to std:: functions such as
32*9356374aSAndroid Build Coastguard Worker // `std::xx(std::begin(cont), std::end(cont), ...)`. Functions that act on
33*9356374aSAndroid Build Coastguard Worker // iterators but not conceptually on iterator ranges (e.g. `std::iter_swap`)
34*9356374aSAndroid Build Coastguard Worker // have no equivalent here.
35*9356374aSAndroid Build Coastguard Worker //
36*9356374aSAndroid Build Coastguard Worker // For template parameter and variable naming, `C` indicates the container type
37*9356374aSAndroid Build Coastguard Worker // to which the function is applied, `Pred` indicates the predicate object type
38*9356374aSAndroid Build Coastguard Worker // to be used by the function and `T` indicates the applicable element type.
39*9356374aSAndroid Build Coastguard Worker 
40*9356374aSAndroid Build Coastguard Worker #ifndef ABSL_ALGORITHM_CONTAINER_H_
41*9356374aSAndroid Build Coastguard Worker #define ABSL_ALGORITHM_CONTAINER_H_
42*9356374aSAndroid Build Coastguard Worker 
43*9356374aSAndroid Build Coastguard Worker #include <algorithm>
44*9356374aSAndroid Build Coastguard Worker #include <cassert>
45*9356374aSAndroid Build Coastguard Worker #include <iterator>
46*9356374aSAndroid Build Coastguard Worker #include <numeric>
47*9356374aSAndroid Build Coastguard Worker #include <random>
48*9356374aSAndroid Build Coastguard Worker #include <type_traits>
49*9356374aSAndroid Build Coastguard Worker #include <unordered_map>
50*9356374aSAndroid Build Coastguard Worker #include <unordered_set>
51*9356374aSAndroid Build Coastguard Worker #include <utility>
52*9356374aSAndroid Build Coastguard Worker #include <vector>
53*9356374aSAndroid Build Coastguard Worker 
54*9356374aSAndroid Build Coastguard Worker #include "absl/algorithm/algorithm.h"
55*9356374aSAndroid Build Coastguard Worker #include "absl/base/config.h"
56*9356374aSAndroid Build Coastguard Worker #include "absl/base/macros.h"
57*9356374aSAndroid Build Coastguard Worker #include "absl/base/nullability.h"
58*9356374aSAndroid Build Coastguard Worker #include "absl/meta/type_traits.h"
59*9356374aSAndroid Build Coastguard Worker 
60*9356374aSAndroid Build Coastguard Worker namespace absl {
61*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_BEGIN
62*9356374aSAndroid Build Coastguard Worker namespace container_algorithm_internal {
63*9356374aSAndroid Build Coastguard Worker 
64*9356374aSAndroid Build Coastguard Worker // NOTE: it is important to defer to ADL lookup for building with C++ modules,
65*9356374aSAndroid Build Coastguard Worker // especially for headers like <valarray> which are not visible from this file
66*9356374aSAndroid Build Coastguard Worker // but specialize std::begin and std::end.
67*9356374aSAndroid Build Coastguard Worker using std::begin;
68*9356374aSAndroid Build Coastguard Worker using std::end;
69*9356374aSAndroid Build Coastguard Worker 
70*9356374aSAndroid Build Coastguard Worker // The type of the iterator given by begin(c) (possibly std::begin(c)).
71*9356374aSAndroid Build Coastguard Worker // ContainerIter<const vector<T>> gives vector<T>::const_iterator,
72*9356374aSAndroid Build Coastguard Worker // while ContainerIter<vector<T>> gives vector<T>::iterator.
73*9356374aSAndroid Build Coastguard Worker template <typename C>
74*9356374aSAndroid Build Coastguard Worker using ContainerIter = decltype(begin(std::declval<C&>()));
75*9356374aSAndroid Build Coastguard Worker 
76*9356374aSAndroid Build Coastguard Worker // An MSVC bug involving template parameter substitution requires us to use
77*9356374aSAndroid Build Coastguard Worker // decltype() here instead of just std::pair.
78*9356374aSAndroid Build Coastguard Worker template <typename C1, typename C2>
79*9356374aSAndroid Build Coastguard Worker using ContainerIterPairType =
80*9356374aSAndroid Build Coastguard Worker     decltype(std::make_pair(ContainerIter<C1>(), ContainerIter<C2>()));
81*9356374aSAndroid Build Coastguard Worker 
82*9356374aSAndroid Build Coastguard Worker template <typename C>
83*9356374aSAndroid Build Coastguard Worker using ContainerDifferenceType = decltype(std::distance(
84*9356374aSAndroid Build Coastguard Worker     std::declval<ContainerIter<C>>(), std::declval<ContainerIter<C>>()));
85*9356374aSAndroid Build Coastguard Worker 
86*9356374aSAndroid Build Coastguard Worker template <typename C>
87*9356374aSAndroid Build Coastguard Worker using ContainerPointerType =
88*9356374aSAndroid Build Coastguard Worker     typename std::iterator_traits<ContainerIter<C>>::pointer;
89*9356374aSAndroid Build Coastguard Worker 
90*9356374aSAndroid Build Coastguard Worker // container_algorithm_internal::c_begin and
91*9356374aSAndroid Build Coastguard Worker // container_algorithm_internal::c_end are abbreviations for proper ADL
92*9356374aSAndroid Build Coastguard Worker // lookup of std::begin and std::end, i.e.
93*9356374aSAndroid Build Coastguard Worker //   using std::begin;
94*9356374aSAndroid Build Coastguard Worker //   using std::end;
95*9356374aSAndroid Build Coastguard Worker //   std::foo(begin(c), end(c));
96*9356374aSAndroid Build Coastguard Worker // becomes
97*9356374aSAndroid Build Coastguard Worker //   std::foo(container_algorithm_internal::c_begin(c),
98*9356374aSAndroid Build Coastguard Worker //            container_algorithm_internal::c_end(c));
99*9356374aSAndroid Build Coastguard Worker // These are meant for internal use only.
100*9356374aSAndroid Build Coastguard Worker 
101*9356374aSAndroid Build Coastguard Worker template <typename C>
c_begin(C & c)102*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_CONSTEXPR_SINCE_CXX17 ContainerIter<C> c_begin(C& c) {
103*9356374aSAndroid Build Coastguard Worker   return begin(c);
104*9356374aSAndroid Build Coastguard Worker }
105*9356374aSAndroid Build Coastguard Worker 
106*9356374aSAndroid Build Coastguard Worker template <typename C>
c_end(C & c)107*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_CONSTEXPR_SINCE_CXX17 ContainerIter<C> c_end(C& c) {
108*9356374aSAndroid Build Coastguard Worker   return end(c);
109*9356374aSAndroid Build Coastguard Worker }
110*9356374aSAndroid Build Coastguard Worker 
111*9356374aSAndroid Build Coastguard Worker template <typename T>
112*9356374aSAndroid Build Coastguard Worker struct IsUnorderedContainer : std::false_type {};
113*9356374aSAndroid Build Coastguard Worker 
114*9356374aSAndroid Build Coastguard Worker template <class Key, class T, class Hash, class KeyEqual, class Allocator>
115*9356374aSAndroid Build Coastguard Worker struct IsUnorderedContainer<
116*9356374aSAndroid Build Coastguard Worker     std::unordered_map<Key, T, Hash, KeyEqual, Allocator>> : std::true_type {};
117*9356374aSAndroid Build Coastguard Worker 
118*9356374aSAndroid Build Coastguard Worker template <class Key, class Hash, class KeyEqual, class Allocator>
119*9356374aSAndroid Build Coastguard Worker struct IsUnorderedContainer<std::unordered_set<Key, Hash, KeyEqual, Allocator>>
120*9356374aSAndroid Build Coastguard Worker     : std::true_type {};
121*9356374aSAndroid Build Coastguard Worker 
122*9356374aSAndroid Build Coastguard Worker }  // namespace container_algorithm_internal
123*9356374aSAndroid Build Coastguard Worker 
124*9356374aSAndroid Build Coastguard Worker // PUBLIC API
125*9356374aSAndroid Build Coastguard Worker 
126*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
127*9356374aSAndroid Build Coastguard Worker // Abseil algorithm.h functions
128*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
129*9356374aSAndroid Build Coastguard Worker 
130*9356374aSAndroid Build Coastguard Worker // c_linear_search()
131*9356374aSAndroid Build Coastguard Worker //
132*9356374aSAndroid Build Coastguard Worker // Container-based version of absl::linear_search() for performing a linear
133*9356374aSAndroid Build Coastguard Worker // search within a container.
134*9356374aSAndroid Build Coastguard Worker template <typename C, typename EqualityComparable>
135*9356374aSAndroid Build Coastguard Worker bool c_linear_search(const C& c, EqualityComparable&& value) {
136*9356374aSAndroid Build Coastguard Worker   return linear_search(container_algorithm_internal::c_begin(c),
137*9356374aSAndroid Build Coastguard Worker                        container_algorithm_internal::c_end(c),
138*9356374aSAndroid Build Coastguard Worker                        std::forward<EqualityComparable>(value));
139*9356374aSAndroid Build Coastguard Worker }
140*9356374aSAndroid Build Coastguard Worker 
141*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
142*9356374aSAndroid Build Coastguard Worker // <iterator> algorithms
143*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
144*9356374aSAndroid Build Coastguard Worker 
145*9356374aSAndroid Build Coastguard Worker // c_distance()
146*9356374aSAndroid Build Coastguard Worker //
147*9356374aSAndroid Build Coastguard Worker // Container-based version of the <iterator> `std::distance()` function to
148*9356374aSAndroid Build Coastguard Worker // return the number of elements within a container.
149*9356374aSAndroid Build Coastguard Worker template <typename C>
150*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_CONSTEXPR_SINCE_CXX17
151*9356374aSAndroid Build Coastguard Worker     container_algorithm_internal::ContainerDifferenceType<const C>
152*9356374aSAndroid Build Coastguard Worker     c_distance(const C& c) {
153*9356374aSAndroid Build Coastguard Worker   return std::distance(container_algorithm_internal::c_begin(c),
154*9356374aSAndroid Build Coastguard Worker                        container_algorithm_internal::c_end(c));
155*9356374aSAndroid Build Coastguard Worker }
156*9356374aSAndroid Build Coastguard Worker 
157*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
158*9356374aSAndroid Build Coastguard Worker // <algorithm> Non-modifying sequence operations
159*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
160*9356374aSAndroid Build Coastguard Worker 
161*9356374aSAndroid Build Coastguard Worker // c_all_of()
162*9356374aSAndroid Build Coastguard Worker //
163*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::all_of()` function to
164*9356374aSAndroid Build Coastguard Worker // test if all elements within a container satisfy a condition.
165*9356374aSAndroid Build Coastguard Worker template <typename C, typename Pred>
166*9356374aSAndroid Build Coastguard Worker bool c_all_of(const C& c, Pred&& pred) {
167*9356374aSAndroid Build Coastguard Worker   return std::all_of(container_algorithm_internal::c_begin(c),
168*9356374aSAndroid Build Coastguard Worker                      container_algorithm_internal::c_end(c),
169*9356374aSAndroid Build Coastguard Worker                      std::forward<Pred>(pred));
170*9356374aSAndroid Build Coastguard Worker }
171*9356374aSAndroid Build Coastguard Worker 
172*9356374aSAndroid Build Coastguard Worker // c_any_of()
173*9356374aSAndroid Build Coastguard Worker //
174*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::any_of()` function to
175*9356374aSAndroid Build Coastguard Worker // test if any element in a container fulfills a condition.
176*9356374aSAndroid Build Coastguard Worker template <typename C, typename Pred>
177*9356374aSAndroid Build Coastguard Worker bool c_any_of(const C& c, Pred&& pred) {
178*9356374aSAndroid Build Coastguard Worker   return std::any_of(container_algorithm_internal::c_begin(c),
179*9356374aSAndroid Build Coastguard Worker                      container_algorithm_internal::c_end(c),
180*9356374aSAndroid Build Coastguard Worker                      std::forward<Pred>(pred));
181*9356374aSAndroid Build Coastguard Worker }
182*9356374aSAndroid Build Coastguard Worker 
183*9356374aSAndroid Build Coastguard Worker // c_none_of()
184*9356374aSAndroid Build Coastguard Worker //
185*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::none_of()` function to
186*9356374aSAndroid Build Coastguard Worker // test if no elements in a container fulfill a condition.
187*9356374aSAndroid Build Coastguard Worker template <typename C, typename Pred>
188*9356374aSAndroid Build Coastguard Worker bool c_none_of(const C& c, Pred&& pred) {
189*9356374aSAndroid Build Coastguard Worker   return std::none_of(container_algorithm_internal::c_begin(c),
190*9356374aSAndroid Build Coastguard Worker                       container_algorithm_internal::c_end(c),
191*9356374aSAndroid Build Coastguard Worker                       std::forward<Pred>(pred));
192*9356374aSAndroid Build Coastguard Worker }
193*9356374aSAndroid Build Coastguard Worker 
194*9356374aSAndroid Build Coastguard Worker // c_for_each()
195*9356374aSAndroid Build Coastguard Worker //
196*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::for_each()` function to
197*9356374aSAndroid Build Coastguard Worker // apply a function to a container's elements.
198*9356374aSAndroid Build Coastguard Worker template <typename C, typename Function>
199*9356374aSAndroid Build Coastguard Worker decay_t<Function> c_for_each(C&& c, Function&& f) {
200*9356374aSAndroid Build Coastguard Worker   return std::for_each(container_algorithm_internal::c_begin(c),
201*9356374aSAndroid Build Coastguard Worker                        container_algorithm_internal::c_end(c),
202*9356374aSAndroid Build Coastguard Worker                        std::forward<Function>(f));
203*9356374aSAndroid Build Coastguard Worker }
204*9356374aSAndroid Build Coastguard Worker 
205*9356374aSAndroid Build Coastguard Worker // c_find()
206*9356374aSAndroid Build Coastguard Worker //
207*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::find()` function to find
208*9356374aSAndroid Build Coastguard Worker // the first element containing the passed value within a container value.
209*9356374aSAndroid Build Coastguard Worker template <typename C, typename T>
210*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<C> c_find(C& c, T&& value) {
211*9356374aSAndroid Build Coastguard Worker   return std::find(container_algorithm_internal::c_begin(c),
212*9356374aSAndroid Build Coastguard Worker                    container_algorithm_internal::c_end(c),
213*9356374aSAndroid Build Coastguard Worker                    std::forward<T>(value));
214*9356374aSAndroid Build Coastguard Worker }
215*9356374aSAndroid Build Coastguard Worker 
216*9356374aSAndroid Build Coastguard Worker // c_contains()
217*9356374aSAndroid Build Coastguard Worker //
218*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::ranges::contains()` C++23
219*9356374aSAndroid Build Coastguard Worker // function to search a container for a value.
220*9356374aSAndroid Build Coastguard Worker template <typename Sequence, typename T>
221*9356374aSAndroid Build Coastguard Worker bool c_contains(const Sequence& sequence, T&& value) {
222*9356374aSAndroid Build Coastguard Worker   return absl::c_find(sequence, std::forward<T>(value)) !=
223*9356374aSAndroid Build Coastguard Worker          container_algorithm_internal::c_end(sequence);
224*9356374aSAndroid Build Coastguard Worker }
225*9356374aSAndroid Build Coastguard Worker 
226*9356374aSAndroid Build Coastguard Worker // c_find_if()
227*9356374aSAndroid Build Coastguard Worker //
228*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::find_if()` function to find
229*9356374aSAndroid Build Coastguard Worker // the first element in a container matching the given condition.
230*9356374aSAndroid Build Coastguard Worker template <typename C, typename Pred>
231*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<C> c_find_if(C& c, Pred&& pred) {
232*9356374aSAndroid Build Coastguard Worker   return std::find_if(container_algorithm_internal::c_begin(c),
233*9356374aSAndroid Build Coastguard Worker                       container_algorithm_internal::c_end(c),
234*9356374aSAndroid Build Coastguard Worker                       std::forward<Pred>(pred));
235*9356374aSAndroid Build Coastguard Worker }
236*9356374aSAndroid Build Coastguard Worker 
237*9356374aSAndroid Build Coastguard Worker // c_find_if_not()
238*9356374aSAndroid Build Coastguard Worker //
239*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::find_if_not()` function to
240*9356374aSAndroid Build Coastguard Worker // find the first element in a container not matching the given condition.
241*9356374aSAndroid Build Coastguard Worker template <typename C, typename Pred>
242*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<C> c_find_if_not(C& c,
243*9356374aSAndroid Build Coastguard Worker                                                              Pred&& pred) {
244*9356374aSAndroid Build Coastguard Worker   return std::find_if_not(container_algorithm_internal::c_begin(c),
245*9356374aSAndroid Build Coastguard Worker                           container_algorithm_internal::c_end(c),
246*9356374aSAndroid Build Coastguard Worker                           std::forward<Pred>(pred));
247*9356374aSAndroid Build Coastguard Worker }
248*9356374aSAndroid Build Coastguard Worker 
249*9356374aSAndroid Build Coastguard Worker // c_find_end()
250*9356374aSAndroid Build Coastguard Worker //
251*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::find_end()` function to
252*9356374aSAndroid Build Coastguard Worker // find the last subsequence within a container.
253*9356374aSAndroid Build Coastguard Worker template <typename Sequence1, typename Sequence2>
254*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<Sequence1> c_find_end(
255*9356374aSAndroid Build Coastguard Worker     Sequence1& sequence, Sequence2& subsequence) {
256*9356374aSAndroid Build Coastguard Worker   return std::find_end(container_algorithm_internal::c_begin(sequence),
257*9356374aSAndroid Build Coastguard Worker                        container_algorithm_internal::c_end(sequence),
258*9356374aSAndroid Build Coastguard Worker                        container_algorithm_internal::c_begin(subsequence),
259*9356374aSAndroid Build Coastguard Worker                        container_algorithm_internal::c_end(subsequence));
260*9356374aSAndroid Build Coastguard Worker }
261*9356374aSAndroid Build Coastguard Worker 
262*9356374aSAndroid Build Coastguard Worker // Overload of c_find_end() for using a predicate evaluation other than `==` as
263*9356374aSAndroid Build Coastguard Worker // the function's test condition.
264*9356374aSAndroid Build Coastguard Worker template <typename Sequence1, typename Sequence2, typename BinaryPredicate>
265*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<Sequence1> c_find_end(
266*9356374aSAndroid Build Coastguard Worker     Sequence1& sequence, Sequence2& subsequence, BinaryPredicate&& pred) {
267*9356374aSAndroid Build Coastguard Worker   return std::find_end(container_algorithm_internal::c_begin(sequence),
268*9356374aSAndroid Build Coastguard Worker                        container_algorithm_internal::c_end(sequence),
269*9356374aSAndroid Build Coastguard Worker                        container_algorithm_internal::c_begin(subsequence),
270*9356374aSAndroid Build Coastguard Worker                        container_algorithm_internal::c_end(subsequence),
271*9356374aSAndroid Build Coastguard Worker                        std::forward<BinaryPredicate>(pred));
272*9356374aSAndroid Build Coastguard Worker }
273*9356374aSAndroid Build Coastguard Worker 
274*9356374aSAndroid Build Coastguard Worker // c_find_first_of()
275*9356374aSAndroid Build Coastguard Worker //
276*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::find_first_of()` function to
277*9356374aSAndroid Build Coastguard Worker // find the first element within the container that is also within the options
278*9356374aSAndroid Build Coastguard Worker // container.
279*9356374aSAndroid Build Coastguard Worker template <typename C1, typename C2>
280*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<C1> c_find_first_of(C1& container,
281*9356374aSAndroid Build Coastguard Worker                                                                 C2& options) {
282*9356374aSAndroid Build Coastguard Worker   return std::find_first_of(container_algorithm_internal::c_begin(container),
283*9356374aSAndroid Build Coastguard Worker                             container_algorithm_internal::c_end(container),
284*9356374aSAndroid Build Coastguard Worker                             container_algorithm_internal::c_begin(options),
285*9356374aSAndroid Build Coastguard Worker                             container_algorithm_internal::c_end(options));
286*9356374aSAndroid Build Coastguard Worker }
287*9356374aSAndroid Build Coastguard Worker 
288*9356374aSAndroid Build Coastguard Worker // Overload of c_find_first_of() for using a predicate evaluation other than
289*9356374aSAndroid Build Coastguard Worker // `==` as the function's test condition.
290*9356374aSAndroid Build Coastguard Worker template <typename C1, typename C2, typename BinaryPredicate>
291*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<C1> c_find_first_of(
292*9356374aSAndroid Build Coastguard Worker     C1& container, C2& options, BinaryPredicate&& pred) {
293*9356374aSAndroid Build Coastguard Worker   return std::find_first_of(container_algorithm_internal::c_begin(container),
294*9356374aSAndroid Build Coastguard Worker                             container_algorithm_internal::c_end(container),
295*9356374aSAndroid Build Coastguard Worker                             container_algorithm_internal::c_begin(options),
296*9356374aSAndroid Build Coastguard Worker                             container_algorithm_internal::c_end(options),
297*9356374aSAndroid Build Coastguard Worker                             std::forward<BinaryPredicate>(pred));
298*9356374aSAndroid Build Coastguard Worker }
299*9356374aSAndroid Build Coastguard Worker 
300*9356374aSAndroid Build Coastguard Worker // c_adjacent_find()
301*9356374aSAndroid Build Coastguard Worker //
302*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::adjacent_find()` function to
303*9356374aSAndroid Build Coastguard Worker // find equal adjacent elements within a container.
304*9356374aSAndroid Build Coastguard Worker template <typename Sequence>
305*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<Sequence> c_adjacent_find(
306*9356374aSAndroid Build Coastguard Worker     Sequence& sequence) {
307*9356374aSAndroid Build Coastguard Worker   return std::adjacent_find(container_algorithm_internal::c_begin(sequence),
308*9356374aSAndroid Build Coastguard Worker                             container_algorithm_internal::c_end(sequence));
309*9356374aSAndroid Build Coastguard Worker }
310*9356374aSAndroid Build Coastguard Worker 
311*9356374aSAndroid Build Coastguard Worker // Overload of c_adjacent_find() for using a predicate evaluation other than
312*9356374aSAndroid Build Coastguard Worker // `==` as the function's test condition.
313*9356374aSAndroid Build Coastguard Worker template <typename Sequence, typename BinaryPredicate>
314*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<Sequence> c_adjacent_find(
315*9356374aSAndroid Build Coastguard Worker     Sequence& sequence, BinaryPredicate&& pred) {
316*9356374aSAndroid Build Coastguard Worker   return std::adjacent_find(container_algorithm_internal::c_begin(sequence),
317*9356374aSAndroid Build Coastguard Worker                             container_algorithm_internal::c_end(sequence),
318*9356374aSAndroid Build Coastguard Worker                             std::forward<BinaryPredicate>(pred));
319*9356374aSAndroid Build Coastguard Worker }
320*9356374aSAndroid Build Coastguard Worker 
321*9356374aSAndroid Build Coastguard Worker // c_count()
322*9356374aSAndroid Build Coastguard Worker //
323*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::count()` function to count
324*9356374aSAndroid Build Coastguard Worker // values that match within a container.
325*9356374aSAndroid Build Coastguard Worker template <typename C, typename T>
326*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerDifferenceType<const C> c_count(
327*9356374aSAndroid Build Coastguard Worker     const C& c, T&& value) {
328*9356374aSAndroid Build Coastguard Worker   return std::count(container_algorithm_internal::c_begin(c),
329*9356374aSAndroid Build Coastguard Worker                     container_algorithm_internal::c_end(c),
330*9356374aSAndroid Build Coastguard Worker                     std::forward<T>(value));
331*9356374aSAndroid Build Coastguard Worker }
332*9356374aSAndroid Build Coastguard Worker 
333*9356374aSAndroid Build Coastguard Worker // c_count_if()
334*9356374aSAndroid Build Coastguard Worker //
335*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::count_if()` function to
336*9356374aSAndroid Build Coastguard Worker // count values matching a condition within a container.
337*9356374aSAndroid Build Coastguard Worker template <typename C, typename Pred>
338*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerDifferenceType<const C> c_count_if(
339*9356374aSAndroid Build Coastguard Worker     const C& c, Pred&& pred) {
340*9356374aSAndroid Build Coastguard Worker   return std::count_if(container_algorithm_internal::c_begin(c),
341*9356374aSAndroid Build Coastguard Worker                        container_algorithm_internal::c_end(c),
342*9356374aSAndroid Build Coastguard Worker                        std::forward<Pred>(pred));
343*9356374aSAndroid Build Coastguard Worker }
344*9356374aSAndroid Build Coastguard Worker 
345*9356374aSAndroid Build Coastguard Worker // c_mismatch()
346*9356374aSAndroid Build Coastguard Worker //
347*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::mismatch()` function to
348*9356374aSAndroid Build Coastguard Worker // return the first element where two ordered containers differ. Applies `==` to
349*9356374aSAndroid Build Coastguard Worker // the first N elements of `c1` and `c2`, where N = min(size(c1), size(c2)).
350*9356374aSAndroid Build Coastguard Worker template <typename C1, typename C2>
351*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIterPairType<C1, C2> c_mismatch(C1& c1,
352*9356374aSAndroid Build Coastguard Worker                                                                        C2& c2) {
353*9356374aSAndroid Build Coastguard Worker   return std::mismatch(container_algorithm_internal::c_begin(c1),
354*9356374aSAndroid Build Coastguard Worker                        container_algorithm_internal::c_end(c1),
355*9356374aSAndroid Build Coastguard Worker                        container_algorithm_internal::c_begin(c2),
356*9356374aSAndroid Build Coastguard Worker                        container_algorithm_internal::c_end(c2));
357*9356374aSAndroid Build Coastguard Worker }
358*9356374aSAndroid Build Coastguard Worker 
359*9356374aSAndroid Build Coastguard Worker // Overload of c_mismatch() for using a predicate evaluation other than `==` as
360*9356374aSAndroid Build Coastguard Worker // the function's test condition. Applies `pred`to the first N elements of `c1`
361*9356374aSAndroid Build Coastguard Worker // and `c2`, where N = min(size(c1), size(c2)).
362*9356374aSAndroid Build Coastguard Worker template <typename C1, typename C2, typename BinaryPredicate>
363*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIterPairType<C1, C2> c_mismatch(
364*9356374aSAndroid Build Coastguard Worker     C1& c1, C2& c2, BinaryPredicate pred) {
365*9356374aSAndroid Build Coastguard Worker   return std::mismatch(container_algorithm_internal::c_begin(c1),
366*9356374aSAndroid Build Coastguard Worker                        container_algorithm_internal::c_end(c1),
367*9356374aSAndroid Build Coastguard Worker                        container_algorithm_internal::c_begin(c2),
368*9356374aSAndroid Build Coastguard Worker                        container_algorithm_internal::c_end(c2), pred);
369*9356374aSAndroid Build Coastguard Worker }
370*9356374aSAndroid Build Coastguard Worker 
371*9356374aSAndroid Build Coastguard Worker // c_equal()
372*9356374aSAndroid Build Coastguard Worker //
373*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::equal()` function to
374*9356374aSAndroid Build Coastguard Worker // test whether two containers are equal.
375*9356374aSAndroid Build Coastguard Worker template <typename C1, typename C2>
376*9356374aSAndroid Build Coastguard Worker bool c_equal(const C1& c1, const C2& c2) {
377*9356374aSAndroid Build Coastguard Worker   return std::equal(container_algorithm_internal::c_begin(c1),
378*9356374aSAndroid Build Coastguard Worker                     container_algorithm_internal::c_end(c1),
379*9356374aSAndroid Build Coastguard Worker                     container_algorithm_internal::c_begin(c2),
380*9356374aSAndroid Build Coastguard Worker                     container_algorithm_internal::c_end(c2));
381*9356374aSAndroid Build Coastguard Worker }
382*9356374aSAndroid Build Coastguard Worker 
383*9356374aSAndroid Build Coastguard Worker // Overload of c_equal() for using a predicate evaluation other than `==` as
384*9356374aSAndroid Build Coastguard Worker // the function's test condition.
385*9356374aSAndroid Build Coastguard Worker template <typename C1, typename C2, typename BinaryPredicate>
386*9356374aSAndroid Build Coastguard Worker bool c_equal(const C1& c1, const C2& c2, BinaryPredicate&& pred) {
387*9356374aSAndroid Build Coastguard Worker   return std::equal(container_algorithm_internal::c_begin(c1),
388*9356374aSAndroid Build Coastguard Worker                     container_algorithm_internal::c_end(c1),
389*9356374aSAndroid Build Coastguard Worker                     container_algorithm_internal::c_begin(c2),
390*9356374aSAndroid Build Coastguard Worker                     container_algorithm_internal::c_end(c2),
391*9356374aSAndroid Build Coastguard Worker                     std::forward<BinaryPredicate>(pred));
392*9356374aSAndroid Build Coastguard Worker }
393*9356374aSAndroid Build Coastguard Worker 
394*9356374aSAndroid Build Coastguard Worker // c_is_permutation()
395*9356374aSAndroid Build Coastguard Worker //
396*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::is_permutation()` function
397*9356374aSAndroid Build Coastguard Worker // to test whether a container is a permutation of another.
398*9356374aSAndroid Build Coastguard Worker template <typename C1, typename C2>
399*9356374aSAndroid Build Coastguard Worker bool c_is_permutation(const C1& c1, const C2& c2) {
400*9356374aSAndroid Build Coastguard Worker   return std::is_permutation(container_algorithm_internal::c_begin(c1),
401*9356374aSAndroid Build Coastguard Worker                              container_algorithm_internal::c_end(c1),
402*9356374aSAndroid Build Coastguard Worker                              container_algorithm_internal::c_begin(c2),
403*9356374aSAndroid Build Coastguard Worker                              container_algorithm_internal::c_end(c2));
404*9356374aSAndroid Build Coastguard Worker }
405*9356374aSAndroid Build Coastguard Worker 
406*9356374aSAndroid Build Coastguard Worker // Overload of c_is_permutation() for using a predicate evaluation other than
407*9356374aSAndroid Build Coastguard Worker // `==` as the function's test condition.
408*9356374aSAndroid Build Coastguard Worker template <typename C1, typename C2, typename BinaryPredicate>
409*9356374aSAndroid Build Coastguard Worker bool c_is_permutation(const C1& c1, const C2& c2, BinaryPredicate&& pred) {
410*9356374aSAndroid Build Coastguard Worker   return std::is_permutation(container_algorithm_internal::c_begin(c1),
411*9356374aSAndroid Build Coastguard Worker                              container_algorithm_internal::c_end(c1),
412*9356374aSAndroid Build Coastguard Worker                              container_algorithm_internal::c_begin(c2),
413*9356374aSAndroid Build Coastguard Worker                              container_algorithm_internal::c_end(c2),
414*9356374aSAndroid Build Coastguard Worker                              std::forward<BinaryPredicate>(pred));
415*9356374aSAndroid Build Coastguard Worker }
416*9356374aSAndroid Build Coastguard Worker 
417*9356374aSAndroid Build Coastguard Worker // c_search()
418*9356374aSAndroid Build Coastguard Worker //
419*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::search()` function to search
420*9356374aSAndroid Build Coastguard Worker // a container for a subsequence.
421*9356374aSAndroid Build Coastguard Worker template <typename Sequence1, typename Sequence2>
422*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<Sequence1> c_search(
423*9356374aSAndroid Build Coastguard Worker     Sequence1& sequence, Sequence2& subsequence) {
424*9356374aSAndroid Build Coastguard Worker   return std::search(container_algorithm_internal::c_begin(sequence),
425*9356374aSAndroid Build Coastguard Worker                      container_algorithm_internal::c_end(sequence),
426*9356374aSAndroid Build Coastguard Worker                      container_algorithm_internal::c_begin(subsequence),
427*9356374aSAndroid Build Coastguard Worker                      container_algorithm_internal::c_end(subsequence));
428*9356374aSAndroid Build Coastguard Worker }
429*9356374aSAndroid Build Coastguard Worker 
430*9356374aSAndroid Build Coastguard Worker // Overload of c_search() for using a predicate evaluation other than
431*9356374aSAndroid Build Coastguard Worker // `==` as the function's test condition.
432*9356374aSAndroid Build Coastguard Worker template <typename Sequence1, typename Sequence2, typename BinaryPredicate>
433*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<Sequence1> c_search(
434*9356374aSAndroid Build Coastguard Worker     Sequence1& sequence, Sequence2& subsequence, BinaryPredicate&& pred) {
435*9356374aSAndroid Build Coastguard Worker   return std::search(container_algorithm_internal::c_begin(sequence),
436*9356374aSAndroid Build Coastguard Worker                      container_algorithm_internal::c_end(sequence),
437*9356374aSAndroid Build Coastguard Worker                      container_algorithm_internal::c_begin(subsequence),
438*9356374aSAndroid Build Coastguard Worker                      container_algorithm_internal::c_end(subsequence),
439*9356374aSAndroid Build Coastguard Worker                      std::forward<BinaryPredicate>(pred));
440*9356374aSAndroid Build Coastguard Worker }
441*9356374aSAndroid Build Coastguard Worker 
442*9356374aSAndroid Build Coastguard Worker // c_contains_subrange()
443*9356374aSAndroid Build Coastguard Worker //
444*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::ranges::contains_subrange()`
445*9356374aSAndroid Build Coastguard Worker // C++23 function to search a container for a subsequence.
446*9356374aSAndroid Build Coastguard Worker template <typename Sequence1, typename Sequence2>
447*9356374aSAndroid Build Coastguard Worker bool c_contains_subrange(Sequence1& sequence, Sequence2& subsequence) {
448*9356374aSAndroid Build Coastguard Worker   return absl::c_search(sequence, subsequence) !=
449*9356374aSAndroid Build Coastguard Worker          container_algorithm_internal::c_end(sequence);
450*9356374aSAndroid Build Coastguard Worker }
451*9356374aSAndroid Build Coastguard Worker 
452*9356374aSAndroid Build Coastguard Worker // Overload of c_contains_subrange() for using a predicate evaluation other than
453*9356374aSAndroid Build Coastguard Worker // `==` as the function's test condition.
454*9356374aSAndroid Build Coastguard Worker template <typename Sequence1, typename Sequence2, typename BinaryPredicate>
455*9356374aSAndroid Build Coastguard Worker bool c_contains_subrange(Sequence1& sequence, Sequence2& subsequence,
456*9356374aSAndroid Build Coastguard Worker                          BinaryPredicate&& pred) {
457*9356374aSAndroid Build Coastguard Worker   return absl::c_search(sequence, subsequence,
458*9356374aSAndroid Build Coastguard Worker                         std::forward<BinaryPredicate>(pred)) !=
459*9356374aSAndroid Build Coastguard Worker          container_algorithm_internal::c_end(sequence);
460*9356374aSAndroid Build Coastguard Worker }
461*9356374aSAndroid Build Coastguard Worker 
462*9356374aSAndroid Build Coastguard Worker // c_search_n()
463*9356374aSAndroid Build Coastguard Worker //
464*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::search_n()` function to
465*9356374aSAndroid Build Coastguard Worker // search a container for the first sequence of N elements.
466*9356374aSAndroid Build Coastguard Worker template <typename Sequence, typename Size, typename T>
467*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<Sequence> c_search_n(
468*9356374aSAndroid Build Coastguard Worker     Sequence& sequence, Size count, T&& value) {
469*9356374aSAndroid Build Coastguard Worker   return std::search_n(container_algorithm_internal::c_begin(sequence),
470*9356374aSAndroid Build Coastguard Worker                        container_algorithm_internal::c_end(sequence), count,
471*9356374aSAndroid Build Coastguard Worker                        std::forward<T>(value));
472*9356374aSAndroid Build Coastguard Worker }
473*9356374aSAndroid Build Coastguard Worker 
474*9356374aSAndroid Build Coastguard Worker // Overload of c_search_n() for using a predicate evaluation other than
475*9356374aSAndroid Build Coastguard Worker // `==` as the function's test condition.
476*9356374aSAndroid Build Coastguard Worker template <typename Sequence, typename Size, typename T,
477*9356374aSAndroid Build Coastguard Worker           typename BinaryPredicate>
478*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<Sequence> c_search_n(
479*9356374aSAndroid Build Coastguard Worker     Sequence& sequence, Size count, T&& value, BinaryPredicate&& pred) {
480*9356374aSAndroid Build Coastguard Worker   return std::search_n(container_algorithm_internal::c_begin(sequence),
481*9356374aSAndroid Build Coastguard Worker                        container_algorithm_internal::c_end(sequence), count,
482*9356374aSAndroid Build Coastguard Worker                        std::forward<T>(value),
483*9356374aSAndroid Build Coastguard Worker                        std::forward<BinaryPredicate>(pred));
484*9356374aSAndroid Build Coastguard Worker }
485*9356374aSAndroid Build Coastguard Worker 
486*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
487*9356374aSAndroid Build Coastguard Worker // <algorithm> Modifying sequence operations
488*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
489*9356374aSAndroid Build Coastguard Worker 
490*9356374aSAndroid Build Coastguard Worker // c_copy()
491*9356374aSAndroid Build Coastguard Worker //
492*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::copy()` function to copy a
493*9356374aSAndroid Build Coastguard Worker // container's elements into an iterator.
494*9356374aSAndroid Build Coastguard Worker template <typename InputSequence, typename OutputIterator>
495*9356374aSAndroid Build Coastguard Worker OutputIterator c_copy(const InputSequence& input, OutputIterator output) {
496*9356374aSAndroid Build Coastguard Worker   return std::copy(container_algorithm_internal::c_begin(input),
497*9356374aSAndroid Build Coastguard Worker                    container_algorithm_internal::c_end(input), output);
498*9356374aSAndroid Build Coastguard Worker }
499*9356374aSAndroid Build Coastguard Worker 
500*9356374aSAndroid Build Coastguard Worker // c_copy_n()
501*9356374aSAndroid Build Coastguard Worker //
502*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::copy_n()` function to copy a
503*9356374aSAndroid Build Coastguard Worker // container's first N elements into an iterator.
504*9356374aSAndroid Build Coastguard Worker template <typename C, typename Size, typename OutputIterator>
505*9356374aSAndroid Build Coastguard Worker OutputIterator c_copy_n(const C& input, Size n, OutputIterator output) {
506*9356374aSAndroid Build Coastguard Worker   return std::copy_n(container_algorithm_internal::c_begin(input), n, output);
507*9356374aSAndroid Build Coastguard Worker }
508*9356374aSAndroid Build Coastguard Worker 
509*9356374aSAndroid Build Coastguard Worker // c_copy_if()
510*9356374aSAndroid Build Coastguard Worker //
511*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::copy_if()` function to copy
512*9356374aSAndroid Build Coastguard Worker // a container's elements satisfying some condition into an iterator.
513*9356374aSAndroid Build Coastguard Worker template <typename InputSequence, typename OutputIterator, typename Pred>
514*9356374aSAndroid Build Coastguard Worker OutputIterator c_copy_if(const InputSequence& input, OutputIterator output,
515*9356374aSAndroid Build Coastguard Worker                          Pred&& pred) {
516*9356374aSAndroid Build Coastguard Worker   return std::copy_if(container_algorithm_internal::c_begin(input),
517*9356374aSAndroid Build Coastguard Worker                       container_algorithm_internal::c_end(input), output,
518*9356374aSAndroid Build Coastguard Worker                       std::forward<Pred>(pred));
519*9356374aSAndroid Build Coastguard Worker }
520*9356374aSAndroid Build Coastguard Worker 
521*9356374aSAndroid Build Coastguard Worker // c_copy_backward()
522*9356374aSAndroid Build Coastguard Worker //
523*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::copy_backward()` function to
524*9356374aSAndroid Build Coastguard Worker // copy a container's elements in reverse order into an iterator.
525*9356374aSAndroid Build Coastguard Worker template <typename C, typename BidirectionalIterator>
526*9356374aSAndroid Build Coastguard Worker BidirectionalIterator c_copy_backward(const C& src,
527*9356374aSAndroid Build Coastguard Worker                                       BidirectionalIterator dest) {
528*9356374aSAndroid Build Coastguard Worker   return std::copy_backward(container_algorithm_internal::c_begin(src),
529*9356374aSAndroid Build Coastguard Worker                             container_algorithm_internal::c_end(src), dest);
530*9356374aSAndroid Build Coastguard Worker }
531*9356374aSAndroid Build Coastguard Worker 
532*9356374aSAndroid Build Coastguard Worker // c_move()
533*9356374aSAndroid Build Coastguard Worker //
534*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::move()` function to move
535*9356374aSAndroid Build Coastguard Worker // a container's elements into an iterator.
536*9356374aSAndroid Build Coastguard Worker template <typename C, typename OutputIterator>
537*9356374aSAndroid Build Coastguard Worker OutputIterator c_move(C&& src, OutputIterator dest) {
538*9356374aSAndroid Build Coastguard Worker   return std::move(container_algorithm_internal::c_begin(src),
539*9356374aSAndroid Build Coastguard Worker                    container_algorithm_internal::c_end(src), dest);
540*9356374aSAndroid Build Coastguard Worker }
541*9356374aSAndroid Build Coastguard Worker 
542*9356374aSAndroid Build Coastguard Worker // c_move_backward()
543*9356374aSAndroid Build Coastguard Worker //
544*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::move_backward()` function to
545*9356374aSAndroid Build Coastguard Worker // move a container's elements into an iterator in reverse order.
546*9356374aSAndroid Build Coastguard Worker template <typename C, typename BidirectionalIterator>
547*9356374aSAndroid Build Coastguard Worker BidirectionalIterator c_move_backward(C&& src, BidirectionalIterator dest) {
548*9356374aSAndroid Build Coastguard Worker   return std::move_backward(container_algorithm_internal::c_begin(src),
549*9356374aSAndroid Build Coastguard Worker                             container_algorithm_internal::c_end(src), dest);
550*9356374aSAndroid Build Coastguard Worker }
551*9356374aSAndroid Build Coastguard Worker 
552*9356374aSAndroid Build Coastguard Worker // c_swap_ranges()
553*9356374aSAndroid Build Coastguard Worker //
554*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::swap_ranges()` function to
555*9356374aSAndroid Build Coastguard Worker // swap a container's elements with another container's elements. Swaps the
556*9356374aSAndroid Build Coastguard Worker // first N elements of `c1` and `c2`, where N = min(size(c1), size(c2)).
557*9356374aSAndroid Build Coastguard Worker template <typename C1, typename C2>
558*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<C2> c_swap_ranges(C1& c1, C2& c2) {
559*9356374aSAndroid Build Coastguard Worker   auto first1 = container_algorithm_internal::c_begin(c1);
560*9356374aSAndroid Build Coastguard Worker   auto last1 = container_algorithm_internal::c_end(c1);
561*9356374aSAndroid Build Coastguard Worker   auto first2 = container_algorithm_internal::c_begin(c2);
562*9356374aSAndroid Build Coastguard Worker   auto last2 = container_algorithm_internal::c_end(c2);
563*9356374aSAndroid Build Coastguard Worker 
564*9356374aSAndroid Build Coastguard Worker   using std::swap;
565*9356374aSAndroid Build Coastguard Worker   for (; first1 != last1 && first2 != last2; ++first1, (void)++first2) {
566*9356374aSAndroid Build Coastguard Worker     swap(*first1, *first2);
567*9356374aSAndroid Build Coastguard Worker   }
568*9356374aSAndroid Build Coastguard Worker   return first2;
569*9356374aSAndroid Build Coastguard Worker }
570*9356374aSAndroid Build Coastguard Worker 
571*9356374aSAndroid Build Coastguard Worker // c_transform()
572*9356374aSAndroid Build Coastguard Worker //
573*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::transform()` function to
574*9356374aSAndroid Build Coastguard Worker // transform a container's elements using the unary operation, storing the
575*9356374aSAndroid Build Coastguard Worker // result in an iterator pointing to the last transformed element in the output
576*9356374aSAndroid Build Coastguard Worker // range.
577*9356374aSAndroid Build Coastguard Worker template <typename InputSequence, typename OutputIterator, typename UnaryOp>
578*9356374aSAndroid Build Coastguard Worker OutputIterator c_transform(const InputSequence& input, OutputIterator output,
579*9356374aSAndroid Build Coastguard Worker                            UnaryOp&& unary_op) {
580*9356374aSAndroid Build Coastguard Worker   return std::transform(container_algorithm_internal::c_begin(input),
581*9356374aSAndroid Build Coastguard Worker                         container_algorithm_internal::c_end(input), output,
582*9356374aSAndroid Build Coastguard Worker                         std::forward<UnaryOp>(unary_op));
583*9356374aSAndroid Build Coastguard Worker }
584*9356374aSAndroid Build Coastguard Worker 
585*9356374aSAndroid Build Coastguard Worker // Overload of c_transform() for performing a transformation using a binary
586*9356374aSAndroid Build Coastguard Worker // predicate. Applies `binary_op` to the first N elements of `c1` and `c2`,
587*9356374aSAndroid Build Coastguard Worker // where N = min(size(c1), size(c2)).
588*9356374aSAndroid Build Coastguard Worker template <typename InputSequence1, typename InputSequence2,
589*9356374aSAndroid Build Coastguard Worker           typename OutputIterator, typename BinaryOp>
590*9356374aSAndroid Build Coastguard Worker OutputIterator c_transform(const InputSequence1& input1,
591*9356374aSAndroid Build Coastguard Worker                            const InputSequence2& input2, OutputIterator output,
592*9356374aSAndroid Build Coastguard Worker                            BinaryOp&& binary_op) {
593*9356374aSAndroid Build Coastguard Worker   auto first1 = container_algorithm_internal::c_begin(input1);
594*9356374aSAndroid Build Coastguard Worker   auto last1 = container_algorithm_internal::c_end(input1);
595*9356374aSAndroid Build Coastguard Worker   auto first2 = container_algorithm_internal::c_begin(input2);
596*9356374aSAndroid Build Coastguard Worker   auto last2 = container_algorithm_internal::c_end(input2);
597*9356374aSAndroid Build Coastguard Worker   for (; first1 != last1 && first2 != last2;
598*9356374aSAndroid Build Coastguard Worker        ++first1, (void)++first2, ++output) {
599*9356374aSAndroid Build Coastguard Worker     *output = binary_op(*first1, *first2);
600*9356374aSAndroid Build Coastguard Worker   }
601*9356374aSAndroid Build Coastguard Worker 
602*9356374aSAndroid Build Coastguard Worker   return output;
603*9356374aSAndroid Build Coastguard Worker }
604*9356374aSAndroid Build Coastguard Worker 
605*9356374aSAndroid Build Coastguard Worker // c_replace()
606*9356374aSAndroid Build Coastguard Worker //
607*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::replace()` function to
608*9356374aSAndroid Build Coastguard Worker // replace a container's elements of some value with a new value. The container
609*9356374aSAndroid Build Coastguard Worker // is modified in place.
610*9356374aSAndroid Build Coastguard Worker template <typename Sequence, typename T>
611*9356374aSAndroid Build Coastguard Worker void c_replace(Sequence& sequence, const T& old_value, const T& new_value) {
612*9356374aSAndroid Build Coastguard Worker   std::replace(container_algorithm_internal::c_begin(sequence),
613*9356374aSAndroid Build Coastguard Worker                container_algorithm_internal::c_end(sequence), old_value,
614*9356374aSAndroid Build Coastguard Worker                new_value);
615*9356374aSAndroid Build Coastguard Worker }
616*9356374aSAndroid Build Coastguard Worker 
617*9356374aSAndroid Build Coastguard Worker // c_replace_if()
618*9356374aSAndroid Build Coastguard Worker //
619*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::replace_if()` function to
620*9356374aSAndroid Build Coastguard Worker // replace a container's elements of some value with a new value based on some
621*9356374aSAndroid Build Coastguard Worker // condition. The container is modified in place.
622*9356374aSAndroid Build Coastguard Worker template <typename C, typename Pred, typename T>
623*9356374aSAndroid Build Coastguard Worker void c_replace_if(C& c, Pred&& pred, T&& new_value) {
624*9356374aSAndroid Build Coastguard Worker   std::replace_if(container_algorithm_internal::c_begin(c),
625*9356374aSAndroid Build Coastguard Worker                   container_algorithm_internal::c_end(c),
626*9356374aSAndroid Build Coastguard Worker                   std::forward<Pred>(pred), std::forward<T>(new_value));
627*9356374aSAndroid Build Coastguard Worker }
628*9356374aSAndroid Build Coastguard Worker 
629*9356374aSAndroid Build Coastguard Worker // c_replace_copy()
630*9356374aSAndroid Build Coastguard Worker //
631*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::replace_copy()` function to
632*9356374aSAndroid Build Coastguard Worker // replace a container's elements of some value with a new value  and return the
633*9356374aSAndroid Build Coastguard Worker // results within an iterator.
634*9356374aSAndroid Build Coastguard Worker template <typename C, typename OutputIterator, typename T>
635*9356374aSAndroid Build Coastguard Worker OutputIterator c_replace_copy(const C& c, OutputIterator result, T&& old_value,
636*9356374aSAndroid Build Coastguard Worker                               T&& new_value) {
637*9356374aSAndroid Build Coastguard Worker   return std::replace_copy(container_algorithm_internal::c_begin(c),
638*9356374aSAndroid Build Coastguard Worker                            container_algorithm_internal::c_end(c), result,
639*9356374aSAndroid Build Coastguard Worker                            std::forward<T>(old_value),
640*9356374aSAndroid Build Coastguard Worker                            std::forward<T>(new_value));
641*9356374aSAndroid Build Coastguard Worker }
642*9356374aSAndroid Build Coastguard Worker 
643*9356374aSAndroid Build Coastguard Worker // c_replace_copy_if()
644*9356374aSAndroid Build Coastguard Worker //
645*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::replace_copy_if()` function
646*9356374aSAndroid Build Coastguard Worker // to replace a container's elements of some value with a new value based on
647*9356374aSAndroid Build Coastguard Worker // some condition, and return the results within an iterator.
648*9356374aSAndroid Build Coastguard Worker template <typename C, typename OutputIterator, typename Pred, typename T>
649*9356374aSAndroid Build Coastguard Worker OutputIterator c_replace_copy_if(const C& c, OutputIterator result, Pred&& pred,
650*9356374aSAndroid Build Coastguard Worker                                  const T& new_value) {
651*9356374aSAndroid Build Coastguard Worker   return std::replace_copy_if(container_algorithm_internal::c_begin(c),
652*9356374aSAndroid Build Coastguard Worker                               container_algorithm_internal::c_end(c), result,
653*9356374aSAndroid Build Coastguard Worker                               std::forward<Pred>(pred), new_value);
654*9356374aSAndroid Build Coastguard Worker }
655*9356374aSAndroid Build Coastguard Worker 
656*9356374aSAndroid Build Coastguard Worker // c_fill()
657*9356374aSAndroid Build Coastguard Worker //
658*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::fill()` function to fill a
659*9356374aSAndroid Build Coastguard Worker // container with some value.
660*9356374aSAndroid Build Coastguard Worker template <typename C, typename T>
661*9356374aSAndroid Build Coastguard Worker void c_fill(C& c, const T& value) {
662*9356374aSAndroid Build Coastguard Worker   std::fill(container_algorithm_internal::c_begin(c),
663*9356374aSAndroid Build Coastguard Worker             container_algorithm_internal::c_end(c), value);
664*9356374aSAndroid Build Coastguard Worker }
665*9356374aSAndroid Build Coastguard Worker 
666*9356374aSAndroid Build Coastguard Worker // c_fill_n()
667*9356374aSAndroid Build Coastguard Worker //
668*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::fill_n()` function to fill
669*9356374aSAndroid Build Coastguard Worker // the first N elements in a container with some value.
670*9356374aSAndroid Build Coastguard Worker template <typename C, typename Size, typename T>
671*9356374aSAndroid Build Coastguard Worker void c_fill_n(C& c, Size n, const T& value) {
672*9356374aSAndroid Build Coastguard Worker   std::fill_n(container_algorithm_internal::c_begin(c), n, value);
673*9356374aSAndroid Build Coastguard Worker }
674*9356374aSAndroid Build Coastguard Worker 
675*9356374aSAndroid Build Coastguard Worker // c_generate()
676*9356374aSAndroid Build Coastguard Worker //
677*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::generate()` function to
678*9356374aSAndroid Build Coastguard Worker // assign a container's elements to the values provided by the given generator.
679*9356374aSAndroid Build Coastguard Worker template <typename C, typename Generator>
680*9356374aSAndroid Build Coastguard Worker void c_generate(C& c, Generator&& gen) {
681*9356374aSAndroid Build Coastguard Worker   std::generate(container_algorithm_internal::c_begin(c),
682*9356374aSAndroid Build Coastguard Worker                 container_algorithm_internal::c_end(c),
683*9356374aSAndroid Build Coastguard Worker                 std::forward<Generator>(gen));
684*9356374aSAndroid Build Coastguard Worker }
685*9356374aSAndroid Build Coastguard Worker 
686*9356374aSAndroid Build Coastguard Worker // c_generate_n()
687*9356374aSAndroid Build Coastguard Worker //
688*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::generate_n()` function to
689*9356374aSAndroid Build Coastguard Worker // assign a container's first N elements to the values provided by the given
690*9356374aSAndroid Build Coastguard Worker // generator.
691*9356374aSAndroid Build Coastguard Worker template <typename C, typename Size, typename Generator>
692*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<C> c_generate_n(C& c, Size n,
693*9356374aSAndroid Build Coastguard Worker                                                             Generator&& gen) {
694*9356374aSAndroid Build Coastguard Worker   return std::generate_n(container_algorithm_internal::c_begin(c), n,
695*9356374aSAndroid Build Coastguard Worker                          std::forward<Generator>(gen));
696*9356374aSAndroid Build Coastguard Worker }
697*9356374aSAndroid Build Coastguard Worker 
698*9356374aSAndroid Build Coastguard Worker // Note: `c_xx()` <algorithm> container versions for `remove()`, `remove_if()`,
699*9356374aSAndroid Build Coastguard Worker // and `unique()` are omitted, because it's not clear whether or not such
700*9356374aSAndroid Build Coastguard Worker // functions should call erase on their supplied sequences afterwards. Either
701*9356374aSAndroid Build Coastguard Worker // behavior would be surprising for a different set of users.
702*9356374aSAndroid Build Coastguard Worker 
703*9356374aSAndroid Build Coastguard Worker // c_remove_copy()
704*9356374aSAndroid Build Coastguard Worker //
705*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::remove_copy()` function to
706*9356374aSAndroid Build Coastguard Worker // copy a container's elements while removing any elements matching the given
707*9356374aSAndroid Build Coastguard Worker // `value`.
708*9356374aSAndroid Build Coastguard Worker template <typename C, typename OutputIterator, typename T>
709*9356374aSAndroid Build Coastguard Worker OutputIterator c_remove_copy(const C& c, OutputIterator result,
710*9356374aSAndroid Build Coastguard Worker                              const T& value) {
711*9356374aSAndroid Build Coastguard Worker   return std::remove_copy(container_algorithm_internal::c_begin(c),
712*9356374aSAndroid Build Coastguard Worker                           container_algorithm_internal::c_end(c), result,
713*9356374aSAndroid Build Coastguard Worker                           value);
714*9356374aSAndroid Build Coastguard Worker }
715*9356374aSAndroid Build Coastguard Worker 
716*9356374aSAndroid Build Coastguard Worker // c_remove_copy_if()
717*9356374aSAndroid Build Coastguard Worker //
718*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::remove_copy_if()` function
719*9356374aSAndroid Build Coastguard Worker // to copy a container's elements while removing any elements matching the given
720*9356374aSAndroid Build Coastguard Worker // condition.
721*9356374aSAndroid Build Coastguard Worker template <typename C, typename OutputIterator, typename Pred>
722*9356374aSAndroid Build Coastguard Worker OutputIterator c_remove_copy_if(const C& c, OutputIterator result,
723*9356374aSAndroid Build Coastguard Worker                                 Pred&& pred) {
724*9356374aSAndroid Build Coastguard Worker   return std::remove_copy_if(container_algorithm_internal::c_begin(c),
725*9356374aSAndroid Build Coastguard Worker                              container_algorithm_internal::c_end(c), result,
726*9356374aSAndroid Build Coastguard Worker                              std::forward<Pred>(pred));
727*9356374aSAndroid Build Coastguard Worker }
728*9356374aSAndroid Build Coastguard Worker 
729*9356374aSAndroid Build Coastguard Worker // c_unique_copy()
730*9356374aSAndroid Build Coastguard Worker //
731*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::unique_copy()` function to
732*9356374aSAndroid Build Coastguard Worker // copy a container's elements while removing any elements containing duplicate
733*9356374aSAndroid Build Coastguard Worker // values.
734*9356374aSAndroid Build Coastguard Worker template <typename C, typename OutputIterator>
735*9356374aSAndroid Build Coastguard Worker OutputIterator c_unique_copy(const C& c, OutputIterator result) {
736*9356374aSAndroid Build Coastguard Worker   return std::unique_copy(container_algorithm_internal::c_begin(c),
737*9356374aSAndroid Build Coastguard Worker                           container_algorithm_internal::c_end(c), result);
738*9356374aSAndroid Build Coastguard Worker }
739*9356374aSAndroid Build Coastguard Worker 
740*9356374aSAndroid Build Coastguard Worker // Overload of c_unique_copy() for using a predicate evaluation other than
741*9356374aSAndroid Build Coastguard Worker // `==` for comparing uniqueness of the element values.
742*9356374aSAndroid Build Coastguard Worker template <typename C, typename OutputIterator, typename BinaryPredicate>
743*9356374aSAndroid Build Coastguard Worker OutputIterator c_unique_copy(const C& c, OutputIterator result,
744*9356374aSAndroid Build Coastguard Worker                              BinaryPredicate&& pred) {
745*9356374aSAndroid Build Coastguard Worker   return std::unique_copy(container_algorithm_internal::c_begin(c),
746*9356374aSAndroid Build Coastguard Worker                           container_algorithm_internal::c_end(c), result,
747*9356374aSAndroid Build Coastguard Worker                           std::forward<BinaryPredicate>(pred));
748*9356374aSAndroid Build Coastguard Worker }
749*9356374aSAndroid Build Coastguard Worker 
750*9356374aSAndroid Build Coastguard Worker // c_reverse()
751*9356374aSAndroid Build Coastguard Worker //
752*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::reverse()` function to
753*9356374aSAndroid Build Coastguard Worker // reverse a container's elements.
754*9356374aSAndroid Build Coastguard Worker template <typename Sequence>
755*9356374aSAndroid Build Coastguard Worker void c_reverse(Sequence& sequence) {
756*9356374aSAndroid Build Coastguard Worker   std::reverse(container_algorithm_internal::c_begin(sequence),
757*9356374aSAndroid Build Coastguard Worker                container_algorithm_internal::c_end(sequence));
758*9356374aSAndroid Build Coastguard Worker }
759*9356374aSAndroid Build Coastguard Worker 
760*9356374aSAndroid Build Coastguard Worker // c_reverse_copy()
761*9356374aSAndroid Build Coastguard Worker //
762*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::reverse()` function to
763*9356374aSAndroid Build Coastguard Worker // reverse a container's elements and write them to an iterator range.
764*9356374aSAndroid Build Coastguard Worker template <typename C, typename OutputIterator>
765*9356374aSAndroid Build Coastguard Worker OutputIterator c_reverse_copy(const C& sequence, OutputIterator result) {
766*9356374aSAndroid Build Coastguard Worker   return std::reverse_copy(container_algorithm_internal::c_begin(sequence),
767*9356374aSAndroid Build Coastguard Worker                            container_algorithm_internal::c_end(sequence),
768*9356374aSAndroid Build Coastguard Worker                            result);
769*9356374aSAndroid Build Coastguard Worker }
770*9356374aSAndroid Build Coastguard Worker 
771*9356374aSAndroid Build Coastguard Worker // c_rotate()
772*9356374aSAndroid Build Coastguard Worker //
773*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::rotate()` function to
774*9356374aSAndroid Build Coastguard Worker // shift a container's elements leftward such that the `middle` element becomes
775*9356374aSAndroid Build Coastguard Worker // the first element in the container.
776*9356374aSAndroid Build Coastguard Worker template <typename C,
777*9356374aSAndroid Build Coastguard Worker           typename Iterator = container_algorithm_internal::ContainerIter<C>>
778*9356374aSAndroid Build Coastguard Worker Iterator c_rotate(C& sequence, Iterator middle) {
779*9356374aSAndroid Build Coastguard Worker   return absl::rotate(container_algorithm_internal::c_begin(sequence), middle,
780*9356374aSAndroid Build Coastguard Worker                       container_algorithm_internal::c_end(sequence));
781*9356374aSAndroid Build Coastguard Worker }
782*9356374aSAndroid Build Coastguard Worker 
783*9356374aSAndroid Build Coastguard Worker // c_rotate_copy()
784*9356374aSAndroid Build Coastguard Worker //
785*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::rotate_copy()` function to
786*9356374aSAndroid Build Coastguard Worker // shift a container's elements leftward such that the `middle` element becomes
787*9356374aSAndroid Build Coastguard Worker // the first element in a new iterator range.
788*9356374aSAndroid Build Coastguard Worker template <typename C, typename OutputIterator>
789*9356374aSAndroid Build Coastguard Worker OutputIterator c_rotate_copy(
790*9356374aSAndroid Build Coastguard Worker     const C& sequence,
791*9356374aSAndroid Build Coastguard Worker     container_algorithm_internal::ContainerIter<const C> middle,
792*9356374aSAndroid Build Coastguard Worker     OutputIterator result) {
793*9356374aSAndroid Build Coastguard Worker   return std::rotate_copy(container_algorithm_internal::c_begin(sequence),
794*9356374aSAndroid Build Coastguard Worker                           middle, container_algorithm_internal::c_end(sequence),
795*9356374aSAndroid Build Coastguard Worker                           result);
796*9356374aSAndroid Build Coastguard Worker }
797*9356374aSAndroid Build Coastguard Worker 
798*9356374aSAndroid Build Coastguard Worker // c_shuffle()
799*9356374aSAndroid Build Coastguard Worker //
800*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::shuffle()` function to
801*9356374aSAndroid Build Coastguard Worker // randomly shuffle elements within the container using a `gen()` uniform random
802*9356374aSAndroid Build Coastguard Worker // number generator.
803*9356374aSAndroid Build Coastguard Worker template <typename RandomAccessContainer, typename UniformRandomBitGenerator>
804*9356374aSAndroid Build Coastguard Worker void c_shuffle(RandomAccessContainer& c, UniformRandomBitGenerator&& gen) {
805*9356374aSAndroid Build Coastguard Worker   std::shuffle(container_algorithm_internal::c_begin(c),
806*9356374aSAndroid Build Coastguard Worker                container_algorithm_internal::c_end(c),
807*9356374aSAndroid Build Coastguard Worker                std::forward<UniformRandomBitGenerator>(gen));
808*9356374aSAndroid Build Coastguard Worker }
809*9356374aSAndroid Build Coastguard Worker 
810*9356374aSAndroid Build Coastguard Worker // c_sample()
811*9356374aSAndroid Build Coastguard Worker //
812*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::sample()` function to
813*9356374aSAndroid Build Coastguard Worker // randomly sample elements from the container without replacement using a
814*9356374aSAndroid Build Coastguard Worker // `gen()` uniform random number generator and write them to an iterator range.
815*9356374aSAndroid Build Coastguard Worker template <typename C, typename OutputIterator, typename Distance,
816*9356374aSAndroid Build Coastguard Worker           typename UniformRandomBitGenerator>
817*9356374aSAndroid Build Coastguard Worker OutputIterator c_sample(const C& c, OutputIterator result, Distance n,
818*9356374aSAndroid Build Coastguard Worker                         UniformRandomBitGenerator&& gen) {
819*9356374aSAndroid Build Coastguard Worker #if defined(__cpp_lib_sample) && __cpp_lib_sample >= 201603L
820*9356374aSAndroid Build Coastguard Worker   return std::sample(container_algorithm_internal::c_begin(c),
821*9356374aSAndroid Build Coastguard Worker                      container_algorithm_internal::c_end(c), result, n,
822*9356374aSAndroid Build Coastguard Worker                      std::forward<UniformRandomBitGenerator>(gen));
823*9356374aSAndroid Build Coastguard Worker #else
824*9356374aSAndroid Build Coastguard Worker   // Fall back to a stable selection-sampling implementation.
825*9356374aSAndroid Build Coastguard Worker   auto first = container_algorithm_internal::c_begin(c);
826*9356374aSAndroid Build Coastguard Worker   Distance unsampled_elements = c_distance(c);
827*9356374aSAndroid Build Coastguard Worker   n = (std::min)(n, unsampled_elements);
828*9356374aSAndroid Build Coastguard Worker   for (; n != 0; ++first) {
829*9356374aSAndroid Build Coastguard Worker     Distance r =
830*9356374aSAndroid Build Coastguard Worker         std::uniform_int_distribution<Distance>(0, --unsampled_elements)(gen);
831*9356374aSAndroid Build Coastguard Worker     if (r < n) {
832*9356374aSAndroid Build Coastguard Worker       *result++ = *first;
833*9356374aSAndroid Build Coastguard Worker       --n;
834*9356374aSAndroid Build Coastguard Worker     }
835*9356374aSAndroid Build Coastguard Worker   }
836*9356374aSAndroid Build Coastguard Worker   return result;
837*9356374aSAndroid Build Coastguard Worker #endif
838*9356374aSAndroid Build Coastguard Worker }
839*9356374aSAndroid Build Coastguard Worker 
840*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
841*9356374aSAndroid Build Coastguard Worker // <algorithm> Partition functions
842*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
843*9356374aSAndroid Build Coastguard Worker 
844*9356374aSAndroid Build Coastguard Worker // c_is_partitioned()
845*9356374aSAndroid Build Coastguard Worker //
846*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::is_partitioned()` function
847*9356374aSAndroid Build Coastguard Worker // to test whether all elements in the container for which `pred` returns `true`
848*9356374aSAndroid Build Coastguard Worker // precede those for which `pred` is `false`.
849*9356374aSAndroid Build Coastguard Worker template <typename C, typename Pred>
850*9356374aSAndroid Build Coastguard Worker bool c_is_partitioned(const C& c, Pred&& pred) {
851*9356374aSAndroid Build Coastguard Worker   return std::is_partitioned(container_algorithm_internal::c_begin(c),
852*9356374aSAndroid Build Coastguard Worker                              container_algorithm_internal::c_end(c),
853*9356374aSAndroid Build Coastguard Worker                              std::forward<Pred>(pred));
854*9356374aSAndroid Build Coastguard Worker }
855*9356374aSAndroid Build Coastguard Worker 
856*9356374aSAndroid Build Coastguard Worker // c_partition()
857*9356374aSAndroid Build Coastguard Worker //
858*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::partition()` function
859*9356374aSAndroid Build Coastguard Worker // to rearrange all elements in a container in such a way that all elements for
860*9356374aSAndroid Build Coastguard Worker // which `pred` returns `true` precede all those for which it returns `false`,
861*9356374aSAndroid Build Coastguard Worker // returning an iterator to the first element of the second group.
862*9356374aSAndroid Build Coastguard Worker template <typename C, typename Pred>
863*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<C> c_partition(C& c, Pred&& pred) {
864*9356374aSAndroid Build Coastguard Worker   return std::partition(container_algorithm_internal::c_begin(c),
865*9356374aSAndroid Build Coastguard Worker                         container_algorithm_internal::c_end(c),
866*9356374aSAndroid Build Coastguard Worker                         std::forward<Pred>(pred));
867*9356374aSAndroid Build Coastguard Worker }
868*9356374aSAndroid Build Coastguard Worker 
869*9356374aSAndroid Build Coastguard Worker // c_stable_partition()
870*9356374aSAndroid Build Coastguard Worker //
871*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::stable_partition()` function
872*9356374aSAndroid Build Coastguard Worker // to rearrange all elements in a container in such a way that all elements for
873*9356374aSAndroid Build Coastguard Worker // which `pred` returns `true` precede all those for which it returns `false`,
874*9356374aSAndroid Build Coastguard Worker // preserving the relative ordering between the two groups. The function returns
875*9356374aSAndroid Build Coastguard Worker // an iterator to the first element of the second group.
876*9356374aSAndroid Build Coastguard Worker template <typename C, typename Pred>
877*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<C> c_stable_partition(C& c,
878*9356374aSAndroid Build Coastguard Worker                                                                   Pred&& pred) {
879*9356374aSAndroid Build Coastguard Worker   return std::stable_partition(container_algorithm_internal::c_begin(c),
880*9356374aSAndroid Build Coastguard Worker                                container_algorithm_internal::c_end(c),
881*9356374aSAndroid Build Coastguard Worker                                std::forward<Pred>(pred));
882*9356374aSAndroid Build Coastguard Worker }
883*9356374aSAndroid Build Coastguard Worker 
884*9356374aSAndroid Build Coastguard Worker // c_partition_copy()
885*9356374aSAndroid Build Coastguard Worker //
886*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::partition_copy()` function
887*9356374aSAndroid Build Coastguard Worker // to partition a container's elements and return them into two iterators: one
888*9356374aSAndroid Build Coastguard Worker // for which `pred` returns `true`, and one for which `pred` returns `false.`
889*9356374aSAndroid Build Coastguard Worker 
890*9356374aSAndroid Build Coastguard Worker template <typename C, typename OutputIterator1, typename OutputIterator2,
891*9356374aSAndroid Build Coastguard Worker           typename Pred>
892*9356374aSAndroid Build Coastguard Worker std::pair<OutputIterator1, OutputIterator2> c_partition_copy(
893*9356374aSAndroid Build Coastguard Worker     const C& c, OutputIterator1 out_true, OutputIterator2 out_false,
894*9356374aSAndroid Build Coastguard Worker     Pred&& pred) {
895*9356374aSAndroid Build Coastguard Worker   return std::partition_copy(container_algorithm_internal::c_begin(c),
896*9356374aSAndroid Build Coastguard Worker                              container_algorithm_internal::c_end(c), out_true,
897*9356374aSAndroid Build Coastguard Worker                              out_false, std::forward<Pred>(pred));
898*9356374aSAndroid Build Coastguard Worker }
899*9356374aSAndroid Build Coastguard Worker 
900*9356374aSAndroid Build Coastguard Worker // c_partition_point()
901*9356374aSAndroid Build Coastguard Worker //
902*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::partition_point()` function
903*9356374aSAndroid Build Coastguard Worker // to return the first element of an already partitioned container for which
904*9356374aSAndroid Build Coastguard Worker // the given `pred` is not `true`.
905*9356374aSAndroid Build Coastguard Worker template <typename C, typename Pred>
906*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<C> c_partition_point(C& c,
907*9356374aSAndroid Build Coastguard Worker                                                                  Pred&& pred) {
908*9356374aSAndroid Build Coastguard Worker   return std::partition_point(container_algorithm_internal::c_begin(c),
909*9356374aSAndroid Build Coastguard Worker                               container_algorithm_internal::c_end(c),
910*9356374aSAndroid Build Coastguard Worker                               std::forward<Pred>(pred));
911*9356374aSAndroid Build Coastguard Worker }
912*9356374aSAndroid Build Coastguard Worker 
913*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
914*9356374aSAndroid Build Coastguard Worker // <algorithm> Sorting functions
915*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
916*9356374aSAndroid Build Coastguard Worker 
917*9356374aSAndroid Build Coastguard Worker // c_sort()
918*9356374aSAndroid Build Coastguard Worker //
919*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::sort()` function
920*9356374aSAndroid Build Coastguard Worker // to sort elements in ascending order of their values.
921*9356374aSAndroid Build Coastguard Worker template <typename C>
922*9356374aSAndroid Build Coastguard Worker void c_sort(C& c) {
923*9356374aSAndroid Build Coastguard Worker   std::sort(container_algorithm_internal::c_begin(c),
924*9356374aSAndroid Build Coastguard Worker             container_algorithm_internal::c_end(c));
925*9356374aSAndroid Build Coastguard Worker }
926*9356374aSAndroid Build Coastguard Worker 
927*9356374aSAndroid Build Coastguard Worker // Overload of c_sort() for performing a `comp` comparison other than the
928*9356374aSAndroid Build Coastguard Worker // default `operator<`.
929*9356374aSAndroid Build Coastguard Worker template <typename C, typename LessThan>
930*9356374aSAndroid Build Coastguard Worker void c_sort(C& c, LessThan&& comp) {
931*9356374aSAndroid Build Coastguard Worker   std::sort(container_algorithm_internal::c_begin(c),
932*9356374aSAndroid Build Coastguard Worker             container_algorithm_internal::c_end(c),
933*9356374aSAndroid Build Coastguard Worker             std::forward<LessThan>(comp));
934*9356374aSAndroid Build Coastguard Worker }
935*9356374aSAndroid Build Coastguard Worker 
936*9356374aSAndroid Build Coastguard Worker // c_stable_sort()
937*9356374aSAndroid Build Coastguard Worker //
938*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::stable_sort()` function
939*9356374aSAndroid Build Coastguard Worker // to sort elements in ascending order of their values, preserving the order
940*9356374aSAndroid Build Coastguard Worker // of equivalents.
941*9356374aSAndroid Build Coastguard Worker template <typename C>
942*9356374aSAndroid Build Coastguard Worker void c_stable_sort(C& c) {
943*9356374aSAndroid Build Coastguard Worker   std::stable_sort(container_algorithm_internal::c_begin(c),
944*9356374aSAndroid Build Coastguard Worker                    container_algorithm_internal::c_end(c));
945*9356374aSAndroid Build Coastguard Worker }
946*9356374aSAndroid Build Coastguard Worker 
947*9356374aSAndroid Build Coastguard Worker // Overload of c_stable_sort() for performing a `comp` comparison other than the
948*9356374aSAndroid Build Coastguard Worker // default `operator<`.
949*9356374aSAndroid Build Coastguard Worker template <typename C, typename LessThan>
950*9356374aSAndroid Build Coastguard Worker void c_stable_sort(C& c, LessThan&& comp) {
951*9356374aSAndroid Build Coastguard Worker   std::stable_sort(container_algorithm_internal::c_begin(c),
952*9356374aSAndroid Build Coastguard Worker                    container_algorithm_internal::c_end(c),
953*9356374aSAndroid Build Coastguard Worker                    std::forward<LessThan>(comp));
954*9356374aSAndroid Build Coastguard Worker }
955*9356374aSAndroid Build Coastguard Worker 
956*9356374aSAndroid Build Coastguard Worker // c_is_sorted()
957*9356374aSAndroid Build Coastguard Worker //
958*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::is_sorted()` function
959*9356374aSAndroid Build Coastguard Worker // to evaluate whether the given container is sorted in ascending order.
960*9356374aSAndroid Build Coastguard Worker template <typename C>
961*9356374aSAndroid Build Coastguard Worker bool c_is_sorted(const C& c) {
962*9356374aSAndroid Build Coastguard Worker   return std::is_sorted(container_algorithm_internal::c_begin(c),
963*9356374aSAndroid Build Coastguard Worker                         container_algorithm_internal::c_end(c));
964*9356374aSAndroid Build Coastguard Worker }
965*9356374aSAndroid Build Coastguard Worker 
966*9356374aSAndroid Build Coastguard Worker // c_is_sorted() overload for performing a `comp` comparison other than the
967*9356374aSAndroid Build Coastguard Worker // default `operator<`.
968*9356374aSAndroid Build Coastguard Worker template <typename C, typename LessThan>
969*9356374aSAndroid Build Coastguard Worker bool c_is_sorted(const C& c, LessThan&& comp) {
970*9356374aSAndroid Build Coastguard Worker   return std::is_sorted(container_algorithm_internal::c_begin(c),
971*9356374aSAndroid Build Coastguard Worker                         container_algorithm_internal::c_end(c),
972*9356374aSAndroid Build Coastguard Worker                         std::forward<LessThan>(comp));
973*9356374aSAndroid Build Coastguard Worker }
974*9356374aSAndroid Build Coastguard Worker 
975*9356374aSAndroid Build Coastguard Worker // c_partial_sort()
976*9356374aSAndroid Build Coastguard Worker //
977*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::partial_sort()` function
978*9356374aSAndroid Build Coastguard Worker // to rearrange elements within a container such that elements before `middle`
979*9356374aSAndroid Build Coastguard Worker // are sorted in ascending order.
980*9356374aSAndroid Build Coastguard Worker template <typename RandomAccessContainer>
981*9356374aSAndroid Build Coastguard Worker void c_partial_sort(
982*9356374aSAndroid Build Coastguard Worker     RandomAccessContainer& sequence,
983*9356374aSAndroid Build Coastguard Worker     container_algorithm_internal::ContainerIter<RandomAccessContainer> middle) {
984*9356374aSAndroid Build Coastguard Worker   std::partial_sort(container_algorithm_internal::c_begin(sequence), middle,
985*9356374aSAndroid Build Coastguard Worker                     container_algorithm_internal::c_end(sequence));
986*9356374aSAndroid Build Coastguard Worker }
987*9356374aSAndroid Build Coastguard Worker 
988*9356374aSAndroid Build Coastguard Worker // Overload of c_partial_sort() for performing a `comp` comparison other than
989*9356374aSAndroid Build Coastguard Worker // the default `operator<`.
990*9356374aSAndroid Build Coastguard Worker template <typename RandomAccessContainer, typename LessThan>
991*9356374aSAndroid Build Coastguard Worker void c_partial_sort(
992*9356374aSAndroid Build Coastguard Worker     RandomAccessContainer& sequence,
993*9356374aSAndroid Build Coastguard Worker     container_algorithm_internal::ContainerIter<RandomAccessContainer> middle,
994*9356374aSAndroid Build Coastguard Worker     LessThan&& comp) {
995*9356374aSAndroid Build Coastguard Worker   std::partial_sort(container_algorithm_internal::c_begin(sequence), middle,
996*9356374aSAndroid Build Coastguard Worker                     container_algorithm_internal::c_end(sequence),
997*9356374aSAndroid Build Coastguard Worker                     std::forward<LessThan>(comp));
998*9356374aSAndroid Build Coastguard Worker }
999*9356374aSAndroid Build Coastguard Worker 
1000*9356374aSAndroid Build Coastguard Worker // c_partial_sort_copy()
1001*9356374aSAndroid Build Coastguard Worker //
1002*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::partial_sort_copy()`
1003*9356374aSAndroid Build Coastguard Worker // function to sort the elements in the given range `result` within the larger
1004*9356374aSAndroid Build Coastguard Worker // `sequence` in ascending order (and using `result` as the output parameter).
1005*9356374aSAndroid Build Coastguard Worker // At most min(result.last - result.first, sequence.last - sequence.first)
1006*9356374aSAndroid Build Coastguard Worker // elements from the sequence will be stored in the result.
1007*9356374aSAndroid Build Coastguard Worker template <typename C, typename RandomAccessContainer>
1008*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<RandomAccessContainer>
1009*9356374aSAndroid Build Coastguard Worker c_partial_sort_copy(const C& sequence, RandomAccessContainer& result) {
1010*9356374aSAndroid Build Coastguard Worker   return std::partial_sort_copy(container_algorithm_internal::c_begin(sequence),
1011*9356374aSAndroid Build Coastguard Worker                                 container_algorithm_internal::c_end(sequence),
1012*9356374aSAndroid Build Coastguard Worker                                 container_algorithm_internal::c_begin(result),
1013*9356374aSAndroid Build Coastguard Worker                                 container_algorithm_internal::c_end(result));
1014*9356374aSAndroid Build Coastguard Worker }
1015*9356374aSAndroid Build Coastguard Worker 
1016*9356374aSAndroid Build Coastguard Worker // Overload of c_partial_sort_copy() for performing a `comp` comparison other
1017*9356374aSAndroid Build Coastguard Worker // than the default `operator<`.
1018*9356374aSAndroid Build Coastguard Worker template <typename C, typename RandomAccessContainer, typename LessThan>
1019*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<RandomAccessContainer>
1020*9356374aSAndroid Build Coastguard Worker c_partial_sort_copy(const C& sequence, RandomAccessContainer& result,
1021*9356374aSAndroid Build Coastguard Worker                     LessThan&& comp) {
1022*9356374aSAndroid Build Coastguard Worker   return std::partial_sort_copy(container_algorithm_internal::c_begin(sequence),
1023*9356374aSAndroid Build Coastguard Worker                                 container_algorithm_internal::c_end(sequence),
1024*9356374aSAndroid Build Coastguard Worker                                 container_algorithm_internal::c_begin(result),
1025*9356374aSAndroid Build Coastguard Worker                                 container_algorithm_internal::c_end(result),
1026*9356374aSAndroid Build Coastguard Worker                                 std::forward<LessThan>(comp));
1027*9356374aSAndroid Build Coastguard Worker }
1028*9356374aSAndroid Build Coastguard Worker 
1029*9356374aSAndroid Build Coastguard Worker // c_is_sorted_until()
1030*9356374aSAndroid Build Coastguard Worker //
1031*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::is_sorted_until()` function
1032*9356374aSAndroid Build Coastguard Worker // to return the first element within a container that is not sorted in
1033*9356374aSAndroid Build Coastguard Worker // ascending order as an iterator.
1034*9356374aSAndroid Build Coastguard Worker template <typename C>
1035*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<C> c_is_sorted_until(C& c) {
1036*9356374aSAndroid Build Coastguard Worker   return std::is_sorted_until(container_algorithm_internal::c_begin(c),
1037*9356374aSAndroid Build Coastguard Worker                               container_algorithm_internal::c_end(c));
1038*9356374aSAndroid Build Coastguard Worker }
1039*9356374aSAndroid Build Coastguard Worker 
1040*9356374aSAndroid Build Coastguard Worker // Overload of c_is_sorted_until() for performing a `comp` comparison other than
1041*9356374aSAndroid Build Coastguard Worker // the default `operator<`.
1042*9356374aSAndroid Build Coastguard Worker template <typename C, typename LessThan>
1043*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<C> c_is_sorted_until(
1044*9356374aSAndroid Build Coastguard Worker     C& c, LessThan&& comp) {
1045*9356374aSAndroid Build Coastguard Worker   return std::is_sorted_until(container_algorithm_internal::c_begin(c),
1046*9356374aSAndroid Build Coastguard Worker                               container_algorithm_internal::c_end(c),
1047*9356374aSAndroid Build Coastguard Worker                               std::forward<LessThan>(comp));
1048*9356374aSAndroid Build Coastguard Worker }
1049*9356374aSAndroid Build Coastguard Worker 
1050*9356374aSAndroid Build Coastguard Worker // c_nth_element()
1051*9356374aSAndroid Build Coastguard Worker //
1052*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::nth_element()` function
1053*9356374aSAndroid Build Coastguard Worker // to rearrange the elements within a container such that the `nth` element
1054*9356374aSAndroid Build Coastguard Worker // would be in that position in an ordered sequence; other elements may be in
1055*9356374aSAndroid Build Coastguard Worker // any order, except that all preceding `nth` will be less than that element,
1056*9356374aSAndroid Build Coastguard Worker // and all following `nth` will be greater than that element.
1057*9356374aSAndroid Build Coastguard Worker template <typename RandomAccessContainer>
1058*9356374aSAndroid Build Coastguard Worker void c_nth_element(
1059*9356374aSAndroid Build Coastguard Worker     RandomAccessContainer& sequence,
1060*9356374aSAndroid Build Coastguard Worker     container_algorithm_internal::ContainerIter<RandomAccessContainer> nth) {
1061*9356374aSAndroid Build Coastguard Worker   std::nth_element(container_algorithm_internal::c_begin(sequence), nth,
1062*9356374aSAndroid Build Coastguard Worker                    container_algorithm_internal::c_end(sequence));
1063*9356374aSAndroid Build Coastguard Worker }
1064*9356374aSAndroid Build Coastguard Worker 
1065*9356374aSAndroid Build Coastguard Worker // Overload of c_nth_element() for performing a `comp` comparison other than
1066*9356374aSAndroid Build Coastguard Worker // the default `operator<`.
1067*9356374aSAndroid Build Coastguard Worker template <typename RandomAccessContainer, typename LessThan>
1068*9356374aSAndroid Build Coastguard Worker void c_nth_element(
1069*9356374aSAndroid Build Coastguard Worker     RandomAccessContainer& sequence,
1070*9356374aSAndroid Build Coastguard Worker     container_algorithm_internal::ContainerIter<RandomAccessContainer> nth,
1071*9356374aSAndroid Build Coastguard Worker     LessThan&& comp) {
1072*9356374aSAndroid Build Coastguard Worker   std::nth_element(container_algorithm_internal::c_begin(sequence), nth,
1073*9356374aSAndroid Build Coastguard Worker                    container_algorithm_internal::c_end(sequence),
1074*9356374aSAndroid Build Coastguard Worker                    std::forward<LessThan>(comp));
1075*9356374aSAndroid Build Coastguard Worker }
1076*9356374aSAndroid Build Coastguard Worker 
1077*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
1078*9356374aSAndroid Build Coastguard Worker // <algorithm> Binary Search
1079*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
1080*9356374aSAndroid Build Coastguard Worker 
1081*9356374aSAndroid Build Coastguard Worker // c_lower_bound()
1082*9356374aSAndroid Build Coastguard Worker //
1083*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::lower_bound()` function
1084*9356374aSAndroid Build Coastguard Worker // to return an iterator pointing to the first element in a sorted container
1085*9356374aSAndroid Build Coastguard Worker // which does not compare less than `value`.
1086*9356374aSAndroid Build Coastguard Worker template <typename Sequence, typename T>
1087*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<Sequence> c_lower_bound(
1088*9356374aSAndroid Build Coastguard Worker     Sequence& sequence, const T& value) {
1089*9356374aSAndroid Build Coastguard Worker   return std::lower_bound(container_algorithm_internal::c_begin(sequence),
1090*9356374aSAndroid Build Coastguard Worker                           container_algorithm_internal::c_end(sequence), value);
1091*9356374aSAndroid Build Coastguard Worker }
1092*9356374aSAndroid Build Coastguard Worker 
1093*9356374aSAndroid Build Coastguard Worker // Overload of c_lower_bound() for performing a `comp` comparison other than
1094*9356374aSAndroid Build Coastguard Worker // the default `operator<`.
1095*9356374aSAndroid Build Coastguard Worker template <typename Sequence, typename T, typename LessThan>
1096*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<Sequence> c_lower_bound(
1097*9356374aSAndroid Build Coastguard Worker     Sequence& sequence, const T& value, LessThan&& comp) {
1098*9356374aSAndroid Build Coastguard Worker   return std::lower_bound(container_algorithm_internal::c_begin(sequence),
1099*9356374aSAndroid Build Coastguard Worker                           container_algorithm_internal::c_end(sequence), value,
1100*9356374aSAndroid Build Coastguard Worker                           std::forward<LessThan>(comp));
1101*9356374aSAndroid Build Coastguard Worker }
1102*9356374aSAndroid Build Coastguard Worker 
1103*9356374aSAndroid Build Coastguard Worker // c_upper_bound()
1104*9356374aSAndroid Build Coastguard Worker //
1105*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::upper_bound()` function
1106*9356374aSAndroid Build Coastguard Worker // to return an iterator pointing to the first element in a sorted container
1107*9356374aSAndroid Build Coastguard Worker // which is greater than `value`.
1108*9356374aSAndroid Build Coastguard Worker template <typename Sequence, typename T>
1109*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<Sequence> c_upper_bound(
1110*9356374aSAndroid Build Coastguard Worker     Sequence& sequence, const T& value) {
1111*9356374aSAndroid Build Coastguard Worker   return std::upper_bound(container_algorithm_internal::c_begin(sequence),
1112*9356374aSAndroid Build Coastguard Worker                           container_algorithm_internal::c_end(sequence), value);
1113*9356374aSAndroid Build Coastguard Worker }
1114*9356374aSAndroid Build Coastguard Worker 
1115*9356374aSAndroid Build Coastguard Worker // Overload of c_upper_bound() for performing a `comp` comparison other than
1116*9356374aSAndroid Build Coastguard Worker // the default `operator<`.
1117*9356374aSAndroid Build Coastguard Worker template <typename Sequence, typename T, typename LessThan>
1118*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<Sequence> c_upper_bound(
1119*9356374aSAndroid Build Coastguard Worker     Sequence& sequence, const T& value, LessThan&& comp) {
1120*9356374aSAndroid Build Coastguard Worker   return std::upper_bound(container_algorithm_internal::c_begin(sequence),
1121*9356374aSAndroid Build Coastguard Worker                           container_algorithm_internal::c_end(sequence), value,
1122*9356374aSAndroid Build Coastguard Worker                           std::forward<LessThan>(comp));
1123*9356374aSAndroid Build Coastguard Worker }
1124*9356374aSAndroid Build Coastguard Worker 
1125*9356374aSAndroid Build Coastguard Worker // c_equal_range()
1126*9356374aSAndroid Build Coastguard Worker //
1127*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::equal_range()` function
1128*9356374aSAndroid Build Coastguard Worker // to return an iterator pair pointing to the first and last elements in a
1129*9356374aSAndroid Build Coastguard Worker // sorted container which compare equal to `value`.
1130*9356374aSAndroid Build Coastguard Worker template <typename Sequence, typename T>
1131*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIterPairType<Sequence, Sequence>
1132*9356374aSAndroid Build Coastguard Worker c_equal_range(Sequence& sequence, const T& value) {
1133*9356374aSAndroid Build Coastguard Worker   return std::equal_range(container_algorithm_internal::c_begin(sequence),
1134*9356374aSAndroid Build Coastguard Worker                           container_algorithm_internal::c_end(sequence), value);
1135*9356374aSAndroid Build Coastguard Worker }
1136*9356374aSAndroid Build Coastguard Worker 
1137*9356374aSAndroid Build Coastguard Worker // Overload of c_equal_range() for performing a `comp` comparison other than
1138*9356374aSAndroid Build Coastguard Worker // the default `operator<`.
1139*9356374aSAndroid Build Coastguard Worker template <typename Sequence, typename T, typename LessThan>
1140*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIterPairType<Sequence, Sequence>
1141*9356374aSAndroid Build Coastguard Worker c_equal_range(Sequence& sequence, const T& value, LessThan&& comp) {
1142*9356374aSAndroid Build Coastguard Worker   return std::equal_range(container_algorithm_internal::c_begin(sequence),
1143*9356374aSAndroid Build Coastguard Worker                           container_algorithm_internal::c_end(sequence), value,
1144*9356374aSAndroid Build Coastguard Worker                           std::forward<LessThan>(comp));
1145*9356374aSAndroid Build Coastguard Worker }
1146*9356374aSAndroid Build Coastguard Worker 
1147*9356374aSAndroid Build Coastguard Worker // c_binary_search()
1148*9356374aSAndroid Build Coastguard Worker //
1149*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::binary_search()` function
1150*9356374aSAndroid Build Coastguard Worker // to test if any element in the sorted container contains a value equivalent to
1151*9356374aSAndroid Build Coastguard Worker // 'value'.
1152*9356374aSAndroid Build Coastguard Worker template <typename Sequence, typename T>
1153*9356374aSAndroid Build Coastguard Worker bool c_binary_search(const Sequence& sequence, const T& value) {
1154*9356374aSAndroid Build Coastguard Worker   return std::binary_search(container_algorithm_internal::c_begin(sequence),
1155*9356374aSAndroid Build Coastguard Worker                             container_algorithm_internal::c_end(sequence),
1156*9356374aSAndroid Build Coastguard Worker                             value);
1157*9356374aSAndroid Build Coastguard Worker }
1158*9356374aSAndroid Build Coastguard Worker 
1159*9356374aSAndroid Build Coastguard Worker // Overload of c_binary_search() for performing a `comp` comparison other than
1160*9356374aSAndroid Build Coastguard Worker // the default `operator<`.
1161*9356374aSAndroid Build Coastguard Worker template <typename Sequence, typename T, typename LessThan>
1162*9356374aSAndroid Build Coastguard Worker bool c_binary_search(const Sequence& sequence, const T& value,
1163*9356374aSAndroid Build Coastguard Worker                      LessThan&& comp) {
1164*9356374aSAndroid Build Coastguard Worker   return std::binary_search(container_algorithm_internal::c_begin(sequence),
1165*9356374aSAndroid Build Coastguard Worker                             container_algorithm_internal::c_end(sequence),
1166*9356374aSAndroid Build Coastguard Worker                             value, std::forward<LessThan>(comp));
1167*9356374aSAndroid Build Coastguard Worker }
1168*9356374aSAndroid Build Coastguard Worker 
1169*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
1170*9356374aSAndroid Build Coastguard Worker // <algorithm> Merge functions
1171*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
1172*9356374aSAndroid Build Coastguard Worker 
1173*9356374aSAndroid Build Coastguard Worker // c_merge()
1174*9356374aSAndroid Build Coastguard Worker //
1175*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::merge()` function
1176*9356374aSAndroid Build Coastguard Worker // to merge two sorted containers into a single sorted iterator.
1177*9356374aSAndroid Build Coastguard Worker template <typename C1, typename C2, typename OutputIterator>
1178*9356374aSAndroid Build Coastguard Worker OutputIterator c_merge(const C1& c1, const C2& c2, OutputIterator result) {
1179*9356374aSAndroid Build Coastguard Worker   return std::merge(container_algorithm_internal::c_begin(c1),
1180*9356374aSAndroid Build Coastguard Worker                     container_algorithm_internal::c_end(c1),
1181*9356374aSAndroid Build Coastguard Worker                     container_algorithm_internal::c_begin(c2),
1182*9356374aSAndroid Build Coastguard Worker                     container_algorithm_internal::c_end(c2), result);
1183*9356374aSAndroid Build Coastguard Worker }
1184*9356374aSAndroid Build Coastguard Worker 
1185*9356374aSAndroid Build Coastguard Worker // Overload of c_merge() for performing a `comp` comparison other than
1186*9356374aSAndroid Build Coastguard Worker // the default `operator<`.
1187*9356374aSAndroid Build Coastguard Worker template <typename C1, typename C2, typename OutputIterator, typename LessThan>
1188*9356374aSAndroid Build Coastguard Worker OutputIterator c_merge(const C1& c1, const C2& c2, OutputIterator result,
1189*9356374aSAndroid Build Coastguard Worker                        LessThan&& comp) {
1190*9356374aSAndroid Build Coastguard Worker   return std::merge(container_algorithm_internal::c_begin(c1),
1191*9356374aSAndroid Build Coastguard Worker                     container_algorithm_internal::c_end(c1),
1192*9356374aSAndroid Build Coastguard Worker                     container_algorithm_internal::c_begin(c2),
1193*9356374aSAndroid Build Coastguard Worker                     container_algorithm_internal::c_end(c2), result,
1194*9356374aSAndroid Build Coastguard Worker                     std::forward<LessThan>(comp));
1195*9356374aSAndroid Build Coastguard Worker }
1196*9356374aSAndroid Build Coastguard Worker 
1197*9356374aSAndroid Build Coastguard Worker // c_inplace_merge()
1198*9356374aSAndroid Build Coastguard Worker //
1199*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::inplace_merge()` function
1200*9356374aSAndroid Build Coastguard Worker // to merge a supplied iterator `middle` into a container.
1201*9356374aSAndroid Build Coastguard Worker template <typename C>
1202*9356374aSAndroid Build Coastguard Worker void c_inplace_merge(C& c,
1203*9356374aSAndroid Build Coastguard Worker                      container_algorithm_internal::ContainerIter<C> middle) {
1204*9356374aSAndroid Build Coastguard Worker   std::inplace_merge(container_algorithm_internal::c_begin(c), middle,
1205*9356374aSAndroid Build Coastguard Worker                      container_algorithm_internal::c_end(c));
1206*9356374aSAndroid Build Coastguard Worker }
1207*9356374aSAndroid Build Coastguard Worker 
1208*9356374aSAndroid Build Coastguard Worker // Overload of c_inplace_merge() for performing a merge using a `comp` other
1209*9356374aSAndroid Build Coastguard Worker // than `operator<`.
1210*9356374aSAndroid Build Coastguard Worker template <typename C, typename LessThan>
1211*9356374aSAndroid Build Coastguard Worker void c_inplace_merge(C& c,
1212*9356374aSAndroid Build Coastguard Worker                      container_algorithm_internal::ContainerIter<C> middle,
1213*9356374aSAndroid Build Coastguard Worker                      LessThan&& comp) {
1214*9356374aSAndroid Build Coastguard Worker   std::inplace_merge(container_algorithm_internal::c_begin(c), middle,
1215*9356374aSAndroid Build Coastguard Worker                      container_algorithm_internal::c_end(c),
1216*9356374aSAndroid Build Coastguard Worker                      std::forward<LessThan>(comp));
1217*9356374aSAndroid Build Coastguard Worker }
1218*9356374aSAndroid Build Coastguard Worker 
1219*9356374aSAndroid Build Coastguard Worker // c_includes()
1220*9356374aSAndroid Build Coastguard Worker //
1221*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::includes()` function
1222*9356374aSAndroid Build Coastguard Worker // to test whether a sorted container `c1` entirely contains another sorted
1223*9356374aSAndroid Build Coastguard Worker // container `c2`.
1224*9356374aSAndroid Build Coastguard Worker template <typename C1, typename C2>
1225*9356374aSAndroid Build Coastguard Worker bool c_includes(const C1& c1, const C2& c2) {
1226*9356374aSAndroid Build Coastguard Worker   return std::includes(container_algorithm_internal::c_begin(c1),
1227*9356374aSAndroid Build Coastguard Worker                        container_algorithm_internal::c_end(c1),
1228*9356374aSAndroid Build Coastguard Worker                        container_algorithm_internal::c_begin(c2),
1229*9356374aSAndroid Build Coastguard Worker                        container_algorithm_internal::c_end(c2));
1230*9356374aSAndroid Build Coastguard Worker }
1231*9356374aSAndroid Build Coastguard Worker 
1232*9356374aSAndroid Build Coastguard Worker // Overload of c_includes() for performing a merge using a `comp` other than
1233*9356374aSAndroid Build Coastguard Worker // `operator<`.
1234*9356374aSAndroid Build Coastguard Worker template <typename C1, typename C2, typename LessThan>
1235*9356374aSAndroid Build Coastguard Worker bool c_includes(const C1& c1, const C2& c2, LessThan&& comp) {
1236*9356374aSAndroid Build Coastguard Worker   return std::includes(container_algorithm_internal::c_begin(c1),
1237*9356374aSAndroid Build Coastguard Worker                        container_algorithm_internal::c_end(c1),
1238*9356374aSAndroid Build Coastguard Worker                        container_algorithm_internal::c_begin(c2),
1239*9356374aSAndroid Build Coastguard Worker                        container_algorithm_internal::c_end(c2),
1240*9356374aSAndroid Build Coastguard Worker                        std::forward<LessThan>(comp));
1241*9356374aSAndroid Build Coastguard Worker }
1242*9356374aSAndroid Build Coastguard Worker 
1243*9356374aSAndroid Build Coastguard Worker // c_set_union()
1244*9356374aSAndroid Build Coastguard Worker //
1245*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::set_union()` function
1246*9356374aSAndroid Build Coastguard Worker // to return an iterator containing the union of two containers; duplicate
1247*9356374aSAndroid Build Coastguard Worker // values are not copied into the output.
1248*9356374aSAndroid Build Coastguard Worker template <typename C1, typename C2, typename OutputIterator,
1249*9356374aSAndroid Build Coastguard Worker           typename = typename std::enable_if<
1250*9356374aSAndroid Build Coastguard Worker               !container_algorithm_internal::IsUnorderedContainer<C1>::value,
1251*9356374aSAndroid Build Coastguard Worker               void>::type,
1252*9356374aSAndroid Build Coastguard Worker           typename = typename std::enable_if<
1253*9356374aSAndroid Build Coastguard Worker               !container_algorithm_internal::IsUnorderedContainer<C2>::value,
1254*9356374aSAndroid Build Coastguard Worker               void>::type>
1255*9356374aSAndroid Build Coastguard Worker OutputIterator c_set_union(const C1& c1, const C2& c2, OutputIterator output) {
1256*9356374aSAndroid Build Coastguard Worker   return std::set_union(container_algorithm_internal::c_begin(c1),
1257*9356374aSAndroid Build Coastguard Worker                         container_algorithm_internal::c_end(c1),
1258*9356374aSAndroid Build Coastguard Worker                         container_algorithm_internal::c_begin(c2),
1259*9356374aSAndroid Build Coastguard Worker                         container_algorithm_internal::c_end(c2), output);
1260*9356374aSAndroid Build Coastguard Worker }
1261*9356374aSAndroid Build Coastguard Worker 
1262*9356374aSAndroid Build Coastguard Worker // Overload of c_set_union() for performing a merge using a `comp` other than
1263*9356374aSAndroid Build Coastguard Worker // `operator<`.
1264*9356374aSAndroid Build Coastguard Worker template <typename C1, typename C2, typename OutputIterator, typename LessThan,
1265*9356374aSAndroid Build Coastguard Worker           typename = typename std::enable_if<
1266*9356374aSAndroid Build Coastguard Worker               !container_algorithm_internal::IsUnorderedContainer<C1>::value,
1267*9356374aSAndroid Build Coastguard Worker               void>::type,
1268*9356374aSAndroid Build Coastguard Worker           typename = typename std::enable_if<
1269*9356374aSAndroid Build Coastguard Worker               !container_algorithm_internal::IsUnorderedContainer<C2>::value,
1270*9356374aSAndroid Build Coastguard Worker               void>::type>
1271*9356374aSAndroid Build Coastguard Worker OutputIterator c_set_union(const C1& c1, const C2& c2, OutputIterator output,
1272*9356374aSAndroid Build Coastguard Worker                            LessThan&& comp) {
1273*9356374aSAndroid Build Coastguard Worker   return std::set_union(container_algorithm_internal::c_begin(c1),
1274*9356374aSAndroid Build Coastguard Worker                         container_algorithm_internal::c_end(c1),
1275*9356374aSAndroid Build Coastguard Worker                         container_algorithm_internal::c_begin(c2),
1276*9356374aSAndroid Build Coastguard Worker                         container_algorithm_internal::c_end(c2), output,
1277*9356374aSAndroid Build Coastguard Worker                         std::forward<LessThan>(comp));
1278*9356374aSAndroid Build Coastguard Worker }
1279*9356374aSAndroid Build Coastguard Worker 
1280*9356374aSAndroid Build Coastguard Worker // c_set_intersection()
1281*9356374aSAndroid Build Coastguard Worker //
1282*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::set_intersection()` function
1283*9356374aSAndroid Build Coastguard Worker // to return an iterator containing the intersection of two sorted containers.
1284*9356374aSAndroid Build Coastguard Worker template <typename C1, typename C2, typename OutputIterator,
1285*9356374aSAndroid Build Coastguard Worker           typename = typename std::enable_if<
1286*9356374aSAndroid Build Coastguard Worker               !container_algorithm_internal::IsUnorderedContainer<C1>::value,
1287*9356374aSAndroid Build Coastguard Worker               void>::type,
1288*9356374aSAndroid Build Coastguard Worker           typename = typename std::enable_if<
1289*9356374aSAndroid Build Coastguard Worker               !container_algorithm_internal::IsUnorderedContainer<C2>::value,
1290*9356374aSAndroid Build Coastguard Worker               void>::type>
1291*9356374aSAndroid Build Coastguard Worker OutputIterator c_set_intersection(const C1& c1, const C2& c2,
1292*9356374aSAndroid Build Coastguard Worker                                   OutputIterator output) {
1293*9356374aSAndroid Build Coastguard Worker   // In debug builds, ensure that both containers are sorted with respect to the
1294*9356374aSAndroid Build Coastguard Worker   // default comparator. std::set_intersection requires the containers be sorted
1295*9356374aSAndroid Build Coastguard Worker   // using operator<.
1296*9356374aSAndroid Build Coastguard Worker   assert(absl::c_is_sorted(c1));
1297*9356374aSAndroid Build Coastguard Worker   assert(absl::c_is_sorted(c2));
1298*9356374aSAndroid Build Coastguard Worker   return std::set_intersection(container_algorithm_internal::c_begin(c1),
1299*9356374aSAndroid Build Coastguard Worker                                container_algorithm_internal::c_end(c1),
1300*9356374aSAndroid Build Coastguard Worker                                container_algorithm_internal::c_begin(c2),
1301*9356374aSAndroid Build Coastguard Worker                                container_algorithm_internal::c_end(c2), output);
1302*9356374aSAndroid Build Coastguard Worker }
1303*9356374aSAndroid Build Coastguard Worker 
1304*9356374aSAndroid Build Coastguard Worker // Overload of c_set_intersection() for performing a merge using a `comp` other
1305*9356374aSAndroid Build Coastguard Worker // than `operator<`.
1306*9356374aSAndroid Build Coastguard Worker template <typename C1, typename C2, typename OutputIterator, typename LessThan,
1307*9356374aSAndroid Build Coastguard Worker           typename = typename std::enable_if<
1308*9356374aSAndroid Build Coastguard Worker               !container_algorithm_internal::IsUnorderedContainer<C1>::value,
1309*9356374aSAndroid Build Coastguard Worker               void>::type,
1310*9356374aSAndroid Build Coastguard Worker           typename = typename std::enable_if<
1311*9356374aSAndroid Build Coastguard Worker               !container_algorithm_internal::IsUnorderedContainer<C2>::value,
1312*9356374aSAndroid Build Coastguard Worker               void>::type>
1313*9356374aSAndroid Build Coastguard Worker OutputIterator c_set_intersection(const C1& c1, const C2& c2,
1314*9356374aSAndroid Build Coastguard Worker                                   OutputIterator output, LessThan&& comp) {
1315*9356374aSAndroid Build Coastguard Worker   // In debug builds, ensure that both containers are sorted with respect to the
1316*9356374aSAndroid Build Coastguard Worker   // default comparator. std::set_intersection requires the containers be sorted
1317*9356374aSAndroid Build Coastguard Worker   // using the same comparator.
1318*9356374aSAndroid Build Coastguard Worker   assert(absl::c_is_sorted(c1, comp));
1319*9356374aSAndroid Build Coastguard Worker   assert(absl::c_is_sorted(c2, comp));
1320*9356374aSAndroid Build Coastguard Worker   return std::set_intersection(container_algorithm_internal::c_begin(c1),
1321*9356374aSAndroid Build Coastguard Worker                                container_algorithm_internal::c_end(c1),
1322*9356374aSAndroid Build Coastguard Worker                                container_algorithm_internal::c_begin(c2),
1323*9356374aSAndroid Build Coastguard Worker                                container_algorithm_internal::c_end(c2), output,
1324*9356374aSAndroid Build Coastguard Worker                                std::forward<LessThan>(comp));
1325*9356374aSAndroid Build Coastguard Worker }
1326*9356374aSAndroid Build Coastguard Worker 
1327*9356374aSAndroid Build Coastguard Worker // c_set_difference()
1328*9356374aSAndroid Build Coastguard Worker //
1329*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::set_difference()` function
1330*9356374aSAndroid Build Coastguard Worker // to return an iterator containing elements present in the first container but
1331*9356374aSAndroid Build Coastguard Worker // not in the second.
1332*9356374aSAndroid Build Coastguard Worker template <typename C1, typename C2, typename OutputIterator,
1333*9356374aSAndroid Build Coastguard Worker           typename = typename std::enable_if<
1334*9356374aSAndroid Build Coastguard Worker               !container_algorithm_internal::IsUnorderedContainer<C1>::value,
1335*9356374aSAndroid Build Coastguard Worker               void>::type,
1336*9356374aSAndroid Build Coastguard Worker           typename = typename std::enable_if<
1337*9356374aSAndroid Build Coastguard Worker               !container_algorithm_internal::IsUnorderedContainer<C2>::value,
1338*9356374aSAndroid Build Coastguard Worker               void>::type>
1339*9356374aSAndroid Build Coastguard Worker OutputIterator c_set_difference(const C1& c1, const C2& c2,
1340*9356374aSAndroid Build Coastguard Worker                                 OutputIterator output) {
1341*9356374aSAndroid Build Coastguard Worker   return std::set_difference(container_algorithm_internal::c_begin(c1),
1342*9356374aSAndroid Build Coastguard Worker                              container_algorithm_internal::c_end(c1),
1343*9356374aSAndroid Build Coastguard Worker                              container_algorithm_internal::c_begin(c2),
1344*9356374aSAndroid Build Coastguard Worker                              container_algorithm_internal::c_end(c2), output);
1345*9356374aSAndroid Build Coastguard Worker }
1346*9356374aSAndroid Build Coastguard Worker 
1347*9356374aSAndroid Build Coastguard Worker // Overload of c_set_difference() for performing a merge using a `comp` other
1348*9356374aSAndroid Build Coastguard Worker // than `operator<`.
1349*9356374aSAndroid Build Coastguard Worker template <typename C1, typename C2, typename OutputIterator, typename LessThan,
1350*9356374aSAndroid Build Coastguard Worker           typename = typename std::enable_if<
1351*9356374aSAndroid Build Coastguard Worker               !container_algorithm_internal::IsUnorderedContainer<C1>::value,
1352*9356374aSAndroid Build Coastguard Worker               void>::type,
1353*9356374aSAndroid Build Coastguard Worker           typename = typename std::enable_if<
1354*9356374aSAndroid Build Coastguard Worker               !container_algorithm_internal::IsUnorderedContainer<C2>::value,
1355*9356374aSAndroid Build Coastguard Worker               void>::type>
1356*9356374aSAndroid Build Coastguard Worker OutputIterator c_set_difference(const C1& c1, const C2& c2,
1357*9356374aSAndroid Build Coastguard Worker                                 OutputIterator output, LessThan&& comp) {
1358*9356374aSAndroid Build Coastguard Worker   return std::set_difference(container_algorithm_internal::c_begin(c1),
1359*9356374aSAndroid Build Coastguard Worker                              container_algorithm_internal::c_end(c1),
1360*9356374aSAndroid Build Coastguard Worker                              container_algorithm_internal::c_begin(c2),
1361*9356374aSAndroid Build Coastguard Worker                              container_algorithm_internal::c_end(c2), output,
1362*9356374aSAndroid Build Coastguard Worker                              std::forward<LessThan>(comp));
1363*9356374aSAndroid Build Coastguard Worker }
1364*9356374aSAndroid Build Coastguard Worker 
1365*9356374aSAndroid Build Coastguard Worker // c_set_symmetric_difference()
1366*9356374aSAndroid Build Coastguard Worker //
1367*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::set_symmetric_difference()`
1368*9356374aSAndroid Build Coastguard Worker // function to return an iterator containing elements present in either one
1369*9356374aSAndroid Build Coastguard Worker // container or the other, but not both.
1370*9356374aSAndroid Build Coastguard Worker template <typename C1, typename C2, typename OutputIterator,
1371*9356374aSAndroid Build Coastguard Worker           typename = typename std::enable_if<
1372*9356374aSAndroid Build Coastguard Worker               !container_algorithm_internal::IsUnorderedContainer<C1>::value,
1373*9356374aSAndroid Build Coastguard Worker               void>::type,
1374*9356374aSAndroid Build Coastguard Worker           typename = typename std::enable_if<
1375*9356374aSAndroid Build Coastguard Worker               !container_algorithm_internal::IsUnorderedContainer<C2>::value,
1376*9356374aSAndroid Build Coastguard Worker               void>::type>
1377*9356374aSAndroid Build Coastguard Worker OutputIterator c_set_symmetric_difference(const C1& c1, const C2& c2,
1378*9356374aSAndroid Build Coastguard Worker                                           OutputIterator output) {
1379*9356374aSAndroid Build Coastguard Worker   return std::set_symmetric_difference(
1380*9356374aSAndroid Build Coastguard Worker       container_algorithm_internal::c_begin(c1),
1381*9356374aSAndroid Build Coastguard Worker       container_algorithm_internal::c_end(c1),
1382*9356374aSAndroid Build Coastguard Worker       container_algorithm_internal::c_begin(c2),
1383*9356374aSAndroid Build Coastguard Worker       container_algorithm_internal::c_end(c2), output);
1384*9356374aSAndroid Build Coastguard Worker }
1385*9356374aSAndroid Build Coastguard Worker 
1386*9356374aSAndroid Build Coastguard Worker // Overload of c_set_symmetric_difference() for performing a merge using a
1387*9356374aSAndroid Build Coastguard Worker // `comp` other than `operator<`.
1388*9356374aSAndroid Build Coastguard Worker template <typename C1, typename C2, typename OutputIterator, typename LessThan,
1389*9356374aSAndroid Build Coastguard Worker           typename = typename std::enable_if<
1390*9356374aSAndroid Build Coastguard Worker               !container_algorithm_internal::IsUnorderedContainer<C1>::value,
1391*9356374aSAndroid Build Coastguard Worker               void>::type,
1392*9356374aSAndroid Build Coastguard Worker           typename = typename std::enable_if<
1393*9356374aSAndroid Build Coastguard Worker               !container_algorithm_internal::IsUnorderedContainer<C2>::value,
1394*9356374aSAndroid Build Coastguard Worker               void>::type>
1395*9356374aSAndroid Build Coastguard Worker OutputIterator c_set_symmetric_difference(const C1& c1, const C2& c2,
1396*9356374aSAndroid Build Coastguard Worker                                           OutputIterator output,
1397*9356374aSAndroid Build Coastguard Worker                                           LessThan&& comp) {
1398*9356374aSAndroid Build Coastguard Worker   return std::set_symmetric_difference(
1399*9356374aSAndroid Build Coastguard Worker       container_algorithm_internal::c_begin(c1),
1400*9356374aSAndroid Build Coastguard Worker       container_algorithm_internal::c_end(c1),
1401*9356374aSAndroid Build Coastguard Worker       container_algorithm_internal::c_begin(c2),
1402*9356374aSAndroid Build Coastguard Worker       container_algorithm_internal::c_end(c2), output,
1403*9356374aSAndroid Build Coastguard Worker       std::forward<LessThan>(comp));
1404*9356374aSAndroid Build Coastguard Worker }
1405*9356374aSAndroid Build Coastguard Worker 
1406*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
1407*9356374aSAndroid Build Coastguard Worker // <algorithm> Heap functions
1408*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
1409*9356374aSAndroid Build Coastguard Worker 
1410*9356374aSAndroid Build Coastguard Worker // c_push_heap()
1411*9356374aSAndroid Build Coastguard Worker //
1412*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::push_heap()` function
1413*9356374aSAndroid Build Coastguard Worker // to push a value onto a container heap.
1414*9356374aSAndroid Build Coastguard Worker template <typename RandomAccessContainer>
1415*9356374aSAndroid Build Coastguard Worker void c_push_heap(RandomAccessContainer& sequence) {
1416*9356374aSAndroid Build Coastguard Worker   std::push_heap(container_algorithm_internal::c_begin(sequence),
1417*9356374aSAndroid Build Coastguard Worker                  container_algorithm_internal::c_end(sequence));
1418*9356374aSAndroid Build Coastguard Worker }
1419*9356374aSAndroid Build Coastguard Worker 
1420*9356374aSAndroid Build Coastguard Worker // Overload of c_push_heap() for performing a push operation on a heap using a
1421*9356374aSAndroid Build Coastguard Worker // `comp` other than `operator<`.
1422*9356374aSAndroid Build Coastguard Worker template <typename RandomAccessContainer, typename LessThan>
1423*9356374aSAndroid Build Coastguard Worker void c_push_heap(RandomAccessContainer& sequence, LessThan&& comp) {
1424*9356374aSAndroid Build Coastguard Worker   std::push_heap(container_algorithm_internal::c_begin(sequence),
1425*9356374aSAndroid Build Coastguard Worker                  container_algorithm_internal::c_end(sequence),
1426*9356374aSAndroid Build Coastguard Worker                  std::forward<LessThan>(comp));
1427*9356374aSAndroid Build Coastguard Worker }
1428*9356374aSAndroid Build Coastguard Worker 
1429*9356374aSAndroid Build Coastguard Worker // c_pop_heap()
1430*9356374aSAndroid Build Coastguard Worker //
1431*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::pop_heap()` function
1432*9356374aSAndroid Build Coastguard Worker // to pop a value from a heap container.
1433*9356374aSAndroid Build Coastguard Worker template <typename RandomAccessContainer>
1434*9356374aSAndroid Build Coastguard Worker void c_pop_heap(RandomAccessContainer& sequence) {
1435*9356374aSAndroid Build Coastguard Worker   std::pop_heap(container_algorithm_internal::c_begin(sequence),
1436*9356374aSAndroid Build Coastguard Worker                 container_algorithm_internal::c_end(sequence));
1437*9356374aSAndroid Build Coastguard Worker }
1438*9356374aSAndroid Build Coastguard Worker 
1439*9356374aSAndroid Build Coastguard Worker // Overload of c_pop_heap() for performing a pop operation on a heap using a
1440*9356374aSAndroid Build Coastguard Worker // `comp` other than `operator<`.
1441*9356374aSAndroid Build Coastguard Worker template <typename RandomAccessContainer, typename LessThan>
1442*9356374aSAndroid Build Coastguard Worker void c_pop_heap(RandomAccessContainer& sequence, LessThan&& comp) {
1443*9356374aSAndroid Build Coastguard Worker   std::pop_heap(container_algorithm_internal::c_begin(sequence),
1444*9356374aSAndroid Build Coastguard Worker                 container_algorithm_internal::c_end(sequence),
1445*9356374aSAndroid Build Coastguard Worker                 std::forward<LessThan>(comp));
1446*9356374aSAndroid Build Coastguard Worker }
1447*9356374aSAndroid Build Coastguard Worker 
1448*9356374aSAndroid Build Coastguard Worker // c_make_heap()
1449*9356374aSAndroid Build Coastguard Worker //
1450*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::make_heap()` function
1451*9356374aSAndroid Build Coastguard Worker // to make a container a heap.
1452*9356374aSAndroid Build Coastguard Worker template <typename RandomAccessContainer>
1453*9356374aSAndroid Build Coastguard Worker void c_make_heap(RandomAccessContainer& sequence) {
1454*9356374aSAndroid Build Coastguard Worker   std::make_heap(container_algorithm_internal::c_begin(sequence),
1455*9356374aSAndroid Build Coastguard Worker                  container_algorithm_internal::c_end(sequence));
1456*9356374aSAndroid Build Coastguard Worker }
1457*9356374aSAndroid Build Coastguard Worker 
1458*9356374aSAndroid Build Coastguard Worker // Overload of c_make_heap() for performing heap comparisons using a
1459*9356374aSAndroid Build Coastguard Worker // `comp` other than `operator<`
1460*9356374aSAndroid Build Coastguard Worker template <typename RandomAccessContainer, typename LessThan>
1461*9356374aSAndroid Build Coastguard Worker void c_make_heap(RandomAccessContainer& sequence, LessThan&& comp) {
1462*9356374aSAndroid Build Coastguard Worker   std::make_heap(container_algorithm_internal::c_begin(sequence),
1463*9356374aSAndroid Build Coastguard Worker                  container_algorithm_internal::c_end(sequence),
1464*9356374aSAndroid Build Coastguard Worker                  std::forward<LessThan>(comp));
1465*9356374aSAndroid Build Coastguard Worker }
1466*9356374aSAndroid Build Coastguard Worker 
1467*9356374aSAndroid Build Coastguard Worker // c_sort_heap()
1468*9356374aSAndroid Build Coastguard Worker //
1469*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::sort_heap()` function
1470*9356374aSAndroid Build Coastguard Worker // to sort a heap into ascending order (after which it is no longer a heap).
1471*9356374aSAndroid Build Coastguard Worker template <typename RandomAccessContainer>
1472*9356374aSAndroid Build Coastguard Worker void c_sort_heap(RandomAccessContainer& sequence) {
1473*9356374aSAndroid Build Coastguard Worker   std::sort_heap(container_algorithm_internal::c_begin(sequence),
1474*9356374aSAndroid Build Coastguard Worker                  container_algorithm_internal::c_end(sequence));
1475*9356374aSAndroid Build Coastguard Worker }
1476*9356374aSAndroid Build Coastguard Worker 
1477*9356374aSAndroid Build Coastguard Worker // Overload of c_sort_heap() for performing heap comparisons using a
1478*9356374aSAndroid Build Coastguard Worker // `comp` other than `operator<`
1479*9356374aSAndroid Build Coastguard Worker template <typename RandomAccessContainer, typename LessThan>
1480*9356374aSAndroid Build Coastguard Worker void c_sort_heap(RandomAccessContainer& sequence, LessThan&& comp) {
1481*9356374aSAndroid Build Coastguard Worker   std::sort_heap(container_algorithm_internal::c_begin(sequence),
1482*9356374aSAndroid Build Coastguard Worker                  container_algorithm_internal::c_end(sequence),
1483*9356374aSAndroid Build Coastguard Worker                  std::forward<LessThan>(comp));
1484*9356374aSAndroid Build Coastguard Worker }
1485*9356374aSAndroid Build Coastguard Worker 
1486*9356374aSAndroid Build Coastguard Worker // c_is_heap()
1487*9356374aSAndroid Build Coastguard Worker //
1488*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::is_heap()` function
1489*9356374aSAndroid Build Coastguard Worker // to check whether the given container is a heap.
1490*9356374aSAndroid Build Coastguard Worker template <typename RandomAccessContainer>
1491*9356374aSAndroid Build Coastguard Worker bool c_is_heap(const RandomAccessContainer& sequence) {
1492*9356374aSAndroid Build Coastguard Worker   return std::is_heap(container_algorithm_internal::c_begin(sequence),
1493*9356374aSAndroid Build Coastguard Worker                       container_algorithm_internal::c_end(sequence));
1494*9356374aSAndroid Build Coastguard Worker }
1495*9356374aSAndroid Build Coastguard Worker 
1496*9356374aSAndroid Build Coastguard Worker // Overload of c_is_heap() for performing heap comparisons using a
1497*9356374aSAndroid Build Coastguard Worker // `comp` other than `operator<`
1498*9356374aSAndroid Build Coastguard Worker template <typename RandomAccessContainer, typename LessThan>
1499*9356374aSAndroid Build Coastguard Worker bool c_is_heap(const RandomAccessContainer& sequence, LessThan&& comp) {
1500*9356374aSAndroid Build Coastguard Worker   return std::is_heap(container_algorithm_internal::c_begin(sequence),
1501*9356374aSAndroid Build Coastguard Worker                       container_algorithm_internal::c_end(sequence),
1502*9356374aSAndroid Build Coastguard Worker                       std::forward<LessThan>(comp));
1503*9356374aSAndroid Build Coastguard Worker }
1504*9356374aSAndroid Build Coastguard Worker 
1505*9356374aSAndroid Build Coastguard Worker // c_is_heap_until()
1506*9356374aSAndroid Build Coastguard Worker //
1507*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::is_heap_until()` function
1508*9356374aSAndroid Build Coastguard Worker // to find the first element in a given container which is not in heap order.
1509*9356374aSAndroid Build Coastguard Worker template <typename RandomAccessContainer>
1510*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<RandomAccessContainer>
1511*9356374aSAndroid Build Coastguard Worker c_is_heap_until(RandomAccessContainer& sequence) {
1512*9356374aSAndroid Build Coastguard Worker   return std::is_heap_until(container_algorithm_internal::c_begin(sequence),
1513*9356374aSAndroid Build Coastguard Worker                             container_algorithm_internal::c_end(sequence));
1514*9356374aSAndroid Build Coastguard Worker }
1515*9356374aSAndroid Build Coastguard Worker 
1516*9356374aSAndroid Build Coastguard Worker // Overload of c_is_heap_until() for performing heap comparisons using a
1517*9356374aSAndroid Build Coastguard Worker // `comp` other than `operator<`
1518*9356374aSAndroid Build Coastguard Worker template <typename RandomAccessContainer, typename LessThan>
1519*9356374aSAndroid Build Coastguard Worker container_algorithm_internal::ContainerIter<RandomAccessContainer>
1520*9356374aSAndroid Build Coastguard Worker c_is_heap_until(RandomAccessContainer& sequence, LessThan&& comp) {
1521*9356374aSAndroid Build Coastguard Worker   return std::is_heap_until(container_algorithm_internal::c_begin(sequence),
1522*9356374aSAndroid Build Coastguard Worker                             container_algorithm_internal::c_end(sequence),
1523*9356374aSAndroid Build Coastguard Worker                             std::forward<LessThan>(comp));
1524*9356374aSAndroid Build Coastguard Worker }
1525*9356374aSAndroid Build Coastguard Worker 
1526*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
1527*9356374aSAndroid Build Coastguard Worker //  <algorithm> Min/max
1528*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
1529*9356374aSAndroid Build Coastguard Worker 
1530*9356374aSAndroid Build Coastguard Worker // c_min_element()
1531*9356374aSAndroid Build Coastguard Worker //
1532*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::min_element()` function
1533*9356374aSAndroid Build Coastguard Worker // to return an iterator pointing to the element with the smallest value, using
1534*9356374aSAndroid Build Coastguard Worker // `operator<` to make the comparisons.
1535*9356374aSAndroid Build Coastguard Worker template <typename Sequence>
1536*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_CONSTEXPR_SINCE_CXX17
1537*9356374aSAndroid Build Coastguard Worker     container_algorithm_internal::ContainerIter<Sequence>
1538*9356374aSAndroid Build Coastguard Worker     c_min_element(Sequence& sequence) {
1539*9356374aSAndroid Build Coastguard Worker   return std::min_element(container_algorithm_internal::c_begin(sequence),
1540*9356374aSAndroid Build Coastguard Worker                           container_algorithm_internal::c_end(sequence));
1541*9356374aSAndroid Build Coastguard Worker }
1542*9356374aSAndroid Build Coastguard Worker 
1543*9356374aSAndroid Build Coastguard Worker // Overload of c_min_element() for performing a `comp` comparison other than
1544*9356374aSAndroid Build Coastguard Worker // `operator<`.
1545*9356374aSAndroid Build Coastguard Worker template <typename Sequence, typename LessThan>
1546*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_CONSTEXPR_SINCE_CXX17
1547*9356374aSAndroid Build Coastguard Worker     container_algorithm_internal::ContainerIter<Sequence>
1548*9356374aSAndroid Build Coastguard Worker     c_min_element(Sequence& sequence, LessThan&& comp) {
1549*9356374aSAndroid Build Coastguard Worker   return std::min_element(container_algorithm_internal::c_begin(sequence),
1550*9356374aSAndroid Build Coastguard Worker                           container_algorithm_internal::c_end(sequence),
1551*9356374aSAndroid Build Coastguard Worker                           std::forward<LessThan>(comp));
1552*9356374aSAndroid Build Coastguard Worker }
1553*9356374aSAndroid Build Coastguard Worker 
1554*9356374aSAndroid Build Coastguard Worker // c_max_element()
1555*9356374aSAndroid Build Coastguard Worker //
1556*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::max_element()` function
1557*9356374aSAndroid Build Coastguard Worker // to return an iterator pointing to the element with the largest value, using
1558*9356374aSAndroid Build Coastguard Worker // `operator<` to make the comparisons.
1559*9356374aSAndroid Build Coastguard Worker template <typename Sequence>
1560*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_CONSTEXPR_SINCE_CXX17
1561*9356374aSAndroid Build Coastguard Worker     container_algorithm_internal::ContainerIter<Sequence>
1562*9356374aSAndroid Build Coastguard Worker     c_max_element(Sequence& sequence) {
1563*9356374aSAndroid Build Coastguard Worker   return std::max_element(container_algorithm_internal::c_begin(sequence),
1564*9356374aSAndroid Build Coastguard Worker                           container_algorithm_internal::c_end(sequence));
1565*9356374aSAndroid Build Coastguard Worker }
1566*9356374aSAndroid Build Coastguard Worker 
1567*9356374aSAndroid Build Coastguard Worker // Overload of c_max_element() for performing a `comp` comparison other than
1568*9356374aSAndroid Build Coastguard Worker // `operator<`.
1569*9356374aSAndroid Build Coastguard Worker template <typename Sequence, typename LessThan>
1570*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_CONSTEXPR_SINCE_CXX17
1571*9356374aSAndroid Build Coastguard Worker     container_algorithm_internal::ContainerIter<Sequence>
1572*9356374aSAndroid Build Coastguard Worker     c_max_element(Sequence& sequence, LessThan&& comp) {
1573*9356374aSAndroid Build Coastguard Worker   return std::max_element(container_algorithm_internal::c_begin(sequence),
1574*9356374aSAndroid Build Coastguard Worker                           container_algorithm_internal::c_end(sequence),
1575*9356374aSAndroid Build Coastguard Worker                           std::forward<LessThan>(comp));
1576*9356374aSAndroid Build Coastguard Worker }
1577*9356374aSAndroid Build Coastguard Worker 
1578*9356374aSAndroid Build Coastguard Worker // c_minmax_element()
1579*9356374aSAndroid Build Coastguard Worker //
1580*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::minmax_element()` function
1581*9356374aSAndroid Build Coastguard Worker // to return a pair of iterators pointing to the elements containing the
1582*9356374aSAndroid Build Coastguard Worker // smallest and largest values, respectively, using `operator<` to make the
1583*9356374aSAndroid Build Coastguard Worker // comparisons.
1584*9356374aSAndroid Build Coastguard Worker template <typename C>
1585*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_CONSTEXPR_SINCE_CXX17
1586*9356374aSAndroid Build Coastguard Worker     container_algorithm_internal::ContainerIterPairType<C, C>
1587*9356374aSAndroid Build Coastguard Worker     c_minmax_element(C& c) {
1588*9356374aSAndroid Build Coastguard Worker   return std::minmax_element(container_algorithm_internal::c_begin(c),
1589*9356374aSAndroid Build Coastguard Worker                              container_algorithm_internal::c_end(c));
1590*9356374aSAndroid Build Coastguard Worker }
1591*9356374aSAndroid Build Coastguard Worker 
1592*9356374aSAndroid Build Coastguard Worker // Overload of c_minmax_element() for performing `comp` comparisons other than
1593*9356374aSAndroid Build Coastguard Worker // `operator<`.
1594*9356374aSAndroid Build Coastguard Worker template <typename C, typename LessThan>
1595*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_CONSTEXPR_SINCE_CXX17
1596*9356374aSAndroid Build Coastguard Worker     container_algorithm_internal::ContainerIterPairType<C, C>
1597*9356374aSAndroid Build Coastguard Worker     c_minmax_element(C& c, LessThan&& comp) {
1598*9356374aSAndroid Build Coastguard Worker   return std::minmax_element(container_algorithm_internal::c_begin(c),
1599*9356374aSAndroid Build Coastguard Worker                              container_algorithm_internal::c_end(c),
1600*9356374aSAndroid Build Coastguard Worker                              std::forward<LessThan>(comp));
1601*9356374aSAndroid Build Coastguard Worker }
1602*9356374aSAndroid Build Coastguard Worker 
1603*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
1604*9356374aSAndroid Build Coastguard Worker //  <algorithm> Lexicographical Comparisons
1605*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
1606*9356374aSAndroid Build Coastguard Worker 
1607*9356374aSAndroid Build Coastguard Worker // c_lexicographical_compare()
1608*9356374aSAndroid Build Coastguard Worker //
1609*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::lexicographical_compare()`
1610*9356374aSAndroid Build Coastguard Worker // function to lexicographically compare (e.g. sort words alphabetically) two
1611*9356374aSAndroid Build Coastguard Worker // container sequences. The comparison is performed using `operator<`. Note
1612*9356374aSAndroid Build Coastguard Worker // that capital letters ("A-Z") have ASCII values less than lowercase letters
1613*9356374aSAndroid Build Coastguard Worker // ("a-z").
1614*9356374aSAndroid Build Coastguard Worker template <typename Sequence1, typename Sequence2>
1615*9356374aSAndroid Build Coastguard Worker bool c_lexicographical_compare(const Sequence1& sequence1,
1616*9356374aSAndroid Build Coastguard Worker                                const Sequence2& sequence2) {
1617*9356374aSAndroid Build Coastguard Worker   return std::lexicographical_compare(
1618*9356374aSAndroid Build Coastguard Worker       container_algorithm_internal::c_begin(sequence1),
1619*9356374aSAndroid Build Coastguard Worker       container_algorithm_internal::c_end(sequence1),
1620*9356374aSAndroid Build Coastguard Worker       container_algorithm_internal::c_begin(sequence2),
1621*9356374aSAndroid Build Coastguard Worker       container_algorithm_internal::c_end(sequence2));
1622*9356374aSAndroid Build Coastguard Worker }
1623*9356374aSAndroid Build Coastguard Worker 
1624*9356374aSAndroid Build Coastguard Worker // Overload of c_lexicographical_compare() for performing a lexicographical
1625*9356374aSAndroid Build Coastguard Worker // comparison using a `comp` operator instead of `operator<`.
1626*9356374aSAndroid Build Coastguard Worker template <typename Sequence1, typename Sequence2, typename LessThan>
1627*9356374aSAndroid Build Coastguard Worker bool c_lexicographical_compare(const Sequence1& sequence1,
1628*9356374aSAndroid Build Coastguard Worker                                const Sequence2& sequence2, LessThan&& comp) {
1629*9356374aSAndroid Build Coastguard Worker   return std::lexicographical_compare(
1630*9356374aSAndroid Build Coastguard Worker       container_algorithm_internal::c_begin(sequence1),
1631*9356374aSAndroid Build Coastguard Worker       container_algorithm_internal::c_end(sequence1),
1632*9356374aSAndroid Build Coastguard Worker       container_algorithm_internal::c_begin(sequence2),
1633*9356374aSAndroid Build Coastguard Worker       container_algorithm_internal::c_end(sequence2),
1634*9356374aSAndroid Build Coastguard Worker       std::forward<LessThan>(comp));
1635*9356374aSAndroid Build Coastguard Worker }
1636*9356374aSAndroid Build Coastguard Worker 
1637*9356374aSAndroid Build Coastguard Worker // c_next_permutation()
1638*9356374aSAndroid Build Coastguard Worker //
1639*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::next_permutation()` function
1640*9356374aSAndroid Build Coastguard Worker // to rearrange a container's elements into the next lexicographically greater
1641*9356374aSAndroid Build Coastguard Worker // permutation.
1642*9356374aSAndroid Build Coastguard Worker template <typename C>
1643*9356374aSAndroid Build Coastguard Worker bool c_next_permutation(C& c) {
1644*9356374aSAndroid Build Coastguard Worker   return std::next_permutation(container_algorithm_internal::c_begin(c),
1645*9356374aSAndroid Build Coastguard Worker                                container_algorithm_internal::c_end(c));
1646*9356374aSAndroid Build Coastguard Worker }
1647*9356374aSAndroid Build Coastguard Worker 
1648*9356374aSAndroid Build Coastguard Worker // Overload of c_next_permutation() for performing a lexicographical
1649*9356374aSAndroid Build Coastguard Worker // comparison using a `comp` operator instead of `operator<`.
1650*9356374aSAndroid Build Coastguard Worker template <typename C, typename LessThan>
1651*9356374aSAndroid Build Coastguard Worker bool c_next_permutation(C& c, LessThan&& comp) {
1652*9356374aSAndroid Build Coastguard Worker   return std::next_permutation(container_algorithm_internal::c_begin(c),
1653*9356374aSAndroid Build Coastguard Worker                                container_algorithm_internal::c_end(c),
1654*9356374aSAndroid Build Coastguard Worker                                std::forward<LessThan>(comp));
1655*9356374aSAndroid Build Coastguard Worker }
1656*9356374aSAndroid Build Coastguard Worker 
1657*9356374aSAndroid Build Coastguard Worker // c_prev_permutation()
1658*9356374aSAndroid Build Coastguard Worker //
1659*9356374aSAndroid Build Coastguard Worker // Container-based version of the <algorithm> `std::prev_permutation()` function
1660*9356374aSAndroid Build Coastguard Worker // to rearrange a container's elements into the next lexicographically lesser
1661*9356374aSAndroid Build Coastguard Worker // permutation.
1662*9356374aSAndroid Build Coastguard Worker template <typename C>
1663*9356374aSAndroid Build Coastguard Worker bool c_prev_permutation(C& c) {
1664*9356374aSAndroid Build Coastguard Worker   return std::prev_permutation(container_algorithm_internal::c_begin(c),
1665*9356374aSAndroid Build Coastguard Worker                                container_algorithm_internal::c_end(c));
1666*9356374aSAndroid Build Coastguard Worker }
1667*9356374aSAndroid Build Coastguard Worker 
1668*9356374aSAndroid Build Coastguard Worker // Overload of c_prev_permutation() for performing a lexicographical
1669*9356374aSAndroid Build Coastguard Worker // comparison using a `comp` operator instead of `operator<`.
1670*9356374aSAndroid Build Coastguard Worker template <typename C, typename LessThan>
1671*9356374aSAndroid Build Coastguard Worker bool c_prev_permutation(C& c, LessThan&& comp) {
1672*9356374aSAndroid Build Coastguard Worker   return std::prev_permutation(container_algorithm_internal::c_begin(c),
1673*9356374aSAndroid Build Coastguard Worker                                container_algorithm_internal::c_end(c),
1674*9356374aSAndroid Build Coastguard Worker                                std::forward<LessThan>(comp));
1675*9356374aSAndroid Build Coastguard Worker }
1676*9356374aSAndroid Build Coastguard Worker 
1677*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
1678*9356374aSAndroid Build Coastguard Worker // <numeric> algorithms
1679*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
1680*9356374aSAndroid Build Coastguard Worker 
1681*9356374aSAndroid Build Coastguard Worker // c_iota()
1682*9356374aSAndroid Build Coastguard Worker //
1683*9356374aSAndroid Build Coastguard Worker // Container-based version of the <numeric> `std::iota()` function
1684*9356374aSAndroid Build Coastguard Worker // to compute successive values of `value`, as if incremented with `++value`
1685*9356374aSAndroid Build Coastguard Worker // after each element is written, and write them to the container.
1686*9356374aSAndroid Build Coastguard Worker template <typename Sequence, typename T>
1687*9356374aSAndroid Build Coastguard Worker void c_iota(Sequence& sequence, const T& value) {
1688*9356374aSAndroid Build Coastguard Worker   std::iota(container_algorithm_internal::c_begin(sequence),
1689*9356374aSAndroid Build Coastguard Worker             container_algorithm_internal::c_end(sequence), value);
1690*9356374aSAndroid Build Coastguard Worker }
1691*9356374aSAndroid Build Coastguard Worker 
1692*9356374aSAndroid Build Coastguard Worker // c_accumulate()
1693*9356374aSAndroid Build Coastguard Worker //
1694*9356374aSAndroid Build Coastguard Worker // Container-based version of the <numeric> `std::accumulate()` function
1695*9356374aSAndroid Build Coastguard Worker // to accumulate the element values of a container to `init` and return that
1696*9356374aSAndroid Build Coastguard Worker // accumulation by value.
1697*9356374aSAndroid Build Coastguard Worker //
1698*9356374aSAndroid Build Coastguard Worker // Note: Due to a language technicality this function has return type
1699*9356374aSAndroid Build Coastguard Worker // absl::decay_t<T>. As a user of this function you can casually read
1700*9356374aSAndroid Build Coastguard Worker // this as "returns T by value" and assume it does the right thing.
1701*9356374aSAndroid Build Coastguard Worker template <typename Sequence, typename T>
1702*9356374aSAndroid Build Coastguard Worker decay_t<T> c_accumulate(const Sequence& sequence, T&& init) {
1703*9356374aSAndroid Build Coastguard Worker   return std::accumulate(container_algorithm_internal::c_begin(sequence),
1704*9356374aSAndroid Build Coastguard Worker                          container_algorithm_internal::c_end(sequence),
1705*9356374aSAndroid Build Coastguard Worker                          std::forward<T>(init));
1706*9356374aSAndroid Build Coastguard Worker }
1707*9356374aSAndroid Build Coastguard Worker 
1708*9356374aSAndroid Build Coastguard Worker // Overload of c_accumulate() for using a binary operations other than
1709*9356374aSAndroid Build Coastguard Worker // addition for computing the accumulation.
1710*9356374aSAndroid Build Coastguard Worker template <typename Sequence, typename T, typename BinaryOp>
1711*9356374aSAndroid Build Coastguard Worker decay_t<T> c_accumulate(const Sequence& sequence, T&& init,
1712*9356374aSAndroid Build Coastguard Worker                         BinaryOp&& binary_op) {
1713*9356374aSAndroid Build Coastguard Worker   return std::accumulate(container_algorithm_internal::c_begin(sequence),
1714*9356374aSAndroid Build Coastguard Worker                          container_algorithm_internal::c_end(sequence),
1715*9356374aSAndroid Build Coastguard Worker                          std::forward<T>(init),
1716*9356374aSAndroid Build Coastguard Worker                          std::forward<BinaryOp>(binary_op));
1717*9356374aSAndroid Build Coastguard Worker }
1718*9356374aSAndroid Build Coastguard Worker 
1719*9356374aSAndroid Build Coastguard Worker // c_inner_product()
1720*9356374aSAndroid Build Coastguard Worker //
1721*9356374aSAndroid Build Coastguard Worker // Container-based version of the <numeric> `std::inner_product()` function
1722*9356374aSAndroid Build Coastguard Worker // to compute the cumulative inner product of container element pairs.
1723*9356374aSAndroid Build Coastguard Worker //
1724*9356374aSAndroid Build Coastguard Worker // Note: Due to a language technicality this function has return type
1725*9356374aSAndroid Build Coastguard Worker // absl::decay_t<T>. As a user of this function you can casually read
1726*9356374aSAndroid Build Coastguard Worker // this as "returns T by value" and assume it does the right thing.
1727*9356374aSAndroid Build Coastguard Worker template <typename Sequence1, typename Sequence2, typename T>
1728*9356374aSAndroid Build Coastguard Worker decay_t<T> c_inner_product(const Sequence1& factors1, const Sequence2& factors2,
1729*9356374aSAndroid Build Coastguard Worker                            T&& sum) {
1730*9356374aSAndroid Build Coastguard Worker   return std::inner_product(container_algorithm_internal::c_begin(factors1),
1731*9356374aSAndroid Build Coastguard Worker                             container_algorithm_internal::c_end(factors1),
1732*9356374aSAndroid Build Coastguard Worker                             container_algorithm_internal::c_begin(factors2),
1733*9356374aSAndroid Build Coastguard Worker                             std::forward<T>(sum));
1734*9356374aSAndroid Build Coastguard Worker }
1735*9356374aSAndroid Build Coastguard Worker 
1736*9356374aSAndroid Build Coastguard Worker // Overload of c_inner_product() for using binary operations other than
1737*9356374aSAndroid Build Coastguard Worker // `operator+` (for computing the accumulation) and `operator*` (for computing
1738*9356374aSAndroid Build Coastguard Worker // the product between the two container's element pair).
1739*9356374aSAndroid Build Coastguard Worker template <typename Sequence1, typename Sequence2, typename T,
1740*9356374aSAndroid Build Coastguard Worker           typename BinaryOp1, typename BinaryOp2>
1741*9356374aSAndroid Build Coastguard Worker decay_t<T> c_inner_product(const Sequence1& factors1, const Sequence2& factors2,
1742*9356374aSAndroid Build Coastguard Worker                            T&& sum, BinaryOp1&& op1, BinaryOp2&& op2) {
1743*9356374aSAndroid Build Coastguard Worker   return std::inner_product(container_algorithm_internal::c_begin(factors1),
1744*9356374aSAndroid Build Coastguard Worker                             container_algorithm_internal::c_end(factors1),
1745*9356374aSAndroid Build Coastguard Worker                             container_algorithm_internal::c_begin(factors2),
1746*9356374aSAndroid Build Coastguard Worker                             std::forward<T>(sum), std::forward<BinaryOp1>(op1),
1747*9356374aSAndroid Build Coastguard Worker                             std::forward<BinaryOp2>(op2));
1748*9356374aSAndroid Build Coastguard Worker }
1749*9356374aSAndroid Build Coastguard Worker 
1750*9356374aSAndroid Build Coastguard Worker // c_adjacent_difference()
1751*9356374aSAndroid Build Coastguard Worker //
1752*9356374aSAndroid Build Coastguard Worker // Container-based version of the <numeric> `std::adjacent_difference()`
1753*9356374aSAndroid Build Coastguard Worker // function to compute the difference between each element and the one preceding
1754*9356374aSAndroid Build Coastguard Worker // it and write it to an iterator.
1755*9356374aSAndroid Build Coastguard Worker template <typename InputSequence, typename OutputIt>
1756*9356374aSAndroid Build Coastguard Worker OutputIt c_adjacent_difference(const InputSequence& input,
1757*9356374aSAndroid Build Coastguard Worker                                OutputIt output_first) {
1758*9356374aSAndroid Build Coastguard Worker   return std::adjacent_difference(container_algorithm_internal::c_begin(input),
1759*9356374aSAndroid Build Coastguard Worker                                   container_algorithm_internal::c_end(input),
1760*9356374aSAndroid Build Coastguard Worker                                   output_first);
1761*9356374aSAndroid Build Coastguard Worker }
1762*9356374aSAndroid Build Coastguard Worker 
1763*9356374aSAndroid Build Coastguard Worker // Overload of c_adjacent_difference() for using a binary operation other than
1764*9356374aSAndroid Build Coastguard Worker // subtraction to compute the adjacent difference.
1765*9356374aSAndroid Build Coastguard Worker template <typename InputSequence, typename OutputIt, typename BinaryOp>
1766*9356374aSAndroid Build Coastguard Worker OutputIt c_adjacent_difference(const InputSequence& input,
1767*9356374aSAndroid Build Coastguard Worker                                OutputIt output_first, BinaryOp&& op) {
1768*9356374aSAndroid Build Coastguard Worker   return std::adjacent_difference(container_algorithm_internal::c_begin(input),
1769*9356374aSAndroid Build Coastguard Worker                                   container_algorithm_internal::c_end(input),
1770*9356374aSAndroid Build Coastguard Worker                                   output_first, std::forward<BinaryOp>(op));
1771*9356374aSAndroid Build Coastguard Worker }
1772*9356374aSAndroid Build Coastguard Worker 
1773*9356374aSAndroid Build Coastguard Worker // c_partial_sum()
1774*9356374aSAndroid Build Coastguard Worker //
1775*9356374aSAndroid Build Coastguard Worker // Container-based version of the <numeric> `std::partial_sum()` function
1776*9356374aSAndroid Build Coastguard Worker // to compute the partial sum of the elements in a sequence and write them
1777*9356374aSAndroid Build Coastguard Worker // to an iterator. The partial sum is the sum of all element values so far in
1778*9356374aSAndroid Build Coastguard Worker // the sequence.
1779*9356374aSAndroid Build Coastguard Worker template <typename InputSequence, typename OutputIt>
1780*9356374aSAndroid Build Coastguard Worker OutputIt c_partial_sum(const InputSequence& input, OutputIt output_first) {
1781*9356374aSAndroid Build Coastguard Worker   return std::partial_sum(container_algorithm_internal::c_begin(input),
1782*9356374aSAndroid Build Coastguard Worker                           container_algorithm_internal::c_end(input),
1783*9356374aSAndroid Build Coastguard Worker                           output_first);
1784*9356374aSAndroid Build Coastguard Worker }
1785*9356374aSAndroid Build Coastguard Worker 
1786*9356374aSAndroid Build Coastguard Worker // Overload of c_partial_sum() for using a binary operation other than addition
1787*9356374aSAndroid Build Coastguard Worker // to compute the "partial sum".
1788*9356374aSAndroid Build Coastguard Worker template <typename InputSequence, typename OutputIt, typename BinaryOp>
1789*9356374aSAndroid Build Coastguard Worker OutputIt c_partial_sum(const InputSequence& input, OutputIt output_first,
1790*9356374aSAndroid Build Coastguard Worker                        BinaryOp&& op) {
1791*9356374aSAndroid Build Coastguard Worker   return std::partial_sum(container_algorithm_internal::c_begin(input),
1792*9356374aSAndroid Build Coastguard Worker                           container_algorithm_internal::c_end(input),
1793*9356374aSAndroid Build Coastguard Worker                           output_first, std::forward<BinaryOp>(op));
1794*9356374aSAndroid Build Coastguard Worker }
1795*9356374aSAndroid Build Coastguard Worker 
1796*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_END
1797*9356374aSAndroid Build Coastguard Worker }  // namespace absl
1798*9356374aSAndroid Build Coastguard Worker 
1799*9356374aSAndroid Build Coastguard Worker #endif  // ABSL_ALGORITHM_CONTAINER_H_
1800