xref: /aosp_15_r20/external/libchrome/base/containers/circular_deque_unittest.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
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], &copy[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