xref: /aosp_15_r20/external/pigweed/pw_containers/intrusive_set_test.cc (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker // Copyright 2024 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/intrusive_set.h"
16*61c4878aSAndroid Build Coastguard Worker 
17*61c4878aSAndroid Build Coastguard Worker #include "pw_compilation_testing/negative_compilation.h"
18*61c4878aSAndroid Build Coastguard Worker #include "pw_containers/intrusive_multiset.h"
19*61c4878aSAndroid Build Coastguard Worker #include "pw_span/span.h"
20*61c4878aSAndroid Build Coastguard Worker #include "pw_unit_test/framework.h"
21*61c4878aSAndroid Build Coastguard Worker 
22*61c4878aSAndroid Build Coastguard Worker namespace {
23*61c4878aSAndroid Build Coastguard Worker 
24*61c4878aSAndroid Build Coastguard Worker // Base item.
25*61c4878aSAndroid Build Coastguard Worker class BaseItem {
26*61c4878aSAndroid Build Coastguard Worker  public:
BaseItem(size_t key,const char * name)27*61c4878aSAndroid Build Coastguard Worker   BaseItem(size_t key, const char* name) : key_(key), name_(name) {}
28*61c4878aSAndroid Build Coastguard Worker 
key() const29*61c4878aSAndroid Build Coastguard Worker   constexpr const size_t& key() const { return key_; }
name() const30*61c4878aSAndroid Build Coastguard Worker   constexpr const char* name() const { return name_; }
set_name(const char * name)31*61c4878aSAndroid Build Coastguard Worker   void set_name(const char* name) { name_ = name; }
32*61c4878aSAndroid Build Coastguard Worker 
operator <(const BaseItem & rhs) const33*61c4878aSAndroid Build Coastguard Worker   bool operator<(const BaseItem& rhs) const { return key() < rhs.key(); }
34*61c4878aSAndroid Build Coastguard Worker 
35*61c4878aSAndroid Build Coastguard Worker  private:
36*61c4878aSAndroid Build Coastguard Worker   size_t key_;
37*61c4878aSAndroid Build Coastguard Worker   const char* name_;
38*61c4878aSAndroid Build Coastguard Worker };
39*61c4878aSAndroid Build Coastguard Worker 
40*61c4878aSAndroid Build Coastguard Worker // A basic item that can be used in a set.
41*61c4878aSAndroid Build Coastguard Worker struct TestItem : public ::pw::IntrusiveSet<TestItem>::Item, public BaseItem {
TestItem__anonb368cb8d0111::TestItem42*61c4878aSAndroid Build Coastguard Worker   TestItem(size_t key, const char* name) : BaseItem(key, name) {}
43*61c4878aSAndroid Build Coastguard Worker };
44*61c4878aSAndroid Build Coastguard Worker 
45*61c4878aSAndroid Build Coastguard Worker // Test fixture.
46*61c4878aSAndroid Build Coastguard Worker class IntrusiveSetTest : public ::testing::Test {
47*61c4878aSAndroid Build Coastguard Worker  protected:
48*61c4878aSAndroid Build Coastguard Worker   using IntrusiveSet = ::pw::IntrusiveSet<TestItem>;
49*61c4878aSAndroid Build Coastguard Worker   static constexpr size_t kNumItems = 10;
50*61c4878aSAndroid Build Coastguard Worker 
SetUp()51*61c4878aSAndroid Build Coastguard Worker   void SetUp() override { set_.insert(items_.begin(), items_.end()); }
52*61c4878aSAndroid Build Coastguard Worker 
TearDown()53*61c4878aSAndroid Build Coastguard Worker   void TearDown() override { set_.clear(); }
54*61c4878aSAndroid Build Coastguard Worker 
55*61c4878aSAndroid Build Coastguard Worker   std::array<TestItem, kNumItems> items_ = {{
56*61c4878aSAndroid Build Coastguard Worker       {30, "a"},
57*61c4878aSAndroid Build Coastguard Worker       {50, "b"},
58*61c4878aSAndroid Build Coastguard Worker       {20, "c"},
59*61c4878aSAndroid Build Coastguard Worker       {40, "d"},
60*61c4878aSAndroid Build Coastguard Worker       {10, "e"},
61*61c4878aSAndroid Build Coastguard Worker       {35, "A"},
62*61c4878aSAndroid Build Coastguard Worker       {55, "B"},
63*61c4878aSAndroid Build Coastguard Worker       {25, "C"},
64*61c4878aSAndroid Build Coastguard Worker       {45, "D"},
65*61c4878aSAndroid Build Coastguard Worker       {15, "E"},
66*61c4878aSAndroid Build Coastguard Worker   }};
67*61c4878aSAndroid Build Coastguard Worker 
68*61c4878aSAndroid Build Coastguard Worker   IntrusiveSet set_;
69*61c4878aSAndroid Build Coastguard Worker };
70*61c4878aSAndroid Build Coastguard Worker 
71*61c4878aSAndroid Build Coastguard Worker // Unit tests.
72*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Construct_Default)73*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Construct_Default) {
74*61c4878aSAndroid Build Coastguard Worker   IntrusiveSet set;
75*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(set.empty());
76*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set.begin(), set.end());
77*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set.rbegin(), set.rend());
78*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set.size(), 0U);
79*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set.lower_bound(items_[0]), set.end());
80*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set.upper_bound(items_[0]), set.end());
81*61c4878aSAndroid Build Coastguard Worker }
82*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Construct_ObjectIterators)83*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Construct_ObjectIterators) {
84*61c4878aSAndroid Build Coastguard Worker   set_.clear();
85*61c4878aSAndroid Build Coastguard Worker   IntrusiveSet set(items_.begin(), items_.end());
86*61c4878aSAndroid Build Coastguard Worker   EXPECT_FALSE(set.empty());
87*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set.size(), items_.size());
88*61c4878aSAndroid Build Coastguard Worker   set.clear();
89*61c4878aSAndroid Build Coastguard Worker }
90*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Construct_ObjectIterators_Empty)91*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Construct_ObjectIterators_Empty) {
92*61c4878aSAndroid Build Coastguard Worker   IntrusiveSet set(items_.end(), items_.end());
93*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(set.empty());
94*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set.size(), 0U);
95*61c4878aSAndroid Build Coastguard Worker }
96*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Construct_PointerIterators)97*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Construct_PointerIterators) {
98*61c4878aSAndroid Build Coastguard Worker   std::array<TestItem*, 3> ptrs = {&items_[0], &items_[1], &items_[2]};
99*61c4878aSAndroid Build Coastguard Worker   set_.clear();
100*61c4878aSAndroid Build Coastguard Worker   IntrusiveSet set(ptrs.begin(), ptrs.end());
101*61c4878aSAndroid Build Coastguard Worker   EXPECT_FALSE(set.empty());
102*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set.size(), 3U);
103*61c4878aSAndroid Build Coastguard Worker   set.clear();
104*61c4878aSAndroid Build Coastguard Worker }
105*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Construct_PointerIterators_Empty)106*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Construct_PointerIterators_Empty) {
107*61c4878aSAndroid Build Coastguard Worker   std::array<TestItem*, 0> ptrs;
108*61c4878aSAndroid Build Coastguard Worker   IntrusiveSet set(ptrs.begin(), ptrs.end());
109*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(set.empty());
110*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set.size(), 0U);
111*61c4878aSAndroid Build Coastguard Worker   set.clear();
112*61c4878aSAndroid Build Coastguard Worker }
113*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Construct_InitializerList)114*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Construct_InitializerList) {
115*61c4878aSAndroid Build Coastguard Worker   set_.clear();
116*61c4878aSAndroid Build Coastguard Worker   IntrusiveSet set({&items_[0], &items_[2], &items_[4]});
117*61c4878aSAndroid Build Coastguard Worker   auto iter = set.begin();
118*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ((iter++)->key(), 10U);
119*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ((iter++)->key(), 20U);
120*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ((iter++)->key(), 30U);
121*61c4878aSAndroid Build Coastguard Worker   set.clear();
122*61c4878aSAndroid Build Coastguard Worker }
123*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Construct_InitializerList_Empty)124*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Construct_InitializerList_Empty) {
125*61c4878aSAndroid Build Coastguard Worker   IntrusiveSet set(std::initializer_list<TestItem*>{});
126*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(set.empty());
127*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set.size(), 0U);
128*61c4878aSAndroid Build Coastguard Worker }
129*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Construct_CustomCompare)130*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Construct_CustomCompare) {
131*61c4878aSAndroid Build Coastguard Worker   auto greater_than = [](const BaseItem& lhs, const BaseItem& rhs) {
132*61c4878aSAndroid Build Coastguard Worker     return lhs.key() > rhs.key();
133*61c4878aSAndroid Build Coastguard Worker   };
134*61c4878aSAndroid Build Coastguard Worker   set_.clear();
135*61c4878aSAndroid Build Coastguard Worker   IntrusiveSet set({&items_[0], &items_[2], &items_[4]},
136*61c4878aSAndroid Build Coastguard Worker                    std::move(greater_than));
137*61c4878aSAndroid Build Coastguard Worker   auto iter = set.begin();
138*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ((iter++)->key(), 30U);
139*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ((iter++)->key(), 20U);
140*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ((iter++)->key(), 10U);
141*61c4878aSAndroid Build Coastguard Worker   set.clear();
142*61c4878aSAndroid Build Coastguard Worker }
143*61c4878aSAndroid Build Coastguard Worker 
144*61c4878aSAndroid Build Coastguard Worker //  A struct that is not a set item.
145*61c4878aSAndroid Build Coastguard Worker struct NotAnItem : public BaseItem {
NotAnItem__anonb368cb8d0111::NotAnItem146*61c4878aSAndroid Build Coastguard Worker   NotAnItem(size_t key, const char* name) : BaseItem(key, name) {}
147*61c4878aSAndroid Build Coastguard Worker };
148*61c4878aSAndroid Build Coastguard Worker 
149*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(IncompatibleItem)
150*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("IntrusiveSet items must be derived from IntrusiveSet<T>::Item");
151*61c4878aSAndroid Build Coastguard Worker 
152*61c4878aSAndroid Build Coastguard Worker struct BadItem : public ::pw::IntrusiveSet<NotAnItem>::Item {
153*61c4878aSAndroid Build Coastguard Worker  public:
operator <__anonb368cb8d0111::BadItem154*61c4878aSAndroid Build Coastguard Worker   constexpr bool operator<(const BadItem& rhs) const { return this < &rhs; }
155*61c4878aSAndroid Build Coastguard Worker };
156*61c4878aSAndroid Build Coastguard Worker 
157*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] ::pw::IntrusiveSet<BadItem> bad_set1;
158*61c4878aSAndroid Build Coastguard Worker 
159*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(DoesNotInheritFromItem)
160*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("IntrusiveSet items must be derived from IntrusiveSet<T>::Item");
161*61c4878aSAndroid Build Coastguard Worker 
162*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] ::pw::IntrusiveSet<NotAnItem> bad_set2;
163*61c4878aSAndroid Build Coastguard Worker 
164*61c4878aSAndroid Build Coastguard Worker #endif  // PW_NC_TEST
165*61c4878aSAndroid Build Coastguard Worker 
166*61c4878aSAndroid Build Coastguard Worker // Iterators
167*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Iterator)168*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Iterator) {
169*61c4878aSAndroid Build Coastguard Worker   const IntrusiveSet& set = set_;
170*61c4878aSAndroid Build Coastguard Worker   auto iter = set.begin();
171*61c4878aSAndroid Build Coastguard Worker   size_t key = 10;
172*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < kNumItems; ++i) {
173*61c4878aSAndroid Build Coastguard Worker     auto& item = *iter++;
174*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(item.key(), key);
175*61c4878aSAndroid Build Coastguard Worker     key += 5;
176*61c4878aSAndroid Build Coastguard Worker   }
177*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(key, 60U);
178*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(iter, set.end());
179*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(iter, set.cend());
180*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < kNumItems; ++i) {
181*61c4878aSAndroid Build Coastguard Worker     key -= 5;
182*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ((--iter)->key(), key);
183*61c4878aSAndroid Build Coastguard Worker   }
184*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(key, 10U);
185*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(iter, set.begin());
186*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(iter, set.cbegin());
187*61c4878aSAndroid Build Coastguard Worker }
188*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,ReverseIterator)189*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, ReverseIterator) {
190*61c4878aSAndroid Build Coastguard Worker   const IntrusiveSet& set = set_;
191*61c4878aSAndroid Build Coastguard Worker   auto iter = set.rbegin();
192*61c4878aSAndroid Build Coastguard Worker   size_t key = 55;
193*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < kNumItems; ++i) {
194*61c4878aSAndroid Build Coastguard Worker     auto& item = *iter++;
195*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(item.key(), key);
196*61c4878aSAndroid Build Coastguard Worker     key -= 5;
197*61c4878aSAndroid Build Coastguard Worker   }
198*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(key, 5U);
199*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(iter, set.rend());
200*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(iter, set.crend());
201*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < kNumItems; ++i) {
202*61c4878aSAndroid Build Coastguard Worker     key += 5;
203*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ((--iter)->key(), key);
204*61c4878aSAndroid Build Coastguard Worker   }
205*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(key, 55U);
206*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(iter, set.rbegin());
207*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(iter, set.crbegin());
208*61c4878aSAndroid Build Coastguard Worker }
209*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,ConstIterator_CompareNonConst)210*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, ConstIterator_CompareNonConst) {
211*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.end(), set_.cend());
212*61c4878aSAndroid Build Coastguard Worker }
213*61c4878aSAndroid Build Coastguard Worker 
214*61c4878aSAndroid Build Coastguard Worker // A set item that is distinct from TestItem
215*61c4878aSAndroid Build Coastguard Worker struct OtherItem : public ::pw::IntrusiveSet<OtherItem>::Item, public BaseItem {
OtherItem__anonb368cb8d0111::OtherItem216*61c4878aSAndroid Build Coastguard Worker   OtherItem(size_t key, const char* name) : BaseItem(key, name) {}
217*61c4878aSAndroid Build Coastguard Worker };
218*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,ConstIterator_CompareNonConst_CompilationFails)219*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, ConstIterator_CompareNonConst_CompilationFails) {
220*61c4878aSAndroid Build Coastguard Worker   ::pw::IntrusiveSet<OtherItem> set;
221*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(CannotCompareIncompatibleIteratorsEqual)
222*61c4878aSAndroid Build Coastguard Worker   PW_NC_EXPECT("set_\.end\(\) == set\.end\(\)");
223*61c4878aSAndroid Build Coastguard Worker   static_cast<void>(set_.end() == set.end());
224*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(CannotCompareIncompatibleIteratorsInequal)
225*61c4878aSAndroid Build Coastguard Worker   PW_NC_EXPECT("set_\.end\(\) != set\.end\(\)");
226*61c4878aSAndroid Build Coastguard Worker   static_cast<void>(set_.end() != set.end());
227*61c4878aSAndroid Build Coastguard Worker #endif  // PW_NC_TEST
228*61c4878aSAndroid Build Coastguard Worker }
229*61c4878aSAndroid Build Coastguard Worker 
230*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(CannotModifyThroughConstIterator)
231*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("function is not marked const|discards qualifiers");
232*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,ConstIterator_Modify)233*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, ConstIterator_Modify) {
234*61c4878aSAndroid Build Coastguard Worker   const IntrusiveSet& set = set_;
235*61c4878aSAndroid Build Coastguard Worker   auto iter = set.begin();
236*61c4878aSAndroid Build Coastguard Worker   iter->set_name("nope");
237*61c4878aSAndroid Build Coastguard Worker }
238*61c4878aSAndroid Build Coastguard Worker 
239*61c4878aSAndroid Build Coastguard Worker #endif  // PW_NC_TEST
240*61c4878aSAndroid Build Coastguard Worker 
241*61c4878aSAndroid Build Coastguard Worker // Capacity
242*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,IsEmpty)243*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, IsEmpty) {
244*61c4878aSAndroid Build Coastguard Worker   const IntrusiveSet& set = set_;
245*61c4878aSAndroid Build Coastguard Worker   EXPECT_FALSE(set.empty());
246*61c4878aSAndroid Build Coastguard Worker   set_.clear();
247*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(set.empty());
248*61c4878aSAndroid Build Coastguard Worker }
249*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,GetSize)250*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, GetSize) {
251*61c4878aSAndroid Build Coastguard Worker   const IntrusiveSet& set = set_;
252*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set.size(), kNumItems);
253*61c4878aSAndroid Build Coastguard Worker   set_.clear();
254*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set.size(), 0U);
255*61c4878aSAndroid Build Coastguard Worker }
256*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,GetMaxSize)257*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, GetMaxSize) {
258*61c4878aSAndroid Build Coastguard Worker   const IntrusiveSet& set = set_;
259*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set.max_size(), size_t(std::numeric_limits<ptrdiff_t>::max()));
260*61c4878aSAndroid Build Coastguard Worker }
261*61c4878aSAndroid Build Coastguard Worker 
262*61c4878aSAndroid Build Coastguard Worker // Modifiers
263*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Insert)264*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Insert) {
265*61c4878aSAndroid Build Coastguard Worker   set_.clear();
266*61c4878aSAndroid Build Coastguard Worker   bool sorted = true;
267*61c4878aSAndroid Build Coastguard Worker   size_t prev_key = 0;
268*61c4878aSAndroid Build Coastguard Worker   for (auto& item : items_) {
269*61c4878aSAndroid Build Coastguard Worker     sorted &= prev_key < item.key();
270*61c4878aSAndroid Build Coastguard Worker 
271*61c4878aSAndroid Build Coastguard Worker     // Use the "hinted" version of insert.
272*61c4878aSAndroid Build Coastguard Worker     set_.insert(set_.end(), item);
273*61c4878aSAndroid Build Coastguard Worker     prev_key = item.key();
274*61c4878aSAndroid Build Coastguard Worker   }
275*61c4878aSAndroid Build Coastguard Worker   EXPECT_FALSE(sorted);
276*61c4878aSAndroid Build Coastguard Worker 
277*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.size(), kNumItems);
278*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_sorted(set_.begin(), set_.end()));
279*61c4878aSAndroid Build Coastguard Worker }
280*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Insert_Duplicate)281*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Insert_Duplicate) {
282*61c4878aSAndroid Build Coastguard Worker   TestItem item1(60, "1");
283*61c4878aSAndroid Build Coastguard Worker   TestItem item2(60, "2");
284*61c4878aSAndroid Build Coastguard Worker 
285*61c4878aSAndroid Build Coastguard Worker   auto result = set_.insert(item1);
286*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(result.first->name(), "1");
287*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(result.second);
288*61c4878aSAndroid Build Coastguard Worker 
289*61c4878aSAndroid Build Coastguard Worker   result = set_.insert(item2);
290*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(result.first->name(), "1");
291*61c4878aSAndroid Build Coastguard Worker   EXPECT_FALSE(result.second);
292*61c4878aSAndroid Build Coastguard Worker 
293*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.size(), kNumItems + 1);
294*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_sorted(set_.begin(), set_.end()));
295*61c4878aSAndroid Build Coastguard Worker 
296*61c4878aSAndroid Build Coastguard Worker   // Explicitly clear the set before item 1 goes out of scope.
297*61c4878aSAndroid Build Coastguard Worker   set_.clear();
298*61c4878aSAndroid Build Coastguard Worker }
299*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Insert_ObjectIterators)300*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Insert_ObjectIterators) {
301*61c4878aSAndroid Build Coastguard Worker   set_.clear();
302*61c4878aSAndroid Build Coastguard Worker   set_.insert(items_.begin(), items_.end());
303*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.size(), kNumItems);
304*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_sorted(set_.begin(), set_.end()));
305*61c4878aSAndroid Build Coastguard Worker }
306*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Insert_ObjectIterators_Empty)307*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Insert_ObjectIterators_Empty) {
308*61c4878aSAndroid Build Coastguard Worker   set_.insert(items_.end(), items_.end());
309*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.size(), kNumItems);
310*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_sorted(set_.begin(), set_.end()));
311*61c4878aSAndroid Build Coastguard Worker }
312*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Insert_ObjectIterators_WithDuplicates)313*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Insert_ObjectIterators_WithDuplicates) {
314*61c4878aSAndroid Build Coastguard Worker   std::array<TestItem, 3> items = {{
315*61c4878aSAndroid Build Coastguard Worker       {50, "B"},
316*61c4878aSAndroid Build Coastguard Worker       {40, "D"},
317*61c4878aSAndroid Build Coastguard Worker       {60, "F"},
318*61c4878aSAndroid Build Coastguard Worker   }};
319*61c4878aSAndroid Build Coastguard Worker 
320*61c4878aSAndroid Build Coastguard Worker   set_.insert(items.begin(), items.end());
321*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.size(), kNumItems + 1);
322*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_sorted(set_.begin(), set_.end()));
323*61c4878aSAndroid Build Coastguard Worker 
324*61c4878aSAndroid Build Coastguard Worker   auto iter = set_.find(items[0]);
325*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set_.end());
326*61c4878aSAndroid Build Coastguard Worker   EXPECT_STRNE(iter->name(), "B");
327*61c4878aSAndroid Build Coastguard Worker 
328*61c4878aSAndroid Build Coastguard Worker   iter = set_.find(items[1]);
329*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set_.end());
330*61c4878aSAndroid Build Coastguard Worker   EXPECT_STRNE(iter->name(), "D");
331*61c4878aSAndroid Build Coastguard Worker 
332*61c4878aSAndroid Build Coastguard Worker   iter = set_.find(items[2]);
333*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set_.end());
334*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(iter->name(), "F");
335*61c4878aSAndroid Build Coastguard Worker 
336*61c4878aSAndroid Build Coastguard Worker   // Explicitly clear the set before items goes out of scope.
337*61c4878aSAndroid Build Coastguard Worker   set_.clear();
338*61c4878aSAndroid Build Coastguard Worker }
339*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Insert_PointerIterators)340*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Insert_PointerIterators) {
341*61c4878aSAndroid Build Coastguard Worker   set_.clear();
342*61c4878aSAndroid Build Coastguard Worker   std::array<TestItem*, 3> ptrs = {&items_[0], &items_[1], &items_[2]};
343*61c4878aSAndroid Build Coastguard Worker 
344*61c4878aSAndroid Build Coastguard Worker   set_.insert(ptrs.begin(), ptrs.end());
345*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.size(), 3U);
346*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_sorted(set_.begin(), set_.end()));
347*61c4878aSAndroid Build Coastguard Worker }
348*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Insert_PointerIterators_Empty)349*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Insert_PointerIterators_Empty) {
350*61c4878aSAndroid Build Coastguard Worker   std::array<TestItem*, 0> ptrs;
351*61c4878aSAndroid Build Coastguard Worker 
352*61c4878aSAndroid Build Coastguard Worker   set_.insert(ptrs.begin(), ptrs.end());
353*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.size(), kNumItems);
354*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_sorted(set_.begin(), set_.end()));
355*61c4878aSAndroid Build Coastguard Worker }
356*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Insert_PointerIterators_WithDuplicates)357*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Insert_PointerIterators_WithDuplicates) {
358*61c4878aSAndroid Build Coastguard Worker   TestItem item1(50, "B");
359*61c4878aSAndroid Build Coastguard Worker   TestItem item2(40, "D");
360*61c4878aSAndroid Build Coastguard Worker   TestItem item3(60, "F");
361*61c4878aSAndroid Build Coastguard Worker   std::array<TestItem*, 3> ptrs = {&item1, &item2, &item3};
362*61c4878aSAndroid Build Coastguard Worker 
363*61c4878aSAndroid Build Coastguard Worker   set_.insert(ptrs.begin(), ptrs.end());
364*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.size(), kNumItems + 1);
365*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_sorted(set_.begin(), set_.end()));
366*61c4878aSAndroid Build Coastguard Worker 
367*61c4878aSAndroid Build Coastguard Worker   auto iter = set_.find(item1);
368*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set_.end());
369*61c4878aSAndroid Build Coastguard Worker   EXPECT_STRNE(iter->name(), "B");
370*61c4878aSAndroid Build Coastguard Worker 
371*61c4878aSAndroid Build Coastguard Worker   iter = set_.find(item2);
372*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set_.end());
373*61c4878aSAndroid Build Coastguard Worker   EXPECT_STRNE(iter->name(), "D");
374*61c4878aSAndroid Build Coastguard Worker 
375*61c4878aSAndroid Build Coastguard Worker   iter = set_.find(item3);
376*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set_.end());
377*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(iter->name(), "F");
378*61c4878aSAndroid Build Coastguard Worker 
379*61c4878aSAndroid Build Coastguard Worker   // Explicitly clear the set before items goes out of scope.
380*61c4878aSAndroid Build Coastguard Worker   set_.clear();
381*61c4878aSAndroid Build Coastguard Worker }
382*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Insert_InitializerList)383*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Insert_InitializerList) {
384*61c4878aSAndroid Build Coastguard Worker   set_.clear();
385*61c4878aSAndroid Build Coastguard Worker   set_.insert({&items_[0], &items_[2], &items_[4]});
386*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.size(), 3U);
387*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_sorted(set_.begin(), set_.end()));
388*61c4878aSAndroid Build Coastguard Worker }
389*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Insert_InitializerList_Empty)390*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Insert_InitializerList_Empty) {
391*61c4878aSAndroid Build Coastguard Worker   set_.insert({});
392*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.size(), kNumItems);
393*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_sorted(set_.begin(), set_.end()));
394*61c4878aSAndroid Build Coastguard Worker }
395*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Insert_InitializerList_WithDuplicates)396*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Insert_InitializerList_WithDuplicates) {
397*61c4878aSAndroid Build Coastguard Worker   TestItem item1(50, "B");
398*61c4878aSAndroid Build Coastguard Worker   TestItem item2(40, "D");
399*61c4878aSAndroid Build Coastguard Worker   TestItem item3(60, "F");
400*61c4878aSAndroid Build Coastguard Worker 
401*61c4878aSAndroid Build Coastguard Worker   set_.insert({&item1, &item2, &item3});
402*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.size(), kNumItems + 1);
403*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_sorted(set_.begin(), set_.end()));
404*61c4878aSAndroid Build Coastguard Worker 
405*61c4878aSAndroid Build Coastguard Worker   auto iter = set_.find(item1);
406*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set_.end());
407*61c4878aSAndroid Build Coastguard Worker   EXPECT_STRNE(iter->name(), "B");
408*61c4878aSAndroid Build Coastguard Worker 
409*61c4878aSAndroid Build Coastguard Worker   iter = set_.find(item2);
410*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set_.end());
411*61c4878aSAndroid Build Coastguard Worker   EXPECT_STRNE(iter->name(), "D");
412*61c4878aSAndroid Build Coastguard Worker 
413*61c4878aSAndroid Build Coastguard Worker   iter = set_.find(item3);
414*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set_.end());
415*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(iter->name(), "F");
416*61c4878aSAndroid Build Coastguard Worker 
417*61c4878aSAndroid Build Coastguard Worker   // Explicitly clear the set before items goes out of scope.
418*61c4878aSAndroid Build Coastguard Worker   set_.clear();
419*61c4878aSAndroid Build Coastguard Worker }
420*61c4878aSAndroid Build Coastguard Worker 
421*61c4878aSAndroid Build Coastguard Worker // An item derived from TestItem.
422*61c4878aSAndroid Build Coastguard Worker struct DerivedItem : public TestItem {
DerivedItem__anonb368cb8d0111::DerivedItem423*61c4878aSAndroid Build Coastguard Worker   DerivedItem(size_t n, const char* name) : TestItem(n * 10, name) {}
424*61c4878aSAndroid Build Coastguard Worker };
425*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Insert_DerivedItems)426*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Insert_DerivedItems) {
427*61c4878aSAndroid Build Coastguard Worker   DerivedItem item1(6, "f");
428*61c4878aSAndroid Build Coastguard Worker   set_.insert(item1);
429*61c4878aSAndroid Build Coastguard Worker 
430*61c4878aSAndroid Build Coastguard Worker   DerivedItem item2(7, "g");
431*61c4878aSAndroid Build Coastguard Worker   set_.insert(item2);
432*61c4878aSAndroid Build Coastguard Worker 
433*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.size(), kNumItems + 2);
434*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_sorted(set_.begin(), set_.end()));
435*61c4878aSAndroid Build Coastguard Worker 
436*61c4878aSAndroid Build Coastguard Worker   // Explicitly clear the set before items goes out of scope.
437*61c4878aSAndroid Build Coastguard Worker   set_.clear();
438*61c4878aSAndroid Build Coastguard Worker }
439*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Insert_DerivedItems_CompilationFails)440*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Insert_DerivedItems_CompilationFails) {
441*61c4878aSAndroid Build Coastguard Worker   ::pw::IntrusiveSet<DerivedItem> derived_from_compatible_item_type;
442*61c4878aSAndroid Build Coastguard Worker 
443*61c4878aSAndroid Build Coastguard Worker   DerivedItem item1(6, "f");
444*61c4878aSAndroid Build Coastguard Worker   derived_from_compatible_item_type.insert(item1);
445*61c4878aSAndroid Build Coastguard Worker 
446*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(derived_from_compatible_item_type.size(), 1U);
447*61c4878aSAndroid Build Coastguard Worker 
448*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(CannotAddBaseClassToDerivedClassSet)
449*61c4878aSAndroid Build Coastguard Worker   PW_NC_EXPECT("derived_from_compatible_item_type\.insert\(item2\)");
450*61c4878aSAndroid Build Coastguard Worker 
451*61c4878aSAndroid Build Coastguard Worker   TestItem item2(70, "g");
452*61c4878aSAndroid Build Coastguard Worker   derived_from_compatible_item_type.insert(item2);
453*61c4878aSAndroid Build Coastguard Worker #endif
454*61c4878aSAndroid Build Coastguard Worker   derived_from_compatible_item_type.clear();
455*61c4878aSAndroid Build Coastguard Worker }
456*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Erase_OneItem)457*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Erase_OneItem) {
458*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < kNumItems; ++i) {
459*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(set_.size(), kNumItems);
460*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(set_.erase(items_[i]), 1U);
461*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(set_.size(), kNumItems - 1);
462*61c4878aSAndroid Build Coastguard Worker     auto iter = set_.find(items_[i]);
463*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(iter, set_.end());
464*61c4878aSAndroid Build Coastguard Worker     set_.insert(items_[i]);
465*61c4878aSAndroid Build Coastguard Worker   }
466*61c4878aSAndroid Build Coastguard Worker }
467*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Erase_OnlyItem)468*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Erase_OnlyItem) {
469*61c4878aSAndroid Build Coastguard Worker   set_.clear();
470*61c4878aSAndroid Build Coastguard Worker   set_.insert(items_[0]);
471*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.size(), 1U);
472*61c4878aSAndroid Build Coastguard Worker 
473*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.erase(items_[0]), 1U);
474*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.size(), 0U);
475*61c4878aSAndroid Build Coastguard Worker }
476*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Erase_AllOnebyOne)477*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Erase_AllOnebyOne) {
478*61c4878aSAndroid Build Coastguard Worker   auto iter = set_.begin();
479*61c4878aSAndroid Build Coastguard Worker   for (size_t n = kNumItems; n != 0; --n) {
480*61c4878aSAndroid Build Coastguard Worker     ASSERT_NE(iter, set_.end());
481*61c4878aSAndroid Build Coastguard Worker     iter = set_.erase(iter);
482*61c4878aSAndroid Build Coastguard Worker   }
483*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(iter, set_.end());
484*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.size(), 0U);
485*61c4878aSAndroid Build Coastguard Worker }
486*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Erase_Range)487*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Erase_Range) {
488*61c4878aSAndroid Build Coastguard Worker   auto first = set_.begin();
489*61c4878aSAndroid Build Coastguard Worker   auto last = set_.end();
490*61c4878aSAndroid Build Coastguard Worker   ++first;
491*61c4878aSAndroid Build Coastguard Worker   --last;
492*61c4878aSAndroid Build Coastguard Worker   auto iter = set_.erase(first, last);
493*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.size(), 2U);
494*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_sorted(set_.begin(), set_.end()));
495*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(iter->key(), 55U);
496*61c4878aSAndroid Build Coastguard Worker }
497*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Erase_MissingItem)498*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Erase_MissingItem) {
499*61c4878aSAndroid Build Coastguard Worker   TestItem item(60, "F");
500*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.erase(item), 0U);
501*61c4878aSAndroid Build Coastguard Worker }
502*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Erase_Reinsert)503*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Erase_Reinsert) {
504*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.size(), items_.size());
505*61c4878aSAndroid Build Coastguard Worker 
506*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.erase(items_[0]), 1U);
507*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.find(items_[0]), set_.end());
508*61c4878aSAndroid Build Coastguard Worker 
509*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.erase(items_[2]), 1U);
510*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.find(items_[2]), set_.end());
511*61c4878aSAndroid Build Coastguard Worker 
512*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.erase(items_[4]), 1U);
513*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.find(items_[4]), set_.end());
514*61c4878aSAndroid Build Coastguard Worker 
515*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.size(), items_.size() - 3);
516*61c4878aSAndroid Build Coastguard Worker 
517*61c4878aSAndroid Build Coastguard Worker   set_.insert(items_[4]);
518*61c4878aSAndroid Build Coastguard Worker   auto iter = set_.find(items_[4]);
519*61c4878aSAndroid Build Coastguard Worker   EXPECT_NE(iter, set_.end());
520*61c4878aSAndroid Build Coastguard Worker 
521*61c4878aSAndroid Build Coastguard Worker   set_.insert(items_[0]);
522*61c4878aSAndroid Build Coastguard Worker   iter = set_.find(items_[0]);
523*61c4878aSAndroid Build Coastguard Worker   EXPECT_NE(iter, set_.end());
524*61c4878aSAndroid Build Coastguard Worker 
525*61c4878aSAndroid Build Coastguard Worker   set_.insert(items_[2]);
526*61c4878aSAndroid Build Coastguard Worker   iter = set_.find(items_[2]);
527*61c4878aSAndroid Build Coastguard Worker   EXPECT_NE(iter, set_.end());
528*61c4878aSAndroid Build Coastguard Worker 
529*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.size(), items_.size());
530*61c4878aSAndroid Build Coastguard Worker }
531*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Swap)532*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Swap) {
533*61c4878aSAndroid Build Coastguard Worker   std::array<TestItem, 3> items = {{
534*61c4878aSAndroid Build Coastguard Worker       {50, "B"},
535*61c4878aSAndroid Build Coastguard Worker       {40, "D"},
536*61c4878aSAndroid Build Coastguard Worker       {60, "F"},
537*61c4878aSAndroid Build Coastguard Worker   }};
538*61c4878aSAndroid Build Coastguard Worker   IntrusiveSet set(items.begin(), items.end());
539*61c4878aSAndroid Build Coastguard Worker 
540*61c4878aSAndroid Build Coastguard Worker   set_.swap(set);
541*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set.size(), kNumItems);
542*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_sorted(set.begin(), set.end()));
543*61c4878aSAndroid Build Coastguard Worker 
544*61c4878aSAndroid Build Coastguard Worker   auto iter = set.begin();
545*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "e");
546*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "E");
547*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "c");
548*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "C");
549*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "a");
550*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "A");
551*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "d");
552*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "D");
553*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "b");
554*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "B");
555*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(iter, set.end());
556*61c4878aSAndroid Build Coastguard Worker   set.clear();
557*61c4878aSAndroid Build Coastguard Worker 
558*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.size(), 3U);
559*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_sorted(set_.begin(), set_.end()));
560*61c4878aSAndroid Build Coastguard Worker   iter = set_.begin();
561*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "D");
562*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "B");
563*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "F");
564*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(iter, set_.end());
565*61c4878aSAndroid Build Coastguard Worker 
566*61c4878aSAndroid Build Coastguard Worker   // Explicitly clear the set before items goes out of scope.
567*61c4878aSAndroid Build Coastguard Worker   set_.clear();
568*61c4878aSAndroid Build Coastguard Worker }
569*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Swap_Empty)570*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Swap_Empty) {
571*61c4878aSAndroid Build Coastguard Worker   IntrusiveSet set;
572*61c4878aSAndroid Build Coastguard Worker 
573*61c4878aSAndroid Build Coastguard Worker   set_.swap(set);
574*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set.size(), kNumItems);
575*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_sorted(set.begin(), set.end()));
576*61c4878aSAndroid Build Coastguard Worker 
577*61c4878aSAndroid Build Coastguard Worker   auto iter = set.begin();
578*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "e");
579*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "E");
580*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "c");
581*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "C");
582*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "a");
583*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "A");
584*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "d");
585*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "D");
586*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "b");
587*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "B");
588*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(iter, set.end());
589*61c4878aSAndroid Build Coastguard Worker   set.clear();
590*61c4878aSAndroid Build Coastguard Worker 
591*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.size(), 0U);
592*61c4878aSAndroid Build Coastguard Worker }
593*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Merge)594*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Merge) {
595*61c4878aSAndroid Build Coastguard Worker   std::array<TestItem, 3> items = {{
596*61c4878aSAndroid Build Coastguard Worker       {5, "f"},
597*61c4878aSAndroid Build Coastguard Worker       {75, "g"},
598*61c4878aSAndroid Build Coastguard Worker       {85, "h"},
599*61c4878aSAndroid Build Coastguard Worker   }};
600*61c4878aSAndroid Build Coastguard Worker   IntrusiveSet set(items.begin(), items.end());
601*61c4878aSAndroid Build Coastguard Worker 
602*61c4878aSAndroid Build Coastguard Worker   set_.merge(set);
603*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(set.empty());
604*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.size(), kNumItems + 3);
605*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_sorted(set_.begin(), set_.end()));
606*61c4878aSAndroid Build Coastguard Worker 
607*61c4878aSAndroid Build Coastguard Worker   auto iter = set_.begin();
608*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "f");
609*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "e");
610*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "E");
611*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "c");
612*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "C");
613*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "a");
614*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "A");
615*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "d");
616*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "D");
617*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "b");
618*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "B");
619*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "g");
620*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "h");
621*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(iter, set_.end());
622*61c4878aSAndroid Build Coastguard Worker 
623*61c4878aSAndroid Build Coastguard Worker   // Explicitly clear the set before items goes out of scope.
624*61c4878aSAndroid Build Coastguard Worker   set_.clear();
625*61c4878aSAndroid Build Coastguard Worker }
626*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Merge_Empty)627*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Merge_Empty) {
628*61c4878aSAndroid Build Coastguard Worker   IntrusiveSet set;
629*61c4878aSAndroid Build Coastguard Worker 
630*61c4878aSAndroid Build Coastguard Worker   set_.merge(set);
631*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.size(), kNumItems);
632*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_sorted(set_.begin(), set_.end()));
633*61c4878aSAndroid Build Coastguard Worker 
634*61c4878aSAndroid Build Coastguard Worker   set.merge(set_);
635*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(set_.empty());
636*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set.size(), kNumItems);
637*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_sorted(set.begin(), set.end()));
638*61c4878aSAndroid Build Coastguard Worker 
639*61c4878aSAndroid Build Coastguard Worker   set.clear();
640*61c4878aSAndroid Build Coastguard Worker }
641*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Merge_WithDuplicates)642*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Merge_WithDuplicates) {
643*61c4878aSAndroid Build Coastguard Worker   std::array<TestItem, 3> items = {{
644*61c4878aSAndroid Build Coastguard Worker       {50, "B"},
645*61c4878aSAndroid Build Coastguard Worker       {40, "D"},
646*61c4878aSAndroid Build Coastguard Worker       {60, "F"},
647*61c4878aSAndroid Build Coastguard Worker   }};
648*61c4878aSAndroid Build Coastguard Worker   IntrusiveSet set(items.begin(), items.end());
649*61c4878aSAndroid Build Coastguard Worker 
650*61c4878aSAndroid Build Coastguard Worker   set_.merge(set);
651*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(set.empty());
652*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.size(), kNumItems + 1);
653*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_sorted(set_.begin(), set_.end()));
654*61c4878aSAndroid Build Coastguard Worker 
655*61c4878aSAndroid Build Coastguard Worker   auto iter = set_.begin();
656*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "e");
657*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "E");
658*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "c");
659*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "C");
660*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "a");
661*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "A");
662*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "d");
663*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "D");
664*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "b");
665*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "B");
666*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "F");
667*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(iter, set_.end());
668*61c4878aSAndroid Build Coastguard Worker 
669*61c4878aSAndroid Build Coastguard Worker   // Explicitly clear the set before items goes out of scope.
670*61c4878aSAndroid Build Coastguard Worker   set_.clear();
671*61c4878aSAndroid Build Coastguard Worker }
672*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Merge_MultiSet)673*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Merge_MultiSet) {
674*61c4878aSAndroid Build Coastguard Worker   std::array<TestItem, 3> items = {{
675*61c4878aSAndroid Build Coastguard Worker       {50, "B"},
676*61c4878aSAndroid Build Coastguard Worker       {40, "D"},
677*61c4878aSAndroid Build Coastguard Worker       {60, "F"},
678*61c4878aSAndroid Build Coastguard Worker   }};
679*61c4878aSAndroid Build Coastguard Worker   ::pw::IntrusiveMultiSet<TestItem> multiset(items.begin(), items.end());
680*61c4878aSAndroid Build Coastguard Worker 
681*61c4878aSAndroid Build Coastguard Worker   set_.merge(multiset);
682*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(multiset.empty());
683*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set_.size(), kNumItems + 1);
684*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_sorted(set_.begin(), set_.end()));
685*61c4878aSAndroid Build Coastguard Worker 
686*61c4878aSAndroid Build Coastguard Worker   auto iter = set_.begin();
687*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "e");
688*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "E");
689*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "c");
690*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "C");
691*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "a");
692*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "A");
693*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "d");
694*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "D");
695*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "b");
696*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "B");
697*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ((iter++)->name(), "F");
698*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(iter, set_.end());
699*61c4878aSAndroid Build Coastguard Worker 
700*61c4878aSAndroid Build Coastguard Worker   // Explicitly clear the set before items goes out of scope.
701*61c4878aSAndroid Build Coastguard Worker   set_.clear();
702*61c4878aSAndroid Build Coastguard Worker }
703*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Count)704*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Count) {
705*61c4878aSAndroid Build Coastguard Worker   const IntrusiveSet& set = set_;
706*61c4878aSAndroid Build Coastguard Worker   for (const auto& item : items_) {
707*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(set.count(item), 1U);
708*61c4878aSAndroid Build Coastguard Worker   }
709*61c4878aSAndroid Build Coastguard Worker }
710*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Count_NoSuchKey)711*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Count_NoSuchKey) {
712*61c4878aSAndroid Build Coastguard Worker   const IntrusiveSet& set = set_;
713*61c4878aSAndroid Build Coastguard Worker   TestItem item(60, "F");
714*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set.count(item), 0U);
715*61c4878aSAndroid Build Coastguard Worker }
716*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Find)717*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Find) {
718*61c4878aSAndroid Build Coastguard Worker   const IntrusiveSet& set = set_;
719*61c4878aSAndroid Build Coastguard Worker   for (const auto& item : items_) {
720*61c4878aSAndroid Build Coastguard Worker     auto iter = set.find(item);
721*61c4878aSAndroid Build Coastguard Worker     ASSERT_NE(iter, set.end());
722*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(iter->key(), item.key());
723*61c4878aSAndroid Build Coastguard Worker   }
724*61c4878aSAndroid Build Coastguard Worker }
725*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,Find_NoSuchKey)726*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, Find_NoSuchKey) {
727*61c4878aSAndroid Build Coastguard Worker   const IntrusiveSet& set = set_;
728*61c4878aSAndroid Build Coastguard Worker   TestItem item(60, "F");
729*61c4878aSAndroid Build Coastguard Worker   auto iter = set.find(item);
730*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(iter, set.end());
731*61c4878aSAndroid Build Coastguard Worker }
732*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,LowerBound)733*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, LowerBound) {
734*61c4878aSAndroid Build Coastguard Worker   const IntrusiveSet& set = set_;
735*61c4878aSAndroid Build Coastguard Worker   auto iter = set.lower_bound({10, "?"});
736*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set.end());
737*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(iter->name(), "e");
738*61c4878aSAndroid Build Coastguard Worker 
739*61c4878aSAndroid Build Coastguard Worker   iter = set.lower_bound({20, "?"});
740*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set.end());
741*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(iter->name(), "c");
742*61c4878aSAndroid Build Coastguard Worker 
743*61c4878aSAndroid Build Coastguard Worker   iter = set.lower_bound({30, "?"});
744*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set.end());
745*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(iter->name(), "a");
746*61c4878aSAndroid Build Coastguard Worker 
747*61c4878aSAndroid Build Coastguard Worker   iter = set.lower_bound({40, "?"});
748*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set.end());
749*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(iter->name(), "d");
750*61c4878aSAndroid Build Coastguard Worker 
751*61c4878aSAndroid Build Coastguard Worker   iter = set.lower_bound({50, "?"});
752*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set.end());
753*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(iter->name(), "b");
754*61c4878aSAndroid Build Coastguard Worker }
755*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,LowerBound_NoExactKey)756*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, LowerBound_NoExactKey) {
757*61c4878aSAndroid Build Coastguard Worker   const IntrusiveSet& set = set_;
758*61c4878aSAndroid Build Coastguard Worker   auto iter = set.lower_bound({6, "?"});
759*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set.end());
760*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(iter->name(), "e");
761*61c4878aSAndroid Build Coastguard Worker 
762*61c4878aSAndroid Build Coastguard Worker   iter = set.lower_bound({16, "?"});
763*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set.end());
764*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(iter->name(), "c");
765*61c4878aSAndroid Build Coastguard Worker 
766*61c4878aSAndroid Build Coastguard Worker   iter = set.lower_bound({26, "?"});
767*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set.end());
768*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(iter->name(), "a");
769*61c4878aSAndroid Build Coastguard Worker 
770*61c4878aSAndroid Build Coastguard Worker   iter = set.lower_bound({36, "?"});
771*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set.end());
772*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(iter->name(), "d");
773*61c4878aSAndroid Build Coastguard Worker 
774*61c4878aSAndroid Build Coastguard Worker   iter = set.lower_bound({46, "?"});
775*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set.end());
776*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(iter->name(), "b");
777*61c4878aSAndroid Build Coastguard Worker }
778*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,LowerBound_OutOfRange)779*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, LowerBound_OutOfRange) {
780*61c4878aSAndroid Build Coastguard Worker   const IntrusiveSet& set = set_;
781*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set.lower_bound({56, "?"}), set.end());
782*61c4878aSAndroid Build Coastguard Worker }
783*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,UpperBound)784*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, UpperBound) {
785*61c4878aSAndroid Build Coastguard Worker   const IntrusiveSet& set = set_;
786*61c4878aSAndroid Build Coastguard Worker   auto iter = set.upper_bound({15, "?"});
787*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set.end());
788*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(iter->name(), "c");
789*61c4878aSAndroid Build Coastguard Worker 
790*61c4878aSAndroid Build Coastguard Worker   iter = set.upper_bound({25, "?"});
791*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set.end());
792*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(iter->name(), "a");
793*61c4878aSAndroid Build Coastguard Worker 
794*61c4878aSAndroid Build Coastguard Worker   iter = set.upper_bound({35, "?"});
795*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set.end());
796*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(iter->name(), "d");
797*61c4878aSAndroid Build Coastguard Worker 
798*61c4878aSAndroid Build Coastguard Worker   iter = set.upper_bound({45, "?"});
799*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set.end());
800*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(iter->name(), "b");
801*61c4878aSAndroid Build Coastguard Worker 
802*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set.upper_bound({55, "?"}), set.end());
803*61c4878aSAndroid Build Coastguard Worker }
804*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,UpperBound_NoExactKey)805*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, UpperBound_NoExactKey) {
806*61c4878aSAndroid Build Coastguard Worker   const IntrusiveSet& set = set_;
807*61c4878aSAndroid Build Coastguard Worker   auto iter = set.upper_bound({6, "?"});
808*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set.end());
809*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(iter->name(), "e");
810*61c4878aSAndroid Build Coastguard Worker 
811*61c4878aSAndroid Build Coastguard Worker   iter = set.upper_bound({16, "?"});
812*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set.end());
813*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(iter->name(), "c");
814*61c4878aSAndroid Build Coastguard Worker 
815*61c4878aSAndroid Build Coastguard Worker   iter = set.upper_bound({26, "?"});
816*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set.end());
817*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(iter->name(), "a");
818*61c4878aSAndroid Build Coastguard Worker 
819*61c4878aSAndroid Build Coastguard Worker   iter = set.upper_bound({36, "?"});
820*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set.end());
821*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(iter->name(), "d");
822*61c4878aSAndroid Build Coastguard Worker 
823*61c4878aSAndroid Build Coastguard Worker   iter = set.upper_bound({46, "?"});
824*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(iter, set.end());
825*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(iter->name(), "b");
826*61c4878aSAndroid Build Coastguard Worker }
827*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,UpperBound_OutOfRange)828*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, UpperBound_OutOfRange) {
829*61c4878aSAndroid Build Coastguard Worker   const IntrusiveSet& set = set_;
830*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(set.upper_bound({56, "?"}), set.end());
831*61c4878aSAndroid Build Coastguard Worker }
832*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,EqualRange)833*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, EqualRange) {
834*61c4878aSAndroid Build Coastguard Worker   const IntrusiveSet& set = set_;
835*61c4878aSAndroid Build Coastguard Worker 
836*61c4878aSAndroid Build Coastguard Worker   auto pair = set.equal_range({10, "?"});
837*61c4878aSAndroid Build Coastguard Worker   IntrusiveSet::const_iterator lower = pair.first;
838*61c4878aSAndroid Build Coastguard Worker   IntrusiveSet::const_iterator upper = pair.second;
839*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(lower, set.end());
840*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(lower->name(), "e");
841*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(upper, set.end());
842*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(upper->name(), "E");
843*61c4878aSAndroid Build Coastguard Worker 
844*61c4878aSAndroid Build Coastguard Worker   std::tie(lower, upper) = set.equal_range({20, "?"});
845*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(lower, set.end());
846*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(lower->name(), "c");
847*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(upper, set.end());
848*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(upper->name(), "C");
849*61c4878aSAndroid Build Coastguard Worker 
850*61c4878aSAndroid Build Coastguard Worker   std::tie(lower, upper) = set.equal_range({30, "?"});
851*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(lower, set.end());
852*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(lower->name(), "a");
853*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(upper, set.end());
854*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(upper->name(), "A");
855*61c4878aSAndroid Build Coastguard Worker 
856*61c4878aSAndroid Build Coastguard Worker   std::tie(lower, upper) = set.equal_range({40, "?"});
857*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(lower, set.end());
858*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(lower->name(), "d");
859*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(upper, set.end());
860*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(upper->name(), "D");
861*61c4878aSAndroid Build Coastguard Worker 
862*61c4878aSAndroid Build Coastguard Worker   std::tie(lower, upper) = set.equal_range({50, "?"});
863*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(lower, set.end());
864*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(lower->name(), "b");
865*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(upper, set.end());
866*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(upper->name(), "B");
867*61c4878aSAndroid Build Coastguard Worker }
868*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,EqualRange_NoExactKey)869*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, EqualRange_NoExactKey) {
870*61c4878aSAndroid Build Coastguard Worker   const IntrusiveSet& set = set_;
871*61c4878aSAndroid Build Coastguard Worker 
872*61c4878aSAndroid Build Coastguard Worker   auto pair = set.equal_range({6, "?"});
873*61c4878aSAndroid Build Coastguard Worker   IntrusiveSet::const_iterator lower = pair.first;
874*61c4878aSAndroid Build Coastguard Worker   IntrusiveSet::const_iterator upper = pair.second;
875*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(lower, set.end());
876*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(lower->name(), "e");
877*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(upper, set.end());
878*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(upper->name(), "e");
879*61c4878aSAndroid Build Coastguard Worker 
880*61c4878aSAndroid Build Coastguard Worker   std::tie(lower, upper) = set.equal_range({16, "?"});
881*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(lower, set.end());
882*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(lower->name(), "c");
883*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(upper, set.end());
884*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(upper->name(), "c");
885*61c4878aSAndroid Build Coastguard Worker 
886*61c4878aSAndroid Build Coastguard Worker   std::tie(lower, upper) = set.equal_range({26, "?"});
887*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(lower, set.end());
888*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(lower->name(), "a");
889*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(upper, set.end());
890*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(upper->name(), "a");
891*61c4878aSAndroid Build Coastguard Worker 
892*61c4878aSAndroid Build Coastguard Worker   std::tie(lower, upper) = set.equal_range({36, "?"});
893*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(lower, set.end());
894*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(lower->name(), "d");
895*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(upper, set.end());
896*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(upper->name(), "d");
897*61c4878aSAndroid Build Coastguard Worker 
898*61c4878aSAndroid Build Coastguard Worker   std::tie(lower, upper) = set.equal_range({46, "?"});
899*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(lower, set.end());
900*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(lower->name(), "b");
901*61c4878aSAndroid Build Coastguard Worker   ASSERT_NE(upper, set.end());
902*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ(upper->name(), "b");
903*61c4878aSAndroid Build Coastguard Worker }
904*61c4878aSAndroid Build Coastguard Worker 
TEST_F(IntrusiveSetTest,EqualRange_OutOfRange)905*61c4878aSAndroid Build Coastguard Worker TEST_F(IntrusiveSetTest, EqualRange_OutOfRange) {
906*61c4878aSAndroid Build Coastguard Worker   const IntrusiveSet& set = set_;
907*61c4878aSAndroid Build Coastguard Worker 
908*61c4878aSAndroid Build Coastguard Worker   auto pair = set.equal_range({56, "?"});
909*61c4878aSAndroid Build Coastguard Worker   IntrusiveSet::const_iterator lower = pair.first;
910*61c4878aSAndroid Build Coastguard Worker   IntrusiveSet::const_iterator upper = pair.second;
911*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(lower, set.end());
912*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(upper, set.end());
913*61c4878aSAndroid Build Coastguard Worker }
914*61c4878aSAndroid Build Coastguard Worker 
915*61c4878aSAndroid Build Coastguard Worker }  // namespace
916