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