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