1*84e33947SAndroid Build Coastguard Worker /*
2*84e33947SAndroid Build Coastguard Worker * Copyright (C) 2022 The Android Open Source Project
3*84e33947SAndroid Build Coastguard Worker *
4*84e33947SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*84e33947SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*84e33947SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*84e33947SAndroid Build Coastguard Worker *
8*84e33947SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*84e33947SAndroid Build Coastguard Worker *
10*84e33947SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*84e33947SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*84e33947SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*84e33947SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*84e33947SAndroid Build Coastguard Worker * limitations under the License.
15*84e33947SAndroid Build Coastguard Worker */
16*84e33947SAndroid Build Coastguard Worker
17*84e33947SAndroid Build Coastguard Worker #include "chre/util/segmented_queue.h"
18*84e33947SAndroid Build Coastguard Worker
19*84e33947SAndroid Build Coastguard Worker #include <cstdlib>
20*84e33947SAndroid Build Coastguard Worker #include <deque>
21*84e33947SAndroid Build Coastguard Worker #include <vector>
22*84e33947SAndroid Build Coastguard Worker
23*84e33947SAndroid Build Coastguard Worker #include "chre/util/enum.h"
24*84e33947SAndroid Build Coastguard Worker #include "chre/util/nested_data_ptr.h"
25*84e33947SAndroid Build Coastguard Worker #include "chre/util/non_copyable.h"
26*84e33947SAndroid Build Coastguard Worker #include "gtest/gtest.h"
27*84e33947SAndroid Build Coastguard Worker
28*84e33947SAndroid Build Coastguard Worker using ::chre::NestedDataPtr;
29*84e33947SAndroid Build Coastguard Worker using ::chre::SegmentedQueue;
30*84e33947SAndroid Build Coastguard Worker using ::std::deque;
31*84e33947SAndroid Build Coastguard Worker using ::std::vector;
32*84e33947SAndroid Build Coastguard Worker
33*84e33947SAndroid Build Coastguard Worker namespace {
34*84e33947SAndroid Build Coastguard Worker
35*84e33947SAndroid Build Coastguard Worker class ConstructorCount {
36*84e33947SAndroid Build Coastguard Worker public:
37*84e33947SAndroid Build Coastguard Worker ConstructorCount() = default;
ConstructorCount(int value_,ssize_t * constructedCount)38*84e33947SAndroid Build Coastguard Worker ConstructorCount(int value_, ssize_t *constructedCount)
39*84e33947SAndroid Build Coastguard Worker : sConstructedCounter(constructedCount), value(value_) {
40*84e33947SAndroid Build Coastguard Worker (*sConstructedCounter)++;
41*84e33947SAndroid Build Coastguard Worker }
~ConstructorCount()42*84e33947SAndroid Build Coastguard Worker ~ConstructorCount() {
43*84e33947SAndroid Build Coastguard Worker (*sConstructedCounter)--;
44*84e33947SAndroid Build Coastguard Worker }
getValue()45*84e33947SAndroid Build Coastguard Worker int getValue() {
46*84e33947SAndroid Build Coastguard Worker return value;
47*84e33947SAndroid Build Coastguard Worker }
48*84e33947SAndroid Build Coastguard Worker
49*84e33947SAndroid Build Coastguard Worker ssize_t *sConstructedCounter;
50*84e33947SAndroid Build Coastguard Worker
51*84e33947SAndroid Build Coastguard Worker private:
52*84e33947SAndroid Build Coastguard Worker int value;
53*84e33947SAndroid Build Coastguard Worker };
54*84e33947SAndroid Build Coastguard Worker
55*84e33947SAndroid Build Coastguard Worker constexpr int kConstructedMagic = 0xdeadbeef;
56*84e33947SAndroid Build Coastguard Worker class CopyableButNonMovable {
57*84e33947SAndroid Build Coastguard Worker public:
CopyableButNonMovable(int value)58*84e33947SAndroid Build Coastguard Worker CopyableButNonMovable(int value) : mValue(value) {}
59*84e33947SAndroid Build Coastguard Worker
CopyableButNonMovable(const CopyableButNonMovable & other)60*84e33947SAndroid Build Coastguard Worker CopyableButNonMovable(const CopyableButNonMovable &other) {
61*84e33947SAndroid Build Coastguard Worker mValue = other.mValue;
62*84e33947SAndroid Build Coastguard Worker }
63*84e33947SAndroid Build Coastguard Worker
operator =(const CopyableButNonMovable & other)64*84e33947SAndroid Build Coastguard Worker CopyableButNonMovable &operator=(const CopyableButNonMovable &other) {
65*84e33947SAndroid Build Coastguard Worker CHRE_ASSERT(mMagic == kConstructedMagic);
66*84e33947SAndroid Build Coastguard Worker mValue = other.mValue;
67*84e33947SAndroid Build Coastguard Worker return *this;
68*84e33947SAndroid Build Coastguard Worker }
69*84e33947SAndroid Build Coastguard Worker
70*84e33947SAndroid Build Coastguard Worker CopyableButNonMovable(CopyableButNonMovable &&other) = delete;
71*84e33947SAndroid Build Coastguard Worker CopyableButNonMovable &operator=(CopyableButNonMovable &&other) = delete;
72*84e33947SAndroid Build Coastguard Worker
getValue() const73*84e33947SAndroid Build Coastguard Worker int getValue() const {
74*84e33947SAndroid Build Coastguard Worker return mValue;
75*84e33947SAndroid Build Coastguard Worker }
76*84e33947SAndroid Build Coastguard Worker
77*84e33947SAndroid Build Coastguard Worker private:
78*84e33947SAndroid Build Coastguard Worker int mMagic = kConstructedMagic;
79*84e33947SAndroid Build Coastguard Worker int mValue;
80*84e33947SAndroid Build Coastguard Worker };
81*84e33947SAndroid Build Coastguard Worker
82*84e33947SAndroid Build Coastguard Worker class MovableButNonCopyable : public chre::NonCopyable {
83*84e33947SAndroid Build Coastguard Worker public:
MovableButNonCopyable(int value)84*84e33947SAndroid Build Coastguard Worker MovableButNonCopyable(int value) : mValue(value) {}
85*84e33947SAndroid Build Coastguard Worker
MovableButNonCopyable(MovableButNonCopyable && other)86*84e33947SAndroid Build Coastguard Worker MovableButNonCopyable(MovableButNonCopyable &&other) {
87*84e33947SAndroid Build Coastguard Worker mValue = other.mValue;
88*84e33947SAndroid Build Coastguard Worker other.mValue = -1;
89*84e33947SAndroid Build Coastguard Worker }
90*84e33947SAndroid Build Coastguard Worker
operator =(MovableButNonCopyable && other)91*84e33947SAndroid Build Coastguard Worker MovableButNonCopyable &operator=(MovableButNonCopyable &&other) {
92*84e33947SAndroid Build Coastguard Worker CHRE_ASSERT(mMagic == kConstructedMagic);
93*84e33947SAndroid Build Coastguard Worker mValue = other.mValue;
94*84e33947SAndroid Build Coastguard Worker other.mValue = -1;
95*84e33947SAndroid Build Coastguard Worker return *this;
96*84e33947SAndroid Build Coastguard Worker }
97*84e33947SAndroid Build Coastguard Worker
getValue() const98*84e33947SAndroid Build Coastguard Worker int getValue() const {
99*84e33947SAndroid Build Coastguard Worker return mValue;
100*84e33947SAndroid Build Coastguard Worker }
101*84e33947SAndroid Build Coastguard Worker
102*84e33947SAndroid Build Coastguard Worker private:
103*84e33947SAndroid Build Coastguard Worker int mMagic = kConstructedMagic;
104*84e33947SAndroid Build Coastguard Worker int mValue;
105*84e33947SAndroid Build Coastguard Worker };
106*84e33947SAndroid Build Coastguard Worker
107*84e33947SAndroid Build Coastguard Worker enum class OperationType : uint8_t {
108*84e33947SAndroid Build Coastguard Worker EMPLACE_BACK = 0,
109*84e33947SAndroid Build Coastguard Worker PUSH_BACK,
110*84e33947SAndroid Build Coastguard Worker POP_FRONT,
111*84e33947SAndroid Build Coastguard Worker REMOVE,
112*84e33947SAndroid Build Coastguard Worker BATCH_REMOVE,
113*84e33947SAndroid Build Coastguard Worker
114*84e33947SAndroid Build Coastguard Worker OPERATION_TYPE_COUNT, // Must be at the end.
115*84e33947SAndroid Build Coastguard Worker };
116*84e33947SAndroid Build Coastguard Worker
117*84e33947SAndroid Build Coastguard Worker } // namespace
118*84e33947SAndroid Build Coastguard Worker
TEST(SegmentedQueue,InitialzedState)119*84e33947SAndroid Build Coastguard Worker TEST(SegmentedQueue, InitialzedState) {
120*84e33947SAndroid Build Coastguard Worker constexpr uint8_t blockSize = 5;
121*84e33947SAndroid Build Coastguard Worker constexpr uint8_t maxBlockCount = 3;
122*84e33947SAndroid Build Coastguard Worker constexpr uint8_t staticBlockCount = 2;
123*84e33947SAndroid Build Coastguard Worker SegmentedQueue<int, blockSize> segmentedQueue(maxBlockCount,
124*84e33947SAndroid Build Coastguard Worker staticBlockCount);
125*84e33947SAndroid Build Coastguard Worker
126*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.block_count(), staticBlockCount);
127*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.capacity(), staticBlockCount * blockSize);
128*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.size(), 0);
129*84e33947SAndroid Build Coastguard Worker }
130*84e33947SAndroid Build Coastguard Worker
TEST(SegmentedQueue,PushAndRead)131*84e33947SAndroid Build Coastguard Worker TEST(SegmentedQueue, PushAndRead) {
132*84e33947SAndroid Build Coastguard Worker constexpr uint8_t blockSize = 5;
133*84e33947SAndroid Build Coastguard Worker constexpr uint8_t maxBlockCount = 3;
134*84e33947SAndroid Build Coastguard Worker SegmentedQueue<int, blockSize> segmentedQueue(maxBlockCount);
135*84e33947SAndroid Build Coastguard Worker
136*84e33947SAndroid Build Coastguard Worker for (uint32_t queueSize = 0; queueSize < blockSize * maxBlockCount;
137*84e33947SAndroid Build Coastguard Worker queueSize++) {
138*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(segmentedQueue.push_back(queueSize));
139*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.size(), queueSize + 1);
140*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue[queueSize], queueSize);
141*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.back(), queueSize);
142*84e33947SAndroid Build Coastguard Worker }
143*84e33947SAndroid Build Coastguard Worker
144*84e33947SAndroid Build Coastguard Worker EXPECT_FALSE(segmentedQueue.push_back(10000));
145*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.size(), maxBlockCount * blockSize);
146*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(segmentedQueue.full());
147*84e33947SAndroid Build Coastguard Worker }
148*84e33947SAndroid Build Coastguard Worker
TEST(SegmentedQueue,EmplaceAndRead)149*84e33947SAndroid Build Coastguard Worker TEST(SegmentedQueue, EmplaceAndRead) {
150*84e33947SAndroid Build Coastguard Worker constexpr uint8_t blockSize = 5;
151*84e33947SAndroid Build Coastguard Worker constexpr uint8_t maxBlockCount = 3;
152*84e33947SAndroid Build Coastguard Worker ssize_t constructorCount = 0;
153*84e33947SAndroid Build Coastguard Worker SegmentedQueue<ConstructorCount, blockSize> segmentedQueue(maxBlockCount);
154*84e33947SAndroid Build Coastguard Worker
155*84e33947SAndroid Build Coastguard Worker for (uint32_t queueSize = 0; queueSize < blockSize * maxBlockCount;
156*84e33947SAndroid Build Coastguard Worker queueSize++) {
157*84e33947SAndroid Build Coastguard Worker ssize_t oldConstructedCounter = constructorCount;
158*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(segmentedQueue.emplace_back(queueSize, &constructorCount));
159*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.size(), queueSize + 1);
160*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue[queueSize].getValue(), queueSize);
161*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.back().getValue(), queueSize);
162*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(constructorCount, oldConstructedCounter + 1);
163*84e33947SAndroid Build Coastguard Worker }
164*84e33947SAndroid Build Coastguard Worker
165*84e33947SAndroid Build Coastguard Worker EXPECT_FALSE(segmentedQueue.emplace_back(10000, &constructorCount));
166*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.size(), maxBlockCount * blockSize);
167*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(segmentedQueue.full());
168*84e33947SAndroid Build Coastguard Worker }
169*84e33947SAndroid Build Coastguard Worker
TEST(SegmentedQueue,PushAndReadCopyableButNonMovable)170*84e33947SAndroid Build Coastguard Worker TEST(SegmentedQueue, PushAndReadCopyableButNonMovable) {
171*84e33947SAndroid Build Coastguard Worker constexpr uint8_t blockSize = 5;
172*84e33947SAndroid Build Coastguard Worker constexpr uint8_t maxBlockCount = 3;
173*84e33947SAndroid Build Coastguard Worker SegmentedQueue<CopyableButNonMovable, blockSize> segmentedQueue(
174*84e33947SAndroid Build Coastguard Worker maxBlockCount);
175*84e33947SAndroid Build Coastguard Worker
176*84e33947SAndroid Build Coastguard Worker for (uint32_t queueSize = 0; queueSize < blockSize * maxBlockCount;
177*84e33947SAndroid Build Coastguard Worker queueSize++) {
178*84e33947SAndroid Build Coastguard Worker CopyableButNonMovable cbnm(queueSize);
179*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(segmentedQueue.push_back(cbnm));
180*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.size(), queueSize + 1);
181*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue[queueSize].getValue(), queueSize);
182*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.back().getValue(), queueSize);
183*84e33947SAndroid Build Coastguard Worker }
184*84e33947SAndroid Build Coastguard Worker }
185*84e33947SAndroid Build Coastguard Worker
TEST(SegmentedQueue,PushAndReadMovableButNonCopyable)186*84e33947SAndroid Build Coastguard Worker TEST(SegmentedQueue, PushAndReadMovableButNonCopyable) {
187*84e33947SAndroid Build Coastguard Worker constexpr uint8_t blockSize = 5;
188*84e33947SAndroid Build Coastguard Worker constexpr uint8_t maxBlockCount = 3;
189*84e33947SAndroid Build Coastguard Worker SegmentedQueue<MovableButNonCopyable, blockSize> segmentedQueue(
190*84e33947SAndroid Build Coastguard Worker maxBlockCount);
191*84e33947SAndroid Build Coastguard Worker
192*84e33947SAndroid Build Coastguard Worker for (uint8_t blockIndex = 0; blockIndex < maxBlockCount; blockIndex++) {
193*84e33947SAndroid Build Coastguard Worker for (uint8_t index = 0; index < blockSize; index++) {
194*84e33947SAndroid Build Coastguard Worker int value = segmentedQueue.size();
195*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(segmentedQueue.emplace_back(value));
196*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.size(), value + 1);
197*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue[value].getValue(), value);
198*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.back().getValue(), value);
199*84e33947SAndroid Build Coastguard Worker }
200*84e33947SAndroid Build Coastguard Worker }
201*84e33947SAndroid Build Coastguard Worker }
202*84e33947SAndroid Build Coastguard Worker
TEST(SegmentedQueue,ReadAndPop)203*84e33947SAndroid Build Coastguard Worker TEST(SegmentedQueue, ReadAndPop) {
204*84e33947SAndroid Build Coastguard Worker constexpr uint8_t blockSize = 5;
205*84e33947SAndroid Build Coastguard Worker constexpr uint8_t maxBlockCount = 3;
206*84e33947SAndroid Build Coastguard Worker SegmentedQueue<ConstructorCount, blockSize> segmentedQueue(maxBlockCount);
207*84e33947SAndroid Build Coastguard Worker ssize_t constructedCounter = 0;
208*84e33947SAndroid Build Coastguard Worker
209*84e33947SAndroid Build Coastguard Worker for (uint32_t index = 0; index < blockSize * maxBlockCount; index++) {
210*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(segmentedQueue.emplace_back(index, &constructedCounter));
211*84e33947SAndroid Build Coastguard Worker }
212*84e33947SAndroid Build Coastguard Worker
213*84e33947SAndroid Build Coastguard Worker uint8_t originalQueueSize = segmentedQueue.size();
214*84e33947SAndroid Build Coastguard Worker for (uint8_t index = 0; index < originalQueueSize; index++) {
215*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue[index].getValue(), index);
216*84e33947SAndroid Build Coastguard Worker }
217*84e33947SAndroid Build Coastguard Worker
218*84e33947SAndroid Build Coastguard Worker size_t capacityBeforePop = segmentedQueue.capacity();
219*84e33947SAndroid Build Coastguard Worker while (!segmentedQueue.empty()) {
220*84e33947SAndroid Build Coastguard Worker ASSERT_EQ(segmentedQueue.front().getValue(),
221*84e33947SAndroid Build Coastguard Worker originalQueueSize - segmentedQueue.size());
222*84e33947SAndroid Build Coastguard Worker ssize_t oldConstructedCounter = constructedCounter;
223*84e33947SAndroid Build Coastguard Worker segmentedQueue.pop_front();
224*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(oldConstructedCounter - 1, constructedCounter);
225*84e33947SAndroid Build Coastguard Worker }
226*84e33947SAndroid Build Coastguard Worker
227*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.size(), 0);
228*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(segmentedQueue.empty());
229*84e33947SAndroid Build Coastguard Worker EXPECT_LT(segmentedQueue.capacity(), capacityBeforePop);
230*84e33947SAndroid Build Coastguard Worker EXPECT_GT(segmentedQueue.capacity(), 0);
231*84e33947SAndroid Build Coastguard Worker }
232*84e33947SAndroid Build Coastguard Worker
TEST(SegmentedQueue,RemoveTest)233*84e33947SAndroid Build Coastguard Worker TEST(SegmentedQueue, RemoveTest) {
234*84e33947SAndroid Build Coastguard Worker constexpr uint8_t blockSize = 2;
235*84e33947SAndroid Build Coastguard Worker constexpr uint8_t maxBlockCount = 3;
236*84e33947SAndroid Build Coastguard Worker SegmentedQueue<int, blockSize> segmentedQueue(maxBlockCount);
237*84e33947SAndroid Build Coastguard Worker
238*84e33947SAndroid Build Coastguard Worker for (uint32_t index = 0; index < blockSize * maxBlockCount; index++) {
239*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(segmentedQueue.push_back(index));
240*84e33947SAndroid Build Coastguard Worker }
241*84e33947SAndroid Build Coastguard Worker
242*84e33947SAndroid Build Coastguard Worker // segmentedQueue = [[0, 1], [2, 3], [4, 5]]
243*84e33947SAndroid Build Coastguard Worker EXPECT_FALSE(segmentedQueue.remove(segmentedQueue.size()));
244*84e33947SAndroid Build Coastguard Worker
245*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(segmentedQueue.remove(4));
246*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue[4], 5);
247*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue[3], 3);
248*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.size(), 5);
249*84e33947SAndroid Build Coastguard Worker
250*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(segmentedQueue.remove(1));
251*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue[3], 5);
252*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue[1], 2);
253*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue[0], 0);
254*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.size(), 4);
255*84e33947SAndroid Build Coastguard Worker
256*84e33947SAndroid Build Coastguard Worker size_t currentSize = segmentedQueue.size();
257*84e33947SAndroid Build Coastguard Worker size_t capacityBeforeRemove = segmentedQueue.capacity();
258*84e33947SAndroid Build Coastguard Worker while (currentSize--) {
259*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(segmentedQueue.remove(0));
260*84e33947SAndroid Build Coastguard Worker }
261*84e33947SAndroid Build Coastguard Worker
262*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.size(), 0);
263*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(segmentedQueue.empty());
264*84e33947SAndroid Build Coastguard Worker EXPECT_LT(segmentedQueue.capacity(), capacityBeforeRemove);
265*84e33947SAndroid Build Coastguard Worker EXPECT_GT(segmentedQueue.capacity(), 0);
266*84e33947SAndroid Build Coastguard Worker }
267*84e33947SAndroid Build Coastguard Worker
TEST(SegmentedQueue,MiddleBlockTest)268*84e33947SAndroid Build Coastguard Worker TEST(SegmentedQueue, MiddleBlockTest) {
269*84e33947SAndroid Build Coastguard Worker // This test tests that the SegmentedQueue will behave correctly when
270*84e33947SAndroid Build Coastguard Worker // the reference of front() and back() are not aligned to the head/back
271*84e33947SAndroid Build Coastguard Worker // of a block.
272*84e33947SAndroid Build Coastguard Worker
273*84e33947SAndroid Build Coastguard Worker constexpr uint8_t blockSize = 3;
274*84e33947SAndroid Build Coastguard Worker constexpr uint8_t maxBlockCount = 3;
275*84e33947SAndroid Build Coastguard Worker SegmentedQueue<int, blockSize> segmentedQueue(maxBlockCount);
276*84e33947SAndroid Build Coastguard Worker
277*84e33947SAndroid Build Coastguard Worker for (uint32_t index = 0; index < blockSize * (maxBlockCount - 1); index++) {
278*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(segmentedQueue.push_back(index));
279*84e33947SAndroid Build Coastguard Worker }
280*84e33947SAndroid Build Coastguard Worker
281*84e33947SAndroid Build Coastguard Worker segmentedQueue.pop_front();
282*84e33947SAndroid Build Coastguard Worker segmentedQueue.pop_front();
283*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(segmentedQueue.push_back(6));
284*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(segmentedQueue.push_back(7));
285*84e33947SAndroid Build Coastguard Worker
286*84e33947SAndroid Build Coastguard Worker // segmentedQueue = [[6, 7, 2], [3, 4, 5], [X]]
287*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.front(), 2);
288*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.back(), 7);
289*84e33947SAndroid Build Coastguard Worker
290*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(segmentedQueue.push_back(8));
291*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.back(), 8);
292*84e33947SAndroid Build Coastguard Worker
293*84e33947SAndroid Build Coastguard Worker // segmentedQueue = [[x, x, 2], [3, 4, 5], [6, 7, 8]]
294*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(segmentedQueue.push_back(9));
295*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(segmentedQueue.push_back(10));
296*84e33947SAndroid Build Coastguard Worker
297*84e33947SAndroid Build Coastguard Worker for (int i = 0; i < segmentedQueue.size(); i++) {
298*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue[i], i + 2);
299*84e33947SAndroid Build Coastguard Worker }
300*84e33947SAndroid Build Coastguard Worker }
301*84e33947SAndroid Build Coastguard Worker
TEST(SegmentedQueue,RemoveMatchesEnoughItem)302*84e33947SAndroid Build Coastguard Worker TEST(SegmentedQueue, RemoveMatchesEnoughItem) {
303*84e33947SAndroid Build Coastguard Worker constexpr uint8_t blockSize = 3;
304*84e33947SAndroid Build Coastguard Worker constexpr uint8_t maxBlockCount = 2;
305*84e33947SAndroid Build Coastguard Worker ssize_t constCounter = 0;
306*84e33947SAndroid Build Coastguard Worker SegmentedQueue<ConstructorCount, blockSize> segmentedQueue(maxBlockCount);
307*84e33947SAndroid Build Coastguard Worker
308*84e33947SAndroid Build Coastguard Worker for (uint32_t index = 0; index < blockSize * maxBlockCount; index++) {
309*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(segmentedQueue.emplace_back(index, &constCounter));
310*84e33947SAndroid Build Coastguard Worker }
311*84e33947SAndroid Build Coastguard Worker
312*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(3, segmentedQueue.removeMatchedFromBack(
313*84e33947SAndroid Build Coastguard Worker [](ConstructorCount &element, void *data, void *extraData) {
314*84e33947SAndroid Build Coastguard Worker NestedDataPtr<int> targetValue(data);
315*84e33947SAndroid Build Coastguard Worker NestedDataPtr<int> targetValue2(extraData);
316*84e33947SAndroid Build Coastguard Worker return element.getValue() <= targetValue + targetValue2;
317*84e33947SAndroid Build Coastguard Worker },
318*84e33947SAndroid Build Coastguard Worker /* data= */ NestedDataPtr<int>(2),
319*84e33947SAndroid Build Coastguard Worker /* extraData= */ NestedDataPtr<int>(2), 3));
320*84e33947SAndroid Build Coastguard Worker
321*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue[0].getValue(), 0);
322*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue[1].getValue(), 1);
323*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue[2].getValue(), 5);
324*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.size(), blockSize * maxBlockCount - 3);
325*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.front().getValue(), 0);
326*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.back().getValue(), 5);
327*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(constCounter, 3);
328*84e33947SAndroid Build Coastguard Worker }
329*84e33947SAndroid Build Coastguard Worker
TEST(SegmentedQueue,RemoveMatchesEmptyQueue)330*84e33947SAndroid Build Coastguard Worker TEST(SegmentedQueue, RemoveMatchesEmptyQueue) {
331*84e33947SAndroid Build Coastguard Worker constexpr uint8_t blockSize = 5;
332*84e33947SAndroid Build Coastguard Worker constexpr uint8_t maxBlockCount = 2;
333*84e33947SAndroid Build Coastguard Worker SegmentedQueue<int, blockSize> segmentedQueue(maxBlockCount);
334*84e33947SAndroid Build Coastguard Worker
335*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(0, segmentedQueue.removeMatchedFromBack(
336*84e33947SAndroid Build Coastguard Worker [](int element, void * /* data */, void * /* extraData */) {
337*84e33947SAndroid Build Coastguard Worker return element >= 5;
338*84e33947SAndroid Build Coastguard Worker },
339*84e33947SAndroid Build Coastguard Worker /* data= */ nullptr, /* extraData= */ nullptr, 3));
340*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.size(), 0);
341*84e33947SAndroid Build Coastguard Worker }
342*84e33947SAndroid Build Coastguard Worker
TEST(SegmentedQueue,RemoveMatchesSingleElementQueue)343*84e33947SAndroid Build Coastguard Worker TEST(SegmentedQueue, RemoveMatchesSingleElementQueue) {
344*84e33947SAndroid Build Coastguard Worker constexpr uint8_t blockSize = 5;
345*84e33947SAndroid Build Coastguard Worker constexpr uint8_t maxBlockCount = 2;
346*84e33947SAndroid Build Coastguard Worker SegmentedQueue<int, blockSize> segmentedQueue(maxBlockCount);
347*84e33947SAndroid Build Coastguard Worker
348*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(segmentedQueue.push_back(1));
349*84e33947SAndroid Build Coastguard Worker
350*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(1, segmentedQueue.removeMatchedFromBack(
351*84e33947SAndroid Build Coastguard Worker [](int element, void * /* data */, void * /* extraData */) {
352*84e33947SAndroid Build Coastguard Worker return element == 1;
353*84e33947SAndroid Build Coastguard Worker },
354*84e33947SAndroid Build Coastguard Worker /* data= */ nullptr, /* extraData= */ nullptr, 3));
355*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.size(), 0);
356*84e33947SAndroid Build Coastguard Worker }
357*84e33947SAndroid Build Coastguard Worker
TEST(SegmentedQueue,RemoveMatchesTemp)358*84e33947SAndroid Build Coastguard Worker TEST(SegmentedQueue, RemoveMatchesTemp) {
359*84e33947SAndroid Build Coastguard Worker constexpr uint8_t blockSize = 5;
360*84e33947SAndroid Build Coastguard Worker constexpr uint8_t maxBlockCount = 2;
361*84e33947SAndroid Build Coastguard Worker SegmentedQueue<int, blockSize> segmentedQueue(maxBlockCount);
362*84e33947SAndroid Build Coastguard Worker
363*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(segmentedQueue.push_back(1));
364*84e33947SAndroid Build Coastguard Worker
365*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(1, segmentedQueue.removeMatchedFromBack(
366*84e33947SAndroid Build Coastguard Worker [](int element, void * /* data */, void * /* extraData */) {
367*84e33947SAndroid Build Coastguard Worker return element == 1;
368*84e33947SAndroid Build Coastguard Worker },
369*84e33947SAndroid Build Coastguard Worker /* data= */ nullptr, /* extraData= */ nullptr, 3));
370*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.size(), 0);
371*84e33947SAndroid Build Coastguard Worker }
372*84e33947SAndroid Build Coastguard Worker
TEST(SegmentedQueue,RemoveMatchesTailInMiddle)373*84e33947SAndroid Build Coastguard Worker TEST(SegmentedQueue, RemoveMatchesTailInMiddle) {
374*84e33947SAndroid Build Coastguard Worker constexpr uint8_t blockSize = 5;
375*84e33947SAndroid Build Coastguard Worker constexpr uint8_t maxBlockCount = 2;
376*84e33947SAndroid Build Coastguard Worker SegmentedQueue<int, blockSize> segmentedQueue(maxBlockCount);
377*84e33947SAndroid Build Coastguard Worker
378*84e33947SAndroid Build Coastguard Worker for (uint32_t index = 0; index < blockSize * maxBlockCount; index++) {
379*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(segmentedQueue.emplace_back(index));
380*84e33947SAndroid Build Coastguard Worker }
381*84e33947SAndroid Build Coastguard Worker
382*84e33947SAndroid Build Coastguard Worker segmentedQueue.pop();
383*84e33947SAndroid Build Coastguard Worker segmentedQueue.pop();
384*84e33947SAndroid Build Coastguard Worker segmentedQueue.push_back(blockSize * maxBlockCount);
385*84e33947SAndroid Build Coastguard Worker segmentedQueue.push_back(blockSize * maxBlockCount + 1);
386*84e33947SAndroid Build Coastguard Worker
387*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(5, segmentedQueue.removeMatchedFromBack(
388*84e33947SAndroid Build Coastguard Worker [](int item, void * /* data */, void * /* extraData */) {
389*84e33947SAndroid Build Coastguard Worker return item % 2 == 0;
390*84e33947SAndroid Build Coastguard Worker },
391*84e33947SAndroid Build Coastguard Worker /* data= */ nullptr, /* extraData= */ nullptr, 10));
392*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.size(), 5);
393*84e33947SAndroid Build Coastguard Worker
394*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue[0], 3);
395*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue[1], 5);
396*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue[2], 7);
397*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue[3], 9);
398*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue[4], 11);
399*84e33947SAndroid Build Coastguard Worker
400*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.front(), 3);
401*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.back(), 11);
402*84e33947SAndroid Build Coastguard Worker }
403*84e33947SAndroid Build Coastguard Worker
TEST(SegmentedQueue,RemoveMatchesWithFreeCallback)404*84e33947SAndroid Build Coastguard Worker TEST(SegmentedQueue, RemoveMatchesWithFreeCallback) {
405*84e33947SAndroid Build Coastguard Worker constexpr uint8_t blockSize = 3;
406*84e33947SAndroid Build Coastguard Worker constexpr uint8_t maxBlockCount = 2;
407*84e33947SAndroid Build Coastguard Worker int8_t counter = 0;
408*84e33947SAndroid Build Coastguard Worker SegmentedQueue<uint8_t, blockSize> segmentedQueue(maxBlockCount);
409*84e33947SAndroid Build Coastguard Worker
410*84e33947SAndroid Build Coastguard Worker for (uint8_t index = 0; index < blockSize * maxBlockCount; ++index) {
411*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(segmentedQueue.push_back(index));
412*84e33947SAndroid Build Coastguard Worker }
413*84e33947SAndroid Build Coastguard Worker
414*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(3, segmentedQueue.removeMatchedFromBack(
415*84e33947SAndroid Build Coastguard Worker [](uint8_t item, void * /* data */, void * /* extraData */) {
416*84e33947SAndroid Build Coastguard Worker return item % 2 == 0;
417*84e33947SAndroid Build Coastguard Worker },
418*84e33947SAndroid Build Coastguard Worker /* data= */ nullptr, /* extraData= */ nullptr, 3,
419*84e33947SAndroid Build Coastguard Worker [](uint8_t item, void *counter) {
420*84e33947SAndroid Build Coastguard Worker *static_cast<int8_t *>(counter) -= item;
421*84e33947SAndroid Build Coastguard Worker },
422*84e33947SAndroid Build Coastguard Worker &counter));
423*84e33947SAndroid Build Coastguard Worker
424*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(counter, -6); // item 0, 2, 4 is removed.
425*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.size(), 3);
426*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.back(), 5);
427*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.front(), 1);
428*84e33947SAndroid Build Coastguard Worker }
429*84e33947SAndroid Build Coastguard Worker
TEST(SegmentedQueue,RemoveALotOFMatchItems)430*84e33947SAndroid Build Coastguard Worker TEST(SegmentedQueue, RemoveALotOFMatchItems) {
431*84e33947SAndroid Build Coastguard Worker constexpr uint8_t kBlockSize = 10;
432*84e33947SAndroid Build Coastguard Worker constexpr uint8_t kMaxBlockCount = 3;
433*84e33947SAndroid Build Coastguard Worker constexpr uint8_t kTargetRemoveNumber = 13;
434*84e33947SAndroid Build Coastguard Worker SegmentedQueue<uint8_t, kBlockSize> segmentedQueue(kMaxBlockCount);
435*84e33947SAndroid Build Coastguard Worker
436*84e33947SAndroid Build Coastguard Worker for (uint32_t index = 0; index < kBlockSize * kMaxBlockCount; index++) {
437*84e33947SAndroid Build Coastguard Worker EXPECT_TRUE(segmentedQueue.push_back(index));
438*84e33947SAndroid Build Coastguard Worker }
439*84e33947SAndroid Build Coastguard Worker
440*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(13, segmentedQueue.removeMatchedFromBack(
441*84e33947SAndroid Build Coastguard Worker [](uint8_t element, void * /*data*/, void * /*extraData*/) {
442*84e33947SAndroid Build Coastguard Worker return element % 2 == 0;
443*84e33947SAndroid Build Coastguard Worker },
444*84e33947SAndroid Build Coastguard Worker /* data= */ nullptr,
445*84e33947SAndroid Build Coastguard Worker /* extraData= */ nullptr, kTargetRemoveNumber));
446*84e33947SAndroid Build Coastguard Worker
447*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue.size(),
448*84e33947SAndroid Build Coastguard Worker kBlockSize * kMaxBlockCount - kTargetRemoveNumber);
449*84e33947SAndroid Build Coastguard Worker for (size_t i = 0; i < segmentedQueue.size(); ++i) {
450*84e33947SAndroid Build Coastguard Worker if (i <= 3) {
451*84e33947SAndroid Build Coastguard Worker // Special case since this part of the queue should be untouched.
452*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue[i], i);
453*84e33947SAndroid Build Coastguard Worker } else {
454*84e33947SAndroid Build Coastguard Worker EXPECT_EQ(segmentedQueue[i], 2 * (i - 4) + 5);
455*84e33947SAndroid Build Coastguard Worker }
456*84e33947SAndroid Build Coastguard Worker }
457*84e33947SAndroid Build Coastguard Worker }
458*84e33947SAndroid Build Coastguard Worker
TEST(SegmentedQueue,PseudoRandomStressTest)459*84e33947SAndroid Build Coastguard Worker TEST(SegmentedQueue, PseudoRandomStressTest) {
460*84e33947SAndroid Build Coastguard Worker // This test uses std::deque as reference implementation to make sure
461*84e33947SAndroid Build Coastguard Worker // that chre::SegmentedQueue is functioning correctly.
462*84e33947SAndroid Build Coastguard Worker
463*84e33947SAndroid Build Coastguard Worker constexpr uint32_t maxIteration = 200;
464*84e33947SAndroid Build Coastguard Worker
465*84e33947SAndroid Build Coastguard Worker constexpr uint32_t totalSize = 1024;
466*84e33947SAndroid Build Coastguard Worker constexpr uint32_t blockSize = 16;
467*84e33947SAndroid Build Coastguard Worker
468*84e33947SAndroid Build Coastguard Worker ssize_t referenceQueueConstructedCounter = 0;
469*84e33947SAndroid Build Coastguard Worker ssize_t segmentedQueueConstructedCounter = 0;
470*84e33947SAndroid Build Coastguard Worker
471*84e33947SAndroid Build Coastguard Worker std::srand(0xbeef);
472*84e33947SAndroid Build Coastguard Worker
473*84e33947SAndroid Build Coastguard Worker deque<ConstructorCount> referenceDeque;
474*84e33947SAndroid Build Coastguard Worker SegmentedQueue<ConstructorCount, blockSize> testSegmentedQueue(totalSize /
475*84e33947SAndroid Build Coastguard Worker blockSize);
476*84e33947SAndroid Build Coastguard Worker
477*84e33947SAndroid Build Coastguard Worker for (uint32_t currentIteration = 0; currentIteration < maxIteration;
478*84e33947SAndroid Build Coastguard Worker currentIteration++) {
479*84e33947SAndroid Build Coastguard Worker OperationType operationType = static_cast<OperationType>(
480*84e33947SAndroid Build Coastguard Worker std::rand() % chre::asBaseType(OperationType::OPERATION_TYPE_COUNT));
481*84e33947SAndroid Build Coastguard Worker int temp = std::rand();
482*84e33947SAndroid Build Coastguard Worker switch (operationType) {
483*84e33947SAndroid Build Coastguard Worker case OperationType::PUSH_BACK:
484*84e33947SAndroid Build Coastguard Worker if (referenceDeque.size() < totalSize) {
485*84e33947SAndroid Build Coastguard Worker ASSERT_TRUE(testSegmentedQueue.push_back(
486*84e33947SAndroid Build Coastguard Worker ConstructorCount(temp, &segmentedQueueConstructedCounter)));
487*84e33947SAndroid Build Coastguard Worker referenceDeque.push_back(
488*84e33947SAndroid Build Coastguard Worker ConstructorCount(temp, &referenceQueueConstructedCounter));
489*84e33947SAndroid Build Coastguard Worker } else {
490*84e33947SAndroid Build Coastguard Worker ASSERT_FALSE(testSegmentedQueue.push_back(
491*84e33947SAndroid Build Coastguard Worker ConstructorCount(temp, &segmentedQueueConstructedCounter)));
492*84e33947SAndroid Build Coastguard Worker }
493*84e33947SAndroid Build Coastguard Worker break;
494*84e33947SAndroid Build Coastguard Worker
495*84e33947SAndroid Build Coastguard Worker case OperationType::EMPLACE_BACK:
496*84e33947SAndroid Build Coastguard Worker if (referenceDeque.size() < totalSize) {
497*84e33947SAndroid Build Coastguard Worker ASSERT_TRUE(testSegmentedQueue.emplace_back(
498*84e33947SAndroid Build Coastguard Worker temp, &segmentedQueueConstructedCounter));
499*84e33947SAndroid Build Coastguard Worker referenceDeque.emplace_back(temp, &referenceQueueConstructedCounter);
500*84e33947SAndroid Build Coastguard Worker } else {
501*84e33947SAndroid Build Coastguard Worker ASSERT_FALSE(testSegmentedQueue.emplace_back(
502*84e33947SAndroid Build Coastguard Worker temp, &segmentedQueueConstructedCounter));
503*84e33947SAndroid Build Coastguard Worker }
504*84e33947SAndroid Build Coastguard Worker break;
505*84e33947SAndroid Build Coastguard Worker
506*84e33947SAndroid Build Coastguard Worker case OperationType::POP_FRONT:
507*84e33947SAndroid Build Coastguard Worker ASSERT_EQ(testSegmentedQueue.empty(), referenceDeque.empty());
508*84e33947SAndroid Build Coastguard Worker if (!testSegmentedQueue.empty()) {
509*84e33947SAndroid Build Coastguard Worker testSegmentedQueue.pop_front();
510*84e33947SAndroid Build Coastguard Worker referenceDeque.pop_front();
511*84e33947SAndroid Build Coastguard Worker }
512*84e33947SAndroid Build Coastguard Worker break;
513*84e33947SAndroid Build Coastguard Worker
514*84e33947SAndroid Build Coastguard Worker case OperationType::REMOVE: {
515*84e33947SAndroid Build Coastguard Worker ASSERT_EQ(testSegmentedQueue.size(), referenceDeque.size());
516*84e33947SAndroid Build Coastguard Worker if (!testSegmentedQueue.empty()) {
517*84e33947SAndroid Build Coastguard Worker // Creates 50% chance for removing index that is out of bound
518*84e33947SAndroid Build Coastguard Worker size_t index = std::rand() % (testSegmentedQueue.size() * 2);
519*84e33947SAndroid Build Coastguard Worker if (index >= referenceDeque.size()) {
520*84e33947SAndroid Build Coastguard Worker ASSERT_FALSE(testSegmentedQueue.remove(index));
521*84e33947SAndroid Build Coastguard Worker } else {
522*84e33947SAndroid Build Coastguard Worker ASSERT_TRUE(testSegmentedQueue.remove(index));
523*84e33947SAndroid Build Coastguard Worker referenceDeque.erase(referenceDeque.begin() + index);
524*84e33947SAndroid Build Coastguard Worker }
525*84e33947SAndroid Build Coastguard Worker }
526*84e33947SAndroid Build Coastguard Worker } break;
527*84e33947SAndroid Build Coastguard Worker
528*84e33947SAndroid Build Coastguard Worker case OperationType::BATCH_REMOVE: {
529*84e33947SAndroid Build Coastguard Worker ASSERT_EQ(testSegmentedQueue.size(), referenceDeque.size());
530*84e33947SAndroid Build Coastguard Worker // Always try to remove a quarter of elements
531*84e33947SAndroid Build Coastguard Worker size_t targetRemoveElement = referenceDeque.size() * 0.25;
532*84e33947SAndroid Build Coastguard Worker vector<size_t> removedIndex;
533*84e33947SAndroid Build Coastguard Worker for (int i = referenceDeque.size() - 1; i >= 0; i--) {
534*84e33947SAndroid Build Coastguard Worker if (removedIndex.size() == targetRemoveElement) {
535*84e33947SAndroid Build Coastguard Worker break;
536*84e33947SAndroid Build Coastguard Worker } else if (referenceDeque[i].getValue() % 2 == 0) {
537*84e33947SAndroid Build Coastguard Worker removedIndex.push_back(i);
538*84e33947SAndroid Build Coastguard Worker }
539*84e33947SAndroid Build Coastguard Worker }
540*84e33947SAndroid Build Coastguard Worker for (auto idx : removedIndex) {
541*84e33947SAndroid Build Coastguard Worker referenceDeque.erase(referenceDeque.begin() + idx);
542*84e33947SAndroid Build Coastguard Worker }
543*84e33947SAndroid Build Coastguard Worker
544*84e33947SAndroid Build Coastguard Worker ASSERT_EQ(
545*84e33947SAndroid Build Coastguard Worker removedIndex.size(),
546*84e33947SAndroid Build Coastguard Worker testSegmentedQueue.removeMatchedFromBack(
547*84e33947SAndroid Build Coastguard Worker [](ConstructorCount &item, void * /* data */,
548*84e33947SAndroid Build Coastguard Worker void * /* extraData */) { return item.getValue() % 2 == 0; },
549*84e33947SAndroid Build Coastguard Worker /* data= */ nullptr, /* extraData= */ nullptr,
550*84e33947SAndroid Build Coastguard Worker targetRemoveElement));
551*84e33947SAndroid Build Coastguard Worker } break;
552*84e33947SAndroid Build Coastguard Worker
553*84e33947SAndroid Build Coastguard Worker case OperationType::OPERATION_TYPE_COUNT:
554*84e33947SAndroid Build Coastguard Worker // Should not be here, create this to prevent compiler error from
555*84e33947SAndroid Build Coastguard Worker // -Wswitch.
556*84e33947SAndroid Build Coastguard Worker FAIL();
557*84e33947SAndroid Build Coastguard Worker break;
558*84e33947SAndroid Build Coastguard Worker }
559*84e33947SAndroid Build Coastguard Worker
560*84e33947SAndroid Build Coastguard Worker // Complete check
561*84e33947SAndroid Build Coastguard Worker ASSERT_EQ(segmentedQueueConstructedCounter,
562*84e33947SAndroid Build Coastguard Worker referenceQueueConstructedCounter);
563*84e33947SAndroid Build Coastguard Worker ASSERT_EQ(testSegmentedQueue.size(), referenceDeque.size());
564*84e33947SAndroid Build Coastguard Worker ASSERT_EQ(testSegmentedQueue.empty(), referenceDeque.empty());
565*84e33947SAndroid Build Coastguard Worker if (!testSegmentedQueue.empty()) {
566*84e33947SAndroid Build Coastguard Worker ASSERT_EQ(testSegmentedQueue.back().getValue(),
567*84e33947SAndroid Build Coastguard Worker referenceDeque.back().getValue());
568*84e33947SAndroid Build Coastguard Worker ASSERT_EQ(testSegmentedQueue.front().getValue(),
569*84e33947SAndroid Build Coastguard Worker referenceDeque.front().getValue());
570*84e33947SAndroid Build Coastguard Worker }
571*84e33947SAndroid Build Coastguard Worker for (size_t idx = 0; idx < testSegmentedQueue.size(); idx++) {
572*84e33947SAndroid Build Coastguard Worker ASSERT_EQ(testSegmentedQueue[idx].getValue(),
573*84e33947SAndroid Build Coastguard Worker referenceDeque[idx].getValue());
574*84e33947SAndroid Build Coastguard Worker }
575*84e33947SAndroid Build Coastguard Worker }
576*84e33947SAndroid Build Coastguard Worker }