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