1*61c4878aSAndroid Build Coastguard Worker // Copyright 2020 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker //
3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker // the License at
6*61c4878aSAndroid Build Coastguard Worker //
7*61c4878aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker //
9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker // the License.
14*61c4878aSAndroid Build Coastguard Worker
15*61c4878aSAndroid Build Coastguard Worker #include "pw_containers/inline_deque.h"
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard Worker #include <algorithm>
18*61c4878aSAndroid Build Coastguard Worker #include <array>
19*61c4878aSAndroid Build Coastguard Worker #include <cstddef>
20*61c4878aSAndroid Build Coastguard Worker
21*61c4878aSAndroid Build Coastguard Worker #include "pw_compilation_testing/negative_compilation.h"
22*61c4878aSAndroid Build Coastguard Worker #include "pw_containers/algorithm.h"
23*61c4878aSAndroid Build Coastguard Worker #include "pw_containers_private/test_helpers.h"
24*61c4878aSAndroid Build Coastguard Worker #include "pw_unit_test/framework.h"
25*61c4878aSAndroid Build Coastguard Worker
26*61c4878aSAndroid Build Coastguard Worker namespace pw::containers {
27*61c4878aSAndroid Build Coastguard Worker namespace {
28*61c4878aSAndroid Build Coastguard Worker
29*61c4878aSAndroid Build Coastguard Worker using namespace std::literals::string_view_literals;
30*61c4878aSAndroid Build Coastguard Worker using test::CopyOnly;
31*61c4878aSAndroid Build Coastguard Worker using test::Counter;
32*61c4878aSAndroid Build Coastguard Worker using test::MoveOnly;
33*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Construct_Sized)34*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Construct_Sized) {
35*61c4878aSAndroid Build Coastguard Worker InlineDeque<int, 3> deque;
36*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(deque.empty());
37*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.size(), 0u);
38*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.max_size(), 3u);
39*61c4878aSAndroid Build Coastguard Worker }
40*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Construct_GenericSized)41*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Construct_GenericSized) {
42*61c4878aSAndroid Build Coastguard Worker InlineDeque<int, 3> sized_deque;
43*61c4878aSAndroid Build Coastguard Worker InlineDeque<int>& deque(sized_deque);
44*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(deque.empty());
45*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.size(), 0u);
46*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.max_size(), 3u);
47*61c4878aSAndroid Build Coastguard Worker }
48*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Construct_CopySameCapacity)49*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Construct_CopySameCapacity) {
50*61c4878aSAndroid Build Coastguard Worker InlineDeque<CopyOnly, 4> deque(4, CopyOnly(123));
51*61c4878aSAndroid Build Coastguard Worker const auto& deque_ref = deque;
52*61c4878aSAndroid Build Coastguard Worker InlineDeque<CopyOnly, 4> copied(deque_ref);
53*61c4878aSAndroid Build Coastguard Worker
54*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(4u, deque.size());
55*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(123, deque[3].value);
56*61c4878aSAndroid Build Coastguard Worker
57*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(4u, copied.size());
58*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(123, copied[3].value);
59*61c4878aSAndroid Build Coastguard Worker }
60*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Construct_MoveSameCapacity)61*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Construct_MoveSameCapacity) {
62*61c4878aSAndroid Build Coastguard Worker InlineDeque<MoveOnly, 4> deque;
63*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(MoveOnly(1));
64*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(MoveOnly(2));
65*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(MoveOnly(3));
66*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(MoveOnly(4));
67*61c4878aSAndroid Build Coastguard Worker InlineDeque<MoveOnly, 4> moved(std::move(deque));
68*61c4878aSAndroid Build Coastguard Worker
69*61c4878aSAndroid Build Coastguard Worker // NOLINTNEXTLINE(bugprone-use-after-move)
70*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(0u, deque.size());
71*61c4878aSAndroid Build Coastguard Worker
72*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(4u, moved.size());
73*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(4, moved[3].value);
74*61c4878aSAndroid Build Coastguard Worker }
75*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Construct_CopyLargerCapacity)76*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Construct_CopyLargerCapacity) {
77*61c4878aSAndroid Build Coastguard Worker InlineDeque<CopyOnly, 4> deque(4, CopyOnly(123));
78*61c4878aSAndroid Build Coastguard Worker InlineDeque<CopyOnly, 5> copied(deque);
79*61c4878aSAndroid Build Coastguard Worker
80*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(4u, deque.size());
81*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(123, deque[3].value);
82*61c4878aSAndroid Build Coastguard Worker
83*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(4u, copied.size());
84*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(123, copied[3].value);
85*61c4878aSAndroid Build Coastguard Worker }
86*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Construct_MoveLargerCapacity)87*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Construct_MoveLargerCapacity) {
88*61c4878aSAndroid Build Coastguard Worker InlineDeque<MoveOnly, 4> deque;
89*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(MoveOnly(1));
90*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(MoveOnly(2));
91*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(MoveOnly(3));
92*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(MoveOnly(4));
93*61c4878aSAndroid Build Coastguard Worker InlineDeque<MoveOnly, 5> moved(std::move(deque));
94*61c4878aSAndroid Build Coastguard Worker
95*61c4878aSAndroid Build Coastguard Worker // NOLINTNEXTLINE(bugprone-use-after-move)
96*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(0u, deque.size());
97*61c4878aSAndroid Build Coastguard Worker
98*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(4u, moved.size());
99*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(4, moved[3].value);
100*61c4878aSAndroid Build Coastguard Worker }
101*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Construct_CopySmallerCapacity)102*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Construct_CopySmallerCapacity) {
103*61c4878aSAndroid Build Coastguard Worker InlineDeque<CopyOnly, 4> deque(3, CopyOnly(123));
104*61c4878aSAndroid Build Coastguard Worker InlineDeque<CopyOnly, 3> copied(deque);
105*61c4878aSAndroid Build Coastguard Worker
106*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(3u, deque.size());
107*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(123, deque[2].value);
108*61c4878aSAndroid Build Coastguard Worker
109*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(3u, copied.size());
110*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(123, copied[2].value);
111*61c4878aSAndroid Build Coastguard Worker }
112*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Destruct_ZeroLength)113*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Destruct_ZeroLength) {
114*61c4878aSAndroid Build Coastguard Worker Counter::Reset();
115*61c4878aSAndroid Build Coastguard Worker {
116*61c4878aSAndroid Build Coastguard Worker InlineDeque<Counter, 0> deque;
117*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.size(), 0u);
118*61c4878aSAndroid Build Coastguard Worker }
119*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::created, 0);
120*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::destroyed, 0);
121*61c4878aSAndroid Build Coastguard Worker }
122*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Destruct_Empty)123*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Destruct_Empty) {
124*61c4878aSAndroid Build Coastguard Worker Counter::Reset();
125*61c4878aSAndroid Build Coastguard Worker
126*61c4878aSAndroid Build Coastguard Worker {
127*61c4878aSAndroid Build Coastguard Worker InlineDeque<Counter, 3> deque;
128*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.size(), 0u);
129*61c4878aSAndroid Build Coastguard Worker }
130*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::created, 0);
131*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::destroyed, 0);
132*61c4878aSAndroid Build Coastguard Worker }
133*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Destruct_MultipleEntries)134*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Destruct_MultipleEntries) {
135*61c4878aSAndroid Build Coastguard Worker Counter value;
136*61c4878aSAndroid Build Coastguard Worker Counter::Reset();
137*61c4878aSAndroid Build Coastguard Worker
138*61c4878aSAndroid Build Coastguard Worker {
139*61c4878aSAndroid Build Coastguard Worker InlineDeque<Counter, 128> deque(100, value);
140*61c4878aSAndroid Build Coastguard Worker }
141*61c4878aSAndroid Build Coastguard Worker
142*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::created, 100);
143*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::destroyed, 100);
144*61c4878aSAndroid Build Coastguard Worker }
145*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Assign_InitializerList)146*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Assign_InitializerList) {
147*61c4878aSAndroid Build Coastguard Worker InlineDeque<int, 4> deque = {1, 3, 5, 7};
148*61c4878aSAndroid Build Coastguard Worker
149*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(4u, deque.size());
150*61c4878aSAndroid Build Coastguard Worker
151*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(1, deque[0]);
152*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(3, deque[1]);
153*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(5, deque[2]);
154*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(7, deque[3]);
155*61c4878aSAndroid Build Coastguard Worker }
156*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Assign_CopySameCapacity)157*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Assign_CopySameCapacity) {
158*61c4878aSAndroid Build Coastguard Worker InlineDeque<CopyOnly, 4> deque(4, CopyOnly(123));
159*61c4878aSAndroid Build Coastguard Worker InlineDeque<CopyOnly, 4> copied = deque;
160*61c4878aSAndroid Build Coastguard Worker
161*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(4u, deque.size());
162*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(123, deque[3].value);
163*61c4878aSAndroid Build Coastguard Worker
164*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(4u, copied.size());
165*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(123, copied[3].value);
166*61c4878aSAndroid Build Coastguard Worker }
167*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Assign_CopyLargerCapacity)168*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Assign_CopyLargerCapacity) {
169*61c4878aSAndroid Build Coastguard Worker InlineDeque<CopyOnly, 4> deque(4, CopyOnly(123));
170*61c4878aSAndroid Build Coastguard Worker InlineDeque<CopyOnly, 5> copied = deque;
171*61c4878aSAndroid Build Coastguard Worker
172*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(4u, deque.size());
173*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(123, deque[3].value);
174*61c4878aSAndroid Build Coastguard Worker
175*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(4u, copied.size());
176*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(123, copied[3].value);
177*61c4878aSAndroid Build Coastguard Worker }
178*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Assign_CopySmallerCapacity)179*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Assign_CopySmallerCapacity) {
180*61c4878aSAndroid Build Coastguard Worker InlineDeque<CopyOnly, 4> deque(3, CopyOnly(123));
181*61c4878aSAndroid Build Coastguard Worker InlineDeque<CopyOnly, 3> copied = deque;
182*61c4878aSAndroid Build Coastguard Worker
183*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(3u, deque.size());
184*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(123, deque[2].value);
185*61c4878aSAndroid Build Coastguard Worker
186*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(3u, copied.size());
187*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(123, copied[2].value);
188*61c4878aSAndroid Build Coastguard Worker }
189*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Assign_MoveSameCapacity)190*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Assign_MoveSameCapacity) {
191*61c4878aSAndroid Build Coastguard Worker InlineDeque<MoveOnly, 4> deque;
192*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(MoveOnly(1));
193*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(MoveOnly(2));
194*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(MoveOnly(3));
195*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(MoveOnly(4));
196*61c4878aSAndroid Build Coastguard Worker InlineDeque<MoveOnly, 4> moved = std::move(deque);
197*61c4878aSAndroid Build Coastguard Worker
198*61c4878aSAndroid Build Coastguard Worker // NOLINTNEXTLINE(bugprone-use-after-move)
199*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(0u, deque.size());
200*61c4878aSAndroid Build Coastguard Worker
201*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(4u, moved.size());
202*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(4, moved[3].value);
203*61c4878aSAndroid Build Coastguard Worker }
204*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Assign_MoveLargerCapacity)205*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Assign_MoveLargerCapacity) {
206*61c4878aSAndroid Build Coastguard Worker InlineDeque<MoveOnly, 4> deque;
207*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(MoveOnly(1));
208*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(MoveOnly(2));
209*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(MoveOnly(3));
210*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(MoveOnly(4));
211*61c4878aSAndroid Build Coastguard Worker InlineDeque<MoveOnly, 5> moved = std::move(deque);
212*61c4878aSAndroid Build Coastguard Worker
213*61c4878aSAndroid Build Coastguard Worker // NOLINTNEXTLINE(bugprone-use-after-move)
214*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(0u, deque.size());
215*61c4878aSAndroid Build Coastguard Worker
216*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(4u, moved.size());
217*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(4, moved[3].value);
218*61c4878aSAndroid Build Coastguard Worker }
219*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Assign_MoveSmallerCapacity)220*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Assign_MoveSmallerCapacity) {
221*61c4878aSAndroid Build Coastguard Worker InlineDeque<MoveOnly, 4> deque;
222*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(MoveOnly(1));
223*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(MoveOnly(2));
224*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(MoveOnly(3));
225*61c4878aSAndroid Build Coastguard Worker InlineDeque<MoveOnly, 3> moved = std::move(deque);
226*61c4878aSAndroid Build Coastguard Worker
227*61c4878aSAndroid Build Coastguard Worker // NOLINTNEXTLINE(bugprone-use-after-move)
228*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(0u, deque.size());
229*61c4878aSAndroid Build Coastguard Worker
230*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(3u, moved.size());
231*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(3, moved[2].value);
232*61c4878aSAndroid Build Coastguard Worker }
233*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Access_Iterator)234*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Access_Iterator) {
235*61c4878aSAndroid Build Coastguard Worker InlineDeque<Counter, 2> deque(2);
236*61c4878aSAndroid Build Coastguard Worker for (Counter& item : deque) {
237*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(item.value, 0);
238*61c4878aSAndroid Build Coastguard Worker }
239*61c4878aSAndroid Build Coastguard Worker for (const Counter& item : deque) {
240*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(item.value, 0);
241*61c4878aSAndroid Build Coastguard Worker }
242*61c4878aSAndroid Build Coastguard Worker }
243*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Access_ConstIterator)244*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Access_ConstIterator) {
245*61c4878aSAndroid Build Coastguard Worker const InlineDeque<Counter, 2> deque(2);
246*61c4878aSAndroid Build Coastguard Worker for (const Counter& item : deque) {
247*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(item.value, 0);
248*61c4878aSAndroid Build Coastguard Worker }
249*61c4878aSAndroid Build Coastguard Worker }
250*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Access_ZeroLength)251*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Access_ZeroLength) {
252*61c4878aSAndroid Build Coastguard Worker InlineDeque<Counter, 0> deque;
253*61c4878aSAndroid Build Coastguard Worker
254*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(0u, deque.size());
255*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(0u, deque.max_size());
256*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(deque.empty());
257*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(deque.full());
258*61c4878aSAndroid Build Coastguard Worker
259*61c4878aSAndroid Build Coastguard Worker for (Counter& item : deque) {
260*61c4878aSAndroid Build Coastguard Worker (void)item;
261*61c4878aSAndroid Build Coastguard Worker FAIL();
262*61c4878aSAndroid Build Coastguard Worker }
263*61c4878aSAndroid Build Coastguard Worker }
264*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Access_ContiguousData)265*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Access_ContiguousData) {
266*61c4878aSAndroid Build Coastguard Worker // Content = {}, Storage = [x, x]
267*61c4878aSAndroid Build Coastguard Worker InlineDeque<int, 2> deque;
268*61c4878aSAndroid Build Coastguard Worker
269*61c4878aSAndroid Build Coastguard Worker {
270*61c4878aSAndroid Build Coastguard Worker auto [first, second] = deque.contiguous_data();
271*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(first.size(), 0u);
272*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(second.size(), 0u);
273*61c4878aSAndroid Build Coastguard Worker }
274*61c4878aSAndroid Build Coastguard Worker
275*61c4878aSAndroid Build Coastguard Worker // Content = {1}, Storage = [1, x]
276*61c4878aSAndroid Build Coastguard Worker deque.push_back(1);
277*61c4878aSAndroid Build Coastguard Worker {
278*61c4878aSAndroid Build Coastguard Worker auto [first, second] = deque.contiguous_data();
279*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(Equal(first, std::array<int, 1>{1}));
280*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(Equal(second, std::array<int, 0>{}));
281*61c4878aSAndroid Build Coastguard Worker }
282*61c4878aSAndroid Build Coastguard Worker
283*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2}, Storage = [1, 2]
284*61c4878aSAndroid Build Coastguard Worker deque.push_back(2);
285*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(deque.full());
286*61c4878aSAndroid Build Coastguard Worker {
287*61c4878aSAndroid Build Coastguard Worker auto [first, second] = deque.contiguous_data();
288*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(Equal(first, std::array<int, 2>{1, 2}));
289*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(Equal(second, std::array<int, 0>{}));
290*61c4878aSAndroid Build Coastguard Worker }
291*61c4878aSAndroid Build Coastguard Worker
292*61c4878aSAndroid Build Coastguard Worker // Content = {2}, Storage = [x, 2]
293*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
294*61c4878aSAndroid Build Coastguard Worker {
295*61c4878aSAndroid Build Coastguard Worker auto [first, second] = deque.contiguous_data();
296*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(Equal(first, std::array<int, 1>{2}));
297*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(Equal(second, std::array<int, 0>{}));
298*61c4878aSAndroid Build Coastguard Worker }
299*61c4878aSAndroid Build Coastguard Worker
300*61c4878aSAndroid Build Coastguard Worker // Content = {2, 1}, Storage = [1, 2]
301*61c4878aSAndroid Build Coastguard Worker deque.push_back(1);
302*61c4878aSAndroid Build Coastguard Worker {
303*61c4878aSAndroid Build Coastguard Worker auto [first, second] = deque.contiguous_data();
304*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(Equal(first, std::array<int, 1>{2}));
305*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(Equal(second, std::array<int, 1>{1}));
306*61c4878aSAndroid Build Coastguard Worker }
307*61c4878aSAndroid Build Coastguard Worker
308*61c4878aSAndroid Build Coastguard Worker // Content = {1}, Storage = [1, x]
309*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
310*61c4878aSAndroid Build Coastguard Worker {
311*61c4878aSAndroid Build Coastguard Worker auto [first, second] = deque.contiguous_data();
312*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(Equal(first, std::array<int, 1>{1}));
313*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(Equal(second, std::array<int, 0>{}));
314*61c4878aSAndroid Build Coastguard Worker }
315*61c4878aSAndroid Build Coastguard Worker
316*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2}, Storage = [1, 2]
317*61c4878aSAndroid Build Coastguard Worker deque.push_back(2);
318*61c4878aSAndroid Build Coastguard Worker {
319*61c4878aSAndroid Build Coastguard Worker auto [first, second] = deque.contiguous_data();
320*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(Equal(first, std::array<int, 2>{1, 2}));
321*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(Equal(second, std::array<int, 0>{}));
322*61c4878aSAndroid Build Coastguard Worker }
323*61c4878aSAndroid Build Coastguard Worker }
324*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Access_ConstContiguousData)325*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Access_ConstContiguousData) {
326*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2}, Storage = [1, 2]
327*61c4878aSAndroid Build Coastguard Worker const InlineDeque<int, 2> deque = {1, 2};
328*61c4878aSAndroid Build Coastguard Worker
329*61c4878aSAndroid Build Coastguard Worker {
330*61c4878aSAndroid Build Coastguard Worker auto [first, second] = deque.contiguous_data();
331*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(first.size(), 2u);
332*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(second.size(), 0u);
333*61c4878aSAndroid Build Coastguard Worker }
334*61c4878aSAndroid Build Coastguard Worker }
335*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Modify_Clear)336*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Modify_Clear) {
337*61c4878aSAndroid Build Coastguard Worker Counter::Reset();
338*61c4878aSAndroid Build Coastguard Worker
339*61c4878aSAndroid Build Coastguard Worker InlineDeque<Counter, 100> deque;
340*61c4878aSAndroid Build Coastguard Worker deque.emplace_back();
341*61c4878aSAndroid Build Coastguard Worker deque.emplace_back();
342*61c4878aSAndroid Build Coastguard Worker deque.emplace_back();
343*61c4878aSAndroid Build Coastguard Worker
344*61c4878aSAndroid Build Coastguard Worker deque.clear();
345*61c4878aSAndroid Build Coastguard Worker
346*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(3, Counter::created);
347*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(3, Counter::destroyed);
348*61c4878aSAndroid Build Coastguard Worker }
349*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Modify_PushBack_Copy)350*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Modify_PushBack_Copy) {
351*61c4878aSAndroid Build Coastguard Worker Counter value(99);
352*61c4878aSAndroid Build Coastguard Worker Counter::Reset();
353*61c4878aSAndroid Build Coastguard Worker
354*61c4878aSAndroid Build Coastguard Worker {
355*61c4878aSAndroid Build Coastguard Worker InlineDeque<Counter, 10> deque;
356*61c4878aSAndroid Build Coastguard Worker deque.push_back(value);
357*61c4878aSAndroid Build Coastguard Worker
358*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(deque.size(), 1u);
359*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.front().value, 99);
360*61c4878aSAndroid Build Coastguard Worker }
361*61c4878aSAndroid Build Coastguard Worker
362*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::created, 1);
363*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::destroyed, 1);
364*61c4878aSAndroid Build Coastguard Worker }
365*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Modify_PushBack_Move)366*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Modify_PushBack_Move) {
367*61c4878aSAndroid Build Coastguard Worker Counter::Reset();
368*61c4878aSAndroid Build Coastguard Worker
369*61c4878aSAndroid Build Coastguard Worker {
370*61c4878aSAndroid Build Coastguard Worker Counter value(99);
371*61c4878aSAndroid Build Coastguard Worker InlineDeque<Counter, 10> deque;
372*61c4878aSAndroid Build Coastguard Worker deque.push_back(std::move(value));
373*61c4878aSAndroid Build Coastguard Worker
374*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.size(), 1u);
375*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.front().value, 99);
376*61c4878aSAndroid Build Coastguard Worker // NOLINTNEXTLINE(bugprone-use-after-move)
377*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value.value, 0);
378*61c4878aSAndroid Build Coastguard Worker }
379*61c4878aSAndroid Build Coastguard Worker
380*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::created, 1);
381*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::destroyed, 2);
382*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::moved, 1);
383*61c4878aSAndroid Build Coastguard Worker }
384*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Modify_EmplaceBack)385*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Modify_EmplaceBack) {
386*61c4878aSAndroid Build Coastguard Worker Counter::Reset();
387*61c4878aSAndroid Build Coastguard Worker
388*61c4878aSAndroid Build Coastguard Worker {
389*61c4878aSAndroid Build Coastguard Worker InlineDeque<Counter, 10> deque;
390*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(314);
391*61c4878aSAndroid Build Coastguard Worker
392*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(deque.size(), 1u);
393*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.front().value, 314);
394*61c4878aSAndroid Build Coastguard Worker }
395*61c4878aSAndroid Build Coastguard Worker
396*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::created, 1);
397*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::destroyed, 1);
398*61c4878aSAndroid Build Coastguard Worker }
399*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Modify_WrapForwards)400*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Modify_WrapForwards) {
401*61c4878aSAndroid Build Coastguard Worker Counter::Reset();
402*61c4878aSAndroid Build Coastguard Worker
403*61c4878aSAndroid Build Coastguard Worker {
404*61c4878aSAndroid Build Coastguard Worker InlineDeque<Counter, 3> deque;
405*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(1);
406*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(2);
407*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(3);
408*61c4878aSAndroid Build Coastguard Worker
409*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(deque.size(), 3u);
410*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque[0].value, 1);
411*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.front().value, 1);
412*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque[1].value, 2);
413*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque[2].value, 3);
414*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.back().value, 3);
415*61c4878aSAndroid Build Coastguard Worker
416*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
417*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(4);
418*61c4878aSAndroid Build Coastguard Worker
419*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(deque.size(), 3u);
420*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque[0].value, 2);
421*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.front().value, 2);
422*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque[1].value, 3);
423*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque[2].value, 4);
424*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.back().value, 4);
425*61c4878aSAndroid Build Coastguard Worker }
426*61c4878aSAndroid Build Coastguard Worker
427*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::created, 4);
428*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::destroyed, 4);
429*61c4878aSAndroid Build Coastguard Worker }
430*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Modify_WrapBackwards)431*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Modify_WrapBackwards) {
432*61c4878aSAndroid Build Coastguard Worker Counter::Reset();
433*61c4878aSAndroid Build Coastguard Worker
434*61c4878aSAndroid Build Coastguard Worker {
435*61c4878aSAndroid Build Coastguard Worker InlineDeque<Counter, 3> deque;
436*61c4878aSAndroid Build Coastguard Worker deque.emplace_front(1);
437*61c4878aSAndroid Build Coastguard Worker deque.emplace_front(2);
438*61c4878aSAndroid Build Coastguard Worker deque.emplace_front(3);
439*61c4878aSAndroid Build Coastguard Worker
440*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(deque.size(), 3u);
441*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque[0].value, 3);
442*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.front().value, 3);
443*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque[1].value, 2);
444*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque[2].value, 1);
445*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.back().value, 1);
446*61c4878aSAndroid Build Coastguard Worker
447*61c4878aSAndroid Build Coastguard Worker deque.pop_back();
448*61c4878aSAndroid Build Coastguard Worker deque.emplace_front(4);
449*61c4878aSAndroid Build Coastguard Worker
450*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(deque.size(), 3u);
451*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque[0].value, 4);
452*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.front().value, 4);
453*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque[1].value, 3);
454*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque[2].value, 2);
455*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.back().value, 2);
456*61c4878aSAndroid Build Coastguard Worker }
457*61c4878aSAndroid Build Coastguard Worker
458*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::created, 4);
459*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::destroyed, 4);
460*61c4878aSAndroid Build Coastguard Worker }
461*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Modify_PushFront_Copy)462*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Modify_PushFront_Copy) {
463*61c4878aSAndroid Build Coastguard Worker Counter value(99);
464*61c4878aSAndroid Build Coastguard Worker Counter::Reset();
465*61c4878aSAndroid Build Coastguard Worker
466*61c4878aSAndroid Build Coastguard Worker {
467*61c4878aSAndroid Build Coastguard Worker InlineDeque<Counter, 10> deque;
468*61c4878aSAndroid Build Coastguard Worker deque.push_front(value);
469*61c4878aSAndroid Build Coastguard Worker
470*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.size(), 1u);
471*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.front().value, 99);
472*61c4878aSAndroid Build Coastguard Worker }
473*61c4878aSAndroid Build Coastguard Worker
474*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::created, 1);
475*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::destroyed, 1);
476*61c4878aSAndroid Build Coastguard Worker }
477*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Modify_PushFront_Move)478*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Modify_PushFront_Move) {
479*61c4878aSAndroid Build Coastguard Worker Counter::Reset();
480*61c4878aSAndroid Build Coastguard Worker
481*61c4878aSAndroid Build Coastguard Worker {
482*61c4878aSAndroid Build Coastguard Worker Counter value(99);
483*61c4878aSAndroid Build Coastguard Worker InlineDeque<Counter, 10> deque;
484*61c4878aSAndroid Build Coastguard Worker deque.push_front(std::move(value));
485*61c4878aSAndroid Build Coastguard Worker
486*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.size(), 1u);
487*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.front().value, 99);
488*61c4878aSAndroid Build Coastguard Worker // NOLINTNEXTLINE(bugprone-use-after-move)
489*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value.value, 0);
490*61c4878aSAndroid Build Coastguard Worker }
491*61c4878aSAndroid Build Coastguard Worker
492*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::created, 1);
493*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::destroyed, 2);
494*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::moved, 1);
495*61c4878aSAndroid Build Coastguard Worker }
496*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Modify_EmplaceFront)497*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Modify_EmplaceFront) {
498*61c4878aSAndroid Build Coastguard Worker Counter::Reset();
499*61c4878aSAndroid Build Coastguard Worker
500*61c4878aSAndroid Build Coastguard Worker {
501*61c4878aSAndroid Build Coastguard Worker InlineDeque<Counter, 10> deque;
502*61c4878aSAndroid Build Coastguard Worker deque.emplace_front(314);
503*61c4878aSAndroid Build Coastguard Worker
504*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.size(), 1u);
505*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.front().value, 314);
506*61c4878aSAndroid Build Coastguard Worker }
507*61c4878aSAndroid Build Coastguard Worker
508*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::created, 1);
509*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::destroyed, 1);
510*61c4878aSAndroid Build Coastguard Worker }
511*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Modify_PopBack)512*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Modify_PopBack) {
513*61c4878aSAndroid Build Coastguard Worker Counter::Reset();
514*61c4878aSAndroid Build Coastguard Worker
515*61c4878aSAndroid Build Coastguard Worker InlineDeque<Counter, 3> deque;
516*61c4878aSAndroid Build Coastguard Worker deque.emplace_front(1); // This wraps to the other end.
517*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(2); // This is the first entry in storage.
518*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(3);
519*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3}, Storage = [2, 3, 1]
520*61c4878aSAndroid Build Coastguard Worker
521*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(deque.size(), 3u);
522*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque[0].value, 1);
523*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque[1].value, 2);
524*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque[2].value, 3);
525*61c4878aSAndroid Build Coastguard Worker
526*61c4878aSAndroid Build Coastguard Worker deque.pop_back();
527*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2}, Storage = [2, x, 1]
528*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(deque.size(), 2u);
529*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque[0].value, 1);
530*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque[1].value, 2);
531*61c4878aSAndroid Build Coastguard Worker
532*61c4878aSAndroid Build Coastguard Worker // This wraps around.
533*61c4878aSAndroid Build Coastguard Worker deque.pop_back();
534*61c4878aSAndroid Build Coastguard Worker // Content = {1}, Storage = [x, x, 1]
535*61c4878aSAndroid Build Coastguard Worker
536*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(deque.size(), 1u);
537*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque[0].value, 1);
538*61c4878aSAndroid Build Coastguard Worker
539*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::created, 3);
540*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::destroyed, 2);
541*61c4878aSAndroid Build Coastguard Worker }
542*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Modify_PopFront)543*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Modify_PopFront) {
544*61c4878aSAndroid Build Coastguard Worker Counter::Reset();
545*61c4878aSAndroid Build Coastguard Worker
546*61c4878aSAndroid Build Coastguard Worker InlineDeque<Counter, 3> deque;
547*61c4878aSAndroid Build Coastguard Worker deque.emplace_front(1); // This wraps to the other end.
548*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(2); // This is the first entry in storage.
549*61c4878aSAndroid Build Coastguard Worker deque.emplace_back(3);
550*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3}, Storage = [2, 3, 1]
551*61c4878aSAndroid Build Coastguard Worker
552*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(deque.size(), 3u);
553*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque[0].value, 1);
554*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque[1].value, 2);
555*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque[2].value, 3);
556*61c4878aSAndroid Build Coastguard Worker
557*61c4878aSAndroid Build Coastguard Worker // This wraps around
558*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
559*61c4878aSAndroid Build Coastguard Worker // Content = {2, 3}, Storage = [2, 3, x]
560*61c4878aSAndroid Build Coastguard Worker
561*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.size(), 2u);
562*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque[0].value, 2);
563*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque[1].value, 3);
564*61c4878aSAndroid Build Coastguard Worker
565*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
566*61c4878aSAndroid Build Coastguard Worker // Content = {3}, Storage = [x, 3, x]
567*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(deque.size(), 1u);
568*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque[0].value, 3);
569*61c4878aSAndroid Build Coastguard Worker
570*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::created, 3);
571*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Counter::destroyed, 2);
572*61c4878aSAndroid Build Coastguard Worker }
573*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Modify_Resize_Larger)574*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Modify_Resize_Larger) {
575*61c4878aSAndroid Build Coastguard Worker InlineDeque<CopyOnly, 10> deque(1, CopyOnly(123));
576*61c4878aSAndroid Build Coastguard Worker deque.resize(3, CopyOnly(123));
577*61c4878aSAndroid Build Coastguard Worker
578*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.size(), 3u);
579*61c4878aSAndroid Build Coastguard Worker for (auto& i : deque) {
580*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(i.value, 123);
581*61c4878aSAndroid Build Coastguard Worker }
582*61c4878aSAndroid Build Coastguard Worker }
583*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Modify_Resize_LargerThanMax)584*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Modify_Resize_LargerThanMax) {
585*61c4878aSAndroid Build Coastguard Worker InlineDeque<CopyOnly, 10> deque;
586*61c4878aSAndroid Build Coastguard Worker deque.resize(1000, CopyOnly(123));
587*61c4878aSAndroid Build Coastguard Worker
588*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.size(), 10u);
589*61c4878aSAndroid Build Coastguard Worker for (auto& i : deque) {
590*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(i.value, 123);
591*61c4878aSAndroid Build Coastguard Worker }
592*61c4878aSAndroid Build Coastguard Worker }
593*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Modify_Resize_Smaller)594*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Modify_Resize_Smaller) {
595*61c4878aSAndroid Build Coastguard Worker InlineDeque<CopyOnly, 10> deque(9, CopyOnly(123));
596*61c4878aSAndroid Build Coastguard Worker deque.resize(3, CopyOnly(123));
597*61c4878aSAndroid Build Coastguard Worker
598*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.size(), 3u);
599*61c4878aSAndroid Build Coastguard Worker for (auto& i : deque) {
600*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(i.value, 123);
601*61c4878aSAndroid Build Coastguard Worker }
602*61c4878aSAndroid Build Coastguard Worker }
603*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Modify_Resize_Zero)604*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Modify_Resize_Zero) {
605*61c4878aSAndroid Build Coastguard Worker InlineDeque<CopyOnly, 10> deque(10, CopyOnly(123));
606*61c4878aSAndroid Build Coastguard Worker deque.resize(0, CopyOnly(123));
607*61c4878aSAndroid Build Coastguard Worker
608*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.size(), 0u);
609*61c4878aSAndroid Build Coastguard Worker }
610*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,Generic)611*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, Generic) {
612*61c4878aSAndroid Build Coastguard Worker InlineDeque<int, 10> deque;
613*61c4878aSAndroid Build Coastguard Worker InlineDeque<int>& generic_deque(deque);
614*61c4878aSAndroid Build Coastguard Worker generic_deque = {1, 2, 3, 4, 5};
615*61c4878aSAndroid Build Coastguard Worker
616*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(generic_deque.size(), deque.size());
617*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(generic_deque.max_size(), deque.max_size());
618*61c4878aSAndroid Build Coastguard Worker
619*61c4878aSAndroid Build Coastguard Worker unsigned short i = 0;
620*61c4878aSAndroid Build Coastguard Worker for (int value : deque) {
621*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, generic_deque[i]);
622*61c4878aSAndroid Build Coastguard Worker i += 1;
623*61c4878aSAndroid Build Coastguard Worker }
624*61c4878aSAndroid Build Coastguard Worker
625*61c4878aSAndroid Build Coastguard Worker i = 0;
626*61c4878aSAndroid Build Coastguard Worker for (int value : generic_deque) {
627*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque[i], value);
628*61c4878aSAndroid Build Coastguard Worker i += 1;
629*61c4878aSAndroid Build Coastguard Worker }
630*61c4878aSAndroid Build Coastguard Worker }
631*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,ConstexprMaxSize)632*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, ConstexprMaxSize) {
633*61c4878aSAndroid Build Coastguard Worker InlineDeque<int, 10> deque;
634*61c4878aSAndroid Build Coastguard Worker constexpr size_t kMaxSize = deque.max_size();
635*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(deque.max_size(), kMaxSize);
636*61c4878aSAndroid Build Coastguard Worker
637*61c4878aSAndroid Build Coastguard Worker // Ensure the generic sized container does not have a constexpr max_size().
638*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] InlineDeque<int>& generic_deque(deque);
639*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(InlineDeque_GenericMaxSize_NotConstexpr)
640*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT_CLANG(
641*61c4878aSAndroid Build Coastguard Worker "kGenericMaxSize.* must be initialized by a constant expression");
642*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT_GCC("call to non-'constexpr' function .*InlineDeque.*max_size");
643*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr size_t kGenericMaxSize = generic_deque.max_size();
644*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
645*61c4878aSAndroid Build Coastguard Worker }
646*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,StdMaxElement)647*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, StdMaxElement) {
648*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3, 4}, Storage = [1, 2, 3, 4]
649*61c4878aSAndroid Build Coastguard Worker InlineDeque<int, 4> deque = {1, 2, 3, 4};
650*61c4878aSAndroid Build Coastguard Worker
651*61c4878aSAndroid Build Coastguard Worker auto max_element_it = std::max_element(deque.begin(), deque.end());
652*61c4878aSAndroid Build Coastguard Worker ASSERT_NE(max_element_it, deque.end());
653*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(*max_element_it, 4);
654*61c4878aSAndroid Build Coastguard Worker
655*61c4878aSAndroid Build Coastguard Worker // Content = {2, 3, 4}, Storage = [x, 2, 3, 4]
656*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
657*61c4878aSAndroid Build Coastguard Worker
658*61c4878aSAndroid Build Coastguard Worker max_element_it = std::max_element(deque.begin(), deque.end());
659*61c4878aSAndroid Build Coastguard Worker ASSERT_NE(max_element_it, deque.end());
660*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(*max_element_it, 4);
661*61c4878aSAndroid Build Coastguard Worker
662*61c4878aSAndroid Build Coastguard Worker // Content = {2, 3, 4, 5}, Storage = [5, 2, 3, 4]
663*61c4878aSAndroid Build Coastguard Worker deque.push_back(5);
664*61c4878aSAndroid Build Coastguard Worker max_element_it = std::max_element(deque.begin(), deque.end());
665*61c4878aSAndroid Build Coastguard Worker ASSERT_NE(max_element_it, deque.end());
666*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(*max_element_it, 5);
667*61c4878aSAndroid Build Coastguard Worker
668*61c4878aSAndroid Build Coastguard Worker // Content = {}, Storage = [x, x, x, x]
669*61c4878aSAndroid Build Coastguard Worker deque.clear();
670*61c4878aSAndroid Build Coastguard Worker
671*61c4878aSAndroid Build Coastguard Worker max_element_it = std::max_element(deque.begin(), deque.end());
672*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(max_element_it, deque.end());
673*61c4878aSAndroid Build Coastguard Worker }
674*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,StdMaxElementConst)675*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, StdMaxElementConst) {
676*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3, 4}, Storage = [1, 2, 3, 4]
677*61c4878aSAndroid Build Coastguard Worker InlineDeque<int, 4> deque = {1, 2, 3, 4};
678*61c4878aSAndroid Build Coastguard Worker
679*61c4878aSAndroid Build Coastguard Worker auto max_element_it = std::max_element(deque.cbegin(), deque.cend());
680*61c4878aSAndroid Build Coastguard Worker ASSERT_NE(max_element_it, deque.cend());
681*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(*max_element_it, 4);
682*61c4878aSAndroid Build Coastguard Worker
683*61c4878aSAndroid Build Coastguard Worker // Content = {2, 3, 4}, Storage = [x, 2, 3, 4]
684*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
685*61c4878aSAndroid Build Coastguard Worker
686*61c4878aSAndroid Build Coastguard Worker max_element_it = std::max_element(deque.cbegin(), deque.cend());
687*61c4878aSAndroid Build Coastguard Worker ASSERT_NE(max_element_it, deque.cend());
688*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(*max_element_it, 4);
689*61c4878aSAndroid Build Coastguard Worker
690*61c4878aSAndroid Build Coastguard Worker // Content = {2, 3, 4, 5}, Storage = [5, 2, 3, 4]
691*61c4878aSAndroid Build Coastguard Worker deque.push_back(5);
692*61c4878aSAndroid Build Coastguard Worker max_element_it = std::max_element(deque.cbegin(), deque.cend());
693*61c4878aSAndroid Build Coastguard Worker ASSERT_NE(max_element_it, deque.cend());
694*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(*max_element_it, 5);
695*61c4878aSAndroid Build Coastguard Worker
696*61c4878aSAndroid Build Coastguard Worker // Content = {}, Storage = [x, x, x, x]
697*61c4878aSAndroid Build Coastguard Worker deque.clear();
698*61c4878aSAndroid Build Coastguard Worker
699*61c4878aSAndroid Build Coastguard Worker max_element_it = std::max_element(deque.cbegin(), deque.cend());
700*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(max_element_it, deque.cend());
701*61c4878aSAndroid Build Coastguard Worker }
702*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,OperatorPlus)703*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, OperatorPlus) {
704*61c4878aSAndroid Build Coastguard Worker // Content = {0, 0, 1, 2}, Storage = [0, 0, 1, 2]
705*61c4878aSAndroid Build Coastguard Worker InlineDeque<int, 4> deque = {0, 0, 1, 2};
706*61c4878aSAndroid Build Coastguard Worker // Content = {0, 1, 2}, Storage = [x, 0, 1, 2]
707*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
708*61c4878aSAndroid Build Coastguard Worker // Content = {0, 1, 2, 3}, Storage = [3, 0, 1, 2]
709*61c4878aSAndroid Build Coastguard Worker deque.push_back(3);
710*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3}, Storage = [3, x, 1, 2]
711*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
712*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3, 4}, Storage = [3, 4, 1, 2]
713*61c4878aSAndroid Build Coastguard Worker deque.push_back(4);
714*61c4878aSAndroid Build Coastguard Worker
715*61c4878aSAndroid Build Coastguard Worker for (int i = 0; i < 4; i++) {
716*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(*(deque.begin() + i), static_cast<int>(i + 1));
717*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(*(i + deque.begin()), static_cast<int>(i + 1));
718*61c4878aSAndroid Build Coastguard Worker }
719*61c4878aSAndroid Build Coastguard Worker
720*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(deque.begin() + deque.size(), deque.end());
721*61c4878aSAndroid Build Coastguard Worker }
722*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,OperatorPlusPlus)723*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, OperatorPlusPlus) {
724*61c4878aSAndroid Build Coastguard Worker // Content = {0, 0, 1, 2}, Storage = [0, 0, 1, 2]
725*61c4878aSAndroid Build Coastguard Worker InlineDeque<int, 4> deque = {0, 0, 1, 2};
726*61c4878aSAndroid Build Coastguard Worker // Content = {0, 1, 2}, Storage = [x, 0, 1, 2]
727*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
728*61c4878aSAndroid Build Coastguard Worker // Content = {0, 1, 2, 3}, Storage = [3, 0, 1, 2]
729*61c4878aSAndroid Build Coastguard Worker deque.push_back(3);
730*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3}, Storage = [3, x, 1, 2]
731*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
732*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3, 4}, Storage = [3, 4, 1, 2]
733*61c4878aSAndroid Build Coastguard Worker deque.push_back(4);
734*61c4878aSAndroid Build Coastguard Worker
735*61c4878aSAndroid Build Coastguard Worker auto it = deque.begin();
736*61c4878aSAndroid Build Coastguard Worker
737*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(*it, 1);
738*61c4878aSAndroid Build Coastguard Worker it++;
739*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(*it, 2);
740*61c4878aSAndroid Build Coastguard Worker it++;
741*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(*it, 3);
742*61c4878aSAndroid Build Coastguard Worker it++;
743*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(*it, 4);
744*61c4878aSAndroid Build Coastguard Worker it++;
745*61c4878aSAndroid Build Coastguard Worker
746*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(it, deque.end());
747*61c4878aSAndroid Build Coastguard Worker }
748*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,OperatorPlusEquals)749*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, OperatorPlusEquals) {
750*61c4878aSAndroid Build Coastguard Worker // Content = {0, 0, 1, 2}, Storage = [0, 0, 1, 2]
751*61c4878aSAndroid Build Coastguard Worker InlineDeque<int, 4> deque = {0, 0, 1, 2};
752*61c4878aSAndroid Build Coastguard Worker // Content = {0, 1, 2}, Storage = [x, 0, 1, 2]
753*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
754*61c4878aSAndroid Build Coastguard Worker // Content = {0, 1, 2, 3}, Storage = [3, 0, 1, 2]
755*61c4878aSAndroid Build Coastguard Worker deque.push_back(3);
756*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3}, Storage = [3, x, 1, 2]
757*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
758*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3, 4}, Storage = [3, 4, 1, 2]
759*61c4878aSAndroid Build Coastguard Worker deque.push_back(4);
760*61c4878aSAndroid Build Coastguard Worker
761*61c4878aSAndroid Build Coastguard Worker auto it = deque.begin();
762*61c4878aSAndroid Build Coastguard Worker
763*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(*it, 1);
764*61c4878aSAndroid Build Coastguard Worker it += 1;
765*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(*it, 2);
766*61c4878aSAndroid Build Coastguard Worker it += 1;
767*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(*it, 3);
768*61c4878aSAndroid Build Coastguard Worker it += 1;
769*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(*it, 4);
770*61c4878aSAndroid Build Coastguard Worker it += 1;
771*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(it, deque.end());
772*61c4878aSAndroid Build Coastguard Worker
773*61c4878aSAndroid Build Coastguard Worker it = deque.begin();
774*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(*it, 1);
775*61c4878aSAndroid Build Coastguard Worker it += 2;
776*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(*it, 3);
777*61c4878aSAndroid Build Coastguard Worker it += 2;
778*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(it, deque.end());
779*61c4878aSAndroid Build Coastguard Worker
780*61c4878aSAndroid Build Coastguard Worker it = deque.begin();
781*61c4878aSAndroid Build Coastguard Worker it += deque.size();
782*61c4878aSAndroid Build Coastguard Worker
783*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(it, deque.end());
784*61c4878aSAndroid Build Coastguard Worker }
785*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,OpeartorMinus)786*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, OpeartorMinus) {
787*61c4878aSAndroid Build Coastguard Worker // Content = {0, 0, 1, 2}, Storage = [0, 0, 1, 2]
788*61c4878aSAndroid Build Coastguard Worker InlineDeque<int, 4> deque = {0, 0, 1, 2};
789*61c4878aSAndroid Build Coastguard Worker // Content = {0, 1, 2}, Storage = [x, 0, 1, 2]
790*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
791*61c4878aSAndroid Build Coastguard Worker // Content = {0, 1, 2, 3}, Storage = [3, 0, 1, 2]
792*61c4878aSAndroid Build Coastguard Worker deque.push_back(3);
793*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3}, Storage = [3, x, 1, 2]
794*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
795*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3, 4}, Storage = [3, 4, 1, 2]
796*61c4878aSAndroid Build Coastguard Worker deque.push_back(4);
797*61c4878aSAndroid Build Coastguard Worker
798*61c4878aSAndroid Build Coastguard Worker for (int i = 1; i <= 4; i++) {
799*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(*(deque.end() - i), static_cast<int>(5 - i));
800*61c4878aSAndroid Build Coastguard Worker }
801*61c4878aSAndroid Build Coastguard Worker
802*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(deque.end() - deque.size(), deque.begin());
803*61c4878aSAndroid Build Coastguard Worker }
TEST(InlineDeque,OperatorMinusMinus)804*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, OperatorMinusMinus) {
805*61c4878aSAndroid Build Coastguard Worker // Content = {0, 0, 1, 2}, Storage = [0, 0, 1, 2]
806*61c4878aSAndroid Build Coastguard Worker InlineDeque<int, 4> deque = {0, 0, 1, 2};
807*61c4878aSAndroid Build Coastguard Worker // Content = {0, 1, 2}, Storage = [x, 0, 1, 2]
808*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
809*61c4878aSAndroid Build Coastguard Worker // Content = {0, 1, 2, 3}, Storage = [3, 0, 1, 2]
810*61c4878aSAndroid Build Coastguard Worker deque.push_back(3);
811*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3}, Storage = [3, x, 1, 2]
812*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
813*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3, 4}, Storage = [3, 4, 1, 2]
814*61c4878aSAndroid Build Coastguard Worker deque.push_back(4);
815*61c4878aSAndroid Build Coastguard Worker
816*61c4878aSAndroid Build Coastguard Worker auto it = deque.end();
817*61c4878aSAndroid Build Coastguard Worker
818*61c4878aSAndroid Build Coastguard Worker it--;
819*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(*it, 4);
820*61c4878aSAndroid Build Coastguard Worker it--;
821*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(*it, 3);
822*61c4878aSAndroid Build Coastguard Worker it--;
823*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(*it, 2);
824*61c4878aSAndroid Build Coastguard Worker it--;
825*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(*it, 1);
826*61c4878aSAndroid Build Coastguard Worker
827*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(it, deque.begin());
828*61c4878aSAndroid Build Coastguard Worker }
829*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,OperatorMinusEquals)830*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, OperatorMinusEquals) {
831*61c4878aSAndroid Build Coastguard Worker // Content = {0, 0, 1, 2}, Storage = [0, 0, 1, 2]
832*61c4878aSAndroid Build Coastguard Worker InlineDeque<int, 4> deque = {0, 0, 1, 2};
833*61c4878aSAndroid Build Coastguard Worker // Content = {0, 1, 2}, Storage = [x, 0, 1, 2]
834*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
835*61c4878aSAndroid Build Coastguard Worker // Content = {0, 1, 2, 3}, Storage = [3, 0, 1, 2]
836*61c4878aSAndroid Build Coastguard Worker deque.push_back(3);
837*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3}, Storage = [3, x, 1, 2]
838*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
839*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3, 4}, Storage = [3, 4, 1, 2]
840*61c4878aSAndroid Build Coastguard Worker deque.push_back(4);
841*61c4878aSAndroid Build Coastguard Worker
842*61c4878aSAndroid Build Coastguard Worker auto it = deque.end();
843*61c4878aSAndroid Build Coastguard Worker
844*61c4878aSAndroid Build Coastguard Worker it -= 1;
845*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(*it, 4);
846*61c4878aSAndroid Build Coastguard Worker it -= 1;
847*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(*it, 3);
848*61c4878aSAndroid Build Coastguard Worker it -= 1;
849*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(*it, 2);
850*61c4878aSAndroid Build Coastguard Worker it -= 1;
851*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(*it, 1);
852*61c4878aSAndroid Build Coastguard Worker
853*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(it, deque.begin());
854*61c4878aSAndroid Build Coastguard Worker
855*61c4878aSAndroid Build Coastguard Worker it = deque.end();
856*61c4878aSAndroid Build Coastguard Worker
857*61c4878aSAndroid Build Coastguard Worker it -= 2;
858*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(*it, 3);
859*61c4878aSAndroid Build Coastguard Worker it -= 2;
860*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(*it, 1);
861*61c4878aSAndroid Build Coastguard Worker
862*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(it, deque.begin());
863*61c4878aSAndroid Build Coastguard Worker
864*61c4878aSAndroid Build Coastguard Worker it = deque.end();
865*61c4878aSAndroid Build Coastguard Worker it -= deque.size();
866*61c4878aSAndroid Build Coastguard Worker
867*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(it, deque.begin());
868*61c4878aSAndroid Build Coastguard Worker }
869*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,OperatorSquareBracket)870*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, OperatorSquareBracket) {
871*61c4878aSAndroid Build Coastguard Worker // Content = {0, 0, 1, 2}, Storage = [0, 0, 1, 2]
872*61c4878aSAndroid Build Coastguard Worker InlineDeque<int, 4> deque = {0, 0, 1, 2};
873*61c4878aSAndroid Build Coastguard Worker // Content = {0, 1, 2}, Storage = [x, 0, 1, 2]
874*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
875*61c4878aSAndroid Build Coastguard Worker // Content = {0, 1, 2, 3}, Storage = [3, 0, 1, 2]
876*61c4878aSAndroid Build Coastguard Worker deque.push_back(3);
877*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3}, Storage = [3, x, 1, 2]
878*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
879*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3, 4}, Storage = [3, 4, 1, 2]
880*61c4878aSAndroid Build Coastguard Worker deque.push_back(4);
881*61c4878aSAndroid Build Coastguard Worker
882*61c4878aSAndroid Build Coastguard Worker for (unsigned short i = 0; i < deque.size(); i++) {
883*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(deque.begin()[i], static_cast<int>(i + 1));
884*61c4878aSAndroid Build Coastguard Worker }
885*61c4878aSAndroid Build Coastguard Worker }
886*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,OperatorLessThan)887*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, OperatorLessThan) {
888*61c4878aSAndroid Build Coastguard Worker // Content = {0, 0, 1, 2}, Storage = [0, 0, 1, 2]
889*61c4878aSAndroid Build Coastguard Worker InlineDeque<int, 4> deque = {0, 0, 1, 2};
890*61c4878aSAndroid Build Coastguard Worker // Content = {0, 1, 2}, Storage = [x, 0, 1, 2]
891*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
892*61c4878aSAndroid Build Coastguard Worker // Content = {0, 1, 2, 3}, Storage = [3, 0, 1, 2]
893*61c4878aSAndroid Build Coastguard Worker deque.push_back(3);
894*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3}, Storage = [3, x, 1, 2]
895*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
896*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3, 4}, Storage = [3, 4, 1, 2]
897*61c4878aSAndroid Build Coastguard Worker deque.push_back(4);
898*61c4878aSAndroid Build Coastguard Worker
899*61c4878aSAndroid Build Coastguard Worker for (int i = 0; i < deque.size(); i++) {
900*61c4878aSAndroid Build Coastguard Worker for (int j = 0; j < i; j++) {
901*61c4878aSAndroid Build Coastguard Worker ASSERT_TRUE((deque.begin() + j) < (deque.begin() + i));
902*61c4878aSAndroid Build Coastguard Worker }
903*61c4878aSAndroid Build Coastguard Worker
904*61c4878aSAndroid Build Coastguard Worker ASSERT_TRUE((deque.begin() + i) < deque.end());
905*61c4878aSAndroid Build Coastguard Worker }
906*61c4878aSAndroid Build Coastguard Worker }
907*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,OperatorLessThanEqual)908*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, OperatorLessThanEqual) {
909*61c4878aSAndroid Build Coastguard Worker // Content = {0, 0, 1, 2}, Storage = [0, 0, 1, 2]
910*61c4878aSAndroid Build Coastguard Worker InlineDeque<int, 4> deque = {0, 0, 1, 2};
911*61c4878aSAndroid Build Coastguard Worker // Content = {0, 1, 2}, Storage = [x, 0, 1, 2]
912*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
913*61c4878aSAndroid Build Coastguard Worker // Content = {0, 1, 2, 3}, Storage = [3, 0, 1, 2]
914*61c4878aSAndroid Build Coastguard Worker deque.push_back(3);
915*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3}, Storage = [3, x, 1, 2]
916*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
917*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3, 4}, Storage = [3, 4, 1, 2]
918*61c4878aSAndroid Build Coastguard Worker deque.push_back(4);
919*61c4878aSAndroid Build Coastguard Worker
920*61c4878aSAndroid Build Coastguard Worker for (int i = 0; i < deque.size(); i++) {
921*61c4878aSAndroid Build Coastguard Worker for (int j = 0; j <= i; j++) {
922*61c4878aSAndroid Build Coastguard Worker ASSERT_TRUE((deque.begin() + j) <= (deque.begin() + i));
923*61c4878aSAndroid Build Coastguard Worker }
924*61c4878aSAndroid Build Coastguard Worker
925*61c4878aSAndroid Build Coastguard Worker ASSERT_TRUE((deque.begin() + i) <= deque.end());
926*61c4878aSAndroid Build Coastguard Worker }
927*61c4878aSAndroid Build Coastguard Worker }
928*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,OperatorGreater)929*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, OperatorGreater) {
930*61c4878aSAndroid Build Coastguard Worker // Content = {0, 0, 1, 2}, Storage = [0, 0, 1, 2]
931*61c4878aSAndroid Build Coastguard Worker InlineDeque<int, 4> deque = {0, 0, 1, 2};
932*61c4878aSAndroid Build Coastguard Worker // Content = {0, 1, 2}, Storage = [x, 0, 1, 2]
933*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
934*61c4878aSAndroid Build Coastguard Worker // Content = {0, 1, 2, 3}, Storage = [3, 0, 1, 2]
935*61c4878aSAndroid Build Coastguard Worker deque.push_back(3);
936*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3}, Storage = [3, x, 1, 2]
937*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
938*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3, 4}, Storage = [3, 4, 1, 2]
939*61c4878aSAndroid Build Coastguard Worker deque.push_back(4);
940*61c4878aSAndroid Build Coastguard Worker
941*61c4878aSAndroid Build Coastguard Worker for (int i = 0; i < deque.size(); i++) {
942*61c4878aSAndroid Build Coastguard Worker for (int j = i + 1; j < deque.size(); j++) {
943*61c4878aSAndroid Build Coastguard Worker ASSERT_TRUE((deque.begin() + j) > (deque.begin() + i));
944*61c4878aSAndroid Build Coastguard Worker }
945*61c4878aSAndroid Build Coastguard Worker
946*61c4878aSAndroid Build Coastguard Worker ASSERT_TRUE(deque.end() > (deque.begin() + i));
947*61c4878aSAndroid Build Coastguard Worker }
948*61c4878aSAndroid Build Coastguard Worker }
949*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,OperatorGreaterThanEqual)950*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, OperatorGreaterThanEqual) {
951*61c4878aSAndroid Build Coastguard Worker // Content = {0, 0, 1, 2}, Storage = [0, 0, 1, 2]
952*61c4878aSAndroid Build Coastguard Worker InlineDeque<int, 4> deque = {0, 0, 1, 2};
953*61c4878aSAndroid Build Coastguard Worker // Content = {0, 1, 2}, Storage = [x, 0, 1, 2]
954*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
955*61c4878aSAndroid Build Coastguard Worker // Content = {0, 1, 2, 3}, Storage = [3, 0, 1, 2]
956*61c4878aSAndroid Build Coastguard Worker deque.push_back(3);
957*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3}, Storage = [3, x, 1, 2]
958*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
959*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3, 4}, Storage = [3, 4, 1, 2]
960*61c4878aSAndroid Build Coastguard Worker deque.push_back(4);
961*61c4878aSAndroid Build Coastguard Worker
962*61c4878aSAndroid Build Coastguard Worker for (int i = 0; i < deque.size(); i++) {
963*61c4878aSAndroid Build Coastguard Worker for (int j = i; j < deque.size(); j++) {
964*61c4878aSAndroid Build Coastguard Worker ASSERT_TRUE((deque.begin() + j) >= (deque.begin() + i));
965*61c4878aSAndroid Build Coastguard Worker }
966*61c4878aSAndroid Build Coastguard Worker
967*61c4878aSAndroid Build Coastguard Worker ASSERT_TRUE(deque.end() >= (deque.begin() + i));
968*61c4878aSAndroid Build Coastguard Worker }
969*61c4878aSAndroid Build Coastguard Worker }
970*61c4878aSAndroid Build Coastguard Worker
TEST(InlineDeque,DereferenceOperator)971*61c4878aSAndroid Build Coastguard Worker TEST(InlineDeque, DereferenceOperator) {
972*61c4878aSAndroid Build Coastguard Worker // Content = {0, 0, 1, 2}, Storage = [0, 0, 1, 2]
973*61c4878aSAndroid Build Coastguard Worker InlineDeque<int, 4> deque = {0, 0, 1, 2};
974*61c4878aSAndroid Build Coastguard Worker // Content = {0, 1, 2}, Storage = [x, 0, 1, 2]
975*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
976*61c4878aSAndroid Build Coastguard Worker // Content = {0, 1, 2, 3}, Storage = [3, 0, 1, 2]
977*61c4878aSAndroid Build Coastguard Worker deque.push_back(3);
978*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3}, Storage = [3, x, 1, 2]
979*61c4878aSAndroid Build Coastguard Worker deque.pop_front();
980*61c4878aSAndroid Build Coastguard Worker // Content = {1, 2, 3, 4}, Storage = [3, 4, 1, 2]
981*61c4878aSAndroid Build Coastguard Worker deque.push_back(4);
982*61c4878aSAndroid Build Coastguard Worker
983*61c4878aSAndroid Build Coastguard Worker for (int i = 0; i < deque.size(); i++) {
984*61c4878aSAndroid Build Coastguard Worker const auto it = deque.begin() + i;
985*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(*(it.operator->()), static_cast<int>(i + 1));
986*61c4878aSAndroid Build Coastguard Worker }
987*61c4878aSAndroid Build Coastguard Worker }
988*61c4878aSAndroid Build Coastguard Worker
989*61c4878aSAndroid Build Coastguard Worker // Test that InlineDeque<T> is trivially destructible when its type is.
990*61c4878aSAndroid Build Coastguard Worker static_assert(std::is_trivially_destructible_v<InlineDeque<int, 4>>);
991*61c4878aSAndroid Build Coastguard Worker
992*61c4878aSAndroid Build Coastguard Worker static_assert(std::is_trivially_destructible_v<MoveOnly>);
993*61c4878aSAndroid Build Coastguard Worker static_assert(std::is_trivially_destructible_v<InlineDeque<MoveOnly, 1>>);
994*61c4878aSAndroid Build Coastguard Worker
995*61c4878aSAndroid Build Coastguard Worker static_assert(std::is_trivially_destructible_v<CopyOnly>);
996*61c4878aSAndroid Build Coastguard Worker static_assert(std::is_trivially_destructible_v<InlineDeque<CopyOnly, 99>>);
997*61c4878aSAndroid Build Coastguard Worker
998*61c4878aSAndroid Build Coastguard Worker static_assert(!std::is_trivially_destructible_v<Counter>);
999*61c4878aSAndroid Build Coastguard Worker static_assert(!std::is_trivially_destructible_v<InlineDeque<Counter, 99>>);
1000*61c4878aSAndroid Build Coastguard Worker
1001*61c4878aSAndroid Build Coastguard Worker // Generic-capacity deques cannot be constructed or destructed.
1002*61c4878aSAndroid Build Coastguard Worker static_assert(!std::is_constructible_v<InlineDeque<int>>);
1003*61c4878aSAndroid Build Coastguard Worker static_assert(!std::is_destructible_v<InlineDeque<int>>);
1004*61c4878aSAndroid Build Coastguard Worker
1005*61c4878aSAndroid Build Coastguard Worker // Tests that InlineDeque<T> does not have any extra padding.
1006*61c4878aSAndroid Build Coastguard Worker static_assert(sizeof(InlineDeque<uint8_t, 1>) ==
1007*61c4878aSAndroid Build Coastguard Worker sizeof(InlineDeque<uint8_t>::size_type) * 4 +
1008*61c4878aSAndroid Build Coastguard Worker std::max(sizeof(InlineDeque<uint8_t>::size_type),
1009*61c4878aSAndroid Build Coastguard Worker sizeof(uint8_t)));
1010*61c4878aSAndroid Build Coastguard Worker static_assert(sizeof(InlineDeque<uint8_t, 2>) ==
1011*61c4878aSAndroid Build Coastguard Worker sizeof(InlineDeque<uint8_t>::size_type) * 4 +
1012*61c4878aSAndroid Build Coastguard Worker 2 * sizeof(uint8_t));
1013*61c4878aSAndroid Build Coastguard Worker static_assert(sizeof(InlineDeque<uint16_t, 1>) ==
1014*61c4878aSAndroid Build Coastguard Worker sizeof(InlineDeque<uint16_t>::size_type) * 4 + sizeof(uint16_t));
1015*61c4878aSAndroid Build Coastguard Worker static_assert(sizeof(InlineDeque<uint32_t, 1>) ==
1016*61c4878aSAndroid Build Coastguard Worker sizeof(InlineDeque<uint32_t>::size_type) * 4 + sizeof(uint32_t));
1017*61c4878aSAndroid Build Coastguard Worker static_assert(sizeof(InlineDeque<uint64_t, 1>) ==
1018*61c4878aSAndroid Build Coastguard Worker sizeof(InlineDeque<uint64_t>::size_type) * 4 + sizeof(uint64_t));
1019*61c4878aSAndroid Build Coastguard Worker
1020*61c4878aSAndroid Build Coastguard Worker // Test that InlineDeque<T> is copy constructible
1021*61c4878aSAndroid Build Coastguard Worker static_assert(std::is_copy_constructible_v<InlineDeque<int, 4>::iterator>);
1022*61c4878aSAndroid Build Coastguard Worker
1023*61c4878aSAndroid Build Coastguard Worker // Test that InlineDeque<T> is move constructible
1024*61c4878aSAndroid Build Coastguard Worker static_assert(std::is_move_constructible_v<InlineDeque<MoveOnly, 4>::iterator>);
1025*61c4878aSAndroid Build Coastguard Worker
1026*61c4878aSAndroid Build Coastguard Worker // Test that InlineDeque<T> is copy assignable
1027*61c4878aSAndroid Build Coastguard Worker static_assert(std::is_copy_assignable_v<InlineDeque<int>::iterator>);
1028*61c4878aSAndroid Build Coastguard Worker static_assert(std::is_copy_assignable_v<InlineDeque<int, 4>::iterator>);
1029*61c4878aSAndroid Build Coastguard Worker
1030*61c4878aSAndroid Build Coastguard Worker // Test that InlineDeque<T> is move assignable
1031*61c4878aSAndroid Build Coastguard Worker static_assert(std::is_move_assignable_v<InlineDeque<MoveOnly>>);
1032*61c4878aSAndroid Build Coastguard Worker static_assert(std::is_move_assignable_v<InlineDeque<MoveOnly, 4>>);
1033*61c4878aSAndroid Build Coastguard Worker
1034*61c4878aSAndroid Build Coastguard Worker // Test that InlineDeque<T>::iterator can be converted to a const_iterator
1035*61c4878aSAndroid Build Coastguard Worker static_assert(std::is_convertible<InlineDeque<int>::iterator,
1036*61c4878aSAndroid Build Coastguard Worker InlineDeque<int>::const_iterator>::value);
1037*61c4878aSAndroid Build Coastguard Worker static_assert(std::is_convertible<InlineDeque<int, 4>::iterator,
1038*61c4878aSAndroid Build Coastguard Worker InlineDeque<int, 4>::const_iterator>::value);
1039*61c4878aSAndroid Build Coastguard Worker
1040*61c4878aSAndroid Build Coastguard Worker // Test that InlineDeque<T>::const_iterator can NOT be converted to a iterator
1041*61c4878aSAndroid Build Coastguard Worker static_assert(!std::is_convertible<InlineDeque<int>::const_iterator,
1042*61c4878aSAndroid Build Coastguard Worker InlineDeque<int>::iterator>::value);
1043*61c4878aSAndroid Build Coastguard Worker static_assert(!std::is_convertible<InlineDeque<int, 4>::const_iterator,
1044*61c4878aSAndroid Build Coastguard Worker InlineDeque<int, 4>::iterator>::value);
1045*61c4878aSAndroid Build Coastguard Worker
1046*61c4878aSAndroid Build Coastguard Worker } // namespace
1047*61c4878aSAndroid Build Coastguard Worker } // namespace pw::containers
1048