xref: /aosp_15_r20/external/perfetto/src/base/circular_queue_unittest.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker  * Copyright (C) 2019 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker  *
4*6dbdd20aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker  *
8*6dbdd20aSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker  *
10*6dbdd20aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker  * limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker  */
16*6dbdd20aSAndroid Build Coastguard Worker 
17*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/circular_queue.h"
18*6dbdd20aSAndroid Build Coastguard Worker 
19*6dbdd20aSAndroid Build Coastguard Worker #include <random>
20*6dbdd20aSAndroid Build Coastguard Worker 
21*6dbdd20aSAndroid Build Coastguard Worker #include "test/gtest_and_gmock.h"
22*6dbdd20aSAndroid Build Coastguard Worker 
23*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
24*6dbdd20aSAndroid Build Coastguard Worker namespace base {
25*6dbdd20aSAndroid Build Coastguard Worker namespace {
26*6dbdd20aSAndroid Build Coastguard Worker 
TEST(CircularQueueTest,Int)27*6dbdd20aSAndroid Build Coastguard Worker TEST(CircularQueueTest, Int) {
28*6dbdd20aSAndroid Build Coastguard Worker   CircularQueue<int> queue(/*initial_capacity=*/1);
29*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(queue.size(), 0u);
30*6dbdd20aSAndroid Build Coastguard Worker   queue.emplace_back(101);
31*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(queue.size(), 1u);
32*6dbdd20aSAndroid Build Coastguard Worker   queue.emplace_back(102);
33*6dbdd20aSAndroid Build Coastguard Worker   queue.emplace_back(103);
34*6dbdd20aSAndroid Build Coastguard Worker   queue.emplace_back(104);
35*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(queue.size(), 4u);
36*6dbdd20aSAndroid Build Coastguard Worker 
37*6dbdd20aSAndroid Build Coastguard Worker   auto it = queue.begin();
38*6dbdd20aSAndroid Build Coastguard Worker   for (int i = 101; i <= 104; i++) {
39*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(*it, i);
40*6dbdd20aSAndroid Build Coastguard Worker     it++;
41*6dbdd20aSAndroid Build Coastguard Worker   }
42*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(it, queue.end());
43*6dbdd20aSAndroid Build Coastguard Worker 
44*6dbdd20aSAndroid Build Coastguard Worker   queue.erase_front(1);
45*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(queue.size(), 3u);
46*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(*queue.begin(), 102);
47*6dbdd20aSAndroid Build Coastguard Worker 
48*6dbdd20aSAndroid Build Coastguard Worker   *(queue.begin() + 1) = 42;
49*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(*(queue.end() - 2), 42);
50*6dbdd20aSAndroid Build Coastguard Worker 
51*6dbdd20aSAndroid Build Coastguard Worker   queue.erase_front(2);
52*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(queue.size(), 1u);
53*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(*queue.begin(), 104);
54*6dbdd20aSAndroid Build Coastguard Worker 
55*6dbdd20aSAndroid Build Coastguard Worker   queue.pop_front();
56*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(queue.size(), 0u);
57*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(queue.begin(), queue.end());
58*6dbdd20aSAndroid Build Coastguard Worker 
59*6dbdd20aSAndroid Build Coastguard Worker   const size_t kNumInts = 100000u;
60*6dbdd20aSAndroid Build Coastguard Worker 
61*6dbdd20aSAndroid Build Coastguard Worker   {
62*6dbdd20aSAndroid Build Coastguard Worker     std::minstd_rand0 rnd_engine(0);
63*6dbdd20aSAndroid Build Coastguard Worker     for (size_t i = 0; i < kNumInts; i++) {
64*6dbdd20aSAndroid Build Coastguard Worker       int n = static_cast<int>(rnd_engine());
65*6dbdd20aSAndroid Build Coastguard Worker       queue.emplace_back(n);
66*6dbdd20aSAndroid Build Coastguard Worker     }
67*6dbdd20aSAndroid Build Coastguard Worker   }
68*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(queue.size(), kNumInts);
69*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(static_cast<size_t>(queue.end() - queue.begin()), kNumInts);
70*6dbdd20aSAndroid Build Coastguard Worker   {
71*6dbdd20aSAndroid Build Coastguard Worker     std::minstd_rand0 rnd_engine(0);
72*6dbdd20aSAndroid Build Coastguard Worker     it = queue.begin();
73*6dbdd20aSAndroid Build Coastguard Worker     for (size_t i = 0; i < kNumInts; ++i, ++it) {
74*6dbdd20aSAndroid Build Coastguard Worker       ASSERT_LT(it, queue.end());
75*6dbdd20aSAndroid Build Coastguard Worker       ASSERT_EQ(*it, static_cast<int>(rnd_engine()));
76*6dbdd20aSAndroid Build Coastguard Worker     }
77*6dbdd20aSAndroid Build Coastguard Worker   }
78*6dbdd20aSAndroid Build Coastguard Worker 
79*6dbdd20aSAndroid Build Coastguard Worker   {
80*6dbdd20aSAndroid Build Coastguard Worker     std::minstd_rand0 del_rnd(42);
81*6dbdd20aSAndroid Build Coastguard Worker     std::minstd_rand0 rnd_engine(0);
82*6dbdd20aSAndroid Build Coastguard Worker     while (!queue.empty()) {
83*6dbdd20aSAndroid Build Coastguard Worker       ASSERT_EQ(*queue.begin(), static_cast<int>(rnd_engine()));
84*6dbdd20aSAndroid Build Coastguard Worker       size_t num_del = (del_rnd() % 8) + 1;
85*6dbdd20aSAndroid Build Coastguard Worker       queue.erase_front(num_del + 1);  // +1 because of the read 2 lines above.
86*6dbdd20aSAndroid Build Coastguard Worker       rnd_engine.discard(num_del);
87*6dbdd20aSAndroid Build Coastguard Worker     }
88*6dbdd20aSAndroid Build Coastguard Worker   }
89*6dbdd20aSAndroid Build Coastguard Worker }
90*6dbdd20aSAndroid Build Coastguard Worker 
TEST(CircularQueueTest,Sorting)91*6dbdd20aSAndroid Build Coastguard Worker TEST(CircularQueueTest, Sorting) {
92*6dbdd20aSAndroid Build Coastguard Worker   CircularQueue<uint64_t> queue;
93*6dbdd20aSAndroid Build Coastguard Worker   std::minstd_rand0 rnd_engine(0);
94*6dbdd20aSAndroid Build Coastguard Worker   for (int i = 0; i < 100000; i++) {
95*6dbdd20aSAndroid Build Coastguard Worker     queue.emplace_back(static_cast<uint64_t>(rnd_engine()));
96*6dbdd20aSAndroid Build Coastguard Worker     if ((i % 100) == 0)
97*6dbdd20aSAndroid Build Coastguard Worker       queue.erase_front(29);
98*6dbdd20aSAndroid Build Coastguard Worker   }
99*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_FALSE(std::is_sorted(queue.begin(), queue.end()));
100*6dbdd20aSAndroid Build Coastguard Worker   std::sort(queue.begin(), queue.end());
101*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(std::is_sorted(queue.begin(), queue.end()));
102*6dbdd20aSAndroid Build Coastguard Worker }
103*6dbdd20aSAndroid Build Coastguard Worker 
TEST(CircularQueueTest,MoveOperators)104*6dbdd20aSAndroid Build Coastguard Worker TEST(CircularQueueTest, MoveOperators) {
105*6dbdd20aSAndroid Build Coastguard Worker   CircularQueue<int> queue;
106*6dbdd20aSAndroid Build Coastguard Worker   queue.emplace_back(1);
107*6dbdd20aSAndroid Build Coastguard Worker   queue.emplace_back(2);
108*6dbdd20aSAndroid Build Coastguard Worker 
109*6dbdd20aSAndroid Build Coastguard Worker   {
110*6dbdd20aSAndroid Build Coastguard Worker     CircularQueue<int> moved(std::move(queue));
111*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_TRUE(queue.empty());
112*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(moved.size(), 2u);
113*6dbdd20aSAndroid Build Coastguard Worker 
114*6dbdd20aSAndroid Build Coastguard Worker     moved.emplace_back(3);
115*6dbdd20aSAndroid Build Coastguard Worker     moved.emplace_back(4);
116*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(moved.size(), 4u);
117*6dbdd20aSAndroid Build Coastguard Worker   }
118*6dbdd20aSAndroid Build Coastguard Worker   queue.emplace_back(10);
119*6dbdd20aSAndroid Build Coastguard Worker   queue.emplace_back(11);
120*6dbdd20aSAndroid Build Coastguard Worker   queue.emplace_back(12);
121*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(queue.size(), 3u);
122*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(queue.front(), 10);
123*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(queue.back(), 12);
124*6dbdd20aSAndroid Build Coastguard Worker 
125*6dbdd20aSAndroid Build Coastguard Worker   {
126*6dbdd20aSAndroid Build Coastguard Worker     CircularQueue<int> moved;
127*6dbdd20aSAndroid Build Coastguard Worker     moved.emplace_back(42);
128*6dbdd20aSAndroid Build Coastguard Worker     moved = std::move(queue);
129*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_TRUE(queue.empty());
130*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(moved.size(), 3u);
131*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(moved.size(), 3u);
132*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(moved.front(), 10);
133*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(moved.back(), 12);
134*6dbdd20aSAndroid Build Coastguard Worker   }
135*6dbdd20aSAndroid Build Coastguard Worker }
136*6dbdd20aSAndroid Build Coastguard Worker 
TEST(CircularQueueTest,Iterators)137*6dbdd20aSAndroid Build Coastguard Worker TEST(CircularQueueTest, Iterators) {
138*6dbdd20aSAndroid Build Coastguard Worker   for (size_t repeat = 1; repeat < 8; repeat++) {
139*6dbdd20aSAndroid Build Coastguard Worker     size_t capacity = 8 * (1 << repeat);
140*6dbdd20aSAndroid Build Coastguard Worker     CircularQueue<size_t> queue(capacity);
141*6dbdd20aSAndroid Build Coastguard Worker     for (size_t i = 0; i < capacity - 2; i++)
142*6dbdd20aSAndroid Build Coastguard Worker       queue.emplace_back(0u);
143*6dbdd20aSAndroid Build Coastguard Worker     queue.erase_front(queue.size());
144*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_TRUE(queue.empty());
145*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(queue.capacity(), capacity);
146*6dbdd20aSAndroid Build Coastguard Worker 
147*6dbdd20aSAndroid Build Coastguard Worker     // Now the queue is empty and the internal write iterator is abut to wrap.
148*6dbdd20aSAndroid Build Coastguard Worker 
149*6dbdd20aSAndroid Build Coastguard Worker     // Add a bit more than half-capacity and check that the queue didn't resize.
150*6dbdd20aSAndroid Build Coastguard Worker     for (size_t i = 0; i < capacity / 2 + 3; i++)
151*6dbdd20aSAndroid Build Coastguard Worker       queue.emplace_back(i);
152*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(queue.capacity(), capacity);
153*6dbdd20aSAndroid Build Coastguard Worker 
154*6dbdd20aSAndroid Build Coastguard Worker     // Check that all iterators are consistent.
155*6dbdd20aSAndroid Build Coastguard Worker     auto begin = queue.begin();
156*6dbdd20aSAndroid Build Coastguard Worker     auto end = queue.end();
157*6dbdd20aSAndroid Build Coastguard Worker     auto mid = begin + std::distance(begin, end) / 2;
158*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_TRUE(std::is_sorted(begin, end));
159*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_TRUE(begin < end);
160*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_TRUE(begin <= begin);
161*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_TRUE(begin >= begin);
162*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_FALSE(begin < begin);
163*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_FALSE(begin > begin);
164*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_TRUE(begin + 1 > begin);
165*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_TRUE(begin + 1 >= begin);
166*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_FALSE(begin >= begin + 1);
167*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_TRUE(begin <= begin);
168*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_TRUE(begin <= begin + 1);
169*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_TRUE(end > mid);
170*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_TRUE(mid > begin);
171*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_TRUE(std::is_sorted(begin, mid));
172*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_TRUE(std::is_sorted(mid, end));
173*6dbdd20aSAndroid Build Coastguard Worker   }
174*6dbdd20aSAndroid Build Coastguard Worker }
175*6dbdd20aSAndroid Build Coastguard Worker 
TEST(CircularQueueTest,ObjectLifetime)176*6dbdd20aSAndroid Build Coastguard Worker TEST(CircularQueueTest, ObjectLifetime) {
177*6dbdd20aSAndroid Build Coastguard Worker   class Checker {
178*6dbdd20aSAndroid Build Coastguard Worker    public:
179*6dbdd20aSAndroid Build Coastguard Worker     struct Stats {
180*6dbdd20aSAndroid Build Coastguard Worker       int num_ctors = 0;
181*6dbdd20aSAndroid Build Coastguard Worker       int num_dtors = 0;
182*6dbdd20aSAndroid Build Coastguard Worker       int num_alive = 0;
183*6dbdd20aSAndroid Build Coastguard Worker     };
184*6dbdd20aSAndroid Build Coastguard Worker     Checker(Stats* stats, int n) : stats_(stats), n_(n) {
185*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_GE(n, 0);
186*6dbdd20aSAndroid Build Coastguard Worker       stats_->num_ctors++;
187*6dbdd20aSAndroid Build Coastguard Worker       stats_->num_alive++;
188*6dbdd20aSAndroid Build Coastguard Worker       ptr_ = reinterpret_cast<uintptr_t>(this);
189*6dbdd20aSAndroid Build Coastguard Worker     }
190*6dbdd20aSAndroid Build Coastguard Worker 
191*6dbdd20aSAndroid Build Coastguard Worker     ~Checker() {
192*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_EQ(ptr_, reinterpret_cast<uintptr_t>(this));
193*6dbdd20aSAndroid Build Coastguard Worker       if (n_ >= 0)
194*6dbdd20aSAndroid Build Coastguard Worker         stats_->num_alive--;
195*6dbdd20aSAndroid Build Coastguard Worker       n_ = -1;
196*6dbdd20aSAndroid Build Coastguard Worker       stats_->num_dtors++;
197*6dbdd20aSAndroid Build Coastguard Worker     }
198*6dbdd20aSAndroid Build Coastguard Worker 
199*6dbdd20aSAndroid Build Coastguard Worker     Checker(Checker&& other) noexcept {
200*6dbdd20aSAndroid Build Coastguard Worker       n_ = other.n_;
201*6dbdd20aSAndroid Build Coastguard Worker       other.n_ = -1;
202*6dbdd20aSAndroid Build Coastguard Worker       stats_ = other.stats_;
203*6dbdd20aSAndroid Build Coastguard Worker       ptr_ = reinterpret_cast<uintptr_t>(this);
204*6dbdd20aSAndroid Build Coastguard Worker     }
205*6dbdd20aSAndroid Build Coastguard Worker 
206*6dbdd20aSAndroid Build Coastguard Worker     Checker& operator=(Checker&& other) {
207*6dbdd20aSAndroid Build Coastguard Worker       new (this) Checker(std::move(other));
208*6dbdd20aSAndroid Build Coastguard Worker       return *this;
209*6dbdd20aSAndroid Build Coastguard Worker     }
210*6dbdd20aSAndroid Build Coastguard Worker 
211*6dbdd20aSAndroid Build Coastguard Worker     Checker(const Checker&) = delete;
212*6dbdd20aSAndroid Build Coastguard Worker     Checker& operator=(const Checker&) = delete;
213*6dbdd20aSAndroid Build Coastguard Worker 
214*6dbdd20aSAndroid Build Coastguard Worker     Stats* stats_ = nullptr;
215*6dbdd20aSAndroid Build Coastguard Worker     uintptr_t ptr_ = 0;
216*6dbdd20aSAndroid Build Coastguard Worker     int n_ = -1;
217*6dbdd20aSAndroid Build Coastguard Worker   };
218*6dbdd20aSAndroid Build Coastguard Worker 
219*6dbdd20aSAndroid Build Coastguard Worker   // Check that dtors are invoked on old elements when growing capacity.
220*6dbdd20aSAndroid Build Coastguard Worker   Checker::Stats stats;
221*6dbdd20aSAndroid Build Coastguard Worker   {
222*6dbdd20aSAndroid Build Coastguard Worker     CircularQueue<Checker> queue(/*initial_capacity=*/2);
223*6dbdd20aSAndroid Build Coastguard Worker     for (int i = 0; i < 2; i++)
224*6dbdd20aSAndroid Build Coastguard Worker       queue.emplace_back(&stats, i);
225*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(stats.num_ctors, 2);
226*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(stats.num_dtors, 0);
227*6dbdd20aSAndroid Build Coastguard Worker 
228*6dbdd20aSAndroid Build Coastguard Worker     // This further insertion will grow the queue, causing two std::move()s
229*6dbdd20aSAndroid Build Coastguard Worker     // for the previous elements and one emplace.
230*6dbdd20aSAndroid Build Coastguard Worker     queue.emplace_back(&stats, 2);
231*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(stats.num_ctors, 3);
232*6dbdd20aSAndroid Build Coastguard Worker 
233*6dbdd20aSAndroid Build Coastguard Worker     // The two old elements that have std::move()d should be destroyed upon
234*6dbdd20aSAndroid Build Coastguard Worker     // expansion.
235*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(stats.num_dtors, 2);
236*6dbdd20aSAndroid Build Coastguard Worker   }
237*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(stats.num_dtors, 2 + 3);
238*6dbdd20aSAndroid Build Coastguard Worker 
239*6dbdd20aSAndroid Build Coastguard Worker   stats = Checker::Stats();
240*6dbdd20aSAndroid Build Coastguard Worker   {
241*6dbdd20aSAndroid Build Coastguard Worker     CircularQueue<Checker> queue(/*initial_capacity=*/1);
242*6dbdd20aSAndroid Build Coastguard Worker     for (int i = 0; i < 5; i++)
243*6dbdd20aSAndroid Build Coastguard Worker       queue.emplace_back(&stats, i);
244*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(stats.num_ctors, 5);
245*6dbdd20aSAndroid Build Coastguard Worker     Checker c5(&stats, 5);
246*6dbdd20aSAndroid Build Coastguard Worker     queue.emplace_back(std::move(c5));
247*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(stats.num_alive, 5 + 1);
248*6dbdd20aSAndroid Build Coastguard Worker 
249*6dbdd20aSAndroid Build Coastguard Worker     queue.erase_front(2);
250*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(stats.num_alive, 5 + 1 - 2);
251*6dbdd20aSAndroid Build Coastguard Worker 
252*6dbdd20aSAndroid Build Coastguard Worker     for (int i = 0; i < 4; i++)
253*6dbdd20aSAndroid Build Coastguard Worker       queue.emplace_back(&stats, 10 + i);
254*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(stats.num_alive, 5 + 1 - 2 + 4);
255*6dbdd20aSAndroid Build Coastguard Worker   }
256*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(stats.num_ctors, 5 + 1 + 4);
257*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(stats.num_alive, 0);
258*6dbdd20aSAndroid Build Coastguard Worker 
259*6dbdd20aSAndroid Build Coastguard Worker   stats = Checker::Stats();
260*6dbdd20aSAndroid Build Coastguard Worker   {
261*6dbdd20aSAndroid Build Coastguard Worker     CircularQueue<Checker> q1(1);
262*6dbdd20aSAndroid Build Coastguard Worker     CircularQueue<Checker> q2(64);
263*6dbdd20aSAndroid Build Coastguard Worker     for (int i = 0; i < 100; i++) {
264*6dbdd20aSAndroid Build Coastguard Worker       q1.emplace_back(&stats, 1000 + i * 2);
265*6dbdd20aSAndroid Build Coastguard Worker       q2.emplace_back(&stats, 1001 + i * 2);
266*6dbdd20aSAndroid Build Coastguard Worker     }
267*6dbdd20aSAndroid Build Coastguard Worker 
268*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(stats.num_alive, 200);
269*6dbdd20aSAndroid Build Coastguard Worker 
270*6dbdd20aSAndroid Build Coastguard Worker     for (int i = 0; i < 100; i += 2) {
271*6dbdd20aSAndroid Build Coastguard Worker       auto it1 = q1.begin() + i;
272*6dbdd20aSAndroid Build Coastguard Worker       auto it2 = q2.begin() + i;
273*6dbdd20aSAndroid Build Coastguard Worker       std::swap(*it1, *it2);
274*6dbdd20aSAndroid Build Coastguard Worker     }
275*6dbdd20aSAndroid Build Coastguard Worker     auto comparer = [](const Checker& lhs, const Checker& rhs) {
276*6dbdd20aSAndroid Build Coastguard Worker       return lhs.n_ < rhs.n_;
277*6dbdd20aSAndroid Build Coastguard Worker     };
278*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_TRUE(std::is_sorted(q1.begin(), q1.end(), comparer));
279*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_TRUE(std::is_sorted(q2.begin(), q2.end(), comparer));
280*6dbdd20aSAndroid Build Coastguard Worker     ASSERT_EQ(stats.num_alive, 200);
281*6dbdd20aSAndroid Build Coastguard Worker   }
282*6dbdd20aSAndroid Build Coastguard Worker }
283*6dbdd20aSAndroid Build Coastguard Worker 
284*6dbdd20aSAndroid Build Coastguard Worker }  // namespace
285*6dbdd20aSAndroid Build Coastguard Worker }  // namespace base
286*6dbdd20aSAndroid Build Coastguard Worker }  // namespace perfetto
287