1*635a8641SAndroid Build Coastguard Worker // Copyright 2017 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker
5*635a8641SAndroid Build Coastguard Worker #include "base/containers/circular_deque.h"
6*635a8641SAndroid Build Coastguard Worker
7*635a8641SAndroid Build Coastguard Worker #include "base/test/copy_only_int.h"
8*635a8641SAndroid Build Coastguard Worker #include "base/test/move_only_int.h"
9*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
10*635a8641SAndroid Build Coastguard Worker
11*635a8641SAndroid Build Coastguard Worker using base::internal::VectorBuffer;
12*635a8641SAndroid Build Coastguard Worker
13*635a8641SAndroid Build Coastguard Worker namespace base {
14*635a8641SAndroid Build Coastguard Worker
15*635a8641SAndroid Build Coastguard Worker namespace {
16*635a8641SAndroid Build Coastguard Worker
MakeSequence(size_t max)17*635a8641SAndroid Build Coastguard Worker circular_deque<int> MakeSequence(size_t max) {
18*635a8641SAndroid Build Coastguard Worker circular_deque<int> ret;
19*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < max; i++)
20*635a8641SAndroid Build Coastguard Worker ret.push_back(i);
21*635a8641SAndroid Build Coastguard Worker return ret;
22*635a8641SAndroid Build Coastguard Worker }
23*635a8641SAndroid Build Coastguard Worker
24*635a8641SAndroid Build Coastguard Worker // Cycles through the queue, popping items from the back and pushing items
25*635a8641SAndroid Build Coastguard Worker // at the front to validate behavior across different configurations of the
26*635a8641SAndroid Build Coastguard Worker // queue in relation to the underlying buffer. The tester closure is run for
27*635a8641SAndroid Build Coastguard Worker // each cycle.
28*635a8641SAndroid Build Coastguard Worker template <class QueueT, class Tester>
CycleTest(circular_deque<QueueT> & queue,const Tester & tester)29*635a8641SAndroid Build Coastguard Worker void CycleTest(circular_deque<QueueT>& queue, const Tester& tester) {
30*635a8641SAndroid Build Coastguard Worker size_t steps = queue.size() * 2;
31*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < steps; i++) {
32*635a8641SAndroid Build Coastguard Worker tester(queue, i);
33*635a8641SAndroid Build Coastguard Worker queue.pop_back();
34*635a8641SAndroid Build Coastguard Worker queue.push_front(QueueT());
35*635a8641SAndroid Build Coastguard Worker }
36*635a8641SAndroid Build Coastguard Worker }
37*635a8641SAndroid Build Coastguard Worker
38*635a8641SAndroid Build Coastguard Worker class DestructorCounter {
39*635a8641SAndroid Build Coastguard Worker public:
DestructorCounter(int * counter)40*635a8641SAndroid Build Coastguard Worker DestructorCounter(int* counter) : counter_(counter) {}
~DestructorCounter()41*635a8641SAndroid Build Coastguard Worker ~DestructorCounter() { ++(*counter_); }
42*635a8641SAndroid Build Coastguard Worker
43*635a8641SAndroid Build Coastguard Worker private:
44*635a8641SAndroid Build Coastguard Worker int* counter_;
45*635a8641SAndroid Build Coastguard Worker };
46*635a8641SAndroid Build Coastguard Worker
47*635a8641SAndroid Build Coastguard Worker } // namespace
48*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,FillConstructor)49*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, FillConstructor) {
50*635a8641SAndroid Build Coastguard Worker constexpr size_t num_elts = 9;
51*635a8641SAndroid Build Coastguard Worker
52*635a8641SAndroid Build Coastguard Worker std::vector<int> foo(15);
53*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(15u, foo.size());
54*635a8641SAndroid Build Coastguard Worker
55*635a8641SAndroid Build Coastguard Worker // Fill with default constructor.
56*635a8641SAndroid Build Coastguard Worker {
57*635a8641SAndroid Build Coastguard Worker circular_deque<int> buf(num_elts);
58*635a8641SAndroid Build Coastguard Worker
59*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(num_elts, buf.size());
60*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(num_elts, static_cast<size_t>(buf.end() - buf.begin()));
61*635a8641SAndroid Build Coastguard Worker
62*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < num_elts; i++)
63*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, buf[i]);
64*635a8641SAndroid Build Coastguard Worker }
65*635a8641SAndroid Build Coastguard Worker
66*635a8641SAndroid Build Coastguard Worker // Fill with explicit value.
67*635a8641SAndroid Build Coastguard Worker {
68*635a8641SAndroid Build Coastguard Worker int value = 199;
69*635a8641SAndroid Build Coastguard Worker circular_deque<int> buf(num_elts, value);
70*635a8641SAndroid Build Coastguard Worker
71*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(num_elts, buf.size());
72*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(num_elts, static_cast<size_t>(buf.end() - buf.begin()));
73*635a8641SAndroid Build Coastguard Worker
74*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < num_elts; i++)
75*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(value, buf[i]);
76*635a8641SAndroid Build Coastguard Worker }
77*635a8641SAndroid Build Coastguard Worker }
78*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,CopyAndRangeConstructor)79*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, CopyAndRangeConstructor) {
80*635a8641SAndroid Build Coastguard Worker int values[] = {1, 2, 3, 4, 5, 6};
81*635a8641SAndroid Build Coastguard Worker circular_deque<CopyOnlyInt> first(std::begin(values), std::end(values));
82*635a8641SAndroid Build Coastguard Worker
83*635a8641SAndroid Build Coastguard Worker circular_deque<CopyOnlyInt> second(first);
84*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(6u, second.size());
85*635a8641SAndroid Build Coastguard Worker for (int i = 0; i < 6; i++)
86*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(i + 1, second[i].data());
87*635a8641SAndroid Build Coastguard Worker }
88*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,MoveConstructor)89*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, MoveConstructor) {
90*635a8641SAndroid Build Coastguard Worker int values[] = {1, 2, 3, 4, 5, 6};
91*635a8641SAndroid Build Coastguard Worker circular_deque<MoveOnlyInt> first(std::begin(values), std::end(values));
92*635a8641SAndroid Build Coastguard Worker
93*635a8641SAndroid Build Coastguard Worker circular_deque<MoveOnlyInt> second(std::move(first));
94*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(first.empty());
95*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(6u, second.size());
96*635a8641SAndroid Build Coastguard Worker for (int i = 0; i < 6; i++)
97*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(i + 1, second[i].data());
98*635a8641SAndroid Build Coastguard Worker }
99*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,InitializerListConstructor)100*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, InitializerListConstructor) {
101*635a8641SAndroid Build Coastguard Worker circular_deque<int> empty({});
102*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(empty.empty());
103*635a8641SAndroid Build Coastguard Worker
104*635a8641SAndroid Build Coastguard Worker circular_deque<int> first({1, 2, 3, 4, 5, 6});
105*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(6u, first.size());
106*635a8641SAndroid Build Coastguard Worker for (int i = 0; i < 6; i++)
107*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(i + 1, first[i]);
108*635a8641SAndroid Build Coastguard Worker }
109*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,Destructor)110*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, Destructor) {
111*635a8641SAndroid Build Coastguard Worker int destruct_count = 0;
112*635a8641SAndroid Build Coastguard Worker
113*635a8641SAndroid Build Coastguard Worker // Contiguous buffer.
114*635a8641SAndroid Build Coastguard Worker {
115*635a8641SAndroid Build Coastguard Worker circular_deque<DestructorCounter> q;
116*635a8641SAndroid Build Coastguard Worker q.resize(5, DestructorCounter(&destruct_count));
117*635a8641SAndroid Build Coastguard Worker
118*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, destruct_count); // The temporary in the call to resize().
119*635a8641SAndroid Build Coastguard Worker destruct_count = 0;
120*635a8641SAndroid Build Coastguard Worker }
121*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(5, destruct_count); // One call for each.
122*635a8641SAndroid Build Coastguard Worker
123*635a8641SAndroid Build Coastguard Worker // Force a wraparound buffer.
124*635a8641SAndroid Build Coastguard Worker {
125*635a8641SAndroid Build Coastguard Worker circular_deque<DestructorCounter> q;
126*635a8641SAndroid Build Coastguard Worker q.reserve(7);
127*635a8641SAndroid Build Coastguard Worker q.resize(5, DestructorCounter(&destruct_count));
128*635a8641SAndroid Build Coastguard Worker
129*635a8641SAndroid Build Coastguard Worker // Cycle throught some elements in our buffer to force a wraparound.
130*635a8641SAndroid Build Coastguard Worker destruct_count = 0;
131*635a8641SAndroid Build Coastguard Worker for (int i = 0; i < 4; i++) {
132*635a8641SAndroid Build Coastguard Worker q.emplace_back(&destruct_count);
133*635a8641SAndroid Build Coastguard Worker q.pop_front();
134*635a8641SAndroid Build Coastguard Worker }
135*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(4, destruct_count); // One for each cycle.
136*635a8641SAndroid Build Coastguard Worker destruct_count = 0;
137*635a8641SAndroid Build Coastguard Worker }
138*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(5, destruct_count); // One call for each.
139*635a8641SAndroid Build Coastguard Worker }
140*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,EqualsCopy)141*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, EqualsCopy) {
142*635a8641SAndroid Build Coastguard Worker circular_deque<int> first = {1, 2, 3, 4, 5, 6};
143*635a8641SAndroid Build Coastguard Worker circular_deque<int> copy;
144*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(copy.empty());
145*635a8641SAndroid Build Coastguard Worker copy = first;
146*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(6u, copy.size());
147*635a8641SAndroid Build Coastguard Worker for (int i = 0; i < 6; i++) {
148*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(i + 1, first[i]);
149*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(i + 1, copy[i]);
150*635a8641SAndroid Build Coastguard Worker EXPECT_NE(&first[i], ©[i]);
151*635a8641SAndroid Build Coastguard Worker }
152*635a8641SAndroid Build Coastguard Worker }
153*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,EqualsMove)154*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, EqualsMove) {
155*635a8641SAndroid Build Coastguard Worker circular_deque<int> first = {1, 2, 3, 4, 5, 6};
156*635a8641SAndroid Build Coastguard Worker circular_deque<int> move;
157*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(move.empty());
158*635a8641SAndroid Build Coastguard Worker move = std::move(first);
159*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(first.empty());
160*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(6u, move.size());
161*635a8641SAndroid Build Coastguard Worker for (int i = 0; i < 6; i++)
162*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(i + 1, move[i]);
163*635a8641SAndroid Build Coastguard Worker }
164*635a8641SAndroid Build Coastguard Worker
165*635a8641SAndroid Build Coastguard Worker // Tests that self-assignment is a no-op.
TEST(CircularDeque,EqualsSelf)166*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, EqualsSelf) {
167*635a8641SAndroid Build Coastguard Worker circular_deque<int> q = {1, 2, 3, 4, 5, 6};
168*635a8641SAndroid Build Coastguard Worker q = *&q; // The *& defeats Clang's -Wself-assign warning.
169*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(6u, q.size());
170*635a8641SAndroid Build Coastguard Worker for (int i = 0; i < 6; i++)
171*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(i + 1, q[i]);
172*635a8641SAndroid Build Coastguard Worker }
173*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,EqualsInitializerList)174*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, EqualsInitializerList) {
175*635a8641SAndroid Build Coastguard Worker circular_deque<int> q;
176*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(q.empty());
177*635a8641SAndroid Build Coastguard Worker q = {1, 2, 3, 4, 5, 6};
178*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(6u, q.size());
179*635a8641SAndroid Build Coastguard Worker for (int i = 0; i < 6; i++)
180*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(i + 1, q[i]);
181*635a8641SAndroid Build Coastguard Worker }
182*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,AssignCountValue)183*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, AssignCountValue) {
184*635a8641SAndroid Build Coastguard Worker circular_deque<int> empty;
185*635a8641SAndroid Build Coastguard Worker empty.assign(0, 52);
186*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0u, empty.size());
187*635a8641SAndroid Build Coastguard Worker
188*635a8641SAndroid Build Coastguard Worker circular_deque<int> full;
189*635a8641SAndroid Build Coastguard Worker size_t count = 13;
190*635a8641SAndroid Build Coastguard Worker int value = 12345;
191*635a8641SAndroid Build Coastguard Worker full.assign(count, value);
192*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(count, full.size());
193*635a8641SAndroid Build Coastguard Worker
194*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < count; i++)
195*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(value, full[i]);
196*635a8641SAndroid Build Coastguard Worker }
197*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,AssignIterator)198*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, AssignIterator) {
199*635a8641SAndroid Build Coastguard Worker int range[8] = {11, 12, 13, 14, 15, 16, 17, 18};
200*635a8641SAndroid Build Coastguard Worker
201*635a8641SAndroid Build Coastguard Worker circular_deque<int> empty;
202*635a8641SAndroid Build Coastguard Worker empty.assign(std::begin(range), std::begin(range));
203*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(empty.empty());
204*635a8641SAndroid Build Coastguard Worker
205*635a8641SAndroid Build Coastguard Worker circular_deque<int> full;
206*635a8641SAndroid Build Coastguard Worker full.assign(std::begin(range), std::end(range));
207*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(8u, full.size());
208*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < 8; i++)
209*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(range[i], full[i]);
210*635a8641SAndroid Build Coastguard Worker }
211*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,AssignInitializerList)212*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, AssignInitializerList) {
213*635a8641SAndroid Build Coastguard Worker circular_deque<int> empty;
214*635a8641SAndroid Build Coastguard Worker empty.assign({});
215*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(empty.empty());
216*635a8641SAndroid Build Coastguard Worker
217*635a8641SAndroid Build Coastguard Worker circular_deque<int> full;
218*635a8641SAndroid Build Coastguard Worker full.assign({11, 12, 13, 14, 15, 16, 17, 18});
219*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(8u, full.size());
220*635a8641SAndroid Build Coastguard Worker for (int i = 0; i < 8; i++)
221*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(11 + i, full[i]);
222*635a8641SAndroid Build Coastguard Worker }
223*635a8641SAndroid Build Coastguard Worker
224*635a8641SAndroid Build Coastguard Worker // Tests [] and .at().
TEST(CircularDeque,At)225*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, At) {
226*635a8641SAndroid Build Coastguard Worker circular_deque<int> q = MakeSequence(10);
227*635a8641SAndroid Build Coastguard Worker CycleTest(q, [](const circular_deque<int>& q, size_t cycle) {
228*635a8641SAndroid Build Coastguard Worker size_t expected_size = 10;
229*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected_size, q.size());
230*635a8641SAndroid Build Coastguard Worker
231*635a8641SAndroid Build Coastguard Worker // A sequence of 0's.
232*635a8641SAndroid Build Coastguard Worker size_t index = 0;
233*635a8641SAndroid Build Coastguard Worker size_t num_zeros = std::min(expected_size, cycle);
234*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < num_zeros; i++, index++) {
235*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, q[index]);
236*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, q.at(index));
237*635a8641SAndroid Build Coastguard Worker }
238*635a8641SAndroid Build Coastguard Worker
239*635a8641SAndroid Build Coastguard Worker // Followed by a sequence of increasing ints.
240*635a8641SAndroid Build Coastguard Worker size_t num_ints = expected_size - num_zeros;
241*635a8641SAndroid Build Coastguard Worker for (int i = 0; i < static_cast<int>(num_ints); i++, index++) {
242*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(i, q[index]);
243*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(i, q.at(index));
244*635a8641SAndroid Build Coastguard Worker }
245*635a8641SAndroid Build Coastguard Worker });
246*635a8641SAndroid Build Coastguard Worker }
247*635a8641SAndroid Build Coastguard Worker
248*635a8641SAndroid Build Coastguard Worker // This also tests the copy constructor with lots of different types of
249*635a8641SAndroid Build Coastguard Worker // input configurations.
TEST(CircularDeque,FrontBackPushPop)250*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, FrontBackPushPop) {
251*635a8641SAndroid Build Coastguard Worker circular_deque<int> q = MakeSequence(10);
252*635a8641SAndroid Build Coastguard Worker
253*635a8641SAndroid Build Coastguard Worker int expected_front = 0;
254*635a8641SAndroid Build Coastguard Worker int expected_back = 9;
255*635a8641SAndroid Build Coastguard Worker
256*635a8641SAndroid Build Coastguard Worker // Go in one direction.
257*635a8641SAndroid Build Coastguard Worker for (int i = 0; i < 100; i++) {
258*635a8641SAndroid Build Coastguard Worker const circular_deque<int> const_q(q);
259*635a8641SAndroid Build Coastguard Worker
260*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected_front, q.front());
261*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected_back, q.back());
262*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected_front, const_q.front());
263*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected_back, const_q.back());
264*635a8641SAndroid Build Coastguard Worker
265*635a8641SAndroid Build Coastguard Worker expected_front++;
266*635a8641SAndroid Build Coastguard Worker expected_back++;
267*635a8641SAndroid Build Coastguard Worker
268*635a8641SAndroid Build Coastguard Worker q.pop_front();
269*635a8641SAndroid Build Coastguard Worker q.push_back(expected_back);
270*635a8641SAndroid Build Coastguard Worker }
271*635a8641SAndroid Build Coastguard Worker
272*635a8641SAndroid Build Coastguard Worker // Go back in reverse.
273*635a8641SAndroid Build Coastguard Worker for (int i = 0; i < 100; i++) {
274*635a8641SAndroid Build Coastguard Worker const circular_deque<int> const_q(q);
275*635a8641SAndroid Build Coastguard Worker
276*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected_front, q.front());
277*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected_back, q.back());
278*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected_front, const_q.front());
279*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected_back, const_q.back());
280*635a8641SAndroid Build Coastguard Worker
281*635a8641SAndroid Build Coastguard Worker expected_front--;
282*635a8641SAndroid Build Coastguard Worker expected_back--;
283*635a8641SAndroid Build Coastguard Worker
284*635a8641SAndroid Build Coastguard Worker q.pop_back();
285*635a8641SAndroid Build Coastguard Worker q.push_front(expected_front);
286*635a8641SAndroid Build Coastguard Worker }
287*635a8641SAndroid Build Coastguard Worker }
288*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,ReallocateWithSplitBuffer)289*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, ReallocateWithSplitBuffer) {
290*635a8641SAndroid Build Coastguard Worker // Tests reallocating a deque with an internal buffer that looks like this:
291*635a8641SAndroid Build Coastguard Worker // 4 5 x x 0 1 2 3
292*635a8641SAndroid Build Coastguard Worker // end-^ ^-begin
293*635a8641SAndroid Build Coastguard Worker circular_deque<int> q;
294*635a8641SAndroid Build Coastguard Worker q.reserve(7); // Internal buffer is always 1 larger than requested.
295*635a8641SAndroid Build Coastguard Worker q.push_back(-1);
296*635a8641SAndroid Build Coastguard Worker q.push_back(-1);
297*635a8641SAndroid Build Coastguard Worker q.push_back(-1);
298*635a8641SAndroid Build Coastguard Worker q.push_back(-1);
299*635a8641SAndroid Build Coastguard Worker q.push_back(0);
300*635a8641SAndroid Build Coastguard Worker q.pop_front();
301*635a8641SAndroid Build Coastguard Worker q.pop_front();
302*635a8641SAndroid Build Coastguard Worker q.pop_front();
303*635a8641SAndroid Build Coastguard Worker q.pop_front();
304*635a8641SAndroid Build Coastguard Worker q.push_back(1);
305*635a8641SAndroid Build Coastguard Worker q.push_back(2);
306*635a8641SAndroid Build Coastguard Worker q.push_back(3);
307*635a8641SAndroid Build Coastguard Worker q.push_back(4);
308*635a8641SAndroid Build Coastguard Worker q.push_back(5);
309*635a8641SAndroid Build Coastguard Worker
310*635a8641SAndroid Build Coastguard Worker q.shrink_to_fit();
311*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(6u, q.size());
312*635a8641SAndroid Build Coastguard Worker
313*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, q[0]);
314*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, q[1]);
315*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2, q[2]);
316*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(3, q[3]);
317*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(4, q[4]);
318*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(5, q[5]);
319*635a8641SAndroid Build Coastguard Worker }
320*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,Swap)321*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, Swap) {
322*635a8641SAndroid Build Coastguard Worker circular_deque<int> a = MakeSequence(10);
323*635a8641SAndroid Build Coastguard Worker circular_deque<int> b = MakeSequence(100);
324*635a8641SAndroid Build Coastguard Worker
325*635a8641SAndroid Build Coastguard Worker a.swap(b);
326*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(100u, a.size());
327*635a8641SAndroid Build Coastguard Worker for (int i = 0; i < 100; i++)
328*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(i, a[i]);
329*635a8641SAndroid Build Coastguard Worker
330*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(10u, b.size());
331*635a8641SAndroid Build Coastguard Worker for (int i = 0; i < 10; i++)
332*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(i, b[i]);
333*635a8641SAndroid Build Coastguard Worker }
334*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,Iteration)335*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, Iteration) {
336*635a8641SAndroid Build Coastguard Worker circular_deque<int> q = MakeSequence(10);
337*635a8641SAndroid Build Coastguard Worker
338*635a8641SAndroid Build Coastguard Worker int expected_front = 0;
339*635a8641SAndroid Build Coastguard Worker int expected_back = 9;
340*635a8641SAndroid Build Coastguard Worker
341*635a8641SAndroid Build Coastguard Worker // This loop causes various combinations of begin and end to be tested.
342*635a8641SAndroid Build Coastguard Worker for (int i = 0; i < 30; i++) {
343*635a8641SAndroid Build Coastguard Worker // Range-based for loop going forward.
344*635a8641SAndroid Build Coastguard Worker int current_expected = expected_front;
345*635a8641SAndroid Build Coastguard Worker for (int cur : q) {
346*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(current_expected, cur);
347*635a8641SAndroid Build Coastguard Worker current_expected++;
348*635a8641SAndroid Build Coastguard Worker }
349*635a8641SAndroid Build Coastguard Worker
350*635a8641SAndroid Build Coastguard Worker // Manually test reverse iterators.
351*635a8641SAndroid Build Coastguard Worker current_expected = expected_back;
352*635a8641SAndroid Build Coastguard Worker for (auto cur = q.crbegin(); cur < q.crend(); cur++) {
353*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(current_expected, *cur);
354*635a8641SAndroid Build Coastguard Worker current_expected--;
355*635a8641SAndroid Build Coastguard Worker }
356*635a8641SAndroid Build Coastguard Worker
357*635a8641SAndroid Build Coastguard Worker expected_front++;
358*635a8641SAndroid Build Coastguard Worker expected_back++;
359*635a8641SAndroid Build Coastguard Worker
360*635a8641SAndroid Build Coastguard Worker q.pop_front();
361*635a8641SAndroid Build Coastguard Worker q.push_back(expected_back);
362*635a8641SAndroid Build Coastguard Worker }
363*635a8641SAndroid Build Coastguard Worker
364*635a8641SAndroid Build Coastguard Worker // Go back in reverse.
365*635a8641SAndroid Build Coastguard Worker for (int i = 0; i < 100; i++) {
366*635a8641SAndroid Build Coastguard Worker const circular_deque<int> const_q(q);
367*635a8641SAndroid Build Coastguard Worker
368*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected_front, q.front());
369*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected_back, q.back());
370*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected_front, const_q.front());
371*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected_back, const_q.back());
372*635a8641SAndroid Build Coastguard Worker
373*635a8641SAndroid Build Coastguard Worker expected_front--;
374*635a8641SAndroid Build Coastguard Worker expected_back--;
375*635a8641SAndroid Build Coastguard Worker
376*635a8641SAndroid Build Coastguard Worker q.pop_back();
377*635a8641SAndroid Build Coastguard Worker q.push_front(expected_front);
378*635a8641SAndroid Build Coastguard Worker }
379*635a8641SAndroid Build Coastguard Worker }
380*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,IteratorComparisons)381*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, IteratorComparisons) {
382*635a8641SAndroid Build Coastguard Worker circular_deque<int> q = MakeSequence(10);
383*635a8641SAndroid Build Coastguard Worker
384*635a8641SAndroid Build Coastguard Worker // This loop causes various combinations of begin and end to be tested.
385*635a8641SAndroid Build Coastguard Worker for (int i = 0; i < 30; i++) {
386*635a8641SAndroid Build Coastguard Worker EXPECT_LT(q.begin(), q.end());
387*635a8641SAndroid Build Coastguard Worker EXPECT_LE(q.begin(), q.end());
388*635a8641SAndroid Build Coastguard Worker EXPECT_LE(q.begin(), q.begin());
389*635a8641SAndroid Build Coastguard Worker
390*635a8641SAndroid Build Coastguard Worker EXPECT_GT(q.end(), q.begin());
391*635a8641SAndroid Build Coastguard Worker EXPECT_GE(q.end(), q.begin());
392*635a8641SAndroid Build Coastguard Worker EXPECT_GE(q.end(), q.end());
393*635a8641SAndroid Build Coastguard Worker
394*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q.begin(), q.begin());
395*635a8641SAndroid Build Coastguard Worker EXPECT_NE(q.begin(), q.end());
396*635a8641SAndroid Build Coastguard Worker
397*635a8641SAndroid Build Coastguard Worker q.push_front(10);
398*635a8641SAndroid Build Coastguard Worker q.pop_back();
399*635a8641SAndroid Build Coastguard Worker }
400*635a8641SAndroid Build Coastguard Worker }
401*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,IteratorIncDec)402*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, IteratorIncDec) {
403*635a8641SAndroid Build Coastguard Worker circular_deque<int> q;
404*635a8641SAndroid Build Coastguard Worker
405*635a8641SAndroid Build Coastguard Worker // No-op offset computations with no capacity.
406*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q.end(), q.end() + 0);
407*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q.end(), q.end() - 0);
408*635a8641SAndroid Build Coastguard Worker
409*635a8641SAndroid Build Coastguard Worker q = MakeSequence(10);
410*635a8641SAndroid Build Coastguard Worker
411*635a8641SAndroid Build Coastguard Worker // Mutable preincrement, predecrement.
412*635a8641SAndroid Build Coastguard Worker {
413*635a8641SAndroid Build Coastguard Worker circular_deque<int>::iterator it = q.begin();
414*635a8641SAndroid Build Coastguard Worker circular_deque<int>::iterator op_result = ++it;
415*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, *op_result);
416*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, *it);
417*635a8641SAndroid Build Coastguard Worker
418*635a8641SAndroid Build Coastguard Worker op_result = --it;
419*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, *op_result);
420*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, *it);
421*635a8641SAndroid Build Coastguard Worker }
422*635a8641SAndroid Build Coastguard Worker
423*635a8641SAndroid Build Coastguard Worker // Const preincrement, predecrement.
424*635a8641SAndroid Build Coastguard Worker {
425*635a8641SAndroid Build Coastguard Worker circular_deque<int>::const_iterator it = q.begin();
426*635a8641SAndroid Build Coastguard Worker circular_deque<int>::const_iterator op_result = ++it;
427*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, *op_result);
428*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, *it);
429*635a8641SAndroid Build Coastguard Worker
430*635a8641SAndroid Build Coastguard Worker op_result = --it;
431*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, *op_result);
432*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, *it);
433*635a8641SAndroid Build Coastguard Worker }
434*635a8641SAndroid Build Coastguard Worker
435*635a8641SAndroid Build Coastguard Worker // Mutable postincrement, postdecrement.
436*635a8641SAndroid Build Coastguard Worker {
437*635a8641SAndroid Build Coastguard Worker circular_deque<int>::iterator it = q.begin();
438*635a8641SAndroid Build Coastguard Worker circular_deque<int>::iterator op_result = it++;
439*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, *op_result);
440*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, *it);
441*635a8641SAndroid Build Coastguard Worker
442*635a8641SAndroid Build Coastguard Worker op_result = it--;
443*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, *op_result);
444*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, *it);
445*635a8641SAndroid Build Coastguard Worker }
446*635a8641SAndroid Build Coastguard Worker
447*635a8641SAndroid Build Coastguard Worker // Const postincrement, postdecrement.
448*635a8641SAndroid Build Coastguard Worker {
449*635a8641SAndroid Build Coastguard Worker circular_deque<int>::const_iterator it = q.begin();
450*635a8641SAndroid Build Coastguard Worker circular_deque<int>::const_iterator op_result = it++;
451*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, *op_result);
452*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, *it);
453*635a8641SAndroid Build Coastguard Worker
454*635a8641SAndroid Build Coastguard Worker op_result = it--;
455*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, *op_result);
456*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, *it);
457*635a8641SAndroid Build Coastguard Worker }
458*635a8641SAndroid Build Coastguard Worker }
459*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,IteratorIntegerOps)460*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, IteratorIntegerOps) {
461*635a8641SAndroid Build Coastguard Worker circular_deque<int> q = MakeSequence(10);
462*635a8641SAndroid Build Coastguard Worker
463*635a8641SAndroid Build Coastguard Worker int expected_front = 0;
464*635a8641SAndroid Build Coastguard Worker int expected_back = 9;
465*635a8641SAndroid Build Coastguard Worker
466*635a8641SAndroid Build Coastguard Worker for (int i = 0; i < 30; i++) {
467*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, q.begin() - q.begin());
468*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, q.end() - q.end());
469*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q.size(), static_cast<size_t>(q.end() - q.begin()));
470*635a8641SAndroid Build Coastguard Worker
471*635a8641SAndroid Build Coastguard Worker // +=
472*635a8641SAndroid Build Coastguard Worker circular_deque<int>::iterator eight = q.begin();
473*635a8641SAndroid Build Coastguard Worker eight += 8;
474*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(8, eight - q.begin());
475*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected_front + 8, *eight);
476*635a8641SAndroid Build Coastguard Worker
477*635a8641SAndroid Build Coastguard Worker // -=
478*635a8641SAndroid Build Coastguard Worker eight -= 8;
479*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q.begin(), eight);
480*635a8641SAndroid Build Coastguard Worker
481*635a8641SAndroid Build Coastguard Worker // +
482*635a8641SAndroid Build Coastguard Worker eight = eight + 8;
483*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(8, eight - q.begin());
484*635a8641SAndroid Build Coastguard Worker
485*635a8641SAndroid Build Coastguard Worker // -
486*635a8641SAndroid Build Coastguard Worker eight = eight - 8;
487*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q.begin(), eight);
488*635a8641SAndroid Build Coastguard Worker
489*635a8641SAndroid Build Coastguard Worker expected_front++;
490*635a8641SAndroid Build Coastguard Worker expected_back++;
491*635a8641SAndroid Build Coastguard Worker
492*635a8641SAndroid Build Coastguard Worker q.pop_front();
493*635a8641SAndroid Build Coastguard Worker q.push_back(expected_back);
494*635a8641SAndroid Build Coastguard Worker }
495*635a8641SAndroid Build Coastguard Worker }
496*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,IteratorArrayAccess)497*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, IteratorArrayAccess) {
498*635a8641SAndroid Build Coastguard Worker circular_deque<int> q = MakeSequence(10);
499*635a8641SAndroid Build Coastguard Worker
500*635a8641SAndroid Build Coastguard Worker circular_deque<int>::iterator begin = q.begin();
501*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, begin[0]);
502*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(9, begin[9]);
503*635a8641SAndroid Build Coastguard Worker
504*635a8641SAndroid Build Coastguard Worker circular_deque<int>::iterator end = q.end();
505*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, end[-10]);
506*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(9, end[-1]);
507*635a8641SAndroid Build Coastguard Worker
508*635a8641SAndroid Build Coastguard Worker begin[0] = 100;
509*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(100, end[-10]);
510*635a8641SAndroid Build Coastguard Worker }
511*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,ReverseIterator)512*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, ReverseIterator) {
513*635a8641SAndroid Build Coastguard Worker circular_deque<int> q;
514*635a8641SAndroid Build Coastguard Worker q.push_back(4);
515*635a8641SAndroid Build Coastguard Worker q.push_back(3);
516*635a8641SAndroid Build Coastguard Worker q.push_back(2);
517*635a8641SAndroid Build Coastguard Worker q.push_back(1);
518*635a8641SAndroid Build Coastguard Worker
519*635a8641SAndroid Build Coastguard Worker circular_deque<int>::reverse_iterator iter = q.rbegin();
520*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, *iter);
521*635a8641SAndroid Build Coastguard Worker iter++;
522*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2, *iter);
523*635a8641SAndroid Build Coastguard Worker ++iter;
524*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(3, *iter);
525*635a8641SAndroid Build Coastguard Worker iter++;
526*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(4, *iter);
527*635a8641SAndroid Build Coastguard Worker ++iter;
528*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q.rend(), iter);
529*635a8641SAndroid Build Coastguard Worker }
530*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,CapacityReserveShrink)531*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, CapacityReserveShrink) {
532*635a8641SAndroid Build Coastguard Worker circular_deque<int> q;
533*635a8641SAndroid Build Coastguard Worker
534*635a8641SAndroid Build Coastguard Worker // A default constructed queue should have no capacity since it should waste
535*635a8641SAndroid Build Coastguard Worker // no space.
536*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(q.empty());
537*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0u, q.size());
538*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0u, q.capacity());
539*635a8641SAndroid Build Coastguard Worker
540*635a8641SAndroid Build Coastguard Worker size_t new_capacity = 100;
541*635a8641SAndroid Build Coastguard Worker q.reserve(new_capacity);
542*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(new_capacity, q.capacity());
543*635a8641SAndroid Build Coastguard Worker
544*635a8641SAndroid Build Coastguard Worker // Adding that many items should not cause a resize.
545*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < new_capacity; i++)
546*635a8641SAndroid Build Coastguard Worker q.push_back(i);
547*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(new_capacity, q.size());
548*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(new_capacity, q.capacity());
549*635a8641SAndroid Build Coastguard Worker
550*635a8641SAndroid Build Coastguard Worker // Shrink to fit to a smaller size.
551*635a8641SAndroid Build Coastguard Worker size_t capacity_2 = new_capacity / 2;
552*635a8641SAndroid Build Coastguard Worker q.resize(capacity_2);
553*635a8641SAndroid Build Coastguard Worker q.shrink_to_fit();
554*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(capacity_2, q.size());
555*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(capacity_2, q.capacity());
556*635a8641SAndroid Build Coastguard Worker }
557*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,CapacityAutoShrink)558*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, CapacityAutoShrink) {
559*635a8641SAndroid Build Coastguard Worker size_t big_size = 1000u;
560*635a8641SAndroid Build Coastguard Worker circular_deque<int> q;
561*635a8641SAndroid Build Coastguard Worker q.resize(big_size);
562*635a8641SAndroid Build Coastguard Worker
563*635a8641SAndroid Build Coastguard Worker size_t big_capacity = q.capacity();
564*635a8641SAndroid Build Coastguard Worker
565*635a8641SAndroid Build Coastguard Worker // Delete 3/4 of the items.
566*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < big_size / 4 * 3; i++)
567*635a8641SAndroid Build Coastguard Worker q.pop_back();
568*635a8641SAndroid Build Coastguard Worker
569*635a8641SAndroid Build Coastguard Worker // The capacity should have shrunk by deleting that many items.
570*635a8641SAndroid Build Coastguard Worker size_t medium_capacity = q.capacity();
571*635a8641SAndroid Build Coastguard Worker EXPECT_GT(big_capacity, medium_capacity);
572*635a8641SAndroid Build Coastguard Worker
573*635a8641SAndroid Build Coastguard Worker // Using resize to shrink should keep some extra capacity.
574*635a8641SAndroid Build Coastguard Worker q.resize(1);
575*635a8641SAndroid Build Coastguard Worker EXPECT_LT(1u, q.capacity());
576*635a8641SAndroid Build Coastguard Worker
577*635a8641SAndroid Build Coastguard Worker q.resize(0);
578*635a8641SAndroid Build Coastguard Worker EXPECT_LT(0u, q.capacity());
579*635a8641SAndroid Build Coastguard Worker
580*635a8641SAndroid Build Coastguard Worker // Using clear() should delete everything.
581*635a8641SAndroid Build Coastguard Worker q.clear();
582*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0u, q.capacity());
583*635a8641SAndroid Build Coastguard Worker }
584*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,ClearAndEmpty)585*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, ClearAndEmpty) {
586*635a8641SAndroid Build Coastguard Worker circular_deque<int> q;
587*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(q.empty());
588*635a8641SAndroid Build Coastguard Worker
589*635a8641SAndroid Build Coastguard Worker q.resize(10);
590*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(10u, q.size());
591*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(q.empty());
592*635a8641SAndroid Build Coastguard Worker
593*635a8641SAndroid Build Coastguard Worker q.clear();
594*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0u, q.size());
595*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(q.empty());
596*635a8641SAndroid Build Coastguard Worker
597*635a8641SAndroid Build Coastguard Worker // clear() also should reset the capacity.
598*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0u, q.capacity());
599*635a8641SAndroid Build Coastguard Worker }
600*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,Resize)601*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, Resize) {
602*635a8641SAndroid Build Coastguard Worker circular_deque<int> q;
603*635a8641SAndroid Build Coastguard Worker
604*635a8641SAndroid Build Coastguard Worker // Resize with default constructor.
605*635a8641SAndroid Build Coastguard Worker size_t first_size = 10;
606*635a8641SAndroid Build Coastguard Worker q.resize(first_size);
607*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(first_size, q.size());
608*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < first_size; i++)
609*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, q[i]);
610*635a8641SAndroid Build Coastguard Worker
611*635a8641SAndroid Build Coastguard Worker // Resize with different value.
612*635a8641SAndroid Build Coastguard Worker size_t second_expand = 10;
613*635a8641SAndroid Build Coastguard Worker q.resize(first_size + second_expand, 3);
614*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(first_size + second_expand, q.size());
615*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < first_size; i++)
616*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, q[i]);
617*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < second_expand; i++)
618*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(3, q[i + first_size]);
619*635a8641SAndroid Build Coastguard Worker
620*635a8641SAndroid Build Coastguard Worker // Erase from the end and add to the beginning so resize is forced to cross
621*635a8641SAndroid Build Coastguard Worker // a circular buffer wrap boundary.
622*635a8641SAndroid Build Coastguard Worker q.shrink_to_fit();
623*635a8641SAndroid Build Coastguard Worker for (int i = 0; i < 5; i++) {
624*635a8641SAndroid Build Coastguard Worker q.pop_back();
625*635a8641SAndroid Build Coastguard Worker q.push_front(6);
626*635a8641SAndroid Build Coastguard Worker }
627*635a8641SAndroid Build Coastguard Worker q.resize(10);
628*635a8641SAndroid Build Coastguard Worker
629*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(6, q[0]);
630*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(6, q[1]);
631*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(6, q[2]);
632*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(6, q[3]);
633*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(6, q[4]);
634*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, q[5]);
635*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, q[6]);
636*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, q[7]);
637*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, q[8]);
638*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, q[9]);
639*635a8641SAndroid Build Coastguard Worker }
640*635a8641SAndroid Build Coastguard Worker
641*635a8641SAndroid Build Coastguard Worker // Tests destructor behavior of resize.
TEST(CircularDeque,ResizeDelete)642*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, ResizeDelete) {
643*635a8641SAndroid Build Coastguard Worker int counter = 0;
644*635a8641SAndroid Build Coastguard Worker circular_deque<DestructorCounter> q;
645*635a8641SAndroid Build Coastguard Worker q.resize(10, DestructorCounter(&counter));
646*635a8641SAndroid Build Coastguard Worker // The one temporary when calling resize() should be deleted, that's it.
647*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, counter);
648*635a8641SAndroid Build Coastguard Worker
649*635a8641SAndroid Build Coastguard Worker // The loops below assume the capacity will be set by resize().
650*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(10u, q.capacity());
651*635a8641SAndroid Build Coastguard Worker
652*635a8641SAndroid Build Coastguard Worker // Delete some via resize(). This is done so that the wasted items are
653*635a8641SAndroid Build Coastguard Worker // still greater than the size() so that auto-shrinking is not triggered
654*635a8641SAndroid Build Coastguard Worker // (which will mess up our destructor counting).
655*635a8641SAndroid Build Coastguard Worker counter = 0;
656*635a8641SAndroid Build Coastguard Worker q.resize(8, DestructorCounter(&counter));
657*635a8641SAndroid Build Coastguard Worker // 2 deleted ones + the one temporary in the resize() call.
658*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(3, counter);
659*635a8641SAndroid Build Coastguard Worker
660*635a8641SAndroid Build Coastguard Worker // Cycle through some items so two items will cross the boundary in the
661*635a8641SAndroid Build Coastguard Worker // 11-item buffer (one more than the capacity).
662*635a8641SAndroid Build Coastguard Worker // Before: x x x x x x x x . . .
663*635a8641SAndroid Build Coastguard Worker // After: x . . . x x x x x x x
664*635a8641SAndroid Build Coastguard Worker counter = 0;
665*635a8641SAndroid Build Coastguard Worker for (int i = 0; i < 4; i++) {
666*635a8641SAndroid Build Coastguard Worker q.emplace_back(&counter);
667*635a8641SAndroid Build Coastguard Worker q.pop_front();
668*635a8641SAndroid Build Coastguard Worker }
669*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(4, counter); // Loop should have deleted 7 items.
670*635a8641SAndroid Build Coastguard Worker
671*635a8641SAndroid Build Coastguard Worker // Delete two items with resize, these should be on either side of the
672*635a8641SAndroid Build Coastguard Worker // buffer wrap point.
673*635a8641SAndroid Build Coastguard Worker counter = 0;
674*635a8641SAndroid Build Coastguard Worker q.resize(6, DestructorCounter(&counter));
675*635a8641SAndroid Build Coastguard Worker // 2 deleted ones + the one temporary in the resize() call.
676*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(3, counter);
677*635a8641SAndroid Build Coastguard Worker }
678*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,InsertEraseSingle)679*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, InsertEraseSingle) {
680*635a8641SAndroid Build Coastguard Worker circular_deque<int> q;
681*635a8641SAndroid Build Coastguard Worker q.push_back(1);
682*635a8641SAndroid Build Coastguard Worker q.push_back(2);
683*635a8641SAndroid Build Coastguard Worker
684*635a8641SAndroid Build Coastguard Worker // Insert at the beginning.
685*635a8641SAndroid Build Coastguard Worker auto result = q.insert(q.begin(), 0);
686*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q.begin(), result);
687*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(3u, q.size());
688*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, q[0]);
689*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, q[1]);
690*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2, q[2]);
691*635a8641SAndroid Build Coastguard Worker
692*635a8641SAndroid Build Coastguard Worker // Erase at the beginning.
693*635a8641SAndroid Build Coastguard Worker result = q.erase(q.begin());
694*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q.begin(), result);
695*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2u, q.size());
696*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, q[0]);
697*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2, q[1]);
698*635a8641SAndroid Build Coastguard Worker
699*635a8641SAndroid Build Coastguard Worker // Insert at the end.
700*635a8641SAndroid Build Coastguard Worker result = q.insert(q.end(), 3);
701*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q.end() - 1, result);
702*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, q[0]);
703*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2, q[1]);
704*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(3, q[2]);
705*635a8641SAndroid Build Coastguard Worker
706*635a8641SAndroid Build Coastguard Worker // Erase at the end.
707*635a8641SAndroid Build Coastguard Worker result = q.erase(q.end() - 1);
708*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q.end(), result);
709*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, q[0]);
710*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2, q[1]);
711*635a8641SAndroid Build Coastguard Worker
712*635a8641SAndroid Build Coastguard Worker // Insert in the middle.
713*635a8641SAndroid Build Coastguard Worker result = q.insert(q.begin() + 1, 10);
714*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q.begin() + 1, result);
715*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, q[0]);
716*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(10, q[1]);
717*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2, q[2]);
718*635a8641SAndroid Build Coastguard Worker
719*635a8641SAndroid Build Coastguard Worker // Erase in the middle.
720*635a8641SAndroid Build Coastguard Worker result = q.erase(q.begin() + 1);
721*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q.begin() + 1, result);
722*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, q[0]);
723*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2, q[1]);
724*635a8641SAndroid Build Coastguard Worker }
725*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,InsertFill)726*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, InsertFill) {
727*635a8641SAndroid Build Coastguard Worker circular_deque<int> q;
728*635a8641SAndroid Build Coastguard Worker
729*635a8641SAndroid Build Coastguard Worker // Fill when empty.
730*635a8641SAndroid Build Coastguard Worker q.insert(q.begin(), 2, 1);
731*635a8641SAndroid Build Coastguard Worker
732*635a8641SAndroid Build Coastguard Worker // 0's at the beginning.
733*635a8641SAndroid Build Coastguard Worker q.insert(q.begin(), 2, 0);
734*635a8641SAndroid Build Coastguard Worker
735*635a8641SAndroid Build Coastguard Worker // 50's in the middle (now at offset 3).
736*635a8641SAndroid Build Coastguard Worker q.insert(q.begin() + 3, 2, 50);
737*635a8641SAndroid Build Coastguard Worker
738*635a8641SAndroid Build Coastguard Worker // 200's at the end.
739*635a8641SAndroid Build Coastguard Worker q.insert(q.end(), 2, 200);
740*635a8641SAndroid Build Coastguard Worker
741*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(8u, q.size());
742*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, q[0]);
743*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, q[1]);
744*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, q[2]);
745*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(50, q[3]);
746*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(50, q[4]);
747*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, q[5]);
748*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(200, q[6]);
749*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(200, q[7]);
750*635a8641SAndroid Build Coastguard Worker }
751*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,InsertEraseRange)752*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, InsertEraseRange) {
753*635a8641SAndroid Build Coastguard Worker circular_deque<int> q;
754*635a8641SAndroid Build Coastguard Worker
755*635a8641SAndroid Build Coastguard Worker // Erase nothing from an empty deque should work.
756*635a8641SAndroid Build Coastguard Worker q.erase(q.begin(), q.end());
757*635a8641SAndroid Build Coastguard Worker
758*635a8641SAndroid Build Coastguard Worker // Loop index used below to shift the used items in the buffer.
759*635a8641SAndroid Build Coastguard Worker for (int i = 0; i < 10; i++) {
760*635a8641SAndroid Build Coastguard Worker circular_deque<int> source;
761*635a8641SAndroid Build Coastguard Worker
762*635a8641SAndroid Build Coastguard Worker // Fill empty range.
763*635a8641SAndroid Build Coastguard Worker q.insert(q.begin(), source.begin(), source.end());
764*635a8641SAndroid Build Coastguard Worker
765*635a8641SAndroid Build Coastguard Worker // Have some stuff to insert.
766*635a8641SAndroid Build Coastguard Worker source.push_back(1);
767*635a8641SAndroid Build Coastguard Worker source.push_back(2);
768*635a8641SAndroid Build Coastguard Worker
769*635a8641SAndroid Build Coastguard Worker q.insert(q.begin(), source.begin(), source.end());
770*635a8641SAndroid Build Coastguard Worker
771*635a8641SAndroid Build Coastguard Worker // Shift the used items in the buffer by i which will place the two used
772*635a8641SAndroid Build Coastguard Worker // elements in different places in the buffer each time through this loop.
773*635a8641SAndroid Build Coastguard Worker for (int shift_i = 0; shift_i < i; shift_i++) {
774*635a8641SAndroid Build Coastguard Worker q.push_back(0);
775*635a8641SAndroid Build Coastguard Worker q.pop_front();
776*635a8641SAndroid Build Coastguard Worker }
777*635a8641SAndroid Build Coastguard Worker
778*635a8641SAndroid Build Coastguard Worker // Set the two items to notable values so we can check for them later.
779*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(2u, q.size());
780*635a8641SAndroid Build Coastguard Worker q[0] = 100;
781*635a8641SAndroid Build Coastguard Worker q[1] = 101;
782*635a8641SAndroid Build Coastguard Worker
783*635a8641SAndroid Build Coastguard Worker // Insert at the beginning, middle (now at offset 3), and end.
784*635a8641SAndroid Build Coastguard Worker q.insert(q.begin(), source.begin(), source.end());
785*635a8641SAndroid Build Coastguard Worker q.insert(q.begin() + 3, source.begin(), source.end());
786*635a8641SAndroid Build Coastguard Worker q.insert(q.end(), source.begin(), source.end());
787*635a8641SAndroid Build Coastguard Worker
788*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(8u, q.size());
789*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, q[0]);
790*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2, q[1]);
791*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(100, q[2]); // First inserted one.
792*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, q[3]);
793*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2, q[4]);
794*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(101, q[5]); // First inserted second one.
795*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, q[6]);
796*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2, q[7]);
797*635a8641SAndroid Build Coastguard Worker
798*635a8641SAndroid Build Coastguard Worker // Now erase the inserted ranges. Try each subsection also with no items
799*635a8641SAndroid Build Coastguard Worker // being erased, which should be a no-op.
800*635a8641SAndroid Build Coastguard Worker auto result = q.erase(q.begin(), q.begin()); // No-op.
801*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q.begin(), result);
802*635a8641SAndroid Build Coastguard Worker result = q.erase(q.begin(), q.begin() + 2);
803*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q.begin(), result);
804*635a8641SAndroid Build Coastguard Worker
805*635a8641SAndroid Build Coastguard Worker result = q.erase(q.begin() + 1, q.begin() + 1); // No-op.
806*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q.begin() + 1, result);
807*635a8641SAndroid Build Coastguard Worker result = q.erase(q.begin() + 1, q.begin() + 3);
808*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q.begin() + 1, result);
809*635a8641SAndroid Build Coastguard Worker
810*635a8641SAndroid Build Coastguard Worker result = q.erase(q.end() - 2, q.end() - 2); // No-op.
811*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q.end() - 2, result);
812*635a8641SAndroid Build Coastguard Worker result = q.erase(q.end() - 2, q.end());
813*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q.end(), result);
814*635a8641SAndroid Build Coastguard Worker
815*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(2u, q.size());
816*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(100, q[0]);
817*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(101, q[1]);
818*635a8641SAndroid Build Coastguard Worker
819*635a8641SAndroid Build Coastguard Worker // Erase everything.
820*635a8641SAndroid Build Coastguard Worker result = q.erase(q.begin(), q.end());
821*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q.end(), result);
822*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(q.empty());
823*635a8641SAndroid Build Coastguard Worker }
824*635a8641SAndroid Build Coastguard Worker }
825*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,EmplaceMoveOnly)826*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, EmplaceMoveOnly) {
827*635a8641SAndroid Build Coastguard Worker int values[] = {1, 3};
828*635a8641SAndroid Build Coastguard Worker circular_deque<MoveOnlyInt> q(std::begin(values), std::end(values));
829*635a8641SAndroid Build Coastguard Worker
830*635a8641SAndroid Build Coastguard Worker q.emplace(q.begin(), MoveOnlyInt(0));
831*635a8641SAndroid Build Coastguard Worker q.emplace(q.begin() + 2, MoveOnlyInt(2));
832*635a8641SAndroid Build Coastguard Worker q.emplace(q.end(), MoveOnlyInt(4));
833*635a8641SAndroid Build Coastguard Worker
834*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(5u, q.size());
835*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, q[0].data());
836*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, q[1].data());
837*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2, q[2].data());
838*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(3, q[3].data());
839*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(4, q[4].data());
840*635a8641SAndroid Build Coastguard Worker }
841*635a8641SAndroid Build Coastguard Worker
TEST(CircularDeque,EmplaceFrontBackReturnsReference)842*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, EmplaceFrontBackReturnsReference) {
843*635a8641SAndroid Build Coastguard Worker circular_deque<int> q;
844*635a8641SAndroid Build Coastguard Worker q.reserve(2);
845*635a8641SAndroid Build Coastguard Worker
846*635a8641SAndroid Build Coastguard Worker int& front = q.emplace_front(1);
847*635a8641SAndroid Build Coastguard Worker int& back = q.emplace_back(2);
848*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(2u, q.size());
849*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, q[0]);
850*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2, q[1]);
851*635a8641SAndroid Build Coastguard Worker
852*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(&front, &q.front());
853*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(&back, &q.back());
854*635a8641SAndroid Build Coastguard Worker
855*635a8641SAndroid Build Coastguard Worker front = 3;
856*635a8641SAndroid Build Coastguard Worker back = 4;
857*635a8641SAndroid Build Coastguard Worker
858*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(2u, q.size());
859*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(3, q[0]);
860*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(4, q[1]);
861*635a8641SAndroid Build Coastguard Worker
862*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(&front, &q.front());
863*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(&back, &q.back());
864*635a8641SAndroid Build Coastguard Worker }
865*635a8641SAndroid Build Coastguard Worker
866*635a8641SAndroid Build Coastguard Worker /*
867*635a8641SAndroid Build Coastguard Worker This test should assert in a debug build. It tries to dereference an iterator
868*635a8641SAndroid Build Coastguard Worker after mutating the container. Uncomment to double-check that this works.
869*635a8641SAndroid Build Coastguard Worker TEST(CircularDeque, UseIteratorAfterMutate) {
870*635a8641SAndroid Build Coastguard Worker circular_deque<int> q;
871*635a8641SAndroid Build Coastguard Worker q.push_back(0);
872*635a8641SAndroid Build Coastguard Worker
873*635a8641SAndroid Build Coastguard Worker auto old_begin = q.begin();
874*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, *old_begin);
875*635a8641SAndroid Build Coastguard Worker
876*635a8641SAndroid Build Coastguard Worker q.push_back(1);
877*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, *old_begin); // Should DCHECK.
878*635a8641SAndroid Build Coastguard Worker }
879*635a8641SAndroid Build Coastguard Worker */
880*635a8641SAndroid Build Coastguard Worker
881*635a8641SAndroid Build Coastguard Worker } // namespace base
882