1*9356374aSAndroid Build Coastguard Worker // Copyright 2017 The Abseil Authors.
2*9356374aSAndroid Build Coastguard Worker //
3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*9356374aSAndroid Build Coastguard Worker //
7*9356374aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*9356374aSAndroid Build Coastguard Worker //
9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*9356374aSAndroid Build Coastguard Worker // limitations under the License.
14*9356374aSAndroid Build Coastguard Worker
15*9356374aSAndroid Build Coastguard Worker #include "absl/algorithm/container.h"
16*9356374aSAndroid Build Coastguard Worker
17*9356374aSAndroid Build Coastguard Worker #include <algorithm>
18*9356374aSAndroid Build Coastguard Worker #include <array>
19*9356374aSAndroid Build Coastguard Worker #include <functional>
20*9356374aSAndroid Build Coastguard Worker #include <initializer_list>
21*9356374aSAndroid Build Coastguard Worker #include <iterator>
22*9356374aSAndroid Build Coastguard Worker #include <list>
23*9356374aSAndroid Build Coastguard Worker #include <memory>
24*9356374aSAndroid Build Coastguard Worker #include <ostream>
25*9356374aSAndroid Build Coastguard Worker #include <random>
26*9356374aSAndroid Build Coastguard Worker #include <set>
27*9356374aSAndroid Build Coastguard Worker #include <unordered_set>
28*9356374aSAndroid Build Coastguard Worker #include <utility>
29*9356374aSAndroid Build Coastguard Worker #include <valarray>
30*9356374aSAndroid Build Coastguard Worker #include <vector>
31*9356374aSAndroid Build Coastguard Worker
32*9356374aSAndroid Build Coastguard Worker #include "gmock/gmock.h"
33*9356374aSAndroid Build Coastguard Worker #include "gtest/gtest.h"
34*9356374aSAndroid Build Coastguard Worker #include "absl/base/casts.h"
35*9356374aSAndroid Build Coastguard Worker #include "absl/base/config.h"
36*9356374aSAndroid Build Coastguard Worker #include "absl/base/macros.h"
37*9356374aSAndroid Build Coastguard Worker #include "absl/memory/memory.h"
38*9356374aSAndroid Build Coastguard Worker #include "absl/types/span.h"
39*9356374aSAndroid Build Coastguard Worker
40*9356374aSAndroid Build Coastguard Worker namespace {
41*9356374aSAndroid Build Coastguard Worker
42*9356374aSAndroid Build Coastguard Worker using ::testing::Each;
43*9356374aSAndroid Build Coastguard Worker using ::testing::ElementsAre;
44*9356374aSAndroid Build Coastguard Worker using ::testing::Gt;
45*9356374aSAndroid Build Coastguard Worker using ::testing::IsNull;
46*9356374aSAndroid Build Coastguard Worker using ::testing::IsSubsetOf;
47*9356374aSAndroid Build Coastguard Worker using ::testing::Lt;
48*9356374aSAndroid Build Coastguard Worker using ::testing::Pointee;
49*9356374aSAndroid Build Coastguard Worker using ::testing::SizeIs;
50*9356374aSAndroid Build Coastguard Worker using ::testing::Truly;
51*9356374aSAndroid Build Coastguard Worker using ::testing::UnorderedElementsAre;
52*9356374aSAndroid Build Coastguard Worker
53*9356374aSAndroid Build Coastguard Worker // Most of these tests just check that the code compiles, not that it
54*9356374aSAndroid Build Coastguard Worker // does the right thing. That's fine since the functions just forward
55*9356374aSAndroid Build Coastguard Worker // to the STL implementation.
56*9356374aSAndroid Build Coastguard Worker class NonMutatingTest : public testing::Test {
57*9356374aSAndroid Build Coastguard Worker protected:
58*9356374aSAndroid Build Coastguard Worker std::unordered_set<int> container_ = {1, 2, 3};
59*9356374aSAndroid Build Coastguard Worker std::list<int> sequence_ = {1, 2, 3};
60*9356374aSAndroid Build Coastguard Worker std::vector<int> vector_ = {1, 2, 3};
61*9356374aSAndroid Build Coastguard Worker int array_[3] = {1, 2, 3};
62*9356374aSAndroid Build Coastguard Worker };
63*9356374aSAndroid Build Coastguard Worker
64*9356374aSAndroid Build Coastguard Worker struct AccumulateCalls {
operator ()__anon8c2d03130111::AccumulateCalls65*9356374aSAndroid Build Coastguard Worker void operator()(int value) { calls.push_back(value); }
66*9356374aSAndroid Build Coastguard Worker std::vector<int> calls;
67*9356374aSAndroid Build Coastguard Worker };
68*9356374aSAndroid Build Coastguard Worker
Predicate(int value)69*9356374aSAndroid Build Coastguard Worker bool Predicate(int value) { return value < 3; }
BinPredicate(int v1,int v2)70*9356374aSAndroid Build Coastguard Worker bool BinPredicate(int v1, int v2) { return v1 < v2; }
Equals(int v1,int v2)71*9356374aSAndroid Build Coastguard Worker bool Equals(int v1, int v2) { return v1 == v2; }
IsOdd(int x)72*9356374aSAndroid Build Coastguard Worker bool IsOdd(int x) { return x % 2 != 0; }
73*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,Distance)74*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, Distance) {
75*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(container_.size(),
76*9356374aSAndroid Build Coastguard Worker static_cast<size_t>(absl::c_distance(container_)));
77*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(sequence_.size(), static_cast<size_t>(absl::c_distance(sequence_)));
78*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(vector_.size(), static_cast<size_t>(absl::c_distance(vector_)));
79*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(ABSL_ARRAYSIZE(array_),
80*9356374aSAndroid Build Coastguard Worker static_cast<size_t>(absl::c_distance(array_)));
81*9356374aSAndroid Build Coastguard Worker
82*9356374aSAndroid Build Coastguard Worker // Works with a temporary argument.
83*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(vector_.size(),
84*9356374aSAndroid Build Coastguard Worker static_cast<size_t>(absl::c_distance(std::vector<int>(vector_))));
85*9356374aSAndroid Build Coastguard Worker }
86*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,Distance_OverloadedBeginEnd)87*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, Distance_OverloadedBeginEnd) {
88*9356374aSAndroid Build Coastguard Worker // Works with classes which have custom ADL-selected overloads of std::begin
89*9356374aSAndroid Build Coastguard Worker // and std::end.
90*9356374aSAndroid Build Coastguard Worker std::initializer_list<int> a = {1, 2, 3};
91*9356374aSAndroid Build Coastguard Worker std::valarray<int> b = {1, 2, 3};
92*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(3, absl::c_distance(a));
93*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(3, absl::c_distance(b));
94*9356374aSAndroid Build Coastguard Worker
95*9356374aSAndroid Build Coastguard Worker // It is assumed that other c_* functions use the same mechanism for
96*9356374aSAndroid Build Coastguard Worker // ADL-selecting begin/end overloads.
97*9356374aSAndroid Build Coastguard Worker }
98*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,ForEach)99*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, ForEach) {
100*9356374aSAndroid Build Coastguard Worker AccumulateCalls c = absl::c_for_each(container_, AccumulateCalls());
101*9356374aSAndroid Build Coastguard Worker // Don't rely on the unordered_set's order.
102*9356374aSAndroid Build Coastguard Worker std::sort(c.calls.begin(), c.calls.end());
103*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(vector_, c.calls);
104*9356374aSAndroid Build Coastguard Worker
105*9356374aSAndroid Build Coastguard Worker // Works with temporary container, too.
106*9356374aSAndroid Build Coastguard Worker AccumulateCalls c2 =
107*9356374aSAndroid Build Coastguard Worker absl::c_for_each(std::unordered_set<int>(container_), AccumulateCalls());
108*9356374aSAndroid Build Coastguard Worker std::sort(c2.calls.begin(), c2.calls.end());
109*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(vector_, c2.calls);
110*9356374aSAndroid Build Coastguard Worker }
111*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,FindReturnsCorrectType)112*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, FindReturnsCorrectType) {
113*9356374aSAndroid Build Coastguard Worker auto it = absl::c_find(container_, 3);
114*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(3, *it);
115*9356374aSAndroid Build Coastguard Worker absl::c_find(absl::implicit_cast<const std::list<int>&>(sequence_), 3);
116*9356374aSAndroid Build Coastguard Worker }
117*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,Contains)118*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, Contains) {
119*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_contains(container_, 3));
120*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::c_contains(container_, 4));
121*9356374aSAndroid Build Coastguard Worker }
122*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,FindIf)123*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, FindIf) { absl::c_find_if(container_, Predicate); }
124*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,FindIfNot)125*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, FindIfNot) {
126*9356374aSAndroid Build Coastguard Worker absl::c_find_if_not(container_, Predicate);
127*9356374aSAndroid Build Coastguard Worker }
128*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,FindEnd)129*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, FindEnd) {
130*9356374aSAndroid Build Coastguard Worker absl::c_find_end(sequence_, vector_);
131*9356374aSAndroid Build Coastguard Worker absl::c_find_end(vector_, sequence_);
132*9356374aSAndroid Build Coastguard Worker }
133*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,FindEndWithPredicate)134*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, FindEndWithPredicate) {
135*9356374aSAndroid Build Coastguard Worker absl::c_find_end(sequence_, vector_, BinPredicate);
136*9356374aSAndroid Build Coastguard Worker absl::c_find_end(vector_, sequence_, BinPredicate);
137*9356374aSAndroid Build Coastguard Worker }
138*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,FindFirstOf)139*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, FindFirstOf) {
140*9356374aSAndroid Build Coastguard Worker absl::c_find_first_of(container_, sequence_);
141*9356374aSAndroid Build Coastguard Worker absl::c_find_first_of(sequence_, container_);
142*9356374aSAndroid Build Coastguard Worker }
143*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,FindFirstOfWithPredicate)144*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, FindFirstOfWithPredicate) {
145*9356374aSAndroid Build Coastguard Worker absl::c_find_first_of(container_, sequence_, BinPredicate);
146*9356374aSAndroid Build Coastguard Worker absl::c_find_first_of(sequence_, container_, BinPredicate);
147*9356374aSAndroid Build Coastguard Worker }
148*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,AdjacentFind)149*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, AdjacentFind) { absl::c_adjacent_find(sequence_); }
150*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,AdjacentFindWithPredicate)151*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, AdjacentFindWithPredicate) {
152*9356374aSAndroid Build Coastguard Worker absl::c_adjacent_find(sequence_, BinPredicate);
153*9356374aSAndroid Build Coastguard Worker }
154*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,Count)155*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, Count) { EXPECT_EQ(1, absl::c_count(container_, 3)); }
156*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,CountIf)157*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, CountIf) {
158*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(2, absl::c_count_if(container_, Predicate));
159*9356374aSAndroid Build Coastguard Worker const std::unordered_set<int>& const_container = container_;
160*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(2, absl::c_count_if(const_container, Predicate));
161*9356374aSAndroid Build Coastguard Worker }
162*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,Mismatch)163*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, Mismatch) {
164*9356374aSAndroid Build Coastguard Worker // Testing necessary as absl::c_mismatch executes logic.
165*9356374aSAndroid Build Coastguard Worker {
166*9356374aSAndroid Build Coastguard Worker auto result = absl::c_mismatch(vector_, sequence_);
167*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(result.first, vector_.end());
168*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(result.second, sequence_.end());
169*9356374aSAndroid Build Coastguard Worker }
170*9356374aSAndroid Build Coastguard Worker {
171*9356374aSAndroid Build Coastguard Worker auto result = absl::c_mismatch(sequence_, vector_);
172*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(result.first, sequence_.end());
173*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(result.second, vector_.end());
174*9356374aSAndroid Build Coastguard Worker }
175*9356374aSAndroid Build Coastguard Worker
176*9356374aSAndroid Build Coastguard Worker sequence_.back() = 5;
177*9356374aSAndroid Build Coastguard Worker {
178*9356374aSAndroid Build Coastguard Worker auto result = absl::c_mismatch(vector_, sequence_);
179*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(result.first, std::prev(vector_.end()));
180*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(result.second, std::prev(sequence_.end()));
181*9356374aSAndroid Build Coastguard Worker }
182*9356374aSAndroid Build Coastguard Worker {
183*9356374aSAndroid Build Coastguard Worker auto result = absl::c_mismatch(sequence_, vector_);
184*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(result.first, std::prev(sequence_.end()));
185*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(result.second, std::prev(vector_.end()));
186*9356374aSAndroid Build Coastguard Worker }
187*9356374aSAndroid Build Coastguard Worker
188*9356374aSAndroid Build Coastguard Worker sequence_.pop_back();
189*9356374aSAndroid Build Coastguard Worker {
190*9356374aSAndroid Build Coastguard Worker auto result = absl::c_mismatch(vector_, sequence_);
191*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(result.first, std::prev(vector_.end()));
192*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(result.second, sequence_.end());
193*9356374aSAndroid Build Coastguard Worker }
194*9356374aSAndroid Build Coastguard Worker {
195*9356374aSAndroid Build Coastguard Worker auto result = absl::c_mismatch(sequence_, vector_);
196*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(result.first, sequence_.end());
197*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(result.second, std::prev(vector_.end()));
198*9356374aSAndroid Build Coastguard Worker }
199*9356374aSAndroid Build Coastguard Worker {
200*9356374aSAndroid Build Coastguard Worker struct NoNotEquals {
201*9356374aSAndroid Build Coastguard Worker constexpr bool operator==(NoNotEquals) const { return true; }
202*9356374aSAndroid Build Coastguard Worker constexpr bool operator!=(NoNotEquals) const = delete;
203*9356374aSAndroid Build Coastguard Worker };
204*9356374aSAndroid Build Coastguard Worker std::vector<NoNotEquals> first;
205*9356374aSAndroid Build Coastguard Worker std::list<NoNotEquals> second;
206*9356374aSAndroid Build Coastguard Worker
207*9356374aSAndroid Build Coastguard Worker // Check this still compiles.
208*9356374aSAndroid Build Coastguard Worker absl::c_mismatch(first, second);
209*9356374aSAndroid Build Coastguard Worker }
210*9356374aSAndroid Build Coastguard Worker }
211*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,MismatchWithPredicate)212*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, MismatchWithPredicate) {
213*9356374aSAndroid Build Coastguard Worker // Testing necessary as absl::c_mismatch executes logic.
214*9356374aSAndroid Build Coastguard Worker {
215*9356374aSAndroid Build Coastguard Worker auto result = absl::c_mismatch(vector_, sequence_, BinPredicate);
216*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(result.first, vector_.begin());
217*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(result.second, sequence_.begin());
218*9356374aSAndroid Build Coastguard Worker }
219*9356374aSAndroid Build Coastguard Worker {
220*9356374aSAndroid Build Coastguard Worker auto result = absl::c_mismatch(sequence_, vector_, BinPredicate);
221*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(result.first, sequence_.begin());
222*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(result.second, vector_.begin());
223*9356374aSAndroid Build Coastguard Worker }
224*9356374aSAndroid Build Coastguard Worker
225*9356374aSAndroid Build Coastguard Worker sequence_.front() = 0;
226*9356374aSAndroid Build Coastguard Worker {
227*9356374aSAndroid Build Coastguard Worker auto result = absl::c_mismatch(vector_, sequence_, BinPredicate);
228*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(result.first, vector_.begin());
229*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(result.second, sequence_.begin());
230*9356374aSAndroid Build Coastguard Worker }
231*9356374aSAndroid Build Coastguard Worker {
232*9356374aSAndroid Build Coastguard Worker auto result = absl::c_mismatch(sequence_, vector_, BinPredicate);
233*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(result.first, std::next(sequence_.begin()));
234*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(result.second, std::next(vector_.begin()));
235*9356374aSAndroid Build Coastguard Worker }
236*9356374aSAndroid Build Coastguard Worker
237*9356374aSAndroid Build Coastguard Worker sequence_.clear();
238*9356374aSAndroid Build Coastguard Worker {
239*9356374aSAndroid Build Coastguard Worker auto result = absl::c_mismatch(vector_, sequence_, BinPredicate);
240*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(result.first, vector_.begin());
241*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(result.second, sequence_.end());
242*9356374aSAndroid Build Coastguard Worker }
243*9356374aSAndroid Build Coastguard Worker {
244*9356374aSAndroid Build Coastguard Worker auto result = absl::c_mismatch(sequence_, vector_, BinPredicate);
245*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(result.first, sequence_.end());
246*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(result.second, vector_.begin());
247*9356374aSAndroid Build Coastguard Worker }
248*9356374aSAndroid Build Coastguard Worker }
249*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,Equal)250*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, Equal) {
251*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_equal(vector_, sequence_));
252*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_equal(sequence_, vector_));
253*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_equal(sequence_, array_));
254*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_equal(array_, vector_));
255*9356374aSAndroid Build Coastguard Worker
256*9356374aSAndroid Build Coastguard Worker // Test that behavior appropriately differs from that of equal().
257*9356374aSAndroid Build Coastguard Worker std::vector<int> vector_plus = {1, 2, 3};
258*9356374aSAndroid Build Coastguard Worker vector_plus.push_back(4);
259*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::c_equal(vector_plus, sequence_));
260*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::c_equal(sequence_, vector_plus));
261*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::c_equal(array_, vector_plus));
262*9356374aSAndroid Build Coastguard Worker }
263*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,EqualWithPredicate)264*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, EqualWithPredicate) {
265*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_equal(vector_, sequence_, Equals));
266*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_equal(sequence_, vector_, Equals));
267*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_equal(array_, sequence_, Equals));
268*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_equal(vector_, array_, Equals));
269*9356374aSAndroid Build Coastguard Worker
270*9356374aSAndroid Build Coastguard Worker // Test that behavior appropriately differs from that of equal().
271*9356374aSAndroid Build Coastguard Worker std::vector<int> vector_plus = {1, 2, 3};
272*9356374aSAndroid Build Coastguard Worker vector_plus.push_back(4);
273*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::c_equal(vector_plus, sequence_, Equals));
274*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::c_equal(sequence_, vector_plus, Equals));
275*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::c_equal(vector_plus, array_, Equals));
276*9356374aSAndroid Build Coastguard Worker }
277*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,IsPermutation)278*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, IsPermutation) {
279*9356374aSAndroid Build Coastguard Worker auto vector_permut_ = vector_;
280*9356374aSAndroid Build Coastguard Worker std::next_permutation(vector_permut_.begin(), vector_permut_.end());
281*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_is_permutation(vector_permut_, sequence_));
282*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_is_permutation(sequence_, vector_permut_));
283*9356374aSAndroid Build Coastguard Worker
284*9356374aSAndroid Build Coastguard Worker // Test that behavior appropriately differs from that of is_permutation().
285*9356374aSAndroid Build Coastguard Worker std::vector<int> vector_plus = {1, 2, 3};
286*9356374aSAndroid Build Coastguard Worker vector_plus.push_back(4);
287*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::c_is_permutation(vector_plus, sequence_));
288*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::c_is_permutation(sequence_, vector_plus));
289*9356374aSAndroid Build Coastguard Worker }
290*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,IsPermutationWithPredicate)291*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, IsPermutationWithPredicate) {
292*9356374aSAndroid Build Coastguard Worker auto vector_permut_ = vector_;
293*9356374aSAndroid Build Coastguard Worker std::next_permutation(vector_permut_.begin(), vector_permut_.end());
294*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_is_permutation(vector_permut_, sequence_, Equals));
295*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_is_permutation(sequence_, vector_permut_, Equals));
296*9356374aSAndroid Build Coastguard Worker
297*9356374aSAndroid Build Coastguard Worker // Test that behavior appropriately differs from that of is_permutation().
298*9356374aSAndroid Build Coastguard Worker std::vector<int> vector_plus = {1, 2, 3};
299*9356374aSAndroid Build Coastguard Worker vector_plus.push_back(4);
300*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::c_is_permutation(vector_plus, sequence_, Equals));
301*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::c_is_permutation(sequence_, vector_plus, Equals));
302*9356374aSAndroid Build Coastguard Worker }
303*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,Search)304*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, Search) {
305*9356374aSAndroid Build Coastguard Worker absl::c_search(sequence_, vector_);
306*9356374aSAndroid Build Coastguard Worker absl::c_search(vector_, sequence_);
307*9356374aSAndroid Build Coastguard Worker absl::c_search(array_, sequence_);
308*9356374aSAndroid Build Coastguard Worker }
309*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,SearchWithPredicate)310*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, SearchWithPredicate) {
311*9356374aSAndroid Build Coastguard Worker absl::c_search(sequence_, vector_, BinPredicate);
312*9356374aSAndroid Build Coastguard Worker absl::c_search(vector_, sequence_, BinPredicate);
313*9356374aSAndroid Build Coastguard Worker }
314*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,ContainsSubrange)315*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, ContainsSubrange) {
316*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_contains_subrange(sequence_, vector_));
317*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_contains_subrange(vector_, sequence_));
318*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_contains_subrange(array_, sequence_));
319*9356374aSAndroid Build Coastguard Worker }
320*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,ContainsSubrangeWithPredicate)321*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, ContainsSubrangeWithPredicate) {
322*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_contains_subrange(sequence_, vector_, Equals));
323*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_contains_subrange(vector_, sequence_, Equals));
324*9356374aSAndroid Build Coastguard Worker }
325*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,SearchN)326*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, SearchN) { absl::c_search_n(sequence_, 3, 1); }
327*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,SearchNWithPredicate)328*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, SearchNWithPredicate) {
329*9356374aSAndroid Build Coastguard Worker absl::c_search_n(sequence_, 3, 1, BinPredicate);
330*9356374aSAndroid Build Coastguard Worker }
331*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,LowerBound)332*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, LowerBound) {
333*9356374aSAndroid Build Coastguard Worker std::list<int>::iterator i = absl::c_lower_bound(sequence_, 3);
334*9356374aSAndroid Build Coastguard Worker ASSERT_TRUE(i != sequence_.end());
335*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(2, std::distance(sequence_.begin(), i));
336*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(3, *i);
337*9356374aSAndroid Build Coastguard Worker }
338*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,LowerBoundWithPredicate)339*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, LowerBoundWithPredicate) {
340*9356374aSAndroid Build Coastguard Worker std::vector<int> v(vector_);
341*9356374aSAndroid Build Coastguard Worker std::sort(v.begin(), v.end(), std::greater<int>());
342*9356374aSAndroid Build Coastguard Worker std::vector<int>::iterator i = absl::c_lower_bound(v, 3, std::greater<int>());
343*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(i == v.begin());
344*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(3, *i);
345*9356374aSAndroid Build Coastguard Worker }
346*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,UpperBound)347*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, UpperBound) {
348*9356374aSAndroid Build Coastguard Worker std::list<int>::iterator i = absl::c_upper_bound(sequence_, 1);
349*9356374aSAndroid Build Coastguard Worker ASSERT_TRUE(i != sequence_.end());
350*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, std::distance(sequence_.begin(), i));
351*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(2, *i);
352*9356374aSAndroid Build Coastguard Worker }
353*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,UpperBoundWithPredicate)354*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, UpperBoundWithPredicate) {
355*9356374aSAndroid Build Coastguard Worker std::vector<int> v(vector_);
356*9356374aSAndroid Build Coastguard Worker std::sort(v.begin(), v.end(), std::greater<int>());
357*9356374aSAndroid Build Coastguard Worker std::vector<int>::iterator i = absl::c_upper_bound(v, 1, std::greater<int>());
358*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(3, i - v.begin());
359*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(i == v.end());
360*9356374aSAndroid Build Coastguard Worker }
361*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,EqualRange)362*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, EqualRange) {
363*9356374aSAndroid Build Coastguard Worker std::pair<std::list<int>::iterator, std::list<int>::iterator> p =
364*9356374aSAndroid Build Coastguard Worker absl::c_equal_range(sequence_, 2);
365*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, std::distance(sequence_.begin(), p.first));
366*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(2, std::distance(sequence_.begin(), p.second));
367*9356374aSAndroid Build Coastguard Worker }
368*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,EqualRangeArray)369*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, EqualRangeArray) {
370*9356374aSAndroid Build Coastguard Worker auto p = absl::c_equal_range(array_, 2);
371*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, std::distance(std::begin(array_), p.first));
372*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(2, std::distance(std::begin(array_), p.second));
373*9356374aSAndroid Build Coastguard Worker }
374*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,EqualRangeWithPredicate)375*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, EqualRangeWithPredicate) {
376*9356374aSAndroid Build Coastguard Worker std::vector<int> v(vector_);
377*9356374aSAndroid Build Coastguard Worker std::sort(v.begin(), v.end(), std::greater<int>());
378*9356374aSAndroid Build Coastguard Worker std::pair<std::vector<int>::iterator, std::vector<int>::iterator> p =
379*9356374aSAndroid Build Coastguard Worker absl::c_equal_range(v, 2, std::greater<int>());
380*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, std::distance(v.begin(), p.first));
381*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(2, std::distance(v.begin(), p.second));
382*9356374aSAndroid Build Coastguard Worker }
383*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,BinarySearch)384*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, BinarySearch) {
385*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_binary_search(vector_, 2));
386*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_binary_search(std::vector<int>(vector_), 2));
387*9356374aSAndroid Build Coastguard Worker }
388*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,BinarySearchWithPredicate)389*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, BinarySearchWithPredicate) {
390*9356374aSAndroid Build Coastguard Worker std::vector<int> v(vector_);
391*9356374aSAndroid Build Coastguard Worker std::sort(v.begin(), v.end(), std::greater<int>());
392*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_binary_search(v, 2, std::greater<int>()));
393*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(
394*9356374aSAndroid Build Coastguard Worker absl::c_binary_search(std::vector<int>(v), 2, std::greater<int>()));
395*9356374aSAndroid Build Coastguard Worker }
396*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,MinElement)397*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, MinElement) {
398*9356374aSAndroid Build Coastguard Worker std::list<int>::iterator i = absl::c_min_element(sequence_);
399*9356374aSAndroid Build Coastguard Worker ASSERT_TRUE(i != sequence_.end());
400*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(*i, 1);
401*9356374aSAndroid Build Coastguard Worker }
402*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,MinElementWithPredicate)403*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, MinElementWithPredicate) {
404*9356374aSAndroid Build Coastguard Worker std::list<int>::iterator i =
405*9356374aSAndroid Build Coastguard Worker absl::c_min_element(sequence_, std::greater<int>());
406*9356374aSAndroid Build Coastguard Worker ASSERT_TRUE(i != sequence_.end());
407*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(*i, 3);
408*9356374aSAndroid Build Coastguard Worker }
409*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,MaxElement)410*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, MaxElement) {
411*9356374aSAndroid Build Coastguard Worker std::list<int>::iterator i = absl::c_max_element(sequence_);
412*9356374aSAndroid Build Coastguard Worker ASSERT_TRUE(i != sequence_.end());
413*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(*i, 3);
414*9356374aSAndroid Build Coastguard Worker }
415*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,MaxElementWithPredicate)416*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, MaxElementWithPredicate) {
417*9356374aSAndroid Build Coastguard Worker std::list<int>::iterator i =
418*9356374aSAndroid Build Coastguard Worker absl::c_max_element(sequence_, std::greater<int>());
419*9356374aSAndroid Build Coastguard Worker ASSERT_TRUE(i != sequence_.end());
420*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(*i, 1);
421*9356374aSAndroid Build Coastguard Worker }
422*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,LexicographicalCompare)423*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, LexicographicalCompare) {
424*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::c_lexicographical_compare(sequence_, sequence_));
425*9356374aSAndroid Build Coastguard Worker
426*9356374aSAndroid Build Coastguard Worker std::vector<int> v;
427*9356374aSAndroid Build Coastguard Worker v.push_back(1);
428*9356374aSAndroid Build Coastguard Worker v.push_back(2);
429*9356374aSAndroid Build Coastguard Worker v.push_back(4);
430*9356374aSAndroid Build Coastguard Worker
431*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_lexicographical_compare(sequence_, v));
432*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_lexicographical_compare(std::list<int>(sequence_), v));
433*9356374aSAndroid Build Coastguard Worker }
434*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,LexicographicalCopmareWithPredicate)435*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, LexicographicalCopmareWithPredicate) {
436*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::c_lexicographical_compare(sequence_, sequence_,
437*9356374aSAndroid Build Coastguard Worker std::greater<int>()));
438*9356374aSAndroid Build Coastguard Worker
439*9356374aSAndroid Build Coastguard Worker std::vector<int> v;
440*9356374aSAndroid Build Coastguard Worker v.push_back(1);
441*9356374aSAndroid Build Coastguard Worker v.push_back(2);
442*9356374aSAndroid Build Coastguard Worker v.push_back(4);
443*9356374aSAndroid Build Coastguard Worker
444*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(
445*9356374aSAndroid Build Coastguard Worker absl::c_lexicographical_compare(v, sequence_, std::greater<int>()));
446*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_lexicographical_compare(
447*9356374aSAndroid Build Coastguard Worker std::vector<int>(v), std::list<int>(sequence_), std::greater<int>()));
448*9356374aSAndroid Build Coastguard Worker }
449*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,Includes)450*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, Includes) {
451*9356374aSAndroid Build Coastguard Worker std::set<int> s(vector_.begin(), vector_.end());
452*9356374aSAndroid Build Coastguard Worker s.insert(4);
453*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_includes(s, vector_));
454*9356374aSAndroid Build Coastguard Worker }
455*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,IncludesWithPredicate)456*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, IncludesWithPredicate) {
457*9356374aSAndroid Build Coastguard Worker std::vector<int> v = {3, 2, 1};
458*9356374aSAndroid Build Coastguard Worker std::set<int, std::greater<int>> s(v.begin(), v.end());
459*9356374aSAndroid Build Coastguard Worker s.insert(4);
460*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_includes(s, v, std::greater<int>()));
461*9356374aSAndroid Build Coastguard Worker }
462*9356374aSAndroid Build Coastguard Worker
463*9356374aSAndroid Build Coastguard Worker class NumericMutatingTest : public testing::Test {
464*9356374aSAndroid Build Coastguard Worker protected:
465*9356374aSAndroid Build Coastguard Worker std::list<int> list_ = {1, 2, 3};
466*9356374aSAndroid Build Coastguard Worker std::vector<int> output_;
467*9356374aSAndroid Build Coastguard Worker };
468*9356374aSAndroid Build Coastguard Worker
TEST_F(NumericMutatingTest,Iota)469*9356374aSAndroid Build Coastguard Worker TEST_F(NumericMutatingTest, Iota) {
470*9356374aSAndroid Build Coastguard Worker absl::c_iota(list_, 5);
471*9356374aSAndroid Build Coastguard Worker std::list<int> expected{5, 6, 7};
472*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(list_, expected);
473*9356374aSAndroid Build Coastguard Worker }
474*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,Accumulate)475*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, Accumulate) {
476*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(absl::c_accumulate(sequence_, 4), 1 + 2 + 3 + 4);
477*9356374aSAndroid Build Coastguard Worker }
478*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,AccumulateWithBinaryOp)479*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, AccumulateWithBinaryOp) {
480*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(absl::c_accumulate(sequence_, 4, std::multiplies<int>()),
481*9356374aSAndroid Build Coastguard Worker 1 * 2 * 3 * 4);
482*9356374aSAndroid Build Coastguard Worker }
483*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,AccumulateLvalueInit)484*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, AccumulateLvalueInit) {
485*9356374aSAndroid Build Coastguard Worker int lvalue = 4;
486*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(absl::c_accumulate(sequence_, lvalue), 1 + 2 + 3 + 4);
487*9356374aSAndroid Build Coastguard Worker }
488*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,AccumulateWithBinaryOpLvalueInit)489*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, AccumulateWithBinaryOpLvalueInit) {
490*9356374aSAndroid Build Coastguard Worker int lvalue = 4;
491*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(absl::c_accumulate(sequence_, lvalue, std::multiplies<int>()),
492*9356374aSAndroid Build Coastguard Worker 1 * 2 * 3 * 4);
493*9356374aSAndroid Build Coastguard Worker }
494*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,InnerProduct)495*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, InnerProduct) {
496*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(absl::c_inner_product(sequence_, vector_, 1000),
497*9356374aSAndroid Build Coastguard Worker 1000 + 1 * 1 + 2 * 2 + 3 * 3);
498*9356374aSAndroid Build Coastguard Worker }
499*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,InnerProductWithBinaryOps)500*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, InnerProductWithBinaryOps) {
501*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(absl::c_inner_product(sequence_, vector_, 10,
502*9356374aSAndroid Build Coastguard Worker std::multiplies<int>(), std::plus<int>()),
503*9356374aSAndroid Build Coastguard Worker 10 * (1 + 1) * (2 + 2) * (3 + 3));
504*9356374aSAndroid Build Coastguard Worker }
505*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,InnerProductLvalueInit)506*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, InnerProductLvalueInit) {
507*9356374aSAndroid Build Coastguard Worker int lvalue = 1000;
508*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(absl::c_inner_product(sequence_, vector_, lvalue),
509*9356374aSAndroid Build Coastguard Worker 1000 + 1 * 1 + 2 * 2 + 3 * 3);
510*9356374aSAndroid Build Coastguard Worker }
511*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,InnerProductWithBinaryOpsLvalueInit)512*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, InnerProductWithBinaryOpsLvalueInit) {
513*9356374aSAndroid Build Coastguard Worker int lvalue = 10;
514*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(absl::c_inner_product(sequence_, vector_, lvalue,
515*9356374aSAndroid Build Coastguard Worker std::multiplies<int>(), std::plus<int>()),
516*9356374aSAndroid Build Coastguard Worker 10 * (1 + 1) * (2 + 2) * (3 + 3));
517*9356374aSAndroid Build Coastguard Worker }
518*9356374aSAndroid Build Coastguard Worker
TEST_F(NumericMutatingTest,AdjacentDifference)519*9356374aSAndroid Build Coastguard Worker TEST_F(NumericMutatingTest, AdjacentDifference) {
520*9356374aSAndroid Build Coastguard Worker auto last = absl::c_adjacent_difference(list_, std::back_inserter(output_));
521*9356374aSAndroid Build Coastguard Worker *last = 1000;
522*9356374aSAndroid Build Coastguard Worker std::vector<int> expected{1, 2 - 1, 3 - 2, 1000};
523*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(output_, expected);
524*9356374aSAndroid Build Coastguard Worker }
525*9356374aSAndroid Build Coastguard Worker
TEST_F(NumericMutatingTest,AdjacentDifferenceWithBinaryOp)526*9356374aSAndroid Build Coastguard Worker TEST_F(NumericMutatingTest, AdjacentDifferenceWithBinaryOp) {
527*9356374aSAndroid Build Coastguard Worker auto last = absl::c_adjacent_difference(list_, std::back_inserter(output_),
528*9356374aSAndroid Build Coastguard Worker std::multiplies<int>());
529*9356374aSAndroid Build Coastguard Worker *last = 1000;
530*9356374aSAndroid Build Coastguard Worker std::vector<int> expected{1, 2 * 1, 3 * 2, 1000};
531*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(output_, expected);
532*9356374aSAndroid Build Coastguard Worker }
533*9356374aSAndroid Build Coastguard Worker
TEST_F(NumericMutatingTest,PartialSum)534*9356374aSAndroid Build Coastguard Worker TEST_F(NumericMutatingTest, PartialSum) {
535*9356374aSAndroid Build Coastguard Worker auto last = absl::c_partial_sum(list_, std::back_inserter(output_));
536*9356374aSAndroid Build Coastguard Worker *last = 1000;
537*9356374aSAndroid Build Coastguard Worker std::vector<int> expected{1, 1 + 2, 1 + 2 + 3, 1000};
538*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(output_, expected);
539*9356374aSAndroid Build Coastguard Worker }
540*9356374aSAndroid Build Coastguard Worker
TEST_F(NumericMutatingTest,PartialSumWithBinaryOp)541*9356374aSAndroid Build Coastguard Worker TEST_F(NumericMutatingTest, PartialSumWithBinaryOp) {
542*9356374aSAndroid Build Coastguard Worker auto last = absl::c_partial_sum(list_, std::back_inserter(output_),
543*9356374aSAndroid Build Coastguard Worker std::multiplies<int>());
544*9356374aSAndroid Build Coastguard Worker *last = 1000;
545*9356374aSAndroid Build Coastguard Worker std::vector<int> expected{1, 1 * 2, 1 * 2 * 3, 1000};
546*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(output_, expected);
547*9356374aSAndroid Build Coastguard Worker }
548*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,LinearSearch)549*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, LinearSearch) {
550*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_linear_search(container_, 3));
551*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::c_linear_search(container_, 4));
552*9356374aSAndroid Build Coastguard Worker }
553*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,AllOf)554*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, AllOf) {
555*9356374aSAndroid Build Coastguard Worker const std::vector<int>& v = vector_;
556*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::c_all_of(v, [](int x) { return x > 1; }));
557*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_all_of(v, [](int x) { return x > 0; }));
558*9356374aSAndroid Build Coastguard Worker }
559*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,AnyOf)560*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, AnyOf) {
561*9356374aSAndroid Build Coastguard Worker const std::vector<int>& v = vector_;
562*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_any_of(v, [](int x) { return x > 2; }));
563*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::c_any_of(v, [](int x) { return x > 5; }));
564*9356374aSAndroid Build Coastguard Worker }
565*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,NoneOf)566*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, NoneOf) {
567*9356374aSAndroid Build Coastguard Worker const std::vector<int>& v = vector_;
568*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::c_none_of(v, [](int x) { return x > 2; }));
569*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_none_of(v, [](int x) { return x > 5; }));
570*9356374aSAndroid Build Coastguard Worker }
571*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,MinMaxElementLess)572*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, MinMaxElementLess) {
573*9356374aSAndroid Build Coastguard Worker std::pair<std::vector<int>::const_iterator, std::vector<int>::const_iterator>
574*9356374aSAndroid Build Coastguard Worker p = absl::c_minmax_element(vector_, std::less<int>());
575*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(p.first == vector_.begin());
576*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(p.second == vector_.begin() + 2);
577*9356374aSAndroid Build Coastguard Worker }
578*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,MinMaxElementGreater)579*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, MinMaxElementGreater) {
580*9356374aSAndroid Build Coastguard Worker std::pair<std::vector<int>::const_iterator, std::vector<int>::const_iterator>
581*9356374aSAndroid Build Coastguard Worker p = absl::c_minmax_element(vector_, std::greater<int>());
582*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(p.first == vector_.begin() + 2);
583*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(p.second == vector_.begin());
584*9356374aSAndroid Build Coastguard Worker }
585*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,MinMaxElementNoPredicate)586*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, MinMaxElementNoPredicate) {
587*9356374aSAndroid Build Coastguard Worker std::pair<std::vector<int>::const_iterator, std::vector<int>::const_iterator>
588*9356374aSAndroid Build Coastguard Worker p = absl::c_minmax_element(vector_);
589*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(p.first == vector_.begin());
590*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(p.second == vector_.begin() + 2);
591*9356374aSAndroid Build Coastguard Worker }
592*9356374aSAndroid Build Coastguard Worker
593*9356374aSAndroid Build Coastguard Worker class SortingTest : public testing::Test {
594*9356374aSAndroid Build Coastguard Worker protected:
595*9356374aSAndroid Build Coastguard Worker std::list<int> sorted_ = {1, 2, 3, 4};
596*9356374aSAndroid Build Coastguard Worker std::list<int> unsorted_ = {2, 4, 1, 3};
597*9356374aSAndroid Build Coastguard Worker std::list<int> reversed_ = {4, 3, 2, 1};
598*9356374aSAndroid Build Coastguard Worker };
599*9356374aSAndroid Build Coastguard Worker
TEST_F(SortingTest,IsSorted)600*9356374aSAndroid Build Coastguard Worker TEST_F(SortingTest, IsSorted) {
601*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_is_sorted(sorted_));
602*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::c_is_sorted(unsorted_));
603*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::c_is_sorted(reversed_));
604*9356374aSAndroid Build Coastguard Worker }
605*9356374aSAndroid Build Coastguard Worker
TEST_F(SortingTest,IsSortedWithPredicate)606*9356374aSAndroid Build Coastguard Worker TEST_F(SortingTest, IsSortedWithPredicate) {
607*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::c_is_sorted(sorted_, std::greater<int>()));
608*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::c_is_sorted(unsorted_, std::greater<int>()));
609*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_is_sorted(reversed_, std::greater<int>()));
610*9356374aSAndroid Build Coastguard Worker }
611*9356374aSAndroid Build Coastguard Worker
TEST_F(SortingTest,IsSortedUntil)612*9356374aSAndroid Build Coastguard Worker TEST_F(SortingTest, IsSortedUntil) {
613*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, *absl::c_is_sorted_until(unsorted_));
614*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(4, *absl::c_is_sorted_until(unsorted_, std::greater<int>()));
615*9356374aSAndroid Build Coastguard Worker }
616*9356374aSAndroid Build Coastguard Worker
TEST_F(SortingTest,NthElement)617*9356374aSAndroid Build Coastguard Worker TEST_F(SortingTest, NthElement) {
618*9356374aSAndroid Build Coastguard Worker std::vector<int> unsorted = {2, 4, 1, 3};
619*9356374aSAndroid Build Coastguard Worker absl::c_nth_element(unsorted, unsorted.begin() + 2);
620*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(unsorted, ElementsAre(Lt(3), Lt(3), 3, Gt(3)));
621*9356374aSAndroid Build Coastguard Worker absl::c_nth_element(unsorted, unsorted.begin() + 2, std::greater<int>());
622*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(unsorted, ElementsAre(Gt(2), Gt(2), 2, Lt(2)));
623*9356374aSAndroid Build Coastguard Worker }
624*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,IsPartitioned)625*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, IsPartitioned) {
626*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(
627*9356374aSAndroid Build Coastguard Worker absl::c_is_partitioned(std::vector<int>{1, 3, 5, 2, 4, 6}, IsOdd));
628*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(
629*9356374aSAndroid Build Coastguard Worker absl::c_is_partitioned(std::vector<int>{1, 2, 3, 4, 5, 6}, IsOdd));
630*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(
631*9356374aSAndroid Build Coastguard Worker absl::c_is_partitioned(std::vector<int>{2, 4, 6, 1, 3, 5}, IsOdd));
632*9356374aSAndroid Build Coastguard Worker }
633*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,Partition)634*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, Partition) {
635*9356374aSAndroid Build Coastguard Worker std::vector<int> actual = {1, 2, 3, 4, 5};
636*9356374aSAndroid Build Coastguard Worker absl::c_partition(actual, IsOdd);
637*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, Truly([](const std::vector<int>& c) {
638*9356374aSAndroid Build Coastguard Worker return absl::c_is_partitioned(c, IsOdd);
639*9356374aSAndroid Build Coastguard Worker }));
640*9356374aSAndroid Build Coastguard Worker }
641*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,StablePartition)642*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, StablePartition) {
643*9356374aSAndroid Build Coastguard Worker std::vector<int> actual = {1, 2, 3, 4, 5};
644*9356374aSAndroid Build Coastguard Worker absl::c_stable_partition(actual, IsOdd);
645*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, ElementsAre(1, 3, 5, 2, 4));
646*9356374aSAndroid Build Coastguard Worker }
647*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,PartitionCopy)648*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, PartitionCopy) {
649*9356374aSAndroid Build Coastguard Worker const std::vector<int> initial = {1, 2, 3, 4, 5};
650*9356374aSAndroid Build Coastguard Worker std::vector<int> odds, evens;
651*9356374aSAndroid Build Coastguard Worker auto ends = absl::c_partition_copy(initial, back_inserter(odds),
652*9356374aSAndroid Build Coastguard Worker back_inserter(evens), IsOdd);
653*9356374aSAndroid Build Coastguard Worker *ends.first = 7;
654*9356374aSAndroid Build Coastguard Worker *ends.second = 6;
655*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(odds, ElementsAre(1, 3, 5, 7));
656*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(evens, ElementsAre(2, 4, 6));
657*9356374aSAndroid Build Coastguard Worker }
658*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,PartitionPoint)659*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, PartitionPoint) {
660*9356374aSAndroid Build Coastguard Worker const std::vector<int> initial = {1, 3, 5, 2, 4};
661*9356374aSAndroid Build Coastguard Worker auto middle = absl::c_partition_point(initial, IsOdd);
662*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(2, *middle);
663*9356374aSAndroid Build Coastguard Worker }
664*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,CopyMiddle)665*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, CopyMiddle) {
666*9356374aSAndroid Build Coastguard Worker const std::vector<int> initial = {4, -1, -2, -3, 5};
667*9356374aSAndroid Build Coastguard Worker const std::list<int> input = {1, 2, 3};
668*9356374aSAndroid Build Coastguard Worker const std::vector<int> expected = {4, 1, 2, 3, 5};
669*9356374aSAndroid Build Coastguard Worker
670*9356374aSAndroid Build Coastguard Worker std::list<int> test_list(initial.begin(), initial.end());
671*9356374aSAndroid Build Coastguard Worker absl::c_copy(input, ++test_list.begin());
672*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(std::list<int>(expected.begin(), expected.end()), test_list);
673*9356374aSAndroid Build Coastguard Worker
674*9356374aSAndroid Build Coastguard Worker std::vector<int> test_vector = initial;
675*9356374aSAndroid Build Coastguard Worker absl::c_copy(input, test_vector.begin() + 1);
676*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(expected, test_vector);
677*9356374aSAndroid Build Coastguard Worker }
678*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,CopyFrontInserter)679*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, CopyFrontInserter) {
680*9356374aSAndroid Build Coastguard Worker const std::list<int> initial = {4, 5};
681*9356374aSAndroid Build Coastguard Worker const std::list<int> input = {1, 2, 3};
682*9356374aSAndroid Build Coastguard Worker const std::list<int> expected = {3, 2, 1, 4, 5};
683*9356374aSAndroid Build Coastguard Worker
684*9356374aSAndroid Build Coastguard Worker std::list<int> test_list = initial;
685*9356374aSAndroid Build Coastguard Worker absl::c_copy(input, std::front_inserter(test_list));
686*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(expected, test_list);
687*9356374aSAndroid Build Coastguard Worker }
688*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,CopyBackInserter)689*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, CopyBackInserter) {
690*9356374aSAndroid Build Coastguard Worker const std::vector<int> initial = {4, 5};
691*9356374aSAndroid Build Coastguard Worker const std::list<int> input = {1, 2, 3};
692*9356374aSAndroid Build Coastguard Worker const std::vector<int> expected = {4, 5, 1, 2, 3};
693*9356374aSAndroid Build Coastguard Worker
694*9356374aSAndroid Build Coastguard Worker std::list<int> test_list(initial.begin(), initial.end());
695*9356374aSAndroid Build Coastguard Worker absl::c_copy(input, std::back_inserter(test_list));
696*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(std::list<int>(expected.begin(), expected.end()), test_list);
697*9356374aSAndroid Build Coastguard Worker
698*9356374aSAndroid Build Coastguard Worker std::vector<int> test_vector = initial;
699*9356374aSAndroid Build Coastguard Worker absl::c_copy(input, std::back_inserter(test_vector));
700*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(expected, test_vector);
701*9356374aSAndroid Build Coastguard Worker }
702*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,CopyN)703*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, CopyN) {
704*9356374aSAndroid Build Coastguard Worker const std::vector<int> initial = {1, 2, 3, 4, 5};
705*9356374aSAndroid Build Coastguard Worker const std::vector<int> expected = {1, 2};
706*9356374aSAndroid Build Coastguard Worker std::vector<int> actual;
707*9356374aSAndroid Build Coastguard Worker absl::c_copy_n(initial, 2, back_inserter(actual));
708*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(expected, actual);
709*9356374aSAndroid Build Coastguard Worker }
710*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,CopyIf)711*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, CopyIf) {
712*9356374aSAndroid Build Coastguard Worker const std::list<int> input = {1, 2, 3};
713*9356374aSAndroid Build Coastguard Worker std::vector<int> output;
714*9356374aSAndroid Build Coastguard Worker absl::c_copy_if(input, std::back_inserter(output),
715*9356374aSAndroid Build Coastguard Worker [](int i) { return i != 2; });
716*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(output, ElementsAre(1, 3));
717*9356374aSAndroid Build Coastguard Worker }
718*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,CopyBackward)719*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, CopyBackward) {
720*9356374aSAndroid Build Coastguard Worker std::vector<int> actual = {1, 2, 3, 4, 5};
721*9356374aSAndroid Build Coastguard Worker std::vector<int> expected = {1, 2, 1, 2, 3};
722*9356374aSAndroid Build Coastguard Worker absl::c_copy_backward(absl::MakeSpan(actual.data(), 3), actual.end());
723*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(expected, actual);
724*9356374aSAndroid Build Coastguard Worker }
725*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,Move)726*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, Move) {
727*9356374aSAndroid Build Coastguard Worker std::vector<std::unique_ptr<int>> src;
728*9356374aSAndroid Build Coastguard Worker src.emplace_back(absl::make_unique<int>(1));
729*9356374aSAndroid Build Coastguard Worker src.emplace_back(absl::make_unique<int>(2));
730*9356374aSAndroid Build Coastguard Worker src.emplace_back(absl::make_unique<int>(3));
731*9356374aSAndroid Build Coastguard Worker src.emplace_back(absl::make_unique<int>(4));
732*9356374aSAndroid Build Coastguard Worker src.emplace_back(absl::make_unique<int>(5));
733*9356374aSAndroid Build Coastguard Worker
734*9356374aSAndroid Build Coastguard Worker std::vector<std::unique_ptr<int>> dest = {};
735*9356374aSAndroid Build Coastguard Worker absl::c_move(src, std::back_inserter(dest));
736*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(src, Each(IsNull()));
737*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(dest, ElementsAre(Pointee(1), Pointee(2), Pointee(3), Pointee(4),
738*9356374aSAndroid Build Coastguard Worker Pointee(5)));
739*9356374aSAndroid Build Coastguard Worker }
740*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,MoveBackward)741*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, MoveBackward) {
742*9356374aSAndroid Build Coastguard Worker std::vector<std::unique_ptr<int>> actual;
743*9356374aSAndroid Build Coastguard Worker actual.emplace_back(absl::make_unique<int>(1));
744*9356374aSAndroid Build Coastguard Worker actual.emplace_back(absl::make_unique<int>(2));
745*9356374aSAndroid Build Coastguard Worker actual.emplace_back(absl::make_unique<int>(3));
746*9356374aSAndroid Build Coastguard Worker actual.emplace_back(absl::make_unique<int>(4));
747*9356374aSAndroid Build Coastguard Worker actual.emplace_back(absl::make_unique<int>(5));
748*9356374aSAndroid Build Coastguard Worker auto subrange = absl::MakeSpan(actual.data(), 3);
749*9356374aSAndroid Build Coastguard Worker absl::c_move_backward(subrange, actual.end());
750*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, ElementsAre(IsNull(), IsNull(), Pointee(1), Pointee(2),
751*9356374aSAndroid Build Coastguard Worker Pointee(3)));
752*9356374aSAndroid Build Coastguard Worker }
753*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,MoveWithRvalue)754*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, MoveWithRvalue) {
755*9356374aSAndroid Build Coastguard Worker auto MakeRValueSrc = [] {
756*9356374aSAndroid Build Coastguard Worker std::vector<std::unique_ptr<int>> src;
757*9356374aSAndroid Build Coastguard Worker src.emplace_back(absl::make_unique<int>(1));
758*9356374aSAndroid Build Coastguard Worker src.emplace_back(absl::make_unique<int>(2));
759*9356374aSAndroid Build Coastguard Worker src.emplace_back(absl::make_unique<int>(3));
760*9356374aSAndroid Build Coastguard Worker return src;
761*9356374aSAndroid Build Coastguard Worker };
762*9356374aSAndroid Build Coastguard Worker
763*9356374aSAndroid Build Coastguard Worker std::vector<std::unique_ptr<int>> dest = MakeRValueSrc();
764*9356374aSAndroid Build Coastguard Worker absl::c_move(MakeRValueSrc(), std::back_inserter(dest));
765*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(dest, ElementsAre(Pointee(1), Pointee(2), Pointee(3), Pointee(1),
766*9356374aSAndroid Build Coastguard Worker Pointee(2), Pointee(3)));
767*9356374aSAndroid Build Coastguard Worker }
768*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,SwapRanges)769*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, SwapRanges) {
770*9356374aSAndroid Build Coastguard Worker std::vector<int> odds = {2, 4, 6};
771*9356374aSAndroid Build Coastguard Worker std::vector<int> evens = {1, 3, 5};
772*9356374aSAndroid Build Coastguard Worker absl::c_swap_ranges(odds, evens);
773*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(odds, ElementsAre(1, 3, 5));
774*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(evens, ElementsAre(2, 4, 6));
775*9356374aSAndroid Build Coastguard Worker
776*9356374aSAndroid Build Coastguard Worker odds.pop_back();
777*9356374aSAndroid Build Coastguard Worker absl::c_swap_ranges(odds, evens);
778*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(odds, ElementsAre(2, 4));
779*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(evens, ElementsAre(1, 3, 6));
780*9356374aSAndroid Build Coastguard Worker
781*9356374aSAndroid Build Coastguard Worker absl::c_swap_ranges(evens, odds);
782*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(odds, ElementsAre(1, 3));
783*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(evens, ElementsAre(2, 4, 6));
784*9356374aSAndroid Build Coastguard Worker }
785*9356374aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,Transform)786*9356374aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, Transform) {
787*9356374aSAndroid Build Coastguard Worker std::vector<int> x{0, 2, 4}, y, z;
788*9356374aSAndroid Build Coastguard Worker auto end = absl::c_transform(x, back_inserter(y), std::negate<int>());
789*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(std::vector<int>({0, -2, -4}), y);
790*9356374aSAndroid Build Coastguard Worker *end = 7;
791*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(std::vector<int>({0, -2, -4, 7}), y);
792*9356374aSAndroid Build Coastguard Worker
793*9356374aSAndroid Build Coastguard Worker y = {1, 3, 0};
794*9356374aSAndroid Build Coastguard Worker end = absl::c_transform(x, y, back_inserter(z), std::plus<int>());
795*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(std::vector<int>({1, 5, 4}), z);
796*9356374aSAndroid Build Coastguard Worker *end = 7;
797*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(std::vector<int>({1, 5, 4, 7}), z);
798*9356374aSAndroid Build Coastguard Worker
799*9356374aSAndroid Build Coastguard Worker z.clear();
800*9356374aSAndroid Build Coastguard Worker y.pop_back();
801*9356374aSAndroid Build Coastguard Worker end = absl::c_transform(x, y, std::back_inserter(z), std::plus<int>());
802*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(std::vector<int>({1, 5}), z);
803*9356374aSAndroid Build Coastguard Worker *end = 7;
804*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(std::vector<int>({1, 5, 7}), z);
805*9356374aSAndroid Build Coastguard Worker
806*9356374aSAndroid Build Coastguard Worker z.clear();
807*9356374aSAndroid Build Coastguard Worker std::swap(x, y);
808*9356374aSAndroid Build Coastguard Worker end = absl::c_transform(x, y, std::back_inserter(z), std::plus<int>());
809*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(std::vector<int>({1, 5}), z);
810*9356374aSAndroid Build Coastguard Worker *end = 7;
811*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(std::vector<int>({1, 5, 7}), z);
812*9356374aSAndroid Build Coastguard Worker }
813*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,Replace)814*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, Replace) {
815*9356374aSAndroid Build Coastguard Worker const std::vector<int> initial = {1, 2, 3, 1, 4, 5};
816*9356374aSAndroid Build Coastguard Worker const std::vector<int> expected = {4, 2, 3, 4, 4, 5};
817*9356374aSAndroid Build Coastguard Worker
818*9356374aSAndroid Build Coastguard Worker std::vector<int> test_vector = initial;
819*9356374aSAndroid Build Coastguard Worker absl::c_replace(test_vector, 1, 4);
820*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(expected, test_vector);
821*9356374aSAndroid Build Coastguard Worker
822*9356374aSAndroid Build Coastguard Worker std::list<int> test_list(initial.begin(), initial.end());
823*9356374aSAndroid Build Coastguard Worker absl::c_replace(test_list, 1, 4);
824*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(std::list<int>(expected.begin(), expected.end()), test_list);
825*9356374aSAndroid Build Coastguard Worker }
826*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,ReplaceIf)827*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, ReplaceIf) {
828*9356374aSAndroid Build Coastguard Worker std::vector<int> actual = {1, 2, 3, 4, 5};
829*9356374aSAndroid Build Coastguard Worker const std::vector<int> expected = {0, 2, 0, 4, 0};
830*9356374aSAndroid Build Coastguard Worker
831*9356374aSAndroid Build Coastguard Worker absl::c_replace_if(actual, IsOdd, 0);
832*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(expected, actual);
833*9356374aSAndroid Build Coastguard Worker }
834*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,ReplaceCopy)835*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, ReplaceCopy) {
836*9356374aSAndroid Build Coastguard Worker const std::vector<int> initial = {1, 2, 3, 1, 4, 5};
837*9356374aSAndroid Build Coastguard Worker const std::vector<int> expected = {4, 2, 3, 4, 4, 5};
838*9356374aSAndroid Build Coastguard Worker
839*9356374aSAndroid Build Coastguard Worker std::vector<int> actual;
840*9356374aSAndroid Build Coastguard Worker absl::c_replace_copy(initial, back_inserter(actual), 1, 4);
841*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(expected, actual);
842*9356374aSAndroid Build Coastguard Worker }
843*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,Sort)844*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, Sort) {
845*9356374aSAndroid Build Coastguard Worker std::vector<int> test_vector = {2, 3, 1, 4};
846*9356374aSAndroid Build Coastguard Worker absl::c_sort(test_vector);
847*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(test_vector, ElementsAre(1, 2, 3, 4));
848*9356374aSAndroid Build Coastguard Worker }
849*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,SortWithPredicate)850*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, SortWithPredicate) {
851*9356374aSAndroid Build Coastguard Worker std::vector<int> test_vector = {2, 3, 1, 4};
852*9356374aSAndroid Build Coastguard Worker absl::c_sort(test_vector, std::greater<int>());
853*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(test_vector, ElementsAre(4, 3, 2, 1));
854*9356374aSAndroid Build Coastguard Worker }
855*9356374aSAndroid Build Coastguard Worker
856*9356374aSAndroid Build Coastguard Worker // For absl::c_stable_sort tests. Needs an operator< that does not cover all
857*9356374aSAndroid Build Coastguard Worker // fields so that the test can check the sort preserves order of equal elements.
858*9356374aSAndroid Build Coastguard Worker struct Element {
859*9356374aSAndroid Build Coastguard Worker int key;
860*9356374aSAndroid Build Coastguard Worker int value;
operator <(const Element & e1,const Element & e2)861*9356374aSAndroid Build Coastguard Worker friend bool operator<(const Element& e1, const Element& e2) {
862*9356374aSAndroid Build Coastguard Worker return e1.key < e2.key;
863*9356374aSAndroid Build Coastguard Worker }
864*9356374aSAndroid Build Coastguard Worker // Make gmock print useful diagnostics.
operator <<(std::ostream & o,const Element & e)865*9356374aSAndroid Build Coastguard Worker friend std::ostream& operator<<(std::ostream& o, const Element& e) {
866*9356374aSAndroid Build Coastguard Worker return o << "{" << e.key << ", " << e.value << "}";
867*9356374aSAndroid Build Coastguard Worker }
868*9356374aSAndroid Build Coastguard Worker };
869*9356374aSAndroid Build Coastguard Worker
870*9356374aSAndroid Build Coastguard Worker MATCHER_P2(IsElement, key, value, "") {
871*9356374aSAndroid Build Coastguard Worker return arg.key == key && arg.value == value;
872*9356374aSAndroid Build Coastguard Worker }
873*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,StableSort)874*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, StableSort) {
875*9356374aSAndroid Build Coastguard Worker std::vector<Element> test_vector = {{1, 1}, {2, 1}, {2, 0}, {1, 0}, {2, 2}};
876*9356374aSAndroid Build Coastguard Worker absl::c_stable_sort(test_vector);
877*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(test_vector,
878*9356374aSAndroid Build Coastguard Worker ElementsAre(IsElement(1, 1), IsElement(1, 0), IsElement(2, 1),
879*9356374aSAndroid Build Coastguard Worker IsElement(2, 0), IsElement(2, 2)));
880*9356374aSAndroid Build Coastguard Worker }
881*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,StableSortWithPredicate)882*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, StableSortWithPredicate) {
883*9356374aSAndroid Build Coastguard Worker std::vector<Element> test_vector = {{1, 1}, {2, 1}, {2, 0}, {1, 0}, {2, 2}};
884*9356374aSAndroid Build Coastguard Worker absl::c_stable_sort(test_vector, [](const Element& e1, const Element& e2) {
885*9356374aSAndroid Build Coastguard Worker return e2 < e1;
886*9356374aSAndroid Build Coastguard Worker });
887*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(test_vector,
888*9356374aSAndroid Build Coastguard Worker ElementsAre(IsElement(2, 1), IsElement(2, 0), IsElement(2, 2),
889*9356374aSAndroid Build Coastguard Worker IsElement(1, 1), IsElement(1, 0)));
890*9356374aSAndroid Build Coastguard Worker }
891*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,ReplaceCopyIf)892*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, ReplaceCopyIf) {
893*9356374aSAndroid Build Coastguard Worker const std::vector<int> initial = {1, 2, 3, 4, 5};
894*9356374aSAndroid Build Coastguard Worker const std::vector<int> expected = {0, 2, 0, 4, 0};
895*9356374aSAndroid Build Coastguard Worker
896*9356374aSAndroid Build Coastguard Worker std::vector<int> actual;
897*9356374aSAndroid Build Coastguard Worker absl::c_replace_copy_if(initial, back_inserter(actual), IsOdd, 0);
898*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(expected, actual);
899*9356374aSAndroid Build Coastguard Worker }
900*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,Fill)901*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, Fill) {
902*9356374aSAndroid Build Coastguard Worker std::vector<int> actual(5);
903*9356374aSAndroid Build Coastguard Worker absl::c_fill(actual, 1);
904*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, ElementsAre(1, 1, 1, 1, 1));
905*9356374aSAndroid Build Coastguard Worker }
906*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,FillN)907*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, FillN) {
908*9356374aSAndroid Build Coastguard Worker std::vector<int> actual(5, 0);
909*9356374aSAndroid Build Coastguard Worker absl::c_fill_n(actual, 2, 1);
910*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, ElementsAre(1, 1, 0, 0, 0));
911*9356374aSAndroid Build Coastguard Worker }
912*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,Generate)913*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, Generate) {
914*9356374aSAndroid Build Coastguard Worker std::vector<int> actual(5);
915*9356374aSAndroid Build Coastguard Worker int x = 0;
916*9356374aSAndroid Build Coastguard Worker absl::c_generate(actual, [&x]() { return ++x; });
917*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, ElementsAre(1, 2, 3, 4, 5));
918*9356374aSAndroid Build Coastguard Worker }
919*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,GenerateN)920*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, GenerateN) {
921*9356374aSAndroid Build Coastguard Worker std::vector<int> actual(5, 0);
922*9356374aSAndroid Build Coastguard Worker int x = 0;
923*9356374aSAndroid Build Coastguard Worker absl::c_generate_n(actual, 3, [&x]() { return ++x; });
924*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, ElementsAre(1, 2, 3, 0, 0));
925*9356374aSAndroid Build Coastguard Worker }
926*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,RemoveCopy)927*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, RemoveCopy) {
928*9356374aSAndroid Build Coastguard Worker std::vector<int> actual;
929*9356374aSAndroid Build Coastguard Worker absl::c_remove_copy(std::vector<int>{1, 2, 3}, back_inserter(actual), 2);
930*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, ElementsAre(1, 3));
931*9356374aSAndroid Build Coastguard Worker }
932*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,RemoveCopyIf)933*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, RemoveCopyIf) {
934*9356374aSAndroid Build Coastguard Worker std::vector<int> actual;
935*9356374aSAndroid Build Coastguard Worker absl::c_remove_copy_if(std::vector<int>{1, 2, 3}, back_inserter(actual),
936*9356374aSAndroid Build Coastguard Worker IsOdd);
937*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, ElementsAre(2));
938*9356374aSAndroid Build Coastguard Worker }
939*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,UniqueCopy)940*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, UniqueCopy) {
941*9356374aSAndroid Build Coastguard Worker std::vector<int> actual;
942*9356374aSAndroid Build Coastguard Worker absl::c_unique_copy(std::vector<int>{1, 2, 2, 2, 3, 3, 2},
943*9356374aSAndroid Build Coastguard Worker back_inserter(actual));
944*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, ElementsAre(1, 2, 3, 2));
945*9356374aSAndroid Build Coastguard Worker }
946*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,UniqueCopyWithPredicate)947*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, UniqueCopyWithPredicate) {
948*9356374aSAndroid Build Coastguard Worker std::vector<int> actual;
949*9356374aSAndroid Build Coastguard Worker absl::c_unique_copy(std::vector<int>{1, 2, 3, -1, -2, -3, 1},
950*9356374aSAndroid Build Coastguard Worker back_inserter(actual),
951*9356374aSAndroid Build Coastguard Worker [](int x, int y) { return (x < 0) == (y < 0); });
952*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, ElementsAre(1, -1, 1));
953*9356374aSAndroid Build Coastguard Worker }
954*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,Reverse)955*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, Reverse) {
956*9356374aSAndroid Build Coastguard Worker std::vector<int> test_vector = {1, 2, 3, 4};
957*9356374aSAndroid Build Coastguard Worker absl::c_reverse(test_vector);
958*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(test_vector, ElementsAre(4, 3, 2, 1));
959*9356374aSAndroid Build Coastguard Worker
960*9356374aSAndroid Build Coastguard Worker std::list<int> test_list = {1, 2, 3, 4};
961*9356374aSAndroid Build Coastguard Worker absl::c_reverse(test_list);
962*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(test_list, ElementsAre(4, 3, 2, 1));
963*9356374aSAndroid Build Coastguard Worker }
964*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,ReverseCopy)965*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, ReverseCopy) {
966*9356374aSAndroid Build Coastguard Worker std::vector<int> actual;
967*9356374aSAndroid Build Coastguard Worker absl::c_reverse_copy(std::vector<int>{1, 2, 3, 4}, back_inserter(actual));
968*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, ElementsAre(4, 3, 2, 1));
969*9356374aSAndroid Build Coastguard Worker }
970*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,Rotate)971*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, Rotate) {
972*9356374aSAndroid Build Coastguard Worker std::vector<int> actual = {1, 2, 3, 4};
973*9356374aSAndroid Build Coastguard Worker auto it = absl::c_rotate(actual, actual.begin() + 2);
974*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, testing::ElementsAreArray({3, 4, 1, 2}));
975*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(*it, 1);
976*9356374aSAndroid Build Coastguard Worker }
977*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,RotateCopy)978*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, RotateCopy) {
979*9356374aSAndroid Build Coastguard Worker std::vector<int> initial = {1, 2, 3, 4};
980*9356374aSAndroid Build Coastguard Worker std::vector<int> actual;
981*9356374aSAndroid Build Coastguard Worker auto end =
982*9356374aSAndroid Build Coastguard Worker absl::c_rotate_copy(initial, initial.begin() + 2, back_inserter(actual));
983*9356374aSAndroid Build Coastguard Worker *end = 5;
984*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, ElementsAre(3, 4, 1, 2, 5));
985*9356374aSAndroid Build Coastguard Worker }
986*9356374aSAndroid Build Coastguard Worker
987*9356374aSAndroid Build Coastguard Worker template <typename T>
RandomlySeededPrng()988*9356374aSAndroid Build Coastguard Worker T RandomlySeededPrng() {
989*9356374aSAndroid Build Coastguard Worker std::random_device rdev;
990*9356374aSAndroid Build Coastguard Worker std::seed_seq::result_type data[T::state_size];
991*9356374aSAndroid Build Coastguard Worker std::generate_n(data, T::state_size, std::ref(rdev));
992*9356374aSAndroid Build Coastguard Worker std::seed_seq prng_seed(data, data + T::state_size);
993*9356374aSAndroid Build Coastguard Worker return T(prng_seed);
994*9356374aSAndroid Build Coastguard Worker }
995*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,Shuffle)996*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, Shuffle) {
997*9356374aSAndroid Build Coastguard Worker std::vector<int> actual = {1, 2, 3, 4, 5};
998*9356374aSAndroid Build Coastguard Worker absl::c_shuffle(actual, RandomlySeededPrng<std::mt19937_64>());
999*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, UnorderedElementsAre(1, 2, 3, 4, 5));
1000*9356374aSAndroid Build Coastguard Worker }
1001*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,Sample)1002*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, Sample) {
1003*9356374aSAndroid Build Coastguard Worker std::vector<int> actual;
1004*9356374aSAndroid Build Coastguard Worker absl::c_sample(std::vector<int>{1, 2, 3, 4, 5}, std::back_inserter(actual), 3,
1005*9356374aSAndroid Build Coastguard Worker RandomlySeededPrng<std::mt19937_64>());
1006*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, IsSubsetOf({1, 2, 3, 4, 5}));
1007*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, SizeIs(3));
1008*9356374aSAndroid Build Coastguard Worker }
1009*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,PartialSort)1010*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, PartialSort) {
1011*9356374aSAndroid Build Coastguard Worker std::vector<int> sequence{5, 3, 42, 0};
1012*9356374aSAndroid Build Coastguard Worker absl::c_partial_sort(sequence, sequence.begin() + 2);
1013*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(absl::MakeSpan(sequence.data(), 2), ElementsAre(0, 3));
1014*9356374aSAndroid Build Coastguard Worker absl::c_partial_sort(sequence, sequence.begin() + 2, std::greater<int>());
1015*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(absl::MakeSpan(sequence.data(), 2), ElementsAre(42, 5));
1016*9356374aSAndroid Build Coastguard Worker }
1017*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,PartialSortCopy)1018*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, PartialSortCopy) {
1019*9356374aSAndroid Build Coastguard Worker const std::vector<int> initial = {5, 3, 42, 0};
1020*9356374aSAndroid Build Coastguard Worker std::vector<int> actual(2);
1021*9356374aSAndroid Build Coastguard Worker absl::c_partial_sort_copy(initial, actual);
1022*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, ElementsAre(0, 3));
1023*9356374aSAndroid Build Coastguard Worker absl::c_partial_sort_copy(initial, actual, std::greater<int>());
1024*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, ElementsAre(42, 5));
1025*9356374aSAndroid Build Coastguard Worker }
1026*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,Merge)1027*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, Merge) {
1028*9356374aSAndroid Build Coastguard Worker std::vector<int> actual;
1029*9356374aSAndroid Build Coastguard Worker absl::c_merge(std::vector<int>{1, 3, 5}, std::vector<int>{2, 4},
1030*9356374aSAndroid Build Coastguard Worker back_inserter(actual));
1031*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, ElementsAre(1, 2, 3, 4, 5));
1032*9356374aSAndroid Build Coastguard Worker }
1033*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,MergeWithComparator)1034*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, MergeWithComparator) {
1035*9356374aSAndroid Build Coastguard Worker std::vector<int> actual;
1036*9356374aSAndroid Build Coastguard Worker absl::c_merge(std::vector<int>{5, 3, 1}, std::vector<int>{4, 2},
1037*9356374aSAndroid Build Coastguard Worker back_inserter(actual), std::greater<int>());
1038*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, ElementsAre(5, 4, 3, 2, 1));
1039*9356374aSAndroid Build Coastguard Worker }
1040*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,InplaceMerge)1041*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, InplaceMerge) {
1042*9356374aSAndroid Build Coastguard Worker std::vector<int> actual = {1, 3, 5, 2, 4};
1043*9356374aSAndroid Build Coastguard Worker absl::c_inplace_merge(actual, actual.begin() + 3);
1044*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, ElementsAre(1, 2, 3, 4, 5));
1045*9356374aSAndroid Build Coastguard Worker }
1046*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,InplaceMergeWithComparator)1047*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, InplaceMergeWithComparator) {
1048*9356374aSAndroid Build Coastguard Worker std::vector<int> actual = {5, 3, 1, 4, 2};
1049*9356374aSAndroid Build Coastguard Worker absl::c_inplace_merge(actual, actual.begin() + 3, std::greater<int>());
1050*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, ElementsAre(5, 4, 3, 2, 1));
1051*9356374aSAndroid Build Coastguard Worker }
1052*9356374aSAndroid Build Coastguard Worker
1053*9356374aSAndroid Build Coastguard Worker class SetOperationsTest : public testing::Test {
1054*9356374aSAndroid Build Coastguard Worker protected:
1055*9356374aSAndroid Build Coastguard Worker std::vector<int> a_ = {1, 2, 3};
1056*9356374aSAndroid Build Coastguard Worker std::vector<int> b_ = {1, 3, 5};
1057*9356374aSAndroid Build Coastguard Worker
1058*9356374aSAndroid Build Coastguard Worker std::vector<int> a_reversed_ = {3, 2, 1};
1059*9356374aSAndroid Build Coastguard Worker std::vector<int> b_reversed_ = {5, 3, 1};
1060*9356374aSAndroid Build Coastguard Worker };
1061*9356374aSAndroid Build Coastguard Worker
TEST_F(SetOperationsTest,SetUnion)1062*9356374aSAndroid Build Coastguard Worker TEST_F(SetOperationsTest, SetUnion) {
1063*9356374aSAndroid Build Coastguard Worker std::vector<int> actual;
1064*9356374aSAndroid Build Coastguard Worker absl::c_set_union(a_, b_, back_inserter(actual));
1065*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, ElementsAre(1, 2, 3, 5));
1066*9356374aSAndroid Build Coastguard Worker }
1067*9356374aSAndroid Build Coastguard Worker
TEST_F(SetOperationsTest,SetUnionWithComparator)1068*9356374aSAndroid Build Coastguard Worker TEST_F(SetOperationsTest, SetUnionWithComparator) {
1069*9356374aSAndroid Build Coastguard Worker std::vector<int> actual;
1070*9356374aSAndroid Build Coastguard Worker absl::c_set_union(a_reversed_, b_reversed_, back_inserter(actual),
1071*9356374aSAndroid Build Coastguard Worker std::greater<int>());
1072*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, ElementsAre(5, 3, 2, 1));
1073*9356374aSAndroid Build Coastguard Worker }
1074*9356374aSAndroid Build Coastguard Worker
TEST_F(SetOperationsTest,SetIntersection)1075*9356374aSAndroid Build Coastguard Worker TEST_F(SetOperationsTest, SetIntersection) {
1076*9356374aSAndroid Build Coastguard Worker std::vector<int> actual;
1077*9356374aSAndroid Build Coastguard Worker absl::c_set_intersection(a_, b_, back_inserter(actual));
1078*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, ElementsAre(1, 3));
1079*9356374aSAndroid Build Coastguard Worker }
1080*9356374aSAndroid Build Coastguard Worker
TEST_F(SetOperationsTest,SetIntersectionWithComparator)1081*9356374aSAndroid Build Coastguard Worker TEST_F(SetOperationsTest, SetIntersectionWithComparator) {
1082*9356374aSAndroid Build Coastguard Worker std::vector<int> actual;
1083*9356374aSAndroid Build Coastguard Worker absl::c_set_intersection(a_reversed_, b_reversed_, back_inserter(actual),
1084*9356374aSAndroid Build Coastguard Worker std::greater<int>());
1085*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, ElementsAre(3, 1));
1086*9356374aSAndroid Build Coastguard Worker }
1087*9356374aSAndroid Build Coastguard Worker
TEST_F(SetOperationsTest,SetDifference)1088*9356374aSAndroid Build Coastguard Worker TEST_F(SetOperationsTest, SetDifference) {
1089*9356374aSAndroid Build Coastguard Worker std::vector<int> actual;
1090*9356374aSAndroid Build Coastguard Worker absl::c_set_difference(a_, b_, back_inserter(actual));
1091*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, ElementsAre(2));
1092*9356374aSAndroid Build Coastguard Worker }
1093*9356374aSAndroid Build Coastguard Worker
TEST_F(SetOperationsTest,SetDifferenceWithComparator)1094*9356374aSAndroid Build Coastguard Worker TEST_F(SetOperationsTest, SetDifferenceWithComparator) {
1095*9356374aSAndroid Build Coastguard Worker std::vector<int> actual;
1096*9356374aSAndroid Build Coastguard Worker absl::c_set_difference(a_reversed_, b_reversed_, back_inserter(actual),
1097*9356374aSAndroid Build Coastguard Worker std::greater<int>());
1098*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, ElementsAre(2));
1099*9356374aSAndroid Build Coastguard Worker }
1100*9356374aSAndroid Build Coastguard Worker
TEST_F(SetOperationsTest,SetSymmetricDifference)1101*9356374aSAndroid Build Coastguard Worker TEST_F(SetOperationsTest, SetSymmetricDifference) {
1102*9356374aSAndroid Build Coastguard Worker std::vector<int> actual;
1103*9356374aSAndroid Build Coastguard Worker absl::c_set_symmetric_difference(a_, b_, back_inserter(actual));
1104*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, ElementsAre(2, 5));
1105*9356374aSAndroid Build Coastguard Worker }
1106*9356374aSAndroid Build Coastguard Worker
TEST_F(SetOperationsTest,SetSymmetricDifferenceWithComparator)1107*9356374aSAndroid Build Coastguard Worker TEST_F(SetOperationsTest, SetSymmetricDifferenceWithComparator) {
1108*9356374aSAndroid Build Coastguard Worker std::vector<int> actual;
1109*9356374aSAndroid Build Coastguard Worker absl::c_set_symmetric_difference(a_reversed_, b_reversed_,
1110*9356374aSAndroid Build Coastguard Worker back_inserter(actual), std::greater<int>());
1111*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(actual, ElementsAre(5, 2));
1112*9356374aSAndroid Build Coastguard Worker }
1113*9356374aSAndroid Build Coastguard Worker
TEST(HeapOperationsTest,WithoutComparator)1114*9356374aSAndroid Build Coastguard Worker TEST(HeapOperationsTest, WithoutComparator) {
1115*9356374aSAndroid Build Coastguard Worker std::vector<int> heap = {1, 2, 3};
1116*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::c_is_heap(heap));
1117*9356374aSAndroid Build Coastguard Worker absl::c_make_heap(heap);
1118*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_is_heap(heap));
1119*9356374aSAndroid Build Coastguard Worker heap.push_back(4);
1120*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(3, absl::c_is_heap_until(heap) - heap.begin());
1121*9356374aSAndroid Build Coastguard Worker absl::c_push_heap(heap);
1122*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(4, heap[0]);
1123*9356374aSAndroid Build Coastguard Worker absl::c_pop_heap(heap);
1124*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(4, heap[3]);
1125*9356374aSAndroid Build Coastguard Worker absl::c_make_heap(heap);
1126*9356374aSAndroid Build Coastguard Worker absl::c_sort_heap(heap);
1127*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(heap, ElementsAre(1, 2, 3, 4));
1128*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::c_is_heap(heap));
1129*9356374aSAndroid Build Coastguard Worker }
1130*9356374aSAndroid Build Coastguard Worker
TEST(HeapOperationsTest,WithComparator)1131*9356374aSAndroid Build Coastguard Worker TEST(HeapOperationsTest, WithComparator) {
1132*9356374aSAndroid Build Coastguard Worker using greater = std::greater<int>;
1133*9356374aSAndroid Build Coastguard Worker std::vector<int> heap = {3, 2, 1};
1134*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::c_is_heap(heap, greater()));
1135*9356374aSAndroid Build Coastguard Worker absl::c_make_heap(heap, greater());
1136*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_is_heap(heap, greater()));
1137*9356374aSAndroid Build Coastguard Worker heap.push_back(0);
1138*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(3, absl::c_is_heap_until(heap, greater()) - heap.begin());
1139*9356374aSAndroid Build Coastguard Worker absl::c_push_heap(heap, greater());
1140*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(0, heap[0]);
1141*9356374aSAndroid Build Coastguard Worker absl::c_pop_heap(heap, greater());
1142*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(0, heap[3]);
1143*9356374aSAndroid Build Coastguard Worker absl::c_make_heap(heap, greater());
1144*9356374aSAndroid Build Coastguard Worker absl::c_sort_heap(heap, greater());
1145*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(heap, ElementsAre(3, 2, 1, 0));
1146*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::c_is_heap(heap, greater()));
1147*9356374aSAndroid Build Coastguard Worker }
1148*9356374aSAndroid Build Coastguard Worker
TEST(MutatingTest,PermutationOperations)1149*9356374aSAndroid Build Coastguard Worker TEST(MutatingTest, PermutationOperations) {
1150*9356374aSAndroid Build Coastguard Worker std::vector<int> initial = {1, 2, 3, 4};
1151*9356374aSAndroid Build Coastguard Worker std::vector<int> permuted = initial;
1152*9356374aSAndroid Build Coastguard Worker
1153*9356374aSAndroid Build Coastguard Worker absl::c_next_permutation(permuted);
1154*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_is_permutation(initial, permuted));
1155*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::c_is_permutation(initial, permuted, std::equal_to<int>()));
1156*9356374aSAndroid Build Coastguard Worker
1157*9356374aSAndroid Build Coastguard Worker std::vector<int> permuted2 = initial;
1158*9356374aSAndroid Build Coastguard Worker absl::c_prev_permutation(permuted2, std::greater<int>());
1159*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(permuted, permuted2);
1160*9356374aSAndroid Build Coastguard Worker
1161*9356374aSAndroid Build Coastguard Worker absl::c_prev_permutation(permuted);
1162*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(initial, permuted);
1163*9356374aSAndroid Build Coastguard Worker }
1164*9356374aSAndroid Build Coastguard Worker
1165*9356374aSAndroid Build Coastguard Worker #if defined(ABSL_INTERNAL_CPLUSPLUS_LANG) && \
1166*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L
TEST(ConstexprTest,Distance)1167*9356374aSAndroid Build Coastguard Worker TEST(ConstexprTest, Distance) {
1168*9356374aSAndroid Build Coastguard Worker // Works at compile time with constexpr containers.
1169*9356374aSAndroid Build Coastguard Worker static_assert(absl::c_distance(std::array<int, 3>()) == 3);
1170*9356374aSAndroid Build Coastguard Worker }
1171*9356374aSAndroid Build Coastguard Worker
TEST(ConstexprTest,MinElement)1172*9356374aSAndroid Build Coastguard Worker TEST(ConstexprTest, MinElement) {
1173*9356374aSAndroid Build Coastguard Worker constexpr std::array<int, 3> kArray = {1, 2, 3};
1174*9356374aSAndroid Build Coastguard Worker static_assert(*absl::c_min_element(kArray) == 1);
1175*9356374aSAndroid Build Coastguard Worker }
1176*9356374aSAndroid Build Coastguard Worker
TEST(ConstexprTest,MinElementWithPredicate)1177*9356374aSAndroid Build Coastguard Worker TEST(ConstexprTest, MinElementWithPredicate) {
1178*9356374aSAndroid Build Coastguard Worker constexpr std::array<int, 3> kArray = {1, 2, 3};
1179*9356374aSAndroid Build Coastguard Worker static_assert(*absl::c_min_element(kArray, std::greater<int>()) == 3);
1180*9356374aSAndroid Build Coastguard Worker }
1181*9356374aSAndroid Build Coastguard Worker
TEST(ConstexprTest,MaxElement)1182*9356374aSAndroid Build Coastguard Worker TEST(ConstexprTest, MaxElement) {
1183*9356374aSAndroid Build Coastguard Worker constexpr std::array<int, 3> kArray = {1, 2, 3};
1184*9356374aSAndroid Build Coastguard Worker static_assert(*absl::c_max_element(kArray) == 3);
1185*9356374aSAndroid Build Coastguard Worker }
1186*9356374aSAndroid Build Coastguard Worker
TEST(ConstexprTest,MaxElementWithPredicate)1187*9356374aSAndroid Build Coastguard Worker TEST(ConstexprTest, MaxElementWithPredicate) {
1188*9356374aSAndroid Build Coastguard Worker constexpr std::array<int, 3> kArray = {1, 2, 3};
1189*9356374aSAndroid Build Coastguard Worker static_assert(*absl::c_max_element(kArray, std::greater<int>()) == 1);
1190*9356374aSAndroid Build Coastguard Worker }
1191*9356374aSAndroid Build Coastguard Worker
TEST(ConstexprTest,MinMaxElement)1192*9356374aSAndroid Build Coastguard Worker TEST(ConstexprTest, MinMaxElement) {
1193*9356374aSAndroid Build Coastguard Worker static constexpr std::array<int, 3> kArray = {1, 2, 3};
1194*9356374aSAndroid Build Coastguard Worker constexpr auto kMinMaxPair = absl::c_minmax_element(kArray);
1195*9356374aSAndroid Build Coastguard Worker static_assert(*kMinMaxPair.first == 1);
1196*9356374aSAndroid Build Coastguard Worker static_assert(*kMinMaxPair.second == 3);
1197*9356374aSAndroid Build Coastguard Worker }
1198*9356374aSAndroid Build Coastguard Worker
TEST(ConstexprTest,MinMaxElementWithPredicate)1199*9356374aSAndroid Build Coastguard Worker TEST(ConstexprTest, MinMaxElementWithPredicate) {
1200*9356374aSAndroid Build Coastguard Worker static constexpr std::array<int, 3> kArray = {1, 2, 3};
1201*9356374aSAndroid Build Coastguard Worker constexpr auto kMinMaxPair =
1202*9356374aSAndroid Build Coastguard Worker absl::c_minmax_element(kArray, std::greater<int>());
1203*9356374aSAndroid Build Coastguard Worker static_assert(*kMinMaxPair.first == 3);
1204*9356374aSAndroid Build Coastguard Worker static_assert(*kMinMaxPair.second == 1);
1205*9356374aSAndroid Build Coastguard Worker }
1206*9356374aSAndroid Build Coastguard Worker
1207*9356374aSAndroid Build Coastguard Worker #endif // defined(ABSL_INTERNAL_CPLUSPLUS_LANG) &&
1208*9356374aSAndroid Build Coastguard Worker // ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L
1209*9356374aSAndroid Build Coastguard Worker
1210*9356374aSAndroid Build Coastguard Worker } // namespace
1211