xref: /aosp_15_r20/external/cronet/base/ranges/algorithm_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2020 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/ranges/algorithm.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <algorithm>
8*6777b538SAndroid Build Coastguard Worker #include <functional>
9*6777b538SAndroid Build Coastguard Worker #include <initializer_list>
10*6777b538SAndroid Build Coastguard Worker #include <iterator>
11*6777b538SAndroid Build Coastguard Worker #include <random>
12*6777b538SAndroid Build Coastguard Worker #include <utility>
13*6777b538SAndroid Build Coastguard Worker 
14*6777b538SAndroid Build Coastguard Worker #include "base/ranges/functional.h"
15*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
16*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker using ::testing::ElementsAre;
19*6777b538SAndroid Build Coastguard Worker using ::testing::Field;
20*6777b538SAndroid Build Coastguard Worker using ::testing::Ge;
21*6777b538SAndroid Build Coastguard Worker using ::testing::Gt;
22*6777b538SAndroid Build Coastguard Worker using ::testing::Le;
23*6777b538SAndroid Build Coastguard Worker using ::testing::Lt;
24*6777b538SAndroid Build Coastguard Worker using ::testing::Pair;
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker namespace base {
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker namespace {
29*6777b538SAndroid Build Coastguard Worker 
30*6777b538SAndroid Build Coastguard Worker // A macro to work around the fact that lambdas are not constexpr in C++14.
31*6777b538SAndroid Build Coastguard Worker // This will define an unnamed struct with a constexpr call operator, similarly
32*6777b538SAndroid Build Coastguard Worker // to how lambdas behave in C++17+.
33*6777b538SAndroid Build Coastguard Worker // Note that this does not support capture groups, so all lambdas defined like
34*6777b538SAndroid Build Coastguard Worker // this must be stateless.
35*6777b538SAndroid Build Coastguard Worker // Example Usage: `CONSTEXPR_LAMBDA((int i, int j) { return i + j; }) lambda;`
36*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/752720): Remove once we have constexpr lambdas for real.
37*6777b538SAndroid Build Coastguard Worker #define CONSTEXPR_LAMBDA(fun) \
38*6777b538SAndroid Build Coastguard Worker   constexpr struct { constexpr bool operator() fun }
39*6777b538SAndroid Build Coastguard Worker 
40*6777b538SAndroid Build Coastguard Worker struct Int {
41*6777b538SAndroid Build Coastguard Worker   constexpr Int() = default;
Intbase::__anon0995d6740111::Int42*6777b538SAndroid Build Coastguard Worker   constexpr Int(int value) : value(value) {}
43*6777b538SAndroid Build Coastguard Worker 
44*6777b538SAndroid Build Coastguard Worker   int value = 0;
45*6777b538SAndroid Build Coastguard Worker };
46*6777b538SAndroid Build Coastguard Worker 
operator ==(Int lhs,Int rhs)47*6777b538SAndroid Build Coastguard Worker constexpr bool operator==(Int lhs, Int rhs) {
48*6777b538SAndroid Build Coastguard Worker   return lhs.value == rhs.value;
49*6777b538SAndroid Build Coastguard Worker }
50*6777b538SAndroid Build Coastguard Worker 
operator <(Int lhs,Int rhs)51*6777b538SAndroid Build Coastguard Worker constexpr bool operator<(Int lhs, Int rhs) {
52*6777b538SAndroid Build Coastguard Worker   return lhs.value < rhs.value;
53*6777b538SAndroid Build Coastguard Worker }
54*6777b538SAndroid Build Coastguard Worker 
operator >(Int lhs,Int rhs)55*6777b538SAndroid Build Coastguard Worker constexpr bool operator>(Int lhs, Int rhs) {
56*6777b538SAndroid Build Coastguard Worker   return lhs.value > rhs.value;
57*6777b538SAndroid Build Coastguard Worker }
58*6777b538SAndroid Build Coastguard Worker 
operator <=(Int lhs,Int rhs)59*6777b538SAndroid Build Coastguard Worker constexpr bool operator<=(Int lhs, Int rhs) {
60*6777b538SAndroid Build Coastguard Worker   return lhs.value <= rhs.value;
61*6777b538SAndroid Build Coastguard Worker }
62*6777b538SAndroid Build Coastguard Worker 
operator >=(Int lhs,Int rhs)63*6777b538SAndroid Build Coastguard Worker constexpr bool operator>=(Int lhs, Int rhs) {
64*6777b538SAndroid Build Coastguard Worker   return lhs.value >= rhs.value;
65*6777b538SAndroid Build Coastguard Worker }
66*6777b538SAndroid Build Coastguard Worker 
67*6777b538SAndroid Build Coastguard Worker // Move-only int that clears `value` when moving out.
68*6777b538SAndroid Build Coastguard Worker struct MoveOnlyInt {
MoveOnlyIntbase::__anon0995d6740111::MoveOnlyInt69*6777b538SAndroid Build Coastguard Worker   MoveOnlyInt(int value) : value(value) {}
MoveOnlyIntbase::__anon0995d6740111::MoveOnlyInt70*6777b538SAndroid Build Coastguard Worker   MoveOnlyInt(MoveOnlyInt&& other) : value(std::exchange(other.value, 0)) {}
71*6777b538SAndroid Build Coastguard Worker 
operator =base::__anon0995d6740111::MoveOnlyInt72*6777b538SAndroid Build Coastguard Worker   MoveOnlyInt& operator=(MoveOnlyInt&& other) {
73*6777b538SAndroid Build Coastguard Worker     value = std::exchange(other.value, 0);
74*6777b538SAndroid Build Coastguard Worker     return *this;
75*6777b538SAndroid Build Coastguard Worker   }
76*6777b538SAndroid Build Coastguard Worker 
77*6777b538SAndroid Build Coastguard Worker   int value = 0;
78*6777b538SAndroid Build Coastguard Worker };
79*6777b538SAndroid Build Coastguard Worker 
is_even(int i)80*6777b538SAndroid Build Coastguard Worker constexpr bool is_even(int i) {
81*6777b538SAndroid Build Coastguard Worker   return i % 2 == 0;
82*6777b538SAndroid Build Coastguard Worker }
83*6777b538SAndroid Build Coastguard Worker 
is_odd(int i)84*6777b538SAndroid Build Coastguard Worker bool is_odd(int i) {
85*6777b538SAndroid Build Coastguard Worker   return i % 2 == 1;
86*6777b538SAndroid Build Coastguard Worker }
87*6777b538SAndroid Build Coastguard Worker 
88*6777b538SAndroid Build Coastguard Worker template <typename Iter>
make_vector(Iter begin,Iter end)89*6777b538SAndroid Build Coastguard Worker auto make_vector(Iter begin, Iter end) {
90*6777b538SAndroid Build Coastguard Worker   using T = typename std::iterator_traits<Iter>::value_type;
91*6777b538SAndroid Build Coastguard Worker   return std::vector<T>(begin, end);
92*6777b538SAndroid Build Coastguard Worker }
93*6777b538SAndroid Build Coastguard Worker 
94*6777b538SAndroid Build Coastguard Worker }  // namespace
95*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,AllOf)96*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, AllOf) {
97*6777b538SAndroid Build Coastguard Worker   // Note: Lambdas don't have a constexpr call operator prior to C++17, thus we
98*6777b538SAndroid Build Coastguard Worker   // are providing our own anonyomous struct here.
99*6777b538SAndroid Build Coastguard Worker   constexpr struct {
100*6777b538SAndroid Build Coastguard Worker     constexpr bool operator()(int i) { return i != 0; }
101*6777b538SAndroid Build Coastguard Worker   } is_non_zero;
102*6777b538SAndroid Build Coastguard Worker 
103*6777b538SAndroid Build Coastguard Worker   constexpr int array[] = {0, 1, 2, 3, 4, 5};
104*6777b538SAndroid Build Coastguard Worker 
105*6777b538SAndroid Build Coastguard Worker   static_assert(ranges::all_of(array + 1, array + 6, is_non_zero), "");
106*6777b538SAndroid Build Coastguard Worker   static_assert(!ranges::all_of(array, is_non_zero), "");
107*6777b538SAndroid Build Coastguard Worker 
108*6777b538SAndroid Build Coastguard Worker   constexpr Int values[] = {0, 2, 4, 5};
109*6777b538SAndroid Build Coastguard Worker   static_assert(
110*6777b538SAndroid Build Coastguard Worker       ranges::all_of(values + 1, ranges::end(values), is_non_zero, &Int::value),
111*6777b538SAndroid Build Coastguard Worker       "");
112*6777b538SAndroid Build Coastguard Worker   static_assert(!ranges::all_of(values, is_non_zero, &Int::value), "");
113*6777b538SAndroid Build Coastguard Worker }
114*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,AnyOf)115*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, AnyOf) {
116*6777b538SAndroid Build Coastguard Worker   constexpr int array[] = {0, 1, 2, 3, 4, 5};
117*6777b538SAndroid Build Coastguard Worker 
118*6777b538SAndroid Build Coastguard Worker   static_assert(!ranges::any_of(array + 5, array + 6, is_even), "");
119*6777b538SAndroid Build Coastguard Worker   static_assert(ranges::any_of(array, is_even), "");
120*6777b538SAndroid Build Coastguard Worker 
121*6777b538SAndroid Build Coastguard Worker   constexpr Int values[] = {{0}, {2}, {4}, {5}};
122*6777b538SAndroid Build Coastguard Worker   static_assert(
123*6777b538SAndroid Build Coastguard Worker       !ranges::any_of(values + 3, ranges::end(values), is_even, &Int::value),
124*6777b538SAndroid Build Coastguard Worker       "");
125*6777b538SAndroid Build Coastguard Worker   static_assert(ranges::any_of(values, is_even, &Int::value), "");
126*6777b538SAndroid Build Coastguard Worker }
127*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,NoneOf)128*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, NoneOf) {
129*6777b538SAndroid Build Coastguard Worker   // Note: Lambdas don't have a constexpr call operator prior to C++17, thus we
130*6777b538SAndroid Build Coastguard Worker   // are providing our own anonyomous struct here.
131*6777b538SAndroid Build Coastguard Worker   constexpr struct {
132*6777b538SAndroid Build Coastguard Worker     constexpr bool operator()(int i) { return i == 0; }
133*6777b538SAndroid Build Coastguard Worker   } is_zero;
134*6777b538SAndroid Build Coastguard Worker   constexpr int array[] = {0, 1, 2, 3, 4, 5};
135*6777b538SAndroid Build Coastguard Worker 
136*6777b538SAndroid Build Coastguard Worker   static_assert(ranges::none_of(array + 1, array + 6, is_zero), "");
137*6777b538SAndroid Build Coastguard Worker   static_assert(!ranges::none_of(array, is_zero), "");
138*6777b538SAndroid Build Coastguard Worker 
139*6777b538SAndroid Build Coastguard Worker   constexpr Int values[] = {{0}, {2}, {4}, {5}};
140*6777b538SAndroid Build Coastguard Worker   static_assert(
141*6777b538SAndroid Build Coastguard Worker       ranges::none_of(values + 1, ranges::end(values), is_zero, &Int::value),
142*6777b538SAndroid Build Coastguard Worker       "");
143*6777b538SAndroid Build Coastguard Worker   static_assert(!ranges::none_of(values, is_zero, &Int::value), "");
144*6777b538SAndroid Build Coastguard Worker }
145*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,ForEach)146*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, ForEach) {
147*6777b538SAndroid Build Coastguard Worker   auto times_two = [](int& i) { i *= 2; };
148*6777b538SAndroid Build Coastguard Worker   int array[] = {0, 1, 2, 3, 4, 5};
149*6777b538SAndroid Build Coastguard Worker 
150*6777b538SAndroid Build Coastguard Worker   auto result = ranges::for_each(array, array + 3, times_two);
151*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(result.in, array + 3);
152*6777b538SAndroid Build Coastguard Worker   // TODO(https://crbug.com/1191256): Fix googletest and switch this back to
153*6777b538SAndroid Build Coastguard Worker   // EXPECT_EQ.
154*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(result.fun == times_two);
155*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(array, ElementsAre(0, 2, 4, 3, 4, 5));
156*6777b538SAndroid Build Coastguard Worker 
157*6777b538SAndroid Build Coastguard Worker   ranges::for_each(array + 3, array + 6, times_two);
158*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(result.in, array + 3);
159*6777b538SAndroid Build Coastguard Worker   // TODO(https://crbug.com/1191256): Fix googletest and switch this back to
160*6777b538SAndroid Build Coastguard Worker   // EXPECT_EQ.
161*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(result.fun == times_two);
162*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(array, ElementsAre(0, 2, 4, 6, 8, 10));
163*6777b538SAndroid Build Coastguard Worker 
164*6777b538SAndroid Build Coastguard Worker   // TODO(https://crbug.com/1191256): Fix googletest and switch this back to
165*6777b538SAndroid Build Coastguard Worker   // EXPECT_EQ.
166*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(times_two == ranges::for_each(array, times_two).fun);
167*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(array, ElementsAre(0, 4, 8, 12, 16, 20));
168*6777b538SAndroid Build Coastguard Worker 
169*6777b538SAndroid Build Coastguard Worker   Int values[] = {0, 2, 4, 5};
170*6777b538SAndroid Build Coastguard Worker   // TODO(https://crbug.com/1191256): Fix googletest and switch this back to
171*6777b538SAndroid Build Coastguard Worker   // EXPECT_EQ.
172*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(times_two ==
173*6777b538SAndroid Build Coastguard Worker               ranges::for_each(values, times_two, &Int::value).fun);
174*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(values,
175*6777b538SAndroid Build Coastguard Worker               ElementsAre(Field(&Int::value, 0), Field(&Int::value, 4),
176*6777b538SAndroid Build Coastguard Worker                           Field(&Int::value, 8), Field(&Int::value, 10)));
177*6777b538SAndroid Build Coastguard Worker }
178*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,ForEachN)179*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, ForEachN) {
180*6777b538SAndroid Build Coastguard Worker   auto times_two = [](int& i) { i *= 2; };
181*6777b538SAndroid Build Coastguard Worker   int array[] = {0, 1, 2, 3, 4, 5};
182*6777b538SAndroid Build Coastguard Worker 
183*6777b538SAndroid Build Coastguard Worker   auto result = ranges::for_each_n(array, 3, times_two);
184*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(result.in, array + 3);
185*6777b538SAndroid Build Coastguard Worker   // TODO(https://crbug.com/1191256): Fix googletest and switch this back to
186*6777b538SAndroid Build Coastguard Worker   // EXPECT_EQ.
187*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(result.fun == times_two);
188*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(array, ElementsAre(0, 2, 4, 3, 4, 5));
189*6777b538SAndroid Build Coastguard Worker 
190*6777b538SAndroid Build Coastguard Worker   Int values[] = {0, 2, 4, 5};
191*6777b538SAndroid Build Coastguard Worker   // TODO(https://crbug.com/1191256): Fix googletest and switch this back to
192*6777b538SAndroid Build Coastguard Worker   // EXPECT_EQ.
193*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(times_two ==
194*6777b538SAndroid Build Coastguard Worker               ranges::for_each_n(values, 4, times_two, &Int::value).fun);
195*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(values,
196*6777b538SAndroid Build Coastguard Worker               ElementsAre(Field(&Int::value, 0), Field(&Int::value, 4),
197*6777b538SAndroid Build Coastguard Worker                           Field(&Int::value, 8), Field(&Int::value, 10)));
198*6777b538SAndroid Build Coastguard Worker }
199*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,Find)200*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, Find) {
201*6777b538SAndroid Build Coastguard Worker   constexpr int array[] = {0, 1, 2, 3, 4, 5};
202*6777b538SAndroid Build Coastguard Worker 
203*6777b538SAndroid Build Coastguard Worker   static_assert(array + 6 == ranges::find(array + 1, array + 6, 0), "");
204*6777b538SAndroid Build Coastguard Worker   static_assert(array == ranges::find(array, 0), "");
205*6777b538SAndroid Build Coastguard Worker 
206*6777b538SAndroid Build Coastguard Worker   constexpr Int values[] = {{0}, {2}, {4}, {5}};
207*6777b538SAndroid Build Coastguard Worker   static_assert(values == ranges::find(values, values, 0, &Int::value), "");
208*6777b538SAndroid Build Coastguard Worker   static_assert(ranges::end(values) == ranges::find(values, 3, &Int::value),
209*6777b538SAndroid Build Coastguard Worker                 "");
210*6777b538SAndroid Build Coastguard Worker }
211*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,FindIf)212*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, FindIf) {
213*6777b538SAndroid Build Coastguard Worker   auto is_at_least_5 = [](int i) { return i >= 5; };
214*6777b538SAndroid Build Coastguard Worker   int array[] = {0, 1, 2, 3, 4, 5};
215*6777b538SAndroid Build Coastguard Worker 
216*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array + 5, ranges::find_if(array, array + 5, is_at_least_5));
217*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array + 5, ranges::find_if(array, is_at_least_5));
218*6777b538SAndroid Build Coastguard Worker 
219*6777b538SAndroid Build Coastguard Worker   Int values[] = {{0}, {2}, {4}, {5}};
220*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(values + 3,
221*6777b538SAndroid Build Coastguard Worker             ranges::find_if(values, values + 3, is_odd, &Int::value));
222*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(values + 3, ranges::find_if(values, is_odd, &Int::value));
223*6777b538SAndroid Build Coastguard Worker }
224*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,FindIfNot)225*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, FindIfNot) {
226*6777b538SAndroid Build Coastguard Worker   auto is_less_than_5 = [](int i) { return i < 5; };
227*6777b538SAndroid Build Coastguard Worker   int array[] = {0, 1, 2, 3, 4, 5};
228*6777b538SAndroid Build Coastguard Worker 
229*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array + 5, ranges::find_if_not(array, array + 5, is_less_than_5));
230*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array + 5, ranges::find_if_not(array, is_less_than_5));
231*6777b538SAndroid Build Coastguard Worker 
232*6777b538SAndroid Build Coastguard Worker   Int values[] = {{0}, {2}, {4}, {5}};
233*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(values + 3,
234*6777b538SAndroid Build Coastguard Worker             ranges::find_if_not(values, values + 3, is_even, &Int::value));
235*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(values + 3, ranges::find_if_not(values, is_even, &Int::value));
236*6777b538SAndroid Build Coastguard Worker }
237*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,FindEnd)238*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, FindEnd) {
239*6777b538SAndroid Build Coastguard Worker   int array1[] = {0, 1, 2};
240*6777b538SAndroid Build Coastguard Worker   int array2[] = {4, 5, 6};
241*6777b538SAndroid Build Coastguard Worker   int array3[] = {0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4,
242*6777b538SAndroid Build Coastguard Worker                   0, 1, 2, 3, 0, 1, 2, 0, 1, 0};
243*6777b538SAndroid Build Coastguard Worker 
244*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array3 + 15, ranges::find_end(array3, ranges::end(array3), array1,
245*6777b538SAndroid Build Coastguard Worker                                           ranges::end(array1)));
246*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ranges::end(array3), ranges::find_end(array3, ranges::end(array3),
247*6777b538SAndroid Build Coastguard Worker                                                   array2, ranges::end(array2)));
248*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array3 + 4,
249*6777b538SAndroid Build Coastguard Worker             ranges::find_end(array3, ranges::end(array3), array2, array2 + 2));
250*6777b538SAndroid Build Coastguard Worker 
251*6777b538SAndroid Build Coastguard Worker   Int ints1[] = {{0}, {1}, {2}};
252*6777b538SAndroid Build Coastguard Worker   Int ints2[] = {{4}, {5}, {6}};
253*6777b538SAndroid Build Coastguard Worker 
254*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array3 + 15, ranges::find_end(array3, ints1, ranges::equal_to{},
255*6777b538SAndroid Build Coastguard Worker                                           std::identity{}, &Int::value));
256*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ranges::end(array3),
257*6777b538SAndroid Build Coastguard Worker             ranges::find_end(array3, ints2, ranges::equal_to{}, std::identity{},
258*6777b538SAndroid Build Coastguard Worker                              &Int::value));
259*6777b538SAndroid Build Coastguard Worker }
260*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,FindFirstOf)261*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, FindFirstOf) {
262*6777b538SAndroid Build Coastguard Worker   int array1[] = {1, 2, 3};
263*6777b538SAndroid Build Coastguard Worker   int array2[] = {7, 8, 9};
264*6777b538SAndroid Build Coastguard Worker   int array3[] = {0, 1, 2, 3, 4, 5, 0, 1, 2, 3};
265*6777b538SAndroid Build Coastguard Worker 
266*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array3 + 1, ranges::find_first_of(array3, ranges::end(array3),
267*6777b538SAndroid Build Coastguard Worker                                               array1, ranges::end(array1)));
268*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ranges::end(array3),
269*6777b538SAndroid Build Coastguard Worker             ranges::find_first_of(array3, ranges::end(array3), array2,
270*6777b538SAndroid Build Coastguard Worker                                   ranges::end(array2)));
271*6777b538SAndroid Build Coastguard Worker   Int ints1[] = {{1}, {2}, {3}};
272*6777b538SAndroid Build Coastguard Worker   Int ints2[] = {{7}, {8}, {9}};
273*6777b538SAndroid Build Coastguard Worker 
274*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array3 + 1, ranges::find_first_of(array3, ints1, ranges::equal_to{},
275*6777b538SAndroid Build Coastguard Worker                                               std::identity{}, &Int::value));
276*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ranges::end(array3),
277*6777b538SAndroid Build Coastguard Worker             ranges::find_first_of(array3, ints2, ranges::equal_to{},
278*6777b538SAndroid Build Coastguard Worker                                   std::identity{}, &Int::value));
279*6777b538SAndroid Build Coastguard Worker }
280*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,AdjacentFind)281*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, AdjacentFind) {
282*6777b538SAndroid Build Coastguard Worker   constexpr int array[] = {1, 2, 3, 3};
283*6777b538SAndroid Build Coastguard Worker   static_assert(array + 2 == ranges::adjacent_find(array, ranges::end(array)),
284*6777b538SAndroid Build Coastguard Worker                 "");
285*6777b538SAndroid Build Coastguard Worker   static_assert(
286*6777b538SAndroid Build Coastguard Worker       array == ranges::adjacent_find(array, ranges::end(array), ranges::less{}),
287*6777b538SAndroid Build Coastguard Worker       "");
288*6777b538SAndroid Build Coastguard Worker 
289*6777b538SAndroid Build Coastguard Worker   constexpr Int ints[] = {{6}, {6}, {5}, {4}};
290*6777b538SAndroid Build Coastguard Worker   static_assert(
291*6777b538SAndroid Build Coastguard Worker       ints == ranges::adjacent_find(ints, ranges::equal_to{}, &Int::value), "");
292*6777b538SAndroid Build Coastguard Worker   static_assert(ranges::end(ints) ==
293*6777b538SAndroid Build Coastguard Worker                     ranges::adjacent_find(ints, ranges::less{}, &Int::value),
294*6777b538SAndroid Build Coastguard Worker                 "");
295*6777b538SAndroid Build Coastguard Worker }
296*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,Count)297*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, Count) {
298*6777b538SAndroid Build Coastguard Worker   int array[] = {1, 2, 3, 3};
299*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, ranges::count(array, array + 4, 1));
300*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, ranges::count(array, array + 4, 2));
301*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, ranges::count(array, array + 3, 3));
302*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(2, ranges::count(array, array + 4, 3));
303*6777b538SAndroid Build Coastguard Worker 
304*6777b538SAndroid Build Coastguard Worker   Int ints[] = {{1}, {2}, {3}, {3}};
305*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, ranges::count(ints, 1, &Int::value));
306*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, ranges::count(ints, 2, &Int::value));
307*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(2, ranges::count(ints, 3, &Int::value));
308*6777b538SAndroid Build Coastguard Worker }
309*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,CountIf)310*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, CountIf) {
311*6777b538SAndroid Build Coastguard Worker   int array[] = {1, 2, 3, 3};
312*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, ranges::count_if(array, array + 1, is_even));
313*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, ranges::count_if(array, array + 2, is_even));
314*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, ranges::count_if(array, array + 3, is_even));
315*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, ranges::count_if(array, array + 4, is_even));
316*6777b538SAndroid Build Coastguard Worker 
317*6777b538SAndroid Build Coastguard Worker   Int ints[] = {{1}, {2}, {3}, {3}};
318*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, ranges::count_if(ints, is_even, &Int::value));
319*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(3, ranges::count_if(ints, is_odd, &Int::value));
320*6777b538SAndroid Build Coastguard Worker }
321*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,Mismatch)322*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, Mismatch) {
323*6777b538SAndroid Build Coastguard Worker   int array1[] = {1, 3, 6, 7};
324*6777b538SAndroid Build Coastguard Worker   int array2[] = {1, 3};
325*6777b538SAndroid Build Coastguard Worker   int array3[] = {1, 3, 5, 7};
326*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::make_pair(array1 + 2, array2 + 2),
327*6777b538SAndroid Build Coastguard Worker             ranges::mismatch(array1, array1 + 4, array2, array2 + 2));
328*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::make_pair(array1 + 2, array3 + 2),
329*6777b538SAndroid Build Coastguard Worker             ranges::mismatch(array1, array1 + 4, array3, array3 + 4));
330*6777b538SAndroid Build Coastguard Worker 
331*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::make_pair(array1 + 2, array2 + 2),
332*6777b538SAndroid Build Coastguard Worker             ranges::mismatch(array1, array2));
333*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(std::make_pair(array1 + 2, array3 + 2),
334*6777b538SAndroid Build Coastguard Worker             ranges::mismatch(array1, array3));
335*6777b538SAndroid Build Coastguard Worker }
336*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,Equal)337*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, Equal) {
338*6777b538SAndroid Build Coastguard Worker   static constexpr int array1[] = {1, 3, 6, 7};
339*6777b538SAndroid Build Coastguard Worker   static constexpr int array2[] = {1, 3, 5, 7};
340*6777b538SAndroid Build Coastguard Worker 
341*6777b538SAndroid Build Coastguard Worker   static_assert(ranges::equal(array1, array1 + 2, array2, array2 + 2), "");
342*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::equal(array1, array1 + 2, array2, array2 + 2));
343*6777b538SAndroid Build Coastguard Worker 
344*6777b538SAndroid Build Coastguard Worker   static_assert(!ranges::equal(array1, array1 + 4, array2, array2 + 4), "");
345*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ranges::equal(array1, array1 + 4, array2, array2 + 4));
346*6777b538SAndroid Build Coastguard Worker 
347*6777b538SAndroid Build Coastguard Worker   static_assert(!ranges::equal(array1, array1 + 2, array2, array2 + 3), "");
348*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ranges::equal(array1, array1 + 2, array2, array2 + 3));
349*6777b538SAndroid Build Coastguard Worker 
350*6777b538SAndroid Build Coastguard Worker   static constexpr Int ints[] = {{1}, {3}, {5}, {7}};
351*6777b538SAndroid Build Coastguard Worker 
352*6777b538SAndroid Build Coastguard Worker   CONSTEXPR_LAMBDA((Int lhs, int rhs) { return lhs.value == rhs; }) lambda;
353*6777b538SAndroid Build Coastguard Worker   static_assert(ranges::equal(ints, array2, lambda), "");
354*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::equal(ints, array2, lambda));
355*6777b538SAndroid Build Coastguard Worker 
356*6777b538SAndroid Build Coastguard Worker   static_assert(ranges::equal(array2, ints, ranges::equal_to{}, std::identity{},
357*6777b538SAndroid Build Coastguard Worker                               &Int::value),
358*6777b538SAndroid Build Coastguard Worker                 "");
359*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::equal(array2, ints, ranges::equal_to{}, std::identity{},
360*6777b538SAndroid Build Coastguard Worker                             &Int::value));
361*6777b538SAndroid Build Coastguard Worker }
362*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,IsPermutation)363*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, IsPermutation) {
364*6777b538SAndroid Build Coastguard Worker   int array1[] = {1, 3, 6, 7};
365*6777b538SAndroid Build Coastguard Worker   int array2[] = {7, 3, 1, 6};
366*6777b538SAndroid Build Coastguard Worker   int array3[] = {1, 3, 5, 7};
367*6777b538SAndroid Build Coastguard Worker 
368*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::is_permutation(array1, array1 + 4, array2, array2 + 4));
369*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ranges::is_permutation(array1, array1 + 4, array3, array3 + 4));
370*6777b538SAndroid Build Coastguard Worker 
371*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::is_permutation(array1, array2));
372*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ranges::is_permutation(array1, array3));
373*6777b538SAndroid Build Coastguard Worker 
374*6777b538SAndroid Build Coastguard Worker   Int ints1[] = {{1}, {3}, {5}, {7}};
375*6777b538SAndroid Build Coastguard Worker   Int ints2[] = {{1}, {5}, {3}, {7}};
376*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::is_permutation(
377*6777b538SAndroid Build Coastguard Worker       ints1, ints2, [](Int lhs, Int rhs) { return lhs.value == rhs.value; }));
378*6777b538SAndroid Build Coastguard Worker 
379*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(
380*6777b538SAndroid Build Coastguard Worker       ranges::is_permutation(ints1, ints2, ranges::equal_to{}, &Int::value));
381*6777b538SAndroid Build Coastguard Worker 
382*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ranges::is_permutation(array1, ints2, ranges::equal_to{}, {},
383*6777b538SAndroid Build Coastguard Worker                                       &Int::value));
384*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::is_permutation(array3, ints2, ranges::equal_to{}, {},
385*6777b538SAndroid Build Coastguard Worker                                      &Int::value));
386*6777b538SAndroid Build Coastguard Worker }
387*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,Search)388*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, Search) {
389*6777b538SAndroid Build Coastguard Worker   int array1[] = {0, 1, 2, 3};
390*6777b538SAndroid Build Coastguard Worker   int array2[] = {0, 1, 5, 3};
391*6777b538SAndroid Build Coastguard Worker   int array3[] = {0, 1, 2, 0, 1, 2, 3, 0, 1, 2, 3, 4};
392*6777b538SAndroid Build Coastguard Worker 
393*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array3 + 3,
394*6777b538SAndroid Build Coastguard Worker             ranges::search(array3, array3 + 12, array1, array1 + 4));
395*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array3 + 12,
396*6777b538SAndroid Build Coastguard Worker             ranges::search(array3, array3 + 12, array2, array2 + 4));
397*6777b538SAndroid Build Coastguard Worker 
398*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array3 + 3, ranges::search(array3, array1));
399*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array3 + 12, ranges::search(array3, array2));
400*6777b538SAndroid Build Coastguard Worker 
401*6777b538SAndroid Build Coastguard Worker   Int ints1[] = {{0}, {1}, {2}, {3}};
402*6777b538SAndroid Build Coastguard Worker   Int ints2[] = {{0}, {1}, {5}, {3}};
403*6777b538SAndroid Build Coastguard Worker 
404*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints1 + 4, ranges::search(ints1, ints2, ranges::equal_to{},
405*6777b538SAndroid Build Coastguard Worker                                       &Int::value, &Int::value));
406*6777b538SAndroid Build Coastguard Worker 
407*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array3 + 3, ranges::search(array3, ints1, {}, {}, &Int::value));
408*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array3 + 12, ranges::search(array3, ints2, {}, {}, &Int::value));
409*6777b538SAndroid Build Coastguard Worker }
410*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,SearchN)411*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, SearchN) {
412*6777b538SAndroid Build Coastguard Worker   int array[] = {0, 0, 1, 1, 2, 2};
413*6777b538SAndroid Build Coastguard Worker 
414*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array, ranges::search_n(array, array + 6, 1, 0));
415*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array + 2, ranges::search_n(array, array + 6, 1, 1));
416*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array + 4, ranges::search_n(array, array + 6, 1, 2));
417*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array + 6, ranges::search_n(array, array + 6, 1, 3));
418*6777b538SAndroid Build Coastguard Worker 
419*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array, ranges::search_n(array, array + 6, 2, 0));
420*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array + 2, ranges::search_n(array, array + 6, 2, 1));
421*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array + 4, ranges::search_n(array, array + 6, 2, 2));
422*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array + 6, ranges::search_n(array, array + 6, 2, 3));
423*6777b538SAndroid Build Coastguard Worker 
424*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array + 6, ranges::search_n(array, array + 6, 3, 0));
425*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array + 6, ranges::search_n(array, array + 6, 3, 1));
426*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array + 6, ranges::search_n(array, array + 6, 3, 2));
427*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array + 6, ranges::search_n(array, array + 6, 3, 3));
428*6777b538SAndroid Build Coastguard Worker 
429*6777b538SAndroid Build Coastguard Worker   Int ints[] = {{0}, {0}, {1}, {1}, {2}, {2}};
430*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints, ranges::search_n(ints, 1, 0, {}, &Int::value));
431*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 2, ranges::search_n(ints, 1, 1, {}, &Int::value));
432*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 4, ranges::search_n(ints, 1, 2, {}, &Int::value));
433*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 6, ranges::search_n(ints, 1, 3, {}, &Int::value));
434*6777b538SAndroid Build Coastguard Worker 
435*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints, ranges::search_n(ints, 2, 0, {}, &Int::value));
436*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 2, ranges::search_n(ints, 2, 1, {}, &Int::value));
437*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 4, ranges::search_n(ints, 2, 2, {}, &Int::value));
438*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 6, ranges::search_n(ints, 2, 3, {}, &Int::value));
439*6777b538SAndroid Build Coastguard Worker 
440*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 6, ranges::search_n(ints, 3, 0, {}, &Int::value));
441*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 6, ranges::search_n(ints, 3, 1, {}, &Int::value));
442*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 6, ranges::search_n(ints, 3, 2, {}, &Int::value));
443*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 6, ranges::search_n(ints, 3, 3, {}, &Int::value));
444*6777b538SAndroid Build Coastguard Worker }
445*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,Copy)446*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, Copy) {
447*6777b538SAndroid Build Coastguard Worker   int input[] = {1, 2, 3, 4, 5};
448*6777b538SAndroid Build Coastguard Worker   int output[] = {6, 6, 6, 6, 6, 6, 6};
449*6777b538SAndroid Build Coastguard Worker   auto equals_six = [](int i) { return i == 6; };
450*6777b538SAndroid Build Coastguard Worker 
451*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output + 3, ranges::copy(input, input + 3, output));
452*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(std::equal(input, input + 3, output, output + 3));
453*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(std::all_of(output + 3, output + 7, equals_six));
454*6777b538SAndroid Build Coastguard Worker 
455*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output + 5, ranges::copy(input, output));
456*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(std::equal(input, input + 5, output, output + 5));
457*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(std::all_of(output + 5, output + 7, equals_six));
458*6777b538SAndroid Build Coastguard Worker }
459*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,CopyN)460*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, CopyN) {
461*6777b538SAndroid Build Coastguard Worker   int input[] = {1, 2, 3, 4, 5};
462*6777b538SAndroid Build Coastguard Worker   int output[] = {6, 6, 6, 6, 6, 6, 6};
463*6777b538SAndroid Build Coastguard Worker   auto equals_six = [](int i) { return i == 6; };
464*6777b538SAndroid Build Coastguard Worker 
465*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output + 4, ranges::copy_n(input, 4, output));
466*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(std::equal(input, input + 4, output, output + 4));
467*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(std::all_of(output + 4, output + 7, equals_six));
468*6777b538SAndroid Build Coastguard Worker }
469*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,CopyIf)470*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, CopyIf) {
471*6777b538SAndroid Build Coastguard Worker   int input[] = {2, 4, 6, 8, 6};
472*6777b538SAndroid Build Coastguard Worker   int output[] = {0, 0, 0, 0, 0, 0};
473*6777b538SAndroid Build Coastguard Worker   auto equals_six = [](int i) { return i == 6; };
474*6777b538SAndroid Build Coastguard Worker   auto equals_zero = [](int i) { return i == 0; };
475*6777b538SAndroid Build Coastguard Worker 
476*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output + 1, ranges::copy_if(input, input + 4, output, equals_six));
477*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(std::all_of(output, output + 1, equals_six));
478*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(std::all_of(output + 1, output + 6, equals_zero));
479*6777b538SAndroid Build Coastguard Worker 
480*6777b538SAndroid Build Coastguard Worker   Int ints_in[] = {{2}, {4}, {6}, {8}, {6}};
481*6777b538SAndroid Build Coastguard Worker   Int ints_out[] = {{0}, {0}, {0}, {0}, {0}, {0}};
482*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints_out + 2,
483*6777b538SAndroid Build Coastguard Worker             ranges::copy_if(ints_in, ints_out, equals_six, &Int::value));
484*6777b538SAndroid Build Coastguard Worker 
485*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::all_of(ints_out, ints_out + 2, equals_six, &Int::value));
486*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(
487*6777b538SAndroid Build Coastguard Worker       ranges::all_of(ints_out + 2, ints_out + 6, equals_zero, &Int::value));
488*6777b538SAndroid Build Coastguard Worker }
489*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,CopyBackward)490*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, CopyBackward) {
491*6777b538SAndroid Build Coastguard Worker   int input[] = {2, 4, 6, 8, 6};
492*6777b538SAndroid Build Coastguard Worker   int output[] = {0, 0, 0, 0, 0, 0};
493*6777b538SAndroid Build Coastguard Worker 
494*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output + 1, ranges::copy_backward(input, input + 5, output + 6));
495*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(output, ElementsAre(0, 2, 4, 6, 8, 6));
496*6777b538SAndroid Build Coastguard Worker 
497*6777b538SAndroid Build Coastguard Worker   Int ints_in[] = {{2}, {4}, {6}, {8}, {6}};
498*6777b538SAndroid Build Coastguard Worker   Int ints_out[] = {{0}, {0}, {0}, {0}, {0}, {0}};
499*6777b538SAndroid Build Coastguard Worker 
500*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints_out, ranges::copy_backward(ints_in, ints_out + 5));
501*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(std::equal(ints_in, ints_in + 5, ints_out, ints_out + 5,
502*6777b538SAndroid Build Coastguard Worker                          [](Int i, Int j) { return i.value == j.value; }));
503*6777b538SAndroid Build Coastguard Worker }
504*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,Move)505*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, Move) {
506*6777b538SAndroid Build Coastguard Worker   MoveOnlyInt input[] = {6, 6, 6, 6, 6};
507*6777b538SAndroid Build Coastguard Worker   MoveOnlyInt output[] = {0, 0, 0, 0, 0};
508*6777b538SAndroid Build Coastguard Worker   auto equals_zero = [](const auto& i) { return i.value == 0; };
509*6777b538SAndroid Build Coastguard Worker   auto equals_six = [](const auto& i) { return i.value == 6; };
510*6777b538SAndroid Build Coastguard Worker 
511*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output + 3, ranges::move(input, input + 3, output));
512*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(std::all_of(input, input + 3, equals_zero));
513*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(std::all_of(input + 3, input + 5, equals_six));
514*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(std::all_of(output, output + 3, equals_six));
515*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(std::all_of(output + 3, output + 5, equals_zero));
516*6777b538SAndroid Build Coastguard Worker 
517*6777b538SAndroid Build Coastguard Worker   for (auto& in : input)
518*6777b538SAndroid Build Coastguard Worker     in = 6;
519*6777b538SAndroid Build Coastguard Worker 
520*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output + 5, ranges::move(input, output));
521*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::all_of(input, equals_zero));
522*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::all_of(output, equals_six));
523*6777b538SAndroid Build Coastguard Worker }
524*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,MoveBackward)525*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, MoveBackward) {
526*6777b538SAndroid Build Coastguard Worker   MoveOnlyInt input[] = {6, 6, 6, 6, 6};
527*6777b538SAndroid Build Coastguard Worker   MoveOnlyInt output[] = {0, 0, 0, 0, 0};
528*6777b538SAndroid Build Coastguard Worker   auto equals_zero = [](const auto& i) { return i.value == 0; };
529*6777b538SAndroid Build Coastguard Worker   auto equals_six = [](const auto& i) { return i.value == 6; };
530*6777b538SAndroid Build Coastguard Worker 
531*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output + 2, ranges::move_backward(input, input + 3, output + 5));
532*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(std::all_of(input, input + 3, equals_zero));
533*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(std::all_of(input + 3, input + 5, equals_six));
534*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(std::all_of(output, output + 2, equals_zero));
535*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(std::all_of(output + 2, output + 5, equals_six));
536*6777b538SAndroid Build Coastguard Worker 
537*6777b538SAndroid Build Coastguard Worker   for (auto& in : input)
538*6777b538SAndroid Build Coastguard Worker     in = 6;
539*6777b538SAndroid Build Coastguard Worker 
540*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output, ranges::move_backward(input, output + 5));
541*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::all_of(input, equals_zero));
542*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::all_of(output, equals_six));
543*6777b538SAndroid Build Coastguard Worker }
544*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,SwapRanges)545*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, SwapRanges) {
546*6777b538SAndroid Build Coastguard Worker   int ints1[] = {0, 0, 0, 0, 0};
547*6777b538SAndroid Build Coastguard Worker   int ints2[] = {6, 6, 6, 6, 6};
548*6777b538SAndroid Build Coastguard Worker 
549*6777b538SAndroid Build Coastguard Worker   // Test that swap_ranges does not exceed `last2`.
550*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints2 + 3, ranges::swap_ranges(ints1, ints1 + 5, ints2, ints2 + 3));
551*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ints1, ElementsAre(6, 6, 6, 0, 0));
552*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ints2, ElementsAre(0, 0, 0, 6, 6));
553*6777b538SAndroid Build Coastguard Worker 
554*6777b538SAndroid Build Coastguard Worker   // Test that swap_ranges does not exceed `last1`.
555*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints2 + 3, ranges::swap_ranges(ints1, ints1 + 3, ints2, ints2 + 5));
556*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ints1, ElementsAre(0, 0, 0, 0, 0));
557*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ints2, ElementsAre(6, 6, 6, 6, 6));
558*6777b538SAndroid Build Coastguard Worker 
559*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints2 + 5,
560*6777b538SAndroid Build Coastguard Worker             ranges::swap_ranges(ints1 + 3, ints1 + 5, ints2 + 3, ints2 + 5));
561*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ints1, ElementsAre(0, 0, 0, 6, 6));
562*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ints2, ElementsAre(6, 6, 6, 0, 0));
563*6777b538SAndroid Build Coastguard Worker 
564*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints2 + 5, ranges::swap_ranges(ints1, ints2));
565*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ints1, ElementsAre(6, 6, 6, 0, 0));
566*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ints2, ElementsAre(0, 0, 0, 6, 6));
567*6777b538SAndroid Build Coastguard Worker }
568*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,UnaryTransform)569*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, UnaryTransform) {
570*6777b538SAndroid Build Coastguard Worker   int input[] = {1, 2, 3, 4, 5};
571*6777b538SAndroid Build Coastguard Worker   auto plus_1 = [](int i) { return i + 1; };
572*6777b538SAndroid Build Coastguard Worker   auto times_2 = [](int i) { return i * 2; };
573*6777b538SAndroid Build Coastguard Worker 
574*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 4,
575*6777b538SAndroid Build Coastguard Worker             ranges::transform(input + 1, input + 4, input + 1, plus_1));
576*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(1, 3, 4, 5, 5));
577*6777b538SAndroid Build Coastguard Worker 
578*6777b538SAndroid Build Coastguard Worker   int output[] = {0, 0, 0, 0, 0};
579*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output + 3,
580*6777b538SAndroid Build Coastguard Worker             ranges::transform(input + 1, input + 4, output, times_2));
581*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(output, ElementsAre(6, 8, 10, 0, 0));
582*6777b538SAndroid Build Coastguard Worker 
583*6777b538SAndroid Build Coastguard Worker   Int values[] = {{0}, {2}, {4}, {5}};
584*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(values + 4,
585*6777b538SAndroid Build Coastguard Worker             ranges::transform(values, values, times_2, &Int::value));
586*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(values, ElementsAre(Int{0}, Int{4}, Int{8}, Int{10}));
587*6777b538SAndroid Build Coastguard Worker }
588*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,BinaryTransform)589*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, BinaryTransform) {
590*6777b538SAndroid Build Coastguard Worker   int input[] = {1, 2, 3, 4, 5};
591*6777b538SAndroid Build Coastguard Worker   int output[] = {0, 0, 0, 0, 0};
592*6777b538SAndroid Build Coastguard Worker 
593*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output + 2, ranges::transform(input, input + 2, input + 3,
594*6777b538SAndroid Build Coastguard Worker                                           input + 5, output, std::plus<>{}));
595*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(output, ElementsAre(5, 7, 0, 0, 0));
596*6777b538SAndroid Build Coastguard Worker 
597*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output + 5,
598*6777b538SAndroid Build Coastguard Worker             ranges::transform(input, input, output, std::multiplies<>{}));
599*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(output, ElementsAre(1, 4, 9, 16, 25));
600*6777b538SAndroid Build Coastguard Worker 
601*6777b538SAndroid Build Coastguard Worker   Int values[] = {{0}, {2}, {4}, {5}};
602*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(values + 4,
603*6777b538SAndroid Build Coastguard Worker             ranges::transform(values, values, values, std::minus<>{},
604*6777b538SAndroid Build Coastguard Worker                               &Int::value, &Int::value));
605*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(values, ElementsAre(Int{0}, Int{0}, Int{0}, Int{0}));
606*6777b538SAndroid Build Coastguard Worker }
607*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,Replace)608*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, Replace) {
609*6777b538SAndroid Build Coastguard Worker   int input[] = {0, 0, 0, 0, 0};
610*6777b538SAndroid Build Coastguard Worker 
611*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 2, ranges::replace(input, input + 2, 0, 2));
612*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(2, 2, 0, 0, 0));
613*6777b538SAndroid Build Coastguard Worker 
614*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 5, ranges::replace(input, 0, 3));
615*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(2, 2, 3, 3, 3));
616*6777b538SAndroid Build Coastguard Worker }
617*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,ReplaceIf)618*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, ReplaceIf) {
619*6777b538SAndroid Build Coastguard Worker   int input[] = {0, 1, 2, 3, 4};
620*6777b538SAndroid Build Coastguard Worker 
621*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 3, ranges::replace_if(input, input + 3, is_even, 9));
622*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(9, 1, 9, 3, 4));
623*6777b538SAndroid Build Coastguard Worker 
624*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 5, ranges::replace_if(input, is_odd, 0));
625*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(0, 0, 0, 0, 4));
626*6777b538SAndroid Build Coastguard Worker 
627*6777b538SAndroid Build Coastguard Worker   Int ints[] = {0, 0, 1, 1, 0};
628*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 5, ranges::replace_if(ints, is_odd, 3, &Int::value));
629*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ints, ElementsAre(0, 0, 3, 3, 0));
630*6777b538SAndroid Build Coastguard Worker }
631*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,ReplaceCopy)632*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, ReplaceCopy) {
633*6777b538SAndroid Build Coastguard Worker   int input[] = {0, 0, 0, 0, 0};
634*6777b538SAndroid Build Coastguard Worker   int output[] = {1, 1, 1, 1, 1};
635*6777b538SAndroid Build Coastguard Worker 
636*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 2, ranges::replace_copy(input, input + 2, output, 0, 2));
637*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(0, 0, 0, 0, 0));
638*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(output, ElementsAre(2, 2, 1, 1, 1));
639*6777b538SAndroid Build Coastguard Worker 
640*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 5, ranges::replace_copy(input, output, 0, 3));
641*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(0, 0, 0, 0, 0));
642*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(output, ElementsAre(3, 3, 3, 3, 3));
643*6777b538SAndroid Build Coastguard Worker }
644*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,ReplaceCopyIf)645*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, ReplaceCopyIf) {
646*6777b538SAndroid Build Coastguard Worker   Int input[] = {0, 1, 2, 3, 4};
647*6777b538SAndroid Build Coastguard Worker   Int output[] = {0, 0, 0, 0, 0};
648*6777b538SAndroid Build Coastguard Worker 
649*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output + 3, ranges::replace_copy_if(input, input + 3, output,
650*6777b538SAndroid Build Coastguard Worker                                                 is_even, 9, &Int::value));
651*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(0, 1, 2, 3, 4));
652*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(output, ElementsAre(9, 1, 9, 0, 0));
653*6777b538SAndroid Build Coastguard Worker 
654*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output + 5,
655*6777b538SAndroid Build Coastguard Worker             ranges::replace_copy_if(input, output, is_odd, 0, &Int::value));
656*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(output, ElementsAre(0, 0, 2, 0, 4));
657*6777b538SAndroid Build Coastguard Worker }
658*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,Fill)659*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, Fill) {
660*6777b538SAndroid Build Coastguard Worker   int input[] = {1, 2, 3, 4, 5};
661*6777b538SAndroid Build Coastguard Worker 
662*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 3, ranges::fill(input, input + 3, 0));
663*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(0, 0, 0, 4, 5));
664*6777b538SAndroid Build Coastguard Worker 
665*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 5, ranges::fill(input, 1));
666*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(1, 1, 1, 1, 1));
667*6777b538SAndroid Build Coastguard Worker }
668*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,FillN)669*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, FillN) {
670*6777b538SAndroid Build Coastguard Worker   int input[] = {0, 0, 0, 0, 0};
671*6777b538SAndroid Build Coastguard Worker 
672*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 5, ranges::fill_n(input, 5, 5));
673*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(5, 5, 5, 5, 5));
674*6777b538SAndroid Build Coastguard Worker 
675*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 3, ranges::fill_n(input, 3, 3));
676*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(3, 3, 3, 5, 5));
677*6777b538SAndroid Build Coastguard Worker }
678*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,Generate)679*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, Generate) {
680*6777b538SAndroid Build Coastguard Worker   int input[] = {0, 0, 0, 0, 0};
681*6777b538SAndroid Build Coastguard Worker 
682*6777b538SAndroid Build Coastguard Worker   auto gen = [count = 0]() mutable { return ++count; };
683*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 3, ranges::generate(input, input + 3, gen));
684*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(1, 2, 3, 0, 0));
685*6777b538SAndroid Build Coastguard Worker 
686*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 5, ranges::generate(input, gen));
687*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(1, 2, 3, 4, 5));
688*6777b538SAndroid Build Coastguard Worker }
689*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,GenerateN)690*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, GenerateN) {
691*6777b538SAndroid Build Coastguard Worker   int input[] = {0, 0, 0, 0, 0};
692*6777b538SAndroid Build Coastguard Worker 
693*6777b538SAndroid Build Coastguard Worker   auto gen = [count = 0]() mutable { return ++count; };
694*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 4, ranges::generate_n(input, 4, gen));
695*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(1, 2, 3, 4, 0));
696*6777b538SAndroid Build Coastguard Worker }
697*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,Remove)698*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, Remove) {
699*6777b538SAndroid Build Coastguard Worker   int input[] = {1, 0, 1, 1, 0};
700*6777b538SAndroid Build Coastguard Worker 
701*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 3, ranges::remove(input + 1, input + 5, 1));
702*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input[0], 1);
703*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input[1], 0);
704*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input[2], 0);
705*6777b538SAndroid Build Coastguard Worker 
706*6777b538SAndroid Build Coastguard Worker   Int ints[] = {2, 2, 1, 1, 2, 2};
707*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 2, ranges::remove(ints, 2, &Int::value));
708*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints[0], 1);
709*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints[1], 1);
710*6777b538SAndroid Build Coastguard Worker }
711*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,RemoveIf)712*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, RemoveIf) {
713*6777b538SAndroid Build Coastguard Worker   int input[] = {0, 1, 2, 3, 4};
714*6777b538SAndroid Build Coastguard Worker 
715*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 2, ranges::remove_if(input, input + 4, is_even));
716*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input[0], 1);
717*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input[1], 3);
718*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input[4], 4);
719*6777b538SAndroid Build Coastguard Worker 
720*6777b538SAndroid Build Coastguard Worker   Int ints[] = {2, 2, 1, 1, 2, 2};
721*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 2, ranges::remove_if(ints, is_even, &Int::value));
722*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints[0], 1);
723*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints[1], 1);
724*6777b538SAndroid Build Coastguard Worker }
725*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,RemoveCopy)726*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, RemoveCopy) {
727*6777b538SAndroid Build Coastguard Worker   int input[] = {0, 1, 2, 3, 4};
728*6777b538SAndroid Build Coastguard Worker   int output[] = {0, 0, 0, 0, 0};
729*6777b538SAndroid Build Coastguard Worker 
730*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output + 1, ranges::remove_copy(input, input + 2, output, 0));
731*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(0, 1, 2, 3, 4));
732*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(output, ElementsAre(1, 0, 0, 0, 0));
733*6777b538SAndroid Build Coastguard Worker 
734*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output + 4, ranges::remove_copy(input, output, 4));
735*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(0, 1, 2, 3, 4));
736*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(output, ElementsAre(0, 1, 2, 3, 0));
737*6777b538SAndroid Build Coastguard Worker }
738*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,RemovCopyIf)739*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, RemovCopyIf) {
740*6777b538SAndroid Build Coastguard Worker   Int input[] = {0, 1, 2, 3, 4};
741*6777b538SAndroid Build Coastguard Worker   Int output[] = {0, 0, 0, 0, 0};
742*6777b538SAndroid Build Coastguard Worker 
743*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output + 2, ranges::remove_copy_if(input, input + 4, output,
744*6777b538SAndroid Build Coastguard Worker                                                is_even, &Int::value));
745*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(0, 1, 2, 3, 4));
746*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(output, ElementsAre(1, 3, 0, 0, 0));
747*6777b538SAndroid Build Coastguard Worker 
748*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output + 3,
749*6777b538SAndroid Build Coastguard Worker             ranges::remove_copy_if(input, output, is_odd, &Int::value));
750*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(0, 1, 2, 3, 4));
751*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(output, ElementsAre(0, 2, 4, 0, 0));
752*6777b538SAndroid Build Coastguard Worker }
753*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,Unique)754*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, Unique) {
755*6777b538SAndroid Build Coastguard Worker   int input[] = {0, 0, 1, 1, 2};
756*6777b538SAndroid Build Coastguard Worker 
757*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 2, ranges::unique(input, input + 3));
758*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input[0], 0);
759*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input[1], 1);
760*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input[3], 1);
761*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input[4], 2);
762*6777b538SAndroid Build Coastguard Worker 
763*6777b538SAndroid Build Coastguard Worker   Int ints[] = {2, 2, 1, 1, 2, 2};
764*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 3, ranges::unique(ints, {}, &Int::value));
765*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints[0], 2);
766*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints[1], 1);
767*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints[2], 2);
768*6777b538SAndroid Build Coastguard Worker }
769*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,UniqueCopy)770*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, UniqueCopy) {
771*6777b538SAndroid Build Coastguard Worker   Int input[] = {0, 0, 1, 2, 2};
772*6777b538SAndroid Build Coastguard Worker   Int output[] = {0, 0, 0, 0, 0};
773*6777b538SAndroid Build Coastguard Worker 
774*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output + 3,
775*6777b538SAndroid Build Coastguard Worker             ranges::unique_copy(input, input + 4, output, {}, &Int::value));
776*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(0, 0, 1, 2, 2));
777*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(output, ElementsAre(0, 1, 2, 0, 0));
778*6777b538SAndroid Build Coastguard Worker 
779*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output + 3, ranges::unique_copy(input, output, {}, &Int::value));
780*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(0, 0, 1, 2, 2));
781*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(output, ElementsAre(0, 1, 2, 0, 0));
782*6777b538SAndroid Build Coastguard Worker }
783*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,Reverse)784*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, Reverse) {
785*6777b538SAndroid Build Coastguard Worker   int input[] = {0, 1, 2, 3, 4};
786*6777b538SAndroid Build Coastguard Worker 
787*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 4, ranges::reverse(input + 2, input + 4));
788*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(0, 1, 3, 2, 4));
789*6777b538SAndroid Build Coastguard Worker 
790*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 5, ranges::reverse(input));
791*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(4, 2, 3, 1, 0));
792*6777b538SAndroid Build Coastguard Worker }
793*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,ReverseCopy)794*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, ReverseCopy) {
795*6777b538SAndroid Build Coastguard Worker   int input[] = {0, 1, 2, 3, 4};
796*6777b538SAndroid Build Coastguard Worker   int output[] = {0, 0, 0, 0, 0};
797*6777b538SAndroid Build Coastguard Worker 
798*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output + 2, ranges::reverse_copy(input + 2, input + 4, output));
799*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(0, 1, 2, 3, 4));
800*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(output, ElementsAre(3, 2, 0, 0, 0));
801*6777b538SAndroid Build Coastguard Worker 
802*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output + 5, ranges::reverse_copy(input, output));
803*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(0, 1, 2, 3, 4));
804*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(output, ElementsAre(4, 3, 2, 1, 0));
805*6777b538SAndroid Build Coastguard Worker }
806*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,Rotate)807*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, Rotate) {
808*6777b538SAndroid Build Coastguard Worker   int input[] = {0, 1, 2, 3, 4};
809*6777b538SAndroid Build Coastguard Worker 
810*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 3, ranges::rotate(input + 2, input + 3, input + 4));
811*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(0, 1, 3, 2, 4));
812*6777b538SAndroid Build Coastguard Worker 
813*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 3, ranges::rotate(input, input + 2));
814*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(3, 2, 4, 0, 1));
815*6777b538SAndroid Build Coastguard Worker }
816*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,RotateCopy)817*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, RotateCopy) {
818*6777b538SAndroid Build Coastguard Worker   int input[] = {0, 1, 2, 3, 4};
819*6777b538SAndroid Build Coastguard Worker   int output[] = {0, 0, 0, 0, 0};
820*6777b538SAndroid Build Coastguard Worker 
821*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output + 2,
822*6777b538SAndroid Build Coastguard Worker             ranges::rotate_copy(input + 2, input + 3, input + 4, output));
823*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(0, 1, 2, 3, 4));
824*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(output, ElementsAre(3, 2, 0, 0, 0));
825*6777b538SAndroid Build Coastguard Worker 
826*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output + 5, ranges::rotate_copy(input, input + 3, output));
827*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(0, 1, 2, 3, 4));
828*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(output, ElementsAre(3, 4, 0, 1, 2));
829*6777b538SAndroid Build Coastguard Worker }
830*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,Shuffle)831*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, Shuffle) {
832*6777b538SAndroid Build Coastguard Worker   int input[] = {0, 1, 2, 3, 4};
833*6777b538SAndroid Build Coastguard Worker 
834*6777b538SAndroid Build Coastguard Worker   // Shuffles input[2] and input[3], thus we can't be certain about their
835*6777b538SAndroid Build Coastguard Worker   // positions.
836*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 4, ranges::shuffle(input + 2, input + 4,
837*6777b538SAndroid Build Coastguard Worker                                        std::default_random_engine()));
838*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input[0], 0);
839*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input[1], 1);
840*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input[4], 4);
841*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ::testing::UnorderedElementsAre(0, 1, 2, 3, 4));
842*6777b538SAndroid Build Coastguard Worker 
843*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 5, ranges::shuffle(input, std::default_random_engine()));
844*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ::testing::UnorderedElementsAre(0, 1, 2, 3, 4));
845*6777b538SAndroid Build Coastguard Worker }
846*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,Sort)847*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, Sort) {
848*6777b538SAndroid Build Coastguard Worker   int input[] = {3, 1, 2, 0, 4};
849*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 4, ranges::sort(input, input + 4));
850*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(0, 1, 2, 3, 4));
851*6777b538SAndroid Build Coastguard Worker 
852*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 5, ranges::sort(input, input + 5, ranges::greater()));
853*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(4, 3, 2, 1, 0));
854*6777b538SAndroid Build Coastguard Worker 
855*6777b538SAndroid Build Coastguard Worker   Int ints[] = {6, 7, 9, 8, 5};
856*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 5, ranges::sort(ints, {}, &Int::value));
857*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ints, ElementsAre(5, 6, 7, 8, 9));
858*6777b538SAndroid Build Coastguard Worker 
859*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 5, ranges::sort(ints, ranges::greater(), &Int::value));
860*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ints, ElementsAre(9, 8, 7, 6, 5));
861*6777b538SAndroid Build Coastguard Worker }
862*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,StableSort)863*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, StableSort) {
864*6777b538SAndroid Build Coastguard Worker   // Integer divide each element by 2 to check stability of elements that
865*6777b538SAndroid Build Coastguard Worker   // compare equal.
866*6777b538SAndroid Build Coastguard Worker   auto idiv2 = [](int i) { return i / 2; };
867*6777b538SAndroid Build Coastguard Worker 
868*6777b538SAndroid Build Coastguard Worker   int input[] = {3, 1, 2, 0, 4};
869*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 4, ranges::stable_sort(input, input + 4, {}, idiv2));
870*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(1, 0, 3, 2, 4));
871*6777b538SAndroid Build Coastguard Worker 
872*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 5,
873*6777b538SAndroid Build Coastguard Worker             ranges::stable_sort(input, input + 5, ranges::greater()));
874*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(4, 3, 2, 1, 0));
875*6777b538SAndroid Build Coastguard Worker 
876*6777b538SAndroid Build Coastguard Worker   auto Idiv2 = [](Int i) { return i.value / 2; };
877*6777b538SAndroid Build Coastguard Worker   Int ints[] = {6, 7, 9, 8, 5};
878*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 5, ranges::stable_sort(ints, {}, Idiv2));
879*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ints, ElementsAre(5, 6, 7, 9, 8));
880*6777b538SAndroid Build Coastguard Worker 
881*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 5, ranges::stable_sort(ints, ranges::greater(), Idiv2));
882*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ints, ElementsAre(9, 8, 6, 7, 5));
883*6777b538SAndroid Build Coastguard Worker }
884*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,PartialSort)885*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, PartialSort) {
886*6777b538SAndroid Build Coastguard Worker   int input[] = {3, 1, 2, 0, 4};
887*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 4, ranges::partial_sort(input, input + 2, input + 4));
888*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input[0], 0);
889*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input[1], 1);
890*6777b538SAndroid Build Coastguard Worker 
891*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 5, ranges::partial_sort(input, input + 3, input + 5,
892*6777b538SAndroid Build Coastguard Worker                                             ranges::greater()));
893*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input[0], 4);
894*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input[1], 3);
895*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input[2], 2);
896*6777b538SAndroid Build Coastguard Worker 
897*6777b538SAndroid Build Coastguard Worker   Int ints[] = {6, 7, 9, 8, 5};
898*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 5, ranges::partial_sort(ints, ints + 4, {}, &Int::value));
899*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints[0], 5);
900*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints[1], 6);
901*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints[2], 7);
902*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints[3], 8);
903*6777b538SAndroid Build Coastguard Worker 
904*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 5, ranges::partial_sort(ints, ints + 3, ranges::greater(),
905*6777b538SAndroid Build Coastguard Worker                                            &Int::value));
906*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints[0], 9);
907*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints[1], 8);
908*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints[2], 7);
909*6777b538SAndroid Build Coastguard Worker }
910*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,PartialSortCopy)911*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, PartialSortCopy) {
912*6777b538SAndroid Build Coastguard Worker   int input[] = {3, 1, 2, 0, 4};
913*6777b538SAndroid Build Coastguard Worker   int output[] = {0, 0, 0, 0, 0};
914*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output + 2,
915*6777b538SAndroid Build Coastguard Worker             ranges::partial_sort_copy(input, input + 2, output, output + 4));
916*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(3, 1, 2, 0, 4));
917*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(output, ElementsAre(1, 3, 0, 0, 0));
918*6777b538SAndroid Build Coastguard Worker 
919*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output + 5,
920*6777b538SAndroid Build Coastguard Worker             ranges::partial_sort_copy(input, input + 3, output + 3, output + 5,
921*6777b538SAndroid Build Coastguard Worker                                       ranges::greater()));
922*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(3, 1, 2, 0, 4));
923*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(output, ElementsAre(1, 3, 0, 3, 2));
924*6777b538SAndroid Build Coastguard Worker 
925*6777b538SAndroid Build Coastguard Worker   Int ints[] = {3, 1, 2, 0, 4};
926*6777b538SAndroid Build Coastguard Worker   Int outs[] = {0, 0, 0};
927*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(outs + 3, ranges::partial_sort_copy(ints, outs, {}, &Int::value,
928*6777b538SAndroid Build Coastguard Worker                                                 &Int::value));
929*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ints, ElementsAre(3, 1, 2, 0, 4));
930*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(outs, ElementsAre(0, 1, 2));
931*6777b538SAndroid Build Coastguard Worker 
932*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(outs + 3, ranges::partial_sort_copy(ints, outs, ranges::greater(),
933*6777b538SAndroid Build Coastguard Worker                                                 &Int::value, &Int::value));
934*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ints, ElementsAre(3, 1, 2, 0, 4));
935*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(outs, ElementsAre(4, 3, 2));
936*6777b538SAndroid Build Coastguard Worker 
937*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(outs + 3,
938*6777b538SAndroid Build Coastguard Worker             ranges::partial_sort_copy(input, outs, {}, {}, &Int::value));
939*6777b538SAndroid Build Coastguard Worker }
940*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,IsSorted)941*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, IsSorted) {
942*6777b538SAndroid Build Coastguard Worker   constexpr int input[] = {3, 1, 2, 0, 4};
943*6777b538SAndroid Build Coastguard Worker   static_assert(ranges::is_sorted(input + 1, input + 3), "");
944*6777b538SAndroid Build Coastguard Worker   static_assert(!ranges::is_sorted(input + 1, input + 4), "");
945*6777b538SAndroid Build Coastguard Worker   static_assert(ranges::is_sorted(input, input + 2, ranges::greater()), "");
946*6777b538SAndroid Build Coastguard Worker 
947*6777b538SAndroid Build Coastguard Worker   constexpr Int ints[] = {0, 1, 2, 3, 4};
948*6777b538SAndroid Build Coastguard Worker   static_assert(ranges::is_sorted(ints, {}, &Int::value), "");
949*6777b538SAndroid Build Coastguard Worker   static_assert(!ranges::is_sorted(ints, ranges::greater(), &Int::value), "");
950*6777b538SAndroid Build Coastguard Worker }
951*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,IsSortedUntil)952*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, IsSortedUntil) {
953*6777b538SAndroid Build Coastguard Worker   constexpr int input[] = {3, 1, 2, 0, 4};
954*6777b538SAndroid Build Coastguard Worker   static_assert(input + 3 == ranges::is_sorted_until(input + 1, input + 3), "");
955*6777b538SAndroid Build Coastguard Worker   static_assert(input + 3 == ranges::is_sorted_until(input + 1, input + 4), "");
956*6777b538SAndroid Build Coastguard Worker   static_assert(
957*6777b538SAndroid Build Coastguard Worker       input + 2 == ranges::is_sorted_until(input, input + 2, ranges::greater()),
958*6777b538SAndroid Build Coastguard Worker       "");
959*6777b538SAndroid Build Coastguard Worker 
960*6777b538SAndroid Build Coastguard Worker   constexpr Int ints[] = {0, 1, 2, 3, 4};
961*6777b538SAndroid Build Coastguard Worker   static_assert(ints + 5 == ranges::is_sorted_until(ints, {}, &Int::value), "");
962*6777b538SAndroid Build Coastguard Worker   static_assert(
963*6777b538SAndroid Build Coastguard Worker       ints + 1 == ranges::is_sorted_until(ints, ranges::greater(), &Int::value),
964*6777b538SAndroid Build Coastguard Worker       "");
965*6777b538SAndroid Build Coastguard Worker }
966*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,NthElement)967*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, NthElement) {
968*6777b538SAndroid Build Coastguard Worker   int input[] = {3, 1, 2, 0, 4};
969*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 5, ranges::nth_element(input, input + 2, input + 5));
970*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(Lt(2), Lt(2), 2, Gt(2), Gt(2)));
971*6777b538SAndroid Build Coastguard Worker 
972*6777b538SAndroid Build Coastguard Worker   Int ints[] = {0, 1, 2, 3, 4};
973*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 5, ranges::nth_element(ints, ints + 2, ranges::greater(),
974*6777b538SAndroid Build Coastguard Worker                                           &Int::value));
975*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ints, ElementsAre(Gt(2), Gt(2), 2, Lt(2), Lt(2)));
976*6777b538SAndroid Build Coastguard Worker }
977*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,LowerBound)978*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, LowerBound) {
979*6777b538SAndroid Build Coastguard Worker   int array[] = {0, 0, 1, 1, 2, 2};
980*6777b538SAndroid Build Coastguard Worker 
981*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array, ranges::lower_bound(array, array + 6, -1));
982*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array, ranges::lower_bound(array, array + 6, 0));
983*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array + 2, ranges::lower_bound(array, array + 6, 1));
984*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array + 4, ranges::lower_bound(array, array + 6, 2));
985*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array + 6, ranges::lower_bound(array, array + 6, 3));
986*6777b538SAndroid Build Coastguard Worker 
987*6777b538SAndroid Build Coastguard Worker   Int ints[] = {0, 0, 1, 1, 2, 2};
988*6777b538SAndroid Build Coastguard Worker 
989*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints, ranges::lower_bound(ints, -1, {}, &Int::value));
990*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints, ranges::lower_bound(ints, 0, {}, &Int::value));
991*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 2, ranges::lower_bound(ints, 1, {}, &Int::value));
992*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 4, ranges::lower_bound(ints, 2, {}, &Int::value));
993*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 6, ranges::lower_bound(ints, 3, {}, &Int::value));
994*6777b538SAndroid Build Coastguard Worker 
995*6777b538SAndroid Build Coastguard Worker   const auto proj = [](const Int& i) { return 2 - i.value; };
996*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints, ranges::lower_bound(ints, 3, ranges::greater{}, proj));
997*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints, ranges::lower_bound(ints, 2, ranges::greater{}, proj));
998*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 2, ranges::lower_bound(ints, 1, ranges::greater{}, proj));
999*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 4, ranges::lower_bound(ints, 0, ranges::greater{}, proj));
1000*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 6, ranges::lower_bound(ints, -1, ranges::greater{}, proj));
1001*6777b538SAndroid Build Coastguard Worker }
1002*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,UpperBound)1003*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, UpperBound) {
1004*6777b538SAndroid Build Coastguard Worker   int array[] = {0, 0, 1, 1, 2, 2};
1005*6777b538SAndroid Build Coastguard Worker 
1006*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array, ranges::upper_bound(array, array + 6, -1));
1007*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array + 2, ranges::upper_bound(array, array + 6, 0));
1008*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array + 4, ranges::upper_bound(array, array + 6, 1));
1009*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array + 6, ranges::upper_bound(array, array + 6, 2));
1010*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(array + 6, ranges::upper_bound(array, array + 6, 3));
1011*6777b538SAndroid Build Coastguard Worker 
1012*6777b538SAndroid Build Coastguard Worker   Int ints[] = {0, 0, 1, 1, 2, 2};
1013*6777b538SAndroid Build Coastguard Worker 
1014*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints, ranges::upper_bound(ints, -1, {}, &Int::value));
1015*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 2, ranges::upper_bound(ints, 0, {}, &Int::value));
1016*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 4, ranges::upper_bound(ints, 1, {}, &Int::value));
1017*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 6, ranges::upper_bound(ints, 2, {}, &Int::value));
1018*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 6, ranges::upper_bound(ints, 3, {}, &Int::value));
1019*6777b538SAndroid Build Coastguard Worker 
1020*6777b538SAndroid Build Coastguard Worker   const auto proj = [](const Int& i) { return 2 - i.value; };
1021*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints, ranges::upper_bound(ints, 3, ranges::greater{}, proj));
1022*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 2, ranges::upper_bound(ints, 2, ranges::greater{}, proj));
1023*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 4, ranges::upper_bound(ints, 1, ranges::greater{}, proj));
1024*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 6, ranges::upper_bound(ints, 0, ranges::greater{}, proj));
1025*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 6, ranges::upper_bound(ints, -1, ranges::greater{}, proj));
1026*6777b538SAndroid Build Coastguard Worker }
1027*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,EqualRange)1028*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, EqualRange) {
1029*6777b538SAndroid Build Coastguard Worker   int array[] = {0, 0, 1, 1, 2, 2};
1030*6777b538SAndroid Build Coastguard Worker 
1031*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ranges::equal_range(array, array + 6, -1), Pair(array, array));
1032*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ranges::equal_range(array, array + 6, 0), Pair(array, array + 2));
1033*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ranges::equal_range(array, array + 6, 1),
1034*6777b538SAndroid Build Coastguard Worker               Pair(array + 2, array + 4));
1035*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ranges::equal_range(array, array + 6, 2),
1036*6777b538SAndroid Build Coastguard Worker               Pair(array + 4, array + 6));
1037*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ranges::equal_range(array, array + 6, 3),
1038*6777b538SAndroid Build Coastguard Worker               Pair(array + 6, array + 6));
1039*6777b538SAndroid Build Coastguard Worker 
1040*6777b538SAndroid Build Coastguard Worker   Int ints[] = {0, 0, 1, 1, 2, 2};
1041*6777b538SAndroid Build Coastguard Worker 
1042*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ranges::equal_range(ints, -1, {}, &Int::value), Pair(ints, ints));
1043*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ranges::equal_range(ints, 0, {}, &Int::value),
1044*6777b538SAndroid Build Coastguard Worker               Pair(ints, ints + 2));
1045*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ranges::equal_range(ints, 1, {}, &Int::value),
1046*6777b538SAndroid Build Coastguard Worker               Pair(ints + 2, ints + 4));
1047*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ranges::equal_range(ints, 2, {}, &Int::value),
1048*6777b538SAndroid Build Coastguard Worker               Pair(ints + 4, ints + 6));
1049*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ranges::equal_range(ints, 3, {}, &Int::value),
1050*6777b538SAndroid Build Coastguard Worker               Pair(ints + 6, ints + 6));
1051*6777b538SAndroid Build Coastguard Worker 
1052*6777b538SAndroid Build Coastguard Worker   const auto proj = [](const Int& i) { return 2 - i.value; };
1053*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ranges::equal_range(ints, 3, ranges::greater{}, proj),
1054*6777b538SAndroid Build Coastguard Worker               Pair(ints, ints));
1055*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ranges::equal_range(ints, 2, ranges::greater{}, proj),
1056*6777b538SAndroid Build Coastguard Worker               Pair(ints, ints + 2));
1057*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ranges::equal_range(ints, 1, ranges::greater{}, proj),
1058*6777b538SAndroid Build Coastguard Worker               Pair(ints + 2, ints + 4));
1059*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ranges::equal_range(ints, 0, ranges::greater{}, proj),
1060*6777b538SAndroid Build Coastguard Worker               Pair(ints + 4, ints + 6));
1061*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ranges::equal_range(ints, -1, ranges::greater{}, proj),
1062*6777b538SAndroid Build Coastguard Worker               Pair(ints + 6, ints + 6));
1063*6777b538SAndroid Build Coastguard Worker }
1064*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,BinarySearch)1065*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, BinarySearch) {
1066*6777b538SAndroid Build Coastguard Worker   int array[] = {0, 0, 1, 1, 2, 2};
1067*6777b538SAndroid Build Coastguard Worker 
1068*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ranges::binary_search(array, array + 6, -1));
1069*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::binary_search(array, array + 6, 0));
1070*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::binary_search(array, array + 6, 1));
1071*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::binary_search(array, array + 6, 2));
1072*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ranges::binary_search(array, array + 6, 3));
1073*6777b538SAndroid Build Coastguard Worker 
1074*6777b538SAndroid Build Coastguard Worker   Int ints[] = {0, 0, 1, 1, 2, 2};
1075*6777b538SAndroid Build Coastguard Worker 
1076*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ranges::binary_search(ints, -1, {}, &Int::value));
1077*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::binary_search(ints, 0, {}, &Int::value));
1078*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::binary_search(ints, 1, {}, &Int::value));
1079*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::binary_search(ints, 2, {}, &Int::value));
1080*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ranges::binary_search(ints, 3, {}, &Int::value));
1081*6777b538SAndroid Build Coastguard Worker 
1082*6777b538SAndroid Build Coastguard Worker   const auto proj = [](const Int& i) { return 2 - i.value; };
1083*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ranges::binary_search(ints, 3, ranges::greater{}, proj));
1084*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::binary_search(ints, 2, ranges::greater{}, proj));
1085*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::binary_search(ints, 1, ranges::greater{}, proj));
1086*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::binary_search(ints, 0, ranges::greater{}, proj));
1087*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ranges::binary_search(ints, -1, ranges::greater{}, proj));
1088*6777b538SAndroid Build Coastguard Worker }
1089*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,IsPartitioned)1090*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, IsPartitioned) {
1091*6777b538SAndroid Build Coastguard Worker   int input[] = {1, 3, 5, 0, 4, 2};
1092*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::is_partitioned(input, input, is_odd));
1093*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::is_partitioned(input, input + 6, is_odd));
1094*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::is_partitioned(input, input, is_even));
1095*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ranges::is_partitioned(input, input + 6, is_even));
1096*6777b538SAndroid Build Coastguard Worker 
1097*6777b538SAndroid Build Coastguard Worker   Int ints[] = {1, 0, 4, 3, 2};
1098*6777b538SAndroid Build Coastguard Worker   auto lt_2 = [](const Int& i) { return i.value < 2; };
1099*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::is_partitioned(ints, lt_2, &Int::value));
1100*6777b538SAndroid Build Coastguard Worker }
1101*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,Partition)1102*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, Partition) {
1103*6777b538SAndroid Build Coastguard Worker   int input[] = {3, 1, 2, 0, 4};
1104*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 3, ranges::partition(input, input + 5, is_even));
1105*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(is_even(input[0]));
1106*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(is_even(input[1]));
1107*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(is_even(input[2]));
1108*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(is_odd(input[3]));
1109*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(is_odd(input[4]));
1110*6777b538SAndroid Build Coastguard Worker 
1111*6777b538SAndroid Build Coastguard Worker   Int ints[] = {6, 7, 9, 8, 5};
1112*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 3, ranges::partition(ints, is_odd, &Int::value));
1113*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(is_odd(ints[0].value));
1114*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(is_odd(ints[1].value));
1115*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(is_odd(ints[2].value));
1116*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(is_even(ints[3].value));
1117*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(is_even(ints[4].value));
1118*6777b538SAndroid Build Coastguard Worker }
1119*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,StablePartition)1120*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, StablePartition) {
1121*6777b538SAndroid Build Coastguard Worker   int input[] = {3, 1, 2, 0, 4};
1122*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 3, ranges::stable_partition(input, input + 5, is_even));
1123*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(2, 0, 4, 3, 1));
1124*6777b538SAndroid Build Coastguard Worker 
1125*6777b538SAndroid Build Coastguard Worker   Int ints[] = {6, 7, 9, 8, 5};
1126*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 3, ranges::stable_partition(ints, is_odd, &Int::value));
1127*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ints, ElementsAre(7, 9, 5, 6, 8));
1128*6777b538SAndroid Build Coastguard Worker }
1129*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,PartitionCopy)1130*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, PartitionCopy) {
1131*6777b538SAndroid Build Coastguard Worker   int input[] = {3, 1, 2, 0, 4};
1132*6777b538SAndroid Build Coastguard Worker   int evens[5] = {};
1133*6777b538SAndroid Build Coastguard Worker   int odds[5] = {};
1134*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ranges::partition_copy(input, input + 5, evens, odds, is_even),
1135*6777b538SAndroid Build Coastguard Worker               Pair(evens + 3, odds + 2));
1136*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(3, 1, 2, 0, 4));
1137*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(evens, ElementsAre(2, 0, 4, 0, 0));
1138*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(odds, ElementsAre(3, 1, 0, 0, 0));
1139*6777b538SAndroid Build Coastguard Worker 
1140*6777b538SAndroid Build Coastguard Worker   Int ints[] = {6, 7, 9, 8, 5};
1141*6777b538SAndroid Build Coastguard Worker   Int odd_ints[5] = {};
1142*6777b538SAndroid Build Coastguard Worker   Int even_ints[5] = {};
1143*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(
1144*6777b538SAndroid Build Coastguard Worker       ranges::partition_copy(ints, odd_ints, even_ints, is_odd, &Int::value),
1145*6777b538SAndroid Build Coastguard Worker       Pair(odd_ints + 3, even_ints + 2));
1146*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ints, ElementsAre(6, 7, 9, 8, 5));
1147*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(odd_ints, ElementsAre(7, 9, 5, 0, 0));
1148*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(even_ints, ElementsAre(6, 8, 0, 0, 0));
1149*6777b538SAndroid Build Coastguard Worker }
1150*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,PartitionPoint)1151*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, PartitionPoint) {
1152*6777b538SAndroid Build Coastguard Worker   int input[] = {1, 3, 5, 0, 4, 2};
1153*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input, ranges::partition_point(input, input, is_odd));
1154*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 3, ranges::partition_point(input, input + 6, is_odd));
1155*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input, ranges::partition_point(input, input, is_even));
1156*6777b538SAndroid Build Coastguard Worker 
1157*6777b538SAndroid Build Coastguard Worker   Int ints[] = {1, 0, 4, 3, 2};
1158*6777b538SAndroid Build Coastguard Worker   auto lt_2 = [](const Int& i) { return i.value < 2; };
1159*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 2, ranges::partition_point(ints, lt_2, &Int::value));
1160*6777b538SAndroid Build Coastguard Worker }
1161*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,Merge)1162*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, Merge) {
1163*6777b538SAndroid Build Coastguard Worker   int input1[] = {0, 2, 4, 6, 8};
1164*6777b538SAndroid Build Coastguard Worker   int input2[] = {1, 3, 5, 7, 9};
1165*6777b538SAndroid Build Coastguard Worker   int output[10];
1166*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(output + 10,
1167*6777b538SAndroid Build Coastguard Worker             ranges::merge(input1, input1 + 5, input2, input2 + 5, output));
1168*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(output, ElementsAre(0, 1, 2, 3, 4, 5, 6, 7, 8, 9));
1169*6777b538SAndroid Build Coastguard Worker 
1170*6777b538SAndroid Build Coastguard Worker   Int ints1[] = {0, 2, 4, 6, 8};
1171*6777b538SAndroid Build Coastguard Worker   Int ints2[] = {1, 3, 5, 7, 9};
1172*6777b538SAndroid Build Coastguard Worker   Int outs[10];
1173*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(outs + 10,
1174*6777b538SAndroid Build Coastguard Worker             ranges::merge(ints1, ints2, outs, {}, &Int::value, &Int::value));
1175*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(outs, ElementsAre(0, 1, 2, 3, 4, 5, 6, 7, 8, 9));
1176*6777b538SAndroid Build Coastguard Worker 
1177*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(outs + 10, ranges::merge(input1, ints1, outs, {}, {}, &Int::value));
1178*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(outs, ElementsAre(0, 0, 2, 2, 4, 4, 6, 6, 8, 8));
1179*6777b538SAndroid Build Coastguard Worker 
1180*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(outs + 10, ranges::merge(ints2, input2, outs, {}, &Int::value, {}));
1181*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(outs, ElementsAre(1, 1, 3, 3, 5, 5, 7, 7, 9, 9));
1182*6777b538SAndroid Build Coastguard Worker }
1183*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,InplaceMerge)1184*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, InplaceMerge) {
1185*6777b538SAndroid Build Coastguard Worker   int input[] = {0, 2, 4, 6, 8, 1, 3, 5, 7, 9};
1186*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(input + 10, ranges::inplace_merge(input, input + 5, input + 10));
1187*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(0, 1, 2, 3, 4, 5, 6, 7, 8, 9));
1188*6777b538SAndroid Build Coastguard Worker 
1189*6777b538SAndroid Build Coastguard Worker   Int ints[] = {8, 6, 4, 2, 0, 9, 7, 5, 3, 1};
1190*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(ints + 10, ranges::inplace_merge(ints, ints + 5, ranges::greater(),
1191*6777b538SAndroid Build Coastguard Worker                                              &Int::value));
1192*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ints, ElementsAre(9, 8, 7, 6, 5, 4, 3, 2, 1, 0));
1193*6777b538SAndroid Build Coastguard Worker }
1194*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,Includes)1195*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, Includes) {
1196*6777b538SAndroid Build Coastguard Worker   int evens[] = {0, 2, 4, 6, 8};
1197*6777b538SAndroid Build Coastguard Worker   int odds[] = {1, 3, 5, 7, 9};
1198*6777b538SAndroid Build Coastguard Worker   int fours[] = {0, 4, 8};
1199*6777b538SAndroid Build Coastguard Worker 
1200*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::includes(evens, evens + 5, fours, fours + 3));
1201*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ranges::includes(fours, fours + 3, evens, evens + 5));
1202*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ranges::includes(evens, evens + 5, odds, odds + 5));
1203*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ranges::includes(odds, odds + 5, evens, evens + 5));
1204*6777b538SAndroid Build Coastguard Worker 
1205*6777b538SAndroid Build Coastguard Worker   Int even_ints[] = {0, 2, 4, 6, 8};
1206*6777b538SAndroid Build Coastguard Worker   Int odd_ints[] = {1, 3, 5, 7, 9};
1207*6777b538SAndroid Build Coastguard Worker 
1208*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::includes(even_ints, fours, {}, &Int::value));
1209*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ranges::includes(fours, even_ints, {}, {}, &Int::value));
1210*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(
1211*6777b538SAndroid Build Coastguard Worker       ranges::includes(even_ints, odd_ints, {}, &Int::value, &Int::value));
1212*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(
1213*6777b538SAndroid Build Coastguard Worker       ranges::includes(odd_ints, even_ints, {}, &Int::value, &Int::value));
1214*6777b538SAndroid Build Coastguard Worker }
1215*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,SetUnion)1216*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, SetUnion) {
1217*6777b538SAndroid Build Coastguard Worker   int evens[] = {0, 2, 4, 6, 8};
1218*6777b538SAndroid Build Coastguard Worker   int odds[] = {1, 3, 5, 7, 9};
1219*6777b538SAndroid Build Coastguard Worker   int fours[] = {0, 4, 8};
1220*6777b538SAndroid Build Coastguard Worker   int result[10];
1221*6777b538SAndroid Build Coastguard Worker 
1222*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(result + 10,
1223*6777b538SAndroid Build Coastguard Worker             ranges::set_union(evens, evens + 5, odds, odds + 5, result));
1224*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(result, ElementsAre(0, 1, 2, 3, 4, 5, 6, 7, 8, 9));
1225*6777b538SAndroid Build Coastguard Worker 
1226*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(result + 5,
1227*6777b538SAndroid Build Coastguard Worker             ranges::set_union(evens, evens + 5, fours, fours + 3, result));
1228*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(make_vector(result, result + 5), ElementsAre(0, 2, 4, 6, 8));
1229*6777b538SAndroid Build Coastguard Worker 
1230*6777b538SAndroid Build Coastguard Worker   Int even_ints[] = {0, 2, 4, 6, 8};
1231*6777b538SAndroid Build Coastguard Worker   Int odd_ints[] = {1, 3, 5, 7, 9};
1232*6777b538SAndroid Build Coastguard Worker   Int result_ints[10];
1233*6777b538SAndroid Build Coastguard Worker 
1234*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(result_ints + 10,
1235*6777b538SAndroid Build Coastguard Worker             ranges::set_union(even_ints, odd_ints, result_ints, {}, &Int::value,
1236*6777b538SAndroid Build Coastguard Worker                               &Int::value));
1237*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(result_ints, ElementsAre(0, 1, 2, 3, 4, 5, 6, 7, 8, 9));
1238*6777b538SAndroid Build Coastguard Worker 
1239*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(result_ints + 5,
1240*6777b538SAndroid Build Coastguard Worker             ranges::set_union(even_ints, fours, result_ints, {}, &Int::value));
1241*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(make_vector(result_ints, result_ints + 5),
1242*6777b538SAndroid Build Coastguard Worker               ElementsAre(0, 2, 4, 6, 8));
1243*6777b538SAndroid Build Coastguard Worker 
1244*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(result_ints + 8, ranges::set_union(fours, odd_ints, result_ints, {},
1245*6777b538SAndroid Build Coastguard Worker                                                {}, &Int::value));
1246*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(make_vector(result_ints, result_ints + 8),
1247*6777b538SAndroid Build Coastguard Worker               ElementsAre(0, 1, 3, 4, 5, 7, 8, 9));
1248*6777b538SAndroid Build Coastguard Worker }
1249*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,SetIntersection)1250*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, SetIntersection) {
1251*6777b538SAndroid Build Coastguard Worker   int evens[] = {0, 2, 4, 6, 8};
1252*6777b538SAndroid Build Coastguard Worker   int odds[] = {1, 3, 5, 7, 9};
1253*6777b538SAndroid Build Coastguard Worker   int fours[] = {0, 4, 8};
1254*6777b538SAndroid Build Coastguard Worker   int result[10];
1255*6777b538SAndroid Build Coastguard Worker 
1256*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(result,
1257*6777b538SAndroid Build Coastguard Worker             ranges::set_intersection(evens, evens + 5, odds, odds + 5, result));
1258*6777b538SAndroid Build Coastguard Worker 
1259*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(result + 3, ranges::set_intersection(evens, evens + 5, fours,
1260*6777b538SAndroid Build Coastguard Worker                                                  fours + 3, result));
1261*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(make_vector(result, result + 3), ElementsAre(0, 4, 8));
1262*6777b538SAndroid Build Coastguard Worker 
1263*6777b538SAndroid Build Coastguard Worker   Int even_ints[] = {0, 2, 4, 6, 8};
1264*6777b538SAndroid Build Coastguard Worker   Int odd_ints[] = {1, 3, 5, 7, 9};
1265*6777b538SAndroid Build Coastguard Worker   Int result_ints[10];
1266*6777b538SAndroid Build Coastguard Worker 
1267*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(result_ints,
1268*6777b538SAndroid Build Coastguard Worker             ranges::set_intersection(even_ints, odd_ints, result_ints, {},
1269*6777b538SAndroid Build Coastguard Worker                                      &Int::value, &Int::value));
1270*6777b538SAndroid Build Coastguard Worker 
1271*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(
1272*6777b538SAndroid Build Coastguard Worker       result_ints + 3,
1273*6777b538SAndroid Build Coastguard Worker       ranges::set_intersection(even_ints, fours, result_ints, {}, &Int::value));
1274*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(make_vector(result_ints, result_ints + 3), ElementsAre(0, 4, 8));
1275*6777b538SAndroid Build Coastguard Worker 
1276*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(result_ints, ranges::set_intersection(fours, odd_ints, result_ints,
1277*6777b538SAndroid Build Coastguard Worker                                                   {}, {}, &Int::value));
1278*6777b538SAndroid Build Coastguard Worker }
1279*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,SetDifference)1280*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, SetDifference) {
1281*6777b538SAndroid Build Coastguard Worker   int evens[] = {0, 2, 4, 6, 8};
1282*6777b538SAndroid Build Coastguard Worker   int odds[] = {1, 3, 5, 7, 9};
1283*6777b538SAndroid Build Coastguard Worker   int fours[] = {0, 4, 8};
1284*6777b538SAndroid Build Coastguard Worker   int result[5];
1285*6777b538SAndroid Build Coastguard Worker 
1286*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(result + 5,
1287*6777b538SAndroid Build Coastguard Worker             ranges::set_difference(evens, evens + 5, odds, odds + 5, result));
1288*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(result, ElementsAre(0, 2, 4, 6, 8));
1289*6777b538SAndroid Build Coastguard Worker 
1290*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(result + 2,
1291*6777b538SAndroid Build Coastguard Worker             ranges::set_difference(evens, evens + 5, fours, fours + 3, result));
1292*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(make_vector(result, result + 2), ElementsAre(2, 6));
1293*6777b538SAndroid Build Coastguard Worker 
1294*6777b538SAndroid Build Coastguard Worker   Int even_ints[] = {0, 2, 4, 6, 8};
1295*6777b538SAndroid Build Coastguard Worker   Int odd_ints[] = {1, 3, 5, 7, 9};
1296*6777b538SAndroid Build Coastguard Worker   Int result_ints[5];
1297*6777b538SAndroid Build Coastguard Worker 
1298*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(result_ints + 5,
1299*6777b538SAndroid Build Coastguard Worker             ranges::set_difference(even_ints, odd_ints, result_ints, {},
1300*6777b538SAndroid Build Coastguard Worker                                    &Int::value, &Int::value));
1301*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(result_ints, ElementsAre(0, 2, 4, 6, 8));
1302*6777b538SAndroid Build Coastguard Worker 
1303*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(
1304*6777b538SAndroid Build Coastguard Worker       result_ints + 2,
1305*6777b538SAndroid Build Coastguard Worker       ranges::set_difference(even_ints, fours, result_ints, {}, &Int::value));
1306*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(make_vector(result_ints, result_ints + 2), ElementsAre(2, 6));
1307*6777b538SAndroid Build Coastguard Worker 
1308*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(result_ints + 3,
1309*6777b538SAndroid Build Coastguard Worker             ranges::set_difference(fours, odd_ints, result_ints, {}, {},
1310*6777b538SAndroid Build Coastguard Worker                                    &Int::value));
1311*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(make_vector(result_ints, result_ints + 3), ElementsAre(0, 4, 8));
1312*6777b538SAndroid Build Coastguard Worker }
1313*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,SetSymmetricDifference)1314*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, SetSymmetricDifference) {
1315*6777b538SAndroid Build Coastguard Worker   int evens[] = {0, 2, 4, 6, 8};
1316*6777b538SAndroid Build Coastguard Worker   int odds[] = {1, 3, 5, 7, 9};
1317*6777b538SAndroid Build Coastguard Worker   int fours[] = {0, 4, 8};
1318*6777b538SAndroid Build Coastguard Worker   int result[10];
1319*6777b538SAndroid Build Coastguard Worker 
1320*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(result + 10, ranges::set_symmetric_difference(
1321*6777b538SAndroid Build Coastguard Worker                              evens, evens + 5, odds, odds + 5, result));
1322*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(result, ElementsAre(0, 1, 2, 3, 4, 5, 6, 7, 8, 9));
1323*6777b538SAndroid Build Coastguard Worker 
1324*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(result + 2, ranges::set_symmetric_difference(
1325*6777b538SAndroid Build Coastguard Worker                             evens, evens + 5, fours, fours + 3, result));
1326*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(make_vector(result, result + 2), ElementsAre(2, 6));
1327*6777b538SAndroid Build Coastguard Worker 
1328*6777b538SAndroid Build Coastguard Worker   Int even_ints[] = {0, 2, 4, 6, 8};
1329*6777b538SAndroid Build Coastguard Worker   Int odd_ints[] = {1, 3, 5, 7, 9};
1330*6777b538SAndroid Build Coastguard Worker   Int result_ints[10];
1331*6777b538SAndroid Build Coastguard Worker 
1332*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(result_ints + 10,
1333*6777b538SAndroid Build Coastguard Worker             ranges::set_symmetric_difference(even_ints, odd_ints, result_ints,
1334*6777b538SAndroid Build Coastguard Worker                                              {}, &Int::value, &Int::value));
1335*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(result_ints, ElementsAre(0, 1, 2, 3, 4, 5, 6, 7, 8, 9));
1336*6777b538SAndroid Build Coastguard Worker 
1337*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(result_ints + 2,
1338*6777b538SAndroid Build Coastguard Worker             ranges::set_symmetric_difference(even_ints, fours, result_ints, {},
1339*6777b538SAndroid Build Coastguard Worker                                              &Int::value));
1340*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(make_vector(result_ints, result_ints + 2), ElementsAre(2, 6));
1341*6777b538SAndroid Build Coastguard Worker 
1342*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(result_ints + 8,
1343*6777b538SAndroid Build Coastguard Worker             ranges::set_symmetric_difference(fours, odd_ints, result_ints, {},
1344*6777b538SAndroid Build Coastguard Worker                                              {}, &Int::value));
1345*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(make_vector(result_ints, result_ints + 8),
1346*6777b538SAndroid Build Coastguard Worker               ElementsAre(0, 1, 3, 4, 5, 7, 8, 9));
1347*6777b538SAndroid Build Coastguard Worker }
1348*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,PushHeap)1349*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, PushHeap) {
1350*6777b538SAndroid Build Coastguard Worker   int heap[] = {6, 4, 3, 2, 1, 0, 5};
1351*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(heap + 7, ranges::push_heap(heap, heap + 7));
1352*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(heap, ElementsAre(6, Ge(4), Ge(4), Le(3), Le(3), Le(3), Le(3)));
1353*6777b538SAndroid Build Coastguard Worker 
1354*6777b538SAndroid Build Coastguard Worker   Int heap_int[] = {1, 2, 3, 4, 5, 6, 0};
1355*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(heap_int + 7,
1356*6777b538SAndroid Build Coastguard Worker             ranges::push_heap(heap_int, ranges::greater(), &Int::value));
1357*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(heap_int, ElementsAre(0, 2, 1, 4, 5, 6, 3));
1358*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(heap_int,
1359*6777b538SAndroid Build Coastguard Worker               ElementsAre(0, Le(2), Le(2), Ge(3), Ge(3), Ge(3), Ge(3)));
1360*6777b538SAndroid Build Coastguard Worker }
1361*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,PopHeap)1362*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, PopHeap) {
1363*6777b538SAndroid Build Coastguard Worker   int heap[] = {6, 5, 4, 3, 2, 1, 0};
1364*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(heap + 7, ranges::pop_heap(heap, heap + 7));
1365*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(heap, ElementsAre(5, Ge(3), Ge(3), Le(2), Le(2), Le(2), 6));
1366*6777b538SAndroid Build Coastguard Worker 
1367*6777b538SAndroid Build Coastguard Worker   Int heap_int[] = {0, 1, 2, 3, 4, 5, 6};
1368*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(heap_int + 7,
1369*6777b538SAndroid Build Coastguard Worker             ranges::pop_heap(heap_int, ranges::greater(), &Int::value));
1370*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(heap_int, ElementsAre(1, Le(3), Le(3), Ge(4), Ge(4), Ge(4), 0));
1371*6777b538SAndroid Build Coastguard Worker }
1372*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,MakeHeap)1373*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, MakeHeap) {
1374*6777b538SAndroid Build Coastguard Worker   int heap[] = {0, 1, 2, 3, 4, 5, 6};
1375*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(heap + 7, ranges::make_heap(heap, heap + 7));
1376*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(heap, ElementsAre(6, Ge(4), Ge(4), Le(3), Le(3), Le(3), Le(3)));
1377*6777b538SAndroid Build Coastguard Worker 
1378*6777b538SAndroid Build Coastguard Worker   Int heap_int[] = {6, 5, 4, 3, 2, 1, 0};
1379*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(heap_int + 7,
1380*6777b538SAndroid Build Coastguard Worker             ranges::make_heap(heap_int, ranges::greater(), &Int::value));
1381*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(heap_int,
1382*6777b538SAndroid Build Coastguard Worker               ElementsAre(0, Le(2), Le(2), Ge(3), Ge(3), Ge(3), Ge(3)));
1383*6777b538SAndroid Build Coastguard Worker }
1384*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,SortHeap)1385*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, SortHeap) {
1386*6777b538SAndroid Build Coastguard Worker   int heap[] = {6, 4, 5, 0, 1, 2, 3};
1387*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(heap + 7, ranges::sort_heap(heap, heap + 7));
1388*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(heap, ElementsAre(0, 1, 2, 3, 4, 5, 6));
1389*6777b538SAndroid Build Coastguard Worker 
1390*6777b538SAndroid Build Coastguard Worker   Int heap_int[] = {0, 2, 1, 4, 3, 6, 5};
1391*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(heap_int + 7,
1392*6777b538SAndroid Build Coastguard Worker             ranges::sort_heap(heap_int, ranges::greater(), &Int::value));
1393*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(heap_int, ElementsAre(6, 5, 4, 3, 2, 1, 0));
1394*6777b538SAndroid Build Coastguard Worker }
1395*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,IsHeap)1396*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, IsHeap) {
1397*6777b538SAndroid Build Coastguard Worker   int heap[] = {6, 4, 5, 0, 1, 2, 3};
1398*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::is_heap(heap, heap + 7));
1399*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ranges::is_heap(heap, heap + 7, ranges::greater()));
1400*6777b538SAndroid Build Coastguard Worker 
1401*6777b538SAndroid Build Coastguard Worker   Int heap_int[] = {0, 2, 1, 4, 3, 6, 5};
1402*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::is_heap(heap_int, ranges::greater(), &Int::value));
1403*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ranges::is_heap(heap_int, {}, &Int::value));
1404*6777b538SAndroid Build Coastguard Worker }
1405*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,IsHeapUntil)1406*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, IsHeapUntil) {
1407*6777b538SAndroid Build Coastguard Worker   int heap[] = {6, 4, 5, 0, 1, 2, 3};
1408*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(heap + 7, ranges::is_heap_until(heap, heap + 7));
1409*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(heap + 1, ranges::is_heap_until(heap, heap + 7, ranges::greater()));
1410*6777b538SAndroid Build Coastguard Worker 
1411*6777b538SAndroid Build Coastguard Worker   Int heap_int[] = {0, 2, 1, 4, 3, 6, 5};
1412*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(heap_int + 7,
1413*6777b538SAndroid Build Coastguard Worker             ranges::is_heap_until(heap_int, ranges::greater(), &Int::value));
1414*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(heap_int + 1, ranges::is_heap_until(heap_int, {}, &Int::value));
1415*6777b538SAndroid Build Coastguard Worker }
1416*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,Min)1417*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, Min) {
1418*6777b538SAndroid Build Coastguard Worker   constexpr int k1 = 1;
1419*6777b538SAndroid Build Coastguard Worker   constexpr int k2 = 2;
1420*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::min(k1, k1) == &k1, "");
1421*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::min(k1, k2) == &k1, "");
1422*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::min(k2, k1) == &k1, "");
1423*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::min(k2, k2) == &k2, "");
1424*6777b538SAndroid Build Coastguard Worker 
1425*6777b538SAndroid Build Coastguard Worker   constexpr Int k3 = 3;
1426*6777b538SAndroid Build Coastguard Worker   constexpr Int k4 = 4;
1427*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::min(k3, k3, ranges::greater(), &Int::value) == &k3,
1428*6777b538SAndroid Build Coastguard Worker                 "");
1429*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::min(k3, k4, ranges::greater(), &Int::value) == &k4,
1430*6777b538SAndroid Build Coastguard Worker                 "");
1431*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::min(k4, k3, ranges::greater(), &Int::value) == &k4,
1432*6777b538SAndroid Build Coastguard Worker                 "");
1433*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::min(k4, k4, ranges::greater(), &Int::value) == &k4,
1434*6777b538SAndroid Build Coastguard Worker                 "");
1435*6777b538SAndroid Build Coastguard Worker 
1436*6777b538SAndroid Build Coastguard Worker   constexpr Int array[] = {2, 6, 4, 3, 5, 1};
1437*6777b538SAndroid Build Coastguard Worker   static_assert(ranges::min({5, 3, 4, 2, 1, 6}) == 1, "");
1438*6777b538SAndroid Build Coastguard Worker   static_assert(ranges::min(array, ranges::greater(), &Int::value) == 6, "");
1439*6777b538SAndroid Build Coastguard Worker }
1440*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,Max)1441*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, Max) {
1442*6777b538SAndroid Build Coastguard Worker   constexpr int k1 = 1;
1443*6777b538SAndroid Build Coastguard Worker   constexpr int k2 = 2;
1444*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::max(k1, k2) == &k2, "");
1445*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::max(k1, k2) == &k2, "");
1446*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::max(k2, k1) == &k2, "");
1447*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::max(k2, k1) == &k2, "");
1448*6777b538SAndroid Build Coastguard Worker 
1449*6777b538SAndroid Build Coastguard Worker   constexpr Int k3 = 3;
1450*6777b538SAndroid Build Coastguard Worker   constexpr Int k4 = 4;
1451*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::max(k3, k3, ranges::greater(), &Int::value) == &k3,
1452*6777b538SAndroid Build Coastguard Worker                 "");
1453*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::max(k3, k4, ranges::greater(), &Int::value) == &k3,
1454*6777b538SAndroid Build Coastguard Worker                 "");
1455*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::max(k4, k3, ranges::greater(), &Int::value) == &k3,
1456*6777b538SAndroid Build Coastguard Worker                 "");
1457*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::max(k4, k4, ranges::greater(), &Int::value) == &k4,
1458*6777b538SAndroid Build Coastguard Worker                 "");
1459*6777b538SAndroid Build Coastguard Worker 
1460*6777b538SAndroid Build Coastguard Worker   constexpr Int array[] = {2, 6, 4, 3, 5, 1};
1461*6777b538SAndroid Build Coastguard Worker   static_assert(ranges::max({5, 3, 4, 2, 1, 6}) == 6, "");
1462*6777b538SAndroid Build Coastguard Worker   static_assert(ranges::max(array, ranges::greater(), &Int::value) == 1, "");
1463*6777b538SAndroid Build Coastguard Worker }
1464*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,Minmax)1465*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, Minmax) {
1466*6777b538SAndroid Build Coastguard Worker   constexpr int k1 = 1;
1467*6777b538SAndroid Build Coastguard Worker   constexpr int k2 = 2;
1468*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::minmax(k1, k1).first == &k1, "");
1469*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::minmax(k1, k1).second == &k1, "");
1470*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::minmax(k1, k2).first == &k1, "");
1471*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::minmax(k1, k2).second == &k2, "");
1472*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::minmax(k2, k1).first == &k1, "");
1473*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::minmax(k2, k1).second == &k2, "");
1474*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::minmax(k2, k2).first == &k2, "");
1475*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::minmax(k2, k2).second == &k2, "");
1476*6777b538SAndroid Build Coastguard Worker 
1477*6777b538SAndroid Build Coastguard Worker   static constexpr Int k3 = 3;
1478*6777b538SAndroid Build Coastguard Worker   static constexpr Int k4 = 4;
1479*6777b538SAndroid Build Coastguard Worker   {
1480*6777b538SAndroid Build Coastguard Worker     constexpr auto kResult =
1481*6777b538SAndroid Build Coastguard Worker         ranges::minmax(k3, k3, ranges::greater(), &Int::value);
1482*6777b538SAndroid Build Coastguard Worker     static_assert(&kResult.first == &k3, "");
1483*6777b538SAndroid Build Coastguard Worker     static_assert(&kResult.second == &k3, "");
1484*6777b538SAndroid Build Coastguard Worker   }
1485*6777b538SAndroid Build Coastguard Worker   {
1486*6777b538SAndroid Build Coastguard Worker     constexpr auto kResult =
1487*6777b538SAndroid Build Coastguard Worker         ranges::minmax(k3, k4, ranges::greater(), &Int::value);
1488*6777b538SAndroid Build Coastguard Worker     static_assert(&kResult.first == &k4, "");
1489*6777b538SAndroid Build Coastguard Worker     static_assert(&kResult.second == &k3, "");
1490*6777b538SAndroid Build Coastguard Worker   }
1491*6777b538SAndroid Build Coastguard Worker   {
1492*6777b538SAndroid Build Coastguard Worker     constexpr auto kResult =
1493*6777b538SAndroid Build Coastguard Worker         ranges::minmax(k4, k3, ranges::greater(), &Int::value);
1494*6777b538SAndroid Build Coastguard Worker     static_assert(&kResult.first == &k4, "");
1495*6777b538SAndroid Build Coastguard Worker     static_assert(&kResult.second == &k3, "");
1496*6777b538SAndroid Build Coastguard Worker   }
1497*6777b538SAndroid Build Coastguard Worker   {
1498*6777b538SAndroid Build Coastguard Worker     constexpr auto kResult =
1499*6777b538SAndroid Build Coastguard Worker         ranges::minmax(k4, k4, ranges::greater(), &Int::value);
1500*6777b538SAndroid Build Coastguard Worker     static_assert(&kResult.first == &k4, "");
1501*6777b538SAndroid Build Coastguard Worker     static_assert(&kResult.second == &k4, "");
1502*6777b538SAndroid Build Coastguard Worker   }
1503*6777b538SAndroid Build Coastguard Worker 
1504*6777b538SAndroid Build Coastguard Worker   static_assert(ranges::minmax({5, 3, 4, 2, 1, 6}).first == 1, "");
1505*6777b538SAndroid Build Coastguard Worker   static_assert(ranges::minmax({5, 3, 4, 2, 1, 6}).second == 6, "");
1506*6777b538SAndroid Build Coastguard Worker 
1507*6777b538SAndroid Build Coastguard Worker   constexpr Int array[] = {2, 6, 4, 3, 5, 1};
1508*6777b538SAndroid Build Coastguard Worker   static_assert(
1509*6777b538SAndroid Build Coastguard Worker       ranges::minmax(array, ranges::greater(), &Int::value).first == 6, "");
1510*6777b538SAndroid Build Coastguard Worker   static_assert(
1511*6777b538SAndroid Build Coastguard Worker       ranges::minmax(array, ranges::greater(), &Int::value).second == 1, "");
1512*6777b538SAndroid Build Coastguard Worker }
1513*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,MinElement)1514*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, MinElement) {
1515*6777b538SAndroid Build Coastguard Worker   constexpr int array[] = {2, 6, 4, 3, 5, 1};
1516*6777b538SAndroid Build Coastguard Worker   constexpr Int ints[] = {2, 6, 4, 3, 5, 1};
1517*6777b538SAndroid Build Coastguard Worker   static_assert(*ranges::min_element(array, array + 6) == 1, "");
1518*6777b538SAndroid Build Coastguard Worker   static_assert(*ranges::min_element(ints, ranges::greater(), &Int::value) == 6,
1519*6777b538SAndroid Build Coastguard Worker                 "");
1520*6777b538SAndroid Build Coastguard Worker }
1521*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,MaxElement)1522*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, MaxElement) {
1523*6777b538SAndroid Build Coastguard Worker   constexpr int array[] = {2, 6, 4, 3, 5, 1};
1524*6777b538SAndroid Build Coastguard Worker   constexpr Int ints[] = {2, 6, 4, 3, 5, 1};
1525*6777b538SAndroid Build Coastguard Worker   static_assert(*ranges::max_element(array, array + 6) == 6, "");
1526*6777b538SAndroid Build Coastguard Worker   static_assert(*ranges::max_element(ints, ranges::greater(), &Int::value) == 1,
1527*6777b538SAndroid Build Coastguard Worker                 "");
1528*6777b538SAndroid Build Coastguard Worker }
1529*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,MinmaxElement)1530*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, MinmaxElement) {
1531*6777b538SAndroid Build Coastguard Worker   constexpr int array[] = {2, 6, 4, 3, 5, 1};
1532*6777b538SAndroid Build Coastguard Worker   static_assert(*ranges::minmax_element(array, array + 6).first == 1, "");
1533*6777b538SAndroid Build Coastguard Worker   static_assert(*ranges::minmax_element(array, array + 6).second == 6, "");
1534*6777b538SAndroid Build Coastguard Worker 
1535*6777b538SAndroid Build Coastguard Worker   constexpr Int ints[] = {2, 6, 4, 3, 5, 1};
1536*6777b538SAndroid Build Coastguard Worker   static_assert(
1537*6777b538SAndroid Build Coastguard Worker       *ranges::minmax_element(ints, ranges::greater(), &Int::value).first == 6,
1538*6777b538SAndroid Build Coastguard Worker       "");
1539*6777b538SAndroid Build Coastguard Worker   static_assert(
1540*6777b538SAndroid Build Coastguard Worker       *ranges::minmax_element(ints, ranges::greater(), &Int::value).second == 1,
1541*6777b538SAndroid Build Coastguard Worker       "");
1542*6777b538SAndroid Build Coastguard Worker }
1543*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,Clamp)1544*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, Clamp) {
1545*6777b538SAndroid Build Coastguard Worker   constexpr int k1 = 1;
1546*6777b538SAndroid Build Coastguard Worker   constexpr int k2 = 2;
1547*6777b538SAndroid Build Coastguard Worker   constexpr int k3 = 3;
1548*6777b538SAndroid Build Coastguard Worker 
1549*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::clamp(k1, k1, k1) == &k1, "");
1550*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::clamp(k1, k1, k2) == &k1, "");
1551*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::clamp(k1, k1, k3) == &k1, "");
1552*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::clamp(k1, k2, k2) == &k2, "");
1553*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::clamp(k1, k2, k3) == &k2, "");
1554*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::clamp(k1, k3, k3) == &k3, "");
1555*6777b538SAndroid Build Coastguard Worker 
1556*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::clamp(k2, k1, k1) == &k1, "");
1557*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::clamp(k2, k1, k2) == &k2, "");
1558*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::clamp(k2, k1, k3) == &k2, "");
1559*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::clamp(k2, k2, k2) == &k2, "");
1560*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::clamp(k2, k2, k3) == &k2, "");
1561*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::clamp(k2, k3, k3) == &k3, "");
1562*6777b538SAndroid Build Coastguard Worker 
1563*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::clamp(k3, k1, k1) == &k1, "");
1564*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::clamp(k3, k1, k2) == &k2, "");
1565*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::clamp(k3, k1, k3) == &k3, "");
1566*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::clamp(k3, k2, k2) == &k2, "");
1567*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::clamp(k3, k2, k3) == &k3, "");
1568*6777b538SAndroid Build Coastguard Worker   static_assert(&ranges::clamp(k3, k3, k3) == &k3, "");
1569*6777b538SAndroid Build Coastguard Worker 
1570*6777b538SAndroid Build Coastguard Worker   constexpr Int k4 = 4;
1571*6777b538SAndroid Build Coastguard Worker   constexpr Int k5 = 5;
1572*6777b538SAndroid Build Coastguard Worker   constexpr Int k6 = 6;
1573*6777b538SAndroid Build Coastguard Worker 
1574*6777b538SAndroid Build Coastguard Worker   static_assert(
1575*6777b538SAndroid Build Coastguard Worker       &ranges::clamp(k6, k6, k6, ranges::greater(), &Int::value) == &k6, "");
1576*6777b538SAndroid Build Coastguard Worker   static_assert(
1577*6777b538SAndroid Build Coastguard Worker       &ranges::clamp(k6, k6, k5, ranges::greater(), &Int::value) == &k6, "");
1578*6777b538SAndroid Build Coastguard Worker   static_assert(
1579*6777b538SAndroid Build Coastguard Worker       &ranges::clamp(k6, k6, k4, ranges::greater(), &Int::value) == &k6, "");
1580*6777b538SAndroid Build Coastguard Worker   static_assert(
1581*6777b538SAndroid Build Coastguard Worker       &ranges::clamp(k6, k5, k5, ranges::greater(), &Int::value) == &k5, "");
1582*6777b538SAndroid Build Coastguard Worker   static_assert(
1583*6777b538SAndroid Build Coastguard Worker       &ranges::clamp(k6, k5, k4, ranges::greater(), &Int::value) == &k5, "");
1584*6777b538SAndroid Build Coastguard Worker   static_assert(
1585*6777b538SAndroid Build Coastguard Worker       &ranges::clamp(k6, k4, k4, ranges::greater(), &Int::value) == &k4, "");
1586*6777b538SAndroid Build Coastguard Worker 
1587*6777b538SAndroid Build Coastguard Worker   static_assert(
1588*6777b538SAndroid Build Coastguard Worker       &ranges::clamp(k5, k6, k6, ranges::greater(), &Int::value) == &k6, "");
1589*6777b538SAndroid Build Coastguard Worker   static_assert(
1590*6777b538SAndroid Build Coastguard Worker       &ranges::clamp(k5, k6, k5, ranges::greater(), &Int::value) == &k5, "");
1591*6777b538SAndroid Build Coastguard Worker   static_assert(
1592*6777b538SAndroid Build Coastguard Worker       &ranges::clamp(k5, k6, k4, ranges::greater(), &Int::value) == &k5, "");
1593*6777b538SAndroid Build Coastguard Worker   static_assert(
1594*6777b538SAndroid Build Coastguard Worker       &ranges::clamp(k5, k5, k5, ranges::greater(), &Int::value) == &k5, "");
1595*6777b538SAndroid Build Coastguard Worker   static_assert(
1596*6777b538SAndroid Build Coastguard Worker       &ranges::clamp(k5, k5, k4, ranges::greater(), &Int::value) == &k5, "");
1597*6777b538SAndroid Build Coastguard Worker   static_assert(
1598*6777b538SAndroid Build Coastguard Worker       &ranges::clamp(k5, k4, k4, ranges::greater(), &Int::value) == &k4, "");
1599*6777b538SAndroid Build Coastguard Worker 
1600*6777b538SAndroid Build Coastguard Worker   static_assert(
1601*6777b538SAndroid Build Coastguard Worker       &ranges::clamp(k4, k6, k6, ranges::greater(), &Int::value) == &k6, "");
1602*6777b538SAndroid Build Coastguard Worker   static_assert(
1603*6777b538SAndroid Build Coastguard Worker       &ranges::clamp(k4, k6, k5, ranges::greater(), &Int::value) == &k5, "");
1604*6777b538SAndroid Build Coastguard Worker   static_assert(
1605*6777b538SAndroid Build Coastguard Worker       &ranges::clamp(k4, k6, k4, ranges::greater(), &Int::value) == &k4, "");
1606*6777b538SAndroid Build Coastguard Worker   static_assert(
1607*6777b538SAndroid Build Coastguard Worker       &ranges::clamp(k4, k5, k5, ranges::greater(), &Int::value) == &k5, "");
1608*6777b538SAndroid Build Coastguard Worker   static_assert(
1609*6777b538SAndroid Build Coastguard Worker       &ranges::clamp(k4, k5, k4, ranges::greater(), &Int::value) == &k4, "");
1610*6777b538SAndroid Build Coastguard Worker   static_assert(
1611*6777b538SAndroid Build Coastguard Worker       &ranges::clamp(k4, k4, k4, ranges::greater(), &Int::value) == &k4, "");
1612*6777b538SAndroid Build Coastguard Worker }
1613*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,LexicographicalCompare)1614*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, LexicographicalCompare) {
1615*6777b538SAndroid Build Coastguard Worker   constexpr int inputs1[] = {0, 1, 2, 3, 4, 5};
1616*6777b538SAndroid Build Coastguard Worker   constexpr int inputs2[] = {0, 1, 2, 3, 5, 4};
1617*6777b538SAndroid Build Coastguard Worker   static_assert(!ranges::lexicographical_compare(inputs1, inputs1 + 6, inputs1,
1618*6777b538SAndroid Build Coastguard Worker                                                  inputs1 + 6),
1619*6777b538SAndroid Build Coastguard Worker                 "");
1620*6777b538SAndroid Build Coastguard Worker   static_assert(ranges::lexicographical_compare(inputs1, inputs1 + 6, inputs2,
1621*6777b538SAndroid Build Coastguard Worker                                                 inputs2 + 6),
1622*6777b538SAndroid Build Coastguard Worker                 "");
1623*6777b538SAndroid Build Coastguard Worker   static_assert(!ranges::lexicographical_compare(inputs2, inputs2 + 6, inputs1,
1624*6777b538SAndroid Build Coastguard Worker                                                  inputs1 + 6),
1625*6777b538SAndroid Build Coastguard Worker                 "");
1626*6777b538SAndroid Build Coastguard Worker   static_assert(!ranges::lexicographical_compare(inputs2, inputs2 + 6, inputs2,
1627*6777b538SAndroid Build Coastguard Worker                                                  inputs2 + 6),
1628*6777b538SAndroid Build Coastguard Worker                 "");
1629*6777b538SAndroid Build Coastguard Worker 
1630*6777b538SAndroid Build Coastguard Worker   constexpr Int ints1[] = {0, 1, 2, 3, 4, 5};
1631*6777b538SAndroid Build Coastguard Worker   constexpr Int ints2[] = {5, 4, 3, 2, 1, 0};
1632*6777b538SAndroid Build Coastguard Worker   static_assert(
1633*6777b538SAndroid Build Coastguard Worker       !ranges::lexicographical_compare(inputs1, ints1, {}, {}, &Int::value),
1634*6777b538SAndroid Build Coastguard Worker       "");
1635*6777b538SAndroid Build Coastguard Worker   static_assert(
1636*6777b538SAndroid Build Coastguard Worker       !ranges::lexicographical_compare(ints1, inputs1, {}, &Int::value), "");
1637*6777b538SAndroid Build Coastguard Worker 
1638*6777b538SAndroid Build Coastguard Worker   static_assert(
1639*6777b538SAndroid Build Coastguard Worker       !ranges::lexicographical_compare(inputs2, ints1, {}, {}, &Int::value),
1640*6777b538SAndroid Build Coastguard Worker       "");
1641*6777b538SAndroid Build Coastguard Worker   static_assert(
1642*6777b538SAndroid Build Coastguard Worker       ranges::lexicographical_compare(ints1, inputs2, {}, &Int::value), "");
1643*6777b538SAndroid Build Coastguard Worker 
1644*6777b538SAndroid Build Coastguard Worker   static_assert(ranges::lexicographical_compare(ints1, ints2, {}, &Int::value,
1645*6777b538SAndroid Build Coastguard Worker                                                 &Int::value),
1646*6777b538SAndroid Build Coastguard Worker                 "");
1647*6777b538SAndroid Build Coastguard Worker   static_assert(!ranges::lexicographical_compare(ints2, ints1, {}, &Int::value,
1648*6777b538SAndroid Build Coastguard Worker                                                  &Int::value),
1649*6777b538SAndroid Build Coastguard Worker                 "");
1650*6777b538SAndroid Build Coastguard Worker 
1651*6777b538SAndroid Build Coastguard Worker   static_assert(!ranges::lexicographical_compare(
1652*6777b538SAndroid Build Coastguard Worker                     ints1, ints2, ranges::greater(), &Int::value, &Int::value),
1653*6777b538SAndroid Build Coastguard Worker                 "");
1654*6777b538SAndroid Build Coastguard Worker   static_assert(ranges::lexicographical_compare(ints2, ints1, ranges::greater(),
1655*6777b538SAndroid Build Coastguard Worker                                                 &Int::value, &Int::value),
1656*6777b538SAndroid Build Coastguard Worker                 "");
1657*6777b538SAndroid Build Coastguard Worker 
1658*6777b538SAndroid Build Coastguard Worker   using List = std::initializer_list<int>;
1659*6777b538SAndroid Build Coastguard Worker   static_assert(
1660*6777b538SAndroid Build Coastguard Worker       ranges::lexicographical_compare(List{0, 1, 2}, List{0, 1, 2, 3}), "");
1661*6777b538SAndroid Build Coastguard Worker   static_assert(
1662*6777b538SAndroid Build Coastguard Worker       !ranges::lexicographical_compare(List{0, 1, 2, 3}, List{0, 1, 2}), "");
1663*6777b538SAndroid Build Coastguard Worker   static_assert(
1664*6777b538SAndroid Build Coastguard Worker       ranges::lexicographical_compare(List{0, 1, 2, 3}, List{0, 1, 2, 4}), "");
1665*6777b538SAndroid Build Coastguard Worker   static_assert(
1666*6777b538SAndroid Build Coastguard Worker       !ranges::lexicographical_compare(List{0, 1, 2, 4}, List{0, 1, 2, 3}), "");
1667*6777b538SAndroid Build Coastguard Worker }
1668*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,NextPermutation)1669*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, NextPermutation) {
1670*6777b538SAndroid Build Coastguard Worker   int input[] = {5, 4, 3, 2, 0, 1};
1671*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::next_permutation(input, input + 6));
1672*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(5, 4, 3, 2, 1, 0));
1673*6777b538SAndroid Build Coastguard Worker 
1674*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ranges::next_permutation(input, input + 6));
1675*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(0, 1, 2, 3, 4, 5));
1676*6777b538SAndroid Build Coastguard Worker 
1677*6777b538SAndroid Build Coastguard Worker   Int ints[] = {0, 1, 2, 3, 5, 4};
1678*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::next_permutation(ints, ranges::greater(), &Int::value));
1679*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ints, ElementsAre(0, 1, 2, 3, 4, 5));
1680*6777b538SAndroid Build Coastguard Worker 
1681*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ranges::next_permutation(ints, ranges::greater(), &Int::value));
1682*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ints, ElementsAre(5, 4, 3, 2, 1, 0));
1683*6777b538SAndroid Build Coastguard Worker 
1684*6777b538SAndroid Build Coastguard Worker   int bits[] = {0, 0, 1, 0, 0};
1685*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::next_permutation(bits));
1686*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(bits, ElementsAre(0, 1, 0, 0, 0));
1687*6777b538SAndroid Build Coastguard Worker }
1688*6777b538SAndroid Build Coastguard Worker 
TEST(RangesTest,PrevPermutation)1689*6777b538SAndroid Build Coastguard Worker TEST(RangesTest, PrevPermutation) {
1690*6777b538SAndroid Build Coastguard Worker   int input[] = {0, 1, 2, 3, 5, 4};
1691*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::prev_permutation(input, input + 6));
1692*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(0, 1, 2, 3, 4, 5));
1693*6777b538SAndroid Build Coastguard Worker 
1694*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ranges::prev_permutation(input, input + 6));
1695*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(input, ElementsAre(5, 4, 3, 2, 1, 0));
1696*6777b538SAndroid Build Coastguard Worker 
1697*6777b538SAndroid Build Coastguard Worker   Int ints[] = {5, 4, 3, 2, 0, 1};
1698*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::prev_permutation(ints, ranges::greater(), &Int::value));
1699*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ints, ElementsAre(5, 4, 3, 2, 1, 0));
1700*6777b538SAndroid Build Coastguard Worker 
1701*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ranges::prev_permutation(ints, ranges::greater(), &Int::value));
1702*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ints, ElementsAre(0, 1, 2, 3, 4, 5));
1703*6777b538SAndroid Build Coastguard Worker 
1704*6777b538SAndroid Build Coastguard Worker   int bits[] = {0, 0, 1, 0, 0};
1705*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ranges::prev_permutation(bits));
1706*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(bits, ElementsAre(0, 0, 0, 1, 0));
1707*6777b538SAndroid Build Coastguard Worker }
1708*6777b538SAndroid Build Coastguard Worker 
1709*6777b538SAndroid Build Coastguard Worker namespace internal {
1710*6777b538SAndroid Build Coastguard Worker struct TestPair {
1711*6777b538SAndroid Build Coastguard Worker   int a;
1712*6777b538SAndroid Build Coastguard Worker   int b;
1713*6777b538SAndroid Build Coastguard Worker };
1714*6777b538SAndroid Build Coastguard Worker }  // namespace internal
1715*6777b538SAndroid Build Coastguard Worker 
1716*6777b538SAndroid Build Coastguard Worker }  // namespace base
1717