xref: /aosp_15_r20/external/libchrome/base/containers/small_map_unittest.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include "base/containers/small_map.h"
6*635a8641SAndroid Build Coastguard Worker 
7*635a8641SAndroid Build Coastguard Worker #include <stddef.h>
8*635a8641SAndroid Build Coastguard Worker 
9*635a8641SAndroid Build Coastguard Worker #include <algorithm>
10*635a8641SAndroid Build Coastguard Worker #include <functional>
11*635a8641SAndroid Build Coastguard Worker #include <map>
12*635a8641SAndroid Build Coastguard Worker #include <unordered_map>
13*635a8641SAndroid Build Coastguard Worker 
14*635a8641SAndroid Build Coastguard Worker #include "base/logging.h"
15*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
16*635a8641SAndroid Build Coastguard Worker 
17*635a8641SAndroid Build Coastguard Worker namespace base {
18*635a8641SAndroid Build Coastguard Worker 
TEST(SmallMap,General)19*635a8641SAndroid Build Coastguard Worker TEST(SmallMap, General) {
20*635a8641SAndroid Build Coastguard Worker   small_map<std::unordered_map<int, int>> m;
21*635a8641SAndroid Build Coastguard Worker 
22*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(m.empty());
23*635a8641SAndroid Build Coastguard Worker 
24*635a8641SAndroid Build Coastguard Worker   m[0] = 5;
25*635a8641SAndroid Build Coastguard Worker 
26*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(m.empty());
27*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.size(), 1u);
28*635a8641SAndroid Build Coastguard Worker 
29*635a8641SAndroid Build Coastguard Worker   m[9] = 2;
30*635a8641SAndroid Build Coastguard Worker 
31*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(m.empty());
32*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.size(), 2u);
33*635a8641SAndroid Build Coastguard Worker 
34*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m[9], 2);
35*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m[0], 5);
36*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(m.UsingFullMap());
37*635a8641SAndroid Build Coastguard Worker 
38*635a8641SAndroid Build Coastguard Worker   small_map<std::unordered_map<int, int>>::iterator iter(m.begin());
39*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(iter != m.end());
40*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->first, 0);
41*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->second, 5);
42*635a8641SAndroid Build Coastguard Worker   ++iter;
43*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(iter != m.end());
44*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ((*iter).first, 9);
45*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ((*iter).second, 2);
46*635a8641SAndroid Build Coastguard Worker   ++iter;
47*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(iter == m.end());
48*635a8641SAndroid Build Coastguard Worker 
49*635a8641SAndroid Build Coastguard Worker   m[8] = 23;
50*635a8641SAndroid Build Coastguard Worker   m[1234] = 90;
51*635a8641SAndroid Build Coastguard Worker   m[-5] = 6;
52*635a8641SAndroid Build Coastguard Worker 
53*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m[   9],  2);
54*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m[   0],  5);
55*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m[1234], 90);
56*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m[   8], 23);
57*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m[  -5],  6);
58*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.size(), 5u);
59*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(m.empty());
60*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(m.UsingFullMap());
61*635a8641SAndroid Build Coastguard Worker 
62*635a8641SAndroid Build Coastguard Worker   iter = m.begin();
63*635a8641SAndroid Build Coastguard Worker   for (int i = 0; i < 5; i++) {
64*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(iter != m.end());
65*635a8641SAndroid Build Coastguard Worker     ++iter;
66*635a8641SAndroid Build Coastguard Worker   }
67*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(iter == m.end());
68*635a8641SAndroid Build Coastguard Worker 
69*635a8641SAndroid Build Coastguard Worker   const small_map<std::unordered_map<int, int>>& ref = m;
70*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(ref.find(1234) != m.end());
71*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(ref.find(5678) == m.end());
72*635a8641SAndroid Build Coastguard Worker }
73*635a8641SAndroid Build Coastguard Worker 
TEST(SmallMap,PostFixIteratorIncrement)74*635a8641SAndroid Build Coastguard Worker TEST(SmallMap, PostFixIteratorIncrement) {
75*635a8641SAndroid Build Coastguard Worker   small_map<std::unordered_map<int, int>> m;
76*635a8641SAndroid Build Coastguard Worker   m[0] = 5;
77*635a8641SAndroid Build Coastguard Worker   m[2] = 3;
78*635a8641SAndroid Build Coastguard Worker 
79*635a8641SAndroid Build Coastguard Worker   {
80*635a8641SAndroid Build Coastguard Worker     small_map<std::unordered_map<int, int>>::iterator iter(m.begin());
81*635a8641SAndroid Build Coastguard Worker     small_map<std::unordered_map<int, int>>::iterator last(iter++);
82*635a8641SAndroid Build Coastguard Worker     ++last;
83*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(last == iter);
84*635a8641SAndroid Build Coastguard Worker   }
85*635a8641SAndroid Build Coastguard Worker 
86*635a8641SAndroid Build Coastguard Worker   {
87*635a8641SAndroid Build Coastguard Worker     small_map<std::unordered_map<int, int>>::const_iterator iter(m.begin());
88*635a8641SAndroid Build Coastguard Worker     small_map<std::unordered_map<int, int>>::const_iterator last(iter++);
89*635a8641SAndroid Build Coastguard Worker     ++last;
90*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(last == iter);
91*635a8641SAndroid Build Coastguard Worker   }
92*635a8641SAndroid Build Coastguard Worker }
93*635a8641SAndroid Build Coastguard Worker 
94*635a8641SAndroid Build Coastguard Worker // Based on the General testcase.
TEST(SmallMap,CopyConstructor)95*635a8641SAndroid Build Coastguard Worker TEST(SmallMap, CopyConstructor) {
96*635a8641SAndroid Build Coastguard Worker   small_map<std::unordered_map<int, int>> src;
97*635a8641SAndroid Build Coastguard Worker 
98*635a8641SAndroid Build Coastguard Worker   {
99*635a8641SAndroid Build Coastguard Worker     small_map<std::unordered_map<int, int>> m(src);
100*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(m.empty());
101*635a8641SAndroid Build Coastguard Worker   }
102*635a8641SAndroid Build Coastguard Worker 
103*635a8641SAndroid Build Coastguard Worker   src[0] = 5;
104*635a8641SAndroid Build Coastguard Worker 
105*635a8641SAndroid Build Coastguard Worker   {
106*635a8641SAndroid Build Coastguard Worker     small_map<std::unordered_map<int, int>> m(src);
107*635a8641SAndroid Build Coastguard Worker     EXPECT_FALSE(m.empty());
108*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(m.size(), 1u);
109*635a8641SAndroid Build Coastguard Worker   }
110*635a8641SAndroid Build Coastguard Worker 
111*635a8641SAndroid Build Coastguard Worker   src[9] = 2;
112*635a8641SAndroid Build Coastguard Worker 
113*635a8641SAndroid Build Coastguard Worker   {
114*635a8641SAndroid Build Coastguard Worker     small_map<std::unordered_map<int, int>> m(src);
115*635a8641SAndroid Build Coastguard Worker     EXPECT_FALSE(m.empty());
116*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(m.size(), 2u);
117*635a8641SAndroid Build Coastguard Worker 
118*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(m[9], 2);
119*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(m[0], 5);
120*635a8641SAndroid Build Coastguard Worker     EXPECT_FALSE(m.UsingFullMap());
121*635a8641SAndroid Build Coastguard Worker   }
122*635a8641SAndroid Build Coastguard Worker 
123*635a8641SAndroid Build Coastguard Worker   src[8] = 23;
124*635a8641SAndroid Build Coastguard Worker   src[1234] = 90;
125*635a8641SAndroid Build Coastguard Worker   src[-5] = 6;
126*635a8641SAndroid Build Coastguard Worker 
127*635a8641SAndroid Build Coastguard Worker   {
128*635a8641SAndroid Build Coastguard Worker     small_map<std::unordered_map<int, int>> m(src);
129*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(m[   9],  2);
130*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(m[   0],  5);
131*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(m[1234], 90);
132*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(m[   8], 23);
133*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(m[  -5],  6);
134*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(m.size(), 5u);
135*635a8641SAndroid Build Coastguard Worker     EXPECT_FALSE(m.empty());
136*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(m.UsingFullMap());
137*635a8641SAndroid Build Coastguard Worker   }
138*635a8641SAndroid Build Coastguard Worker }
139*635a8641SAndroid Build Coastguard Worker 
140*635a8641SAndroid Build Coastguard Worker template <class inner>
SmallMapIsSubset(small_map<inner> const & a,small_map<inner> const & b)141*635a8641SAndroid Build Coastguard Worker static bool SmallMapIsSubset(small_map<inner> const& a,
142*635a8641SAndroid Build Coastguard Worker                              small_map<inner> const& b) {
143*635a8641SAndroid Build Coastguard Worker   typename small_map<inner>::const_iterator it;
144*635a8641SAndroid Build Coastguard Worker   for (it = a.begin(); it != a.end(); ++it) {
145*635a8641SAndroid Build Coastguard Worker     typename small_map<inner>::const_iterator it_in_b = b.find(it->first);
146*635a8641SAndroid Build Coastguard Worker     if (it_in_b == b.end() || it_in_b->second != it->second)
147*635a8641SAndroid Build Coastguard Worker       return false;
148*635a8641SAndroid Build Coastguard Worker   }
149*635a8641SAndroid Build Coastguard Worker   return true;
150*635a8641SAndroid Build Coastguard Worker }
151*635a8641SAndroid Build Coastguard Worker 
152*635a8641SAndroid Build Coastguard Worker template <class inner>
SmallMapEqual(small_map<inner> const & a,small_map<inner> const & b)153*635a8641SAndroid Build Coastguard Worker static bool SmallMapEqual(small_map<inner> const& a,
154*635a8641SAndroid Build Coastguard Worker                           small_map<inner> const& b) {
155*635a8641SAndroid Build Coastguard Worker   return SmallMapIsSubset(a, b) && SmallMapIsSubset(b, a);
156*635a8641SAndroid Build Coastguard Worker }
157*635a8641SAndroid Build Coastguard Worker 
TEST(SmallMap,AssignmentOperator)158*635a8641SAndroid Build Coastguard Worker TEST(SmallMap, AssignmentOperator) {
159*635a8641SAndroid Build Coastguard Worker   small_map<std::unordered_map<int, int>> src_small;
160*635a8641SAndroid Build Coastguard Worker   small_map<std::unordered_map<int, int>> src_large;
161*635a8641SAndroid Build Coastguard Worker 
162*635a8641SAndroid Build Coastguard Worker   src_small[1] = 20;
163*635a8641SAndroid Build Coastguard Worker   src_small[2] = 21;
164*635a8641SAndroid Build Coastguard Worker   src_small[3] = 22;
165*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(src_small.UsingFullMap());
166*635a8641SAndroid Build Coastguard Worker 
167*635a8641SAndroid Build Coastguard Worker   src_large[1] = 20;
168*635a8641SAndroid Build Coastguard Worker   src_large[2] = 21;
169*635a8641SAndroid Build Coastguard Worker   src_large[3] = 22;
170*635a8641SAndroid Build Coastguard Worker   src_large[5] = 23;
171*635a8641SAndroid Build Coastguard Worker   src_large[6] = 24;
172*635a8641SAndroid Build Coastguard Worker   src_large[7] = 25;
173*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(src_large.UsingFullMap());
174*635a8641SAndroid Build Coastguard Worker 
175*635a8641SAndroid Build Coastguard Worker   // Assignments to empty.
176*635a8641SAndroid Build Coastguard Worker   small_map<std::unordered_map<int, int>> dest_small;
177*635a8641SAndroid Build Coastguard Worker   dest_small = src_small;
178*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(SmallMapEqual(dest_small, src_small));
179*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(dest_small.UsingFullMap(),
180*635a8641SAndroid Build Coastguard Worker             src_small.UsingFullMap());
181*635a8641SAndroid Build Coastguard Worker 
182*635a8641SAndroid Build Coastguard Worker   small_map<std::unordered_map<int, int>> dest_large;
183*635a8641SAndroid Build Coastguard Worker   dest_large = src_large;
184*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(SmallMapEqual(dest_large, src_large));
185*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(dest_large.UsingFullMap(),
186*635a8641SAndroid Build Coastguard Worker             src_large.UsingFullMap());
187*635a8641SAndroid Build Coastguard Worker 
188*635a8641SAndroid Build Coastguard Worker   // Assignments which assign from full to small, and vice versa.
189*635a8641SAndroid Build Coastguard Worker   dest_small = src_large;
190*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(SmallMapEqual(dest_small, src_large));
191*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(dest_small.UsingFullMap(),
192*635a8641SAndroid Build Coastguard Worker             src_large.UsingFullMap());
193*635a8641SAndroid Build Coastguard Worker 
194*635a8641SAndroid Build Coastguard Worker   dest_large = src_small;
195*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(SmallMapEqual(dest_large, src_small));
196*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(dest_large.UsingFullMap(),
197*635a8641SAndroid Build Coastguard Worker             src_small.UsingFullMap());
198*635a8641SAndroid Build Coastguard Worker 
199*635a8641SAndroid Build Coastguard Worker   // Double check that SmallMapEqual works:
200*635a8641SAndroid Build Coastguard Worker   dest_large[42] = 666;
201*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(SmallMapEqual(dest_large, src_small));
202*635a8641SAndroid Build Coastguard Worker }
203*635a8641SAndroid Build Coastguard Worker 
TEST(SmallMap,Insert)204*635a8641SAndroid Build Coastguard Worker TEST(SmallMap, Insert) {
205*635a8641SAndroid Build Coastguard Worker   small_map<std::unordered_map<int, int>> sm;
206*635a8641SAndroid Build Coastguard Worker 
207*635a8641SAndroid Build Coastguard Worker   // loop through the transition from small map to map.
208*635a8641SAndroid Build Coastguard Worker   for (int i = 1; i <= 10; ++i) {
209*635a8641SAndroid Build Coastguard Worker     VLOG(1) << "Iteration " << i;
210*635a8641SAndroid Build Coastguard Worker     // insert an element
211*635a8641SAndroid Build Coastguard Worker     std::pair<small_map<std::unordered_map<int, int>>::iterator, bool> ret;
212*635a8641SAndroid Build Coastguard Worker     ret = sm.insert(std::make_pair(i, 100*i));
213*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(ret.second);
214*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(ret.first == sm.find(i));
215*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(ret.first->first, i);
216*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(ret.first->second, 100*i);
217*635a8641SAndroid Build Coastguard Worker 
218*635a8641SAndroid Build Coastguard Worker     // try to insert it again with different value, fails, but we still get an
219*635a8641SAndroid Build Coastguard Worker     // iterator back with the original value.
220*635a8641SAndroid Build Coastguard Worker     ret = sm.insert(std::make_pair(i, -i));
221*635a8641SAndroid Build Coastguard Worker     EXPECT_FALSE(ret.second);
222*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(ret.first == sm.find(i));
223*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(ret.first->first, i);
224*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(ret.first->second, 100*i);
225*635a8641SAndroid Build Coastguard Worker 
226*635a8641SAndroid Build Coastguard Worker     // check the state of the map.
227*635a8641SAndroid Build Coastguard Worker     for (int j = 1; j <= i; ++j) {
228*635a8641SAndroid Build Coastguard Worker       small_map<std::unordered_map<int, int>>::iterator it = sm.find(j);
229*635a8641SAndroid Build Coastguard Worker       EXPECT_TRUE(it != sm.end());
230*635a8641SAndroid Build Coastguard Worker       EXPECT_EQ(it->first, j);
231*635a8641SAndroid Build Coastguard Worker       EXPECT_EQ(it->second, j * 100);
232*635a8641SAndroid Build Coastguard Worker     }
233*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(sm.size(), static_cast<size_t>(i));
234*635a8641SAndroid Build Coastguard Worker     EXPECT_FALSE(sm.empty());
235*635a8641SAndroid Build Coastguard Worker   }
236*635a8641SAndroid Build Coastguard Worker }
237*635a8641SAndroid Build Coastguard Worker 
TEST(SmallMap,InsertRange)238*635a8641SAndroid Build Coastguard Worker TEST(SmallMap, InsertRange) {
239*635a8641SAndroid Build Coastguard Worker   // loop through the transition from small map to map.
240*635a8641SAndroid Build Coastguard Worker   for (int elements = 0; elements <= 10; ++elements) {
241*635a8641SAndroid Build Coastguard Worker     VLOG(1) << "Elements " << elements;
242*635a8641SAndroid Build Coastguard Worker     std::unordered_map<int, int> normal_map;
243*635a8641SAndroid Build Coastguard Worker     for (int i = 1; i <= elements; ++i) {
244*635a8641SAndroid Build Coastguard Worker       normal_map.insert(std::make_pair(i, 100*i));
245*635a8641SAndroid Build Coastguard Worker     }
246*635a8641SAndroid Build Coastguard Worker 
247*635a8641SAndroid Build Coastguard Worker     small_map<std::unordered_map<int, int>> sm;
248*635a8641SAndroid Build Coastguard Worker     sm.insert(normal_map.begin(), normal_map.end());
249*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(normal_map.size(), sm.size());
250*635a8641SAndroid Build Coastguard Worker     for (int i = 1; i <= elements; ++i) {
251*635a8641SAndroid Build Coastguard Worker       VLOG(1) << "Iteration " << i;
252*635a8641SAndroid Build Coastguard Worker       EXPECT_TRUE(sm.find(i) != sm.end());
253*635a8641SAndroid Build Coastguard Worker       EXPECT_EQ(sm.find(i)->first, i);
254*635a8641SAndroid Build Coastguard Worker       EXPECT_EQ(sm.find(i)->second, 100*i);
255*635a8641SAndroid Build Coastguard Worker     }
256*635a8641SAndroid Build Coastguard Worker   }
257*635a8641SAndroid Build Coastguard Worker }
258*635a8641SAndroid Build Coastguard Worker 
TEST(SmallMap,Erase)259*635a8641SAndroid Build Coastguard Worker TEST(SmallMap, Erase) {
260*635a8641SAndroid Build Coastguard Worker   small_map<std::unordered_map<std::string, int>> m;
261*635a8641SAndroid Build Coastguard Worker   small_map<std::unordered_map<std::string, int>>::iterator iter;
262*635a8641SAndroid Build Coastguard Worker 
263*635a8641SAndroid Build Coastguard Worker   m["monday"] = 1;
264*635a8641SAndroid Build Coastguard Worker   m["tuesday"] = 2;
265*635a8641SAndroid Build Coastguard Worker   m["wednesday"] = 3;
266*635a8641SAndroid Build Coastguard Worker 
267*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m["monday"   ], 1);
268*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m["tuesday"  ], 2);
269*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m["wednesday"], 3);
270*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.count("tuesday"), 1u);
271*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(m.UsingFullMap());
272*635a8641SAndroid Build Coastguard Worker 
273*635a8641SAndroid Build Coastguard Worker   iter = m.begin();
274*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(iter != m.end());
275*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->first, "monday");
276*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->second, 1);
277*635a8641SAndroid Build Coastguard Worker   ++iter;
278*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(iter != m.end());
279*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->first, "tuesday");
280*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->second, 2);
281*635a8641SAndroid Build Coastguard Worker   ++iter;
282*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(iter != m.end());
283*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->first, "wednesday");
284*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->second, 3);
285*635a8641SAndroid Build Coastguard Worker   ++iter;
286*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(iter == m.end());
287*635a8641SAndroid Build Coastguard Worker 
288*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.erase("tuesday"), 1u);
289*635a8641SAndroid Build Coastguard Worker 
290*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m["monday"   ], 1);
291*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m["wednesday"], 3);
292*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.count("tuesday"), 0u);
293*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.erase("tuesday"), 0u);
294*635a8641SAndroid Build Coastguard Worker 
295*635a8641SAndroid Build Coastguard Worker   iter = m.begin();
296*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(iter != m.end());
297*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->first, "monday");
298*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->second, 1);
299*635a8641SAndroid Build Coastguard Worker   ++iter;
300*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(iter != m.end());
301*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->first, "wednesday");
302*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->second, 3);
303*635a8641SAndroid Build Coastguard Worker   ++iter;
304*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(iter == m.end());
305*635a8641SAndroid Build Coastguard Worker 
306*635a8641SAndroid Build Coastguard Worker   m["thursday"] = 4;
307*635a8641SAndroid Build Coastguard Worker   m["friday"] = 5;
308*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.size(), 4u);
309*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(m.empty());
310*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(m.UsingFullMap());
311*635a8641SAndroid Build Coastguard Worker 
312*635a8641SAndroid Build Coastguard Worker   m["saturday"] = 6;
313*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(m.UsingFullMap());
314*635a8641SAndroid Build Coastguard Worker 
315*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.count("friday"), 1u);
316*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.erase("friday"), 1u);
317*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(m.UsingFullMap());
318*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.count("friday"), 0u);
319*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.erase("friday"), 0u);
320*635a8641SAndroid Build Coastguard Worker 
321*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.size(), 4u);
322*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(m.empty());
323*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.erase("monday"), 1u);
324*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.size(), 3u);
325*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(m.empty());
326*635a8641SAndroid Build Coastguard Worker 
327*635a8641SAndroid Build Coastguard Worker   m.clear();
328*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(m.UsingFullMap());
329*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.size(), 0u);
330*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(m.empty());
331*635a8641SAndroid Build Coastguard Worker }
332*635a8641SAndroid Build Coastguard Worker 
TEST(SmallMap,EraseReturnsIteratorFollowingRemovedElement)333*635a8641SAndroid Build Coastguard Worker TEST(SmallMap, EraseReturnsIteratorFollowingRemovedElement) {
334*635a8641SAndroid Build Coastguard Worker   small_map<std::unordered_map<std::string, int>> m;
335*635a8641SAndroid Build Coastguard Worker   small_map<std::unordered_map<std::string, int>>::iterator iter;
336*635a8641SAndroid Build Coastguard Worker 
337*635a8641SAndroid Build Coastguard Worker   m["a"] = 0;
338*635a8641SAndroid Build Coastguard Worker   m["b"] = 1;
339*635a8641SAndroid Build Coastguard Worker   m["c"] = 2;
340*635a8641SAndroid Build Coastguard Worker 
341*635a8641SAndroid Build Coastguard Worker   // Erase first item.
342*635a8641SAndroid Build Coastguard Worker   auto following_iter = m.erase(m.begin());
343*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.begin(), following_iter);
344*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(2u, m.size());
345*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.count("a"), 0u);
346*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.count("b"), 1u);
347*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.count("c"), 1u);
348*635a8641SAndroid Build Coastguard Worker 
349*635a8641SAndroid Build Coastguard Worker   // Iterate to last item and erase it.
350*635a8641SAndroid Build Coastguard Worker   ++following_iter;
351*635a8641SAndroid Build Coastguard Worker   following_iter = m.erase(following_iter);
352*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(1u, m.size());
353*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.end(), following_iter);
354*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.count("b"), 0u);
355*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.count("c"), 1u);
356*635a8641SAndroid Build Coastguard Worker 
357*635a8641SAndroid Build Coastguard Worker   // Erase remaining item.
358*635a8641SAndroid Build Coastguard Worker   following_iter = m.erase(m.begin());
359*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(m.empty());
360*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.end(), following_iter);
361*635a8641SAndroid Build Coastguard Worker }
362*635a8641SAndroid Build Coastguard Worker 
TEST(SmallMap,NonHashMap)363*635a8641SAndroid Build Coastguard Worker TEST(SmallMap, NonHashMap) {
364*635a8641SAndroid Build Coastguard Worker   small_map<std::map<int, int>, 4, std::equal_to<int>> m;
365*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(m.empty());
366*635a8641SAndroid Build Coastguard Worker 
367*635a8641SAndroid Build Coastguard Worker   m[9] = 2;
368*635a8641SAndroid Build Coastguard Worker   m[0] = 5;
369*635a8641SAndroid Build Coastguard Worker 
370*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m[9], 2);
371*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m[0], 5);
372*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.size(), 2u);
373*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(m.empty());
374*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(m.UsingFullMap());
375*635a8641SAndroid Build Coastguard Worker 
376*635a8641SAndroid Build Coastguard Worker   small_map<std::map<int, int>, 4, std::equal_to<int>>::iterator iter(
377*635a8641SAndroid Build Coastguard Worker       m.begin());
378*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(iter != m.end());
379*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->first, 9);
380*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->second, 2);
381*635a8641SAndroid Build Coastguard Worker   ++iter;
382*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(iter != m.end());
383*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->first, 0);
384*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->second, 5);
385*635a8641SAndroid Build Coastguard Worker   ++iter;
386*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(iter == m.end());
387*635a8641SAndroid Build Coastguard Worker   --iter;
388*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(iter != m.end());
389*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->first, 0);
390*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->second, 5);
391*635a8641SAndroid Build Coastguard Worker 
392*635a8641SAndroid Build Coastguard Worker   m[8] = 23;
393*635a8641SAndroid Build Coastguard Worker   m[1234] = 90;
394*635a8641SAndroid Build Coastguard Worker   m[-5] = 6;
395*635a8641SAndroid Build Coastguard Worker 
396*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m[   9],  2);
397*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m[   0],  5);
398*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m[1234], 90);
399*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m[   8], 23);
400*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m[  -5],  6);
401*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.size(), 5u);
402*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(m.empty());
403*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(m.UsingFullMap());
404*635a8641SAndroid Build Coastguard Worker 
405*635a8641SAndroid Build Coastguard Worker   iter = m.begin();
406*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(iter != m.end());
407*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->first, -5);
408*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->second, 6);
409*635a8641SAndroid Build Coastguard Worker   ++iter;
410*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(iter != m.end());
411*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->first, 0);
412*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->second, 5);
413*635a8641SAndroid Build Coastguard Worker   ++iter;
414*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(iter != m.end());
415*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->first, 8);
416*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->second, 23);
417*635a8641SAndroid Build Coastguard Worker   ++iter;
418*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(iter != m.end());
419*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->first, 9);
420*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->second, 2);
421*635a8641SAndroid Build Coastguard Worker   ++iter;
422*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(iter != m.end());
423*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->first, 1234);
424*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->second, 90);
425*635a8641SAndroid Build Coastguard Worker   ++iter;
426*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(iter == m.end());
427*635a8641SAndroid Build Coastguard Worker   --iter;
428*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(iter != m.end());
429*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->first, 1234);
430*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(iter->second, 90);
431*635a8641SAndroid Build Coastguard Worker }
432*635a8641SAndroid Build Coastguard Worker 
TEST(SmallMap,DefaultEqualKeyWorks)433*635a8641SAndroid Build Coastguard Worker TEST(SmallMap, DefaultEqualKeyWorks) {
434*635a8641SAndroid Build Coastguard Worker   // If these tests compile, they pass. The EXPECT calls are only there to avoid
435*635a8641SAndroid Build Coastguard Worker   // unused variable warnings.
436*635a8641SAndroid Build Coastguard Worker   small_map<std::unordered_map<int, int>> hm;
437*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0u, hm.size());
438*635a8641SAndroid Build Coastguard Worker   small_map<std::map<int, int>> m;
439*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0u, m.size());
440*635a8641SAndroid Build Coastguard Worker }
441*635a8641SAndroid Build Coastguard Worker 
442*635a8641SAndroid Build Coastguard Worker namespace {
443*635a8641SAndroid Build Coastguard Worker 
444*635a8641SAndroid Build Coastguard Worker class unordered_map_add_item : public std::unordered_map<int, int> {
445*635a8641SAndroid Build Coastguard Worker  public:
446*635a8641SAndroid Build Coastguard Worker   unordered_map_add_item() = default;
unordered_map_add_item(const std::pair<int,int> & item)447*635a8641SAndroid Build Coastguard Worker   explicit unordered_map_add_item(const std::pair<int, int>& item) {
448*635a8641SAndroid Build Coastguard Worker     insert(item);
449*635a8641SAndroid Build Coastguard Worker   }
450*635a8641SAndroid Build Coastguard Worker };
451*635a8641SAndroid Build Coastguard Worker 
InitMap(unordered_map_add_item * map_ctor)452*635a8641SAndroid Build Coastguard Worker void InitMap(unordered_map_add_item* map_ctor) {
453*635a8641SAndroid Build Coastguard Worker   new (map_ctor) unordered_map_add_item(std::make_pair(0, 0));
454*635a8641SAndroid Build Coastguard Worker }
455*635a8641SAndroid Build Coastguard Worker 
456*635a8641SAndroid Build Coastguard Worker class unordered_map_add_item_initializer {
457*635a8641SAndroid Build Coastguard Worker  public:
unordered_map_add_item_initializer(int item_to_add)458*635a8641SAndroid Build Coastguard Worker   explicit unordered_map_add_item_initializer(int item_to_add)
459*635a8641SAndroid Build Coastguard Worker       : item_(item_to_add) {}
unordered_map_add_item_initializer()460*635a8641SAndroid Build Coastguard Worker   unordered_map_add_item_initializer() : item_(0) {}
operator ()(unordered_map_add_item * map_ctor) const461*635a8641SAndroid Build Coastguard Worker   void operator()(unordered_map_add_item* map_ctor) const {
462*635a8641SAndroid Build Coastguard Worker     new (map_ctor) unordered_map_add_item(std::make_pair(item_, item_));
463*635a8641SAndroid Build Coastguard Worker   }
464*635a8641SAndroid Build Coastguard Worker 
465*635a8641SAndroid Build Coastguard Worker   int item_;
466*635a8641SAndroid Build Coastguard Worker };
467*635a8641SAndroid Build Coastguard Worker 
468*635a8641SAndroid Build Coastguard Worker }  // anonymous namespace
469*635a8641SAndroid Build Coastguard Worker 
TEST(SmallMap,SubclassInitializationWithFunctionPointer)470*635a8641SAndroid Build Coastguard Worker TEST(SmallMap, SubclassInitializationWithFunctionPointer) {
471*635a8641SAndroid Build Coastguard Worker   small_map<unordered_map_add_item, 4, std::equal_to<int>,
472*635a8641SAndroid Build Coastguard Worker             void (&)(unordered_map_add_item*)>
473*635a8641SAndroid Build Coastguard Worker       m(InitMap);
474*635a8641SAndroid Build Coastguard Worker 
475*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(m.empty());
476*635a8641SAndroid Build Coastguard Worker 
477*635a8641SAndroid Build Coastguard Worker   m[1] = 1;
478*635a8641SAndroid Build Coastguard Worker   m[2] = 2;
479*635a8641SAndroid Build Coastguard Worker   m[3] = 3;
480*635a8641SAndroid Build Coastguard Worker   m[4] = 4;
481*635a8641SAndroid Build Coastguard Worker 
482*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(4u, m.size());
483*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0u, m.count(0));
484*635a8641SAndroid Build Coastguard Worker 
485*635a8641SAndroid Build Coastguard Worker   m[5] = 5;
486*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(6u, m.size());
487*635a8641SAndroid Build Coastguard Worker   // Our function adds an extra item when we convert to a map.
488*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1u, m.count(0));
489*635a8641SAndroid Build Coastguard Worker }
490*635a8641SAndroid Build Coastguard Worker 
TEST(SmallMap,SubclassInitializationWithFunctionObject)491*635a8641SAndroid Build Coastguard Worker TEST(SmallMap, SubclassInitializationWithFunctionObject) {
492*635a8641SAndroid Build Coastguard Worker   small_map<unordered_map_add_item, 4, std::equal_to<int>,
493*635a8641SAndroid Build Coastguard Worker             unordered_map_add_item_initializer>
494*635a8641SAndroid Build Coastguard Worker       m(unordered_map_add_item_initializer(-1));
495*635a8641SAndroid Build Coastguard Worker 
496*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(m.empty());
497*635a8641SAndroid Build Coastguard Worker 
498*635a8641SAndroid Build Coastguard Worker   m[1] = 1;
499*635a8641SAndroid Build Coastguard Worker   m[2] = 2;
500*635a8641SAndroid Build Coastguard Worker   m[3] = 3;
501*635a8641SAndroid Build Coastguard Worker   m[4] = 4;
502*635a8641SAndroid Build Coastguard Worker 
503*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(4u, m.size());
504*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0u, m.count(-1));
505*635a8641SAndroid Build Coastguard Worker 
506*635a8641SAndroid Build Coastguard Worker   m[5] = 5;
507*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(6u, m.size());
508*635a8641SAndroid Build Coastguard Worker   // Our functor adds an extra item when we convert to a map.
509*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1u, m.count(-1));
510*635a8641SAndroid Build Coastguard Worker }
511*635a8641SAndroid Build Coastguard Worker 
512*635a8641SAndroid Build Coastguard Worker namespace {
513*635a8641SAndroid Build Coastguard Worker 
514*635a8641SAndroid Build Coastguard Worker // This class acts as a basic implementation of a move-only type. The canonical
515*635a8641SAndroid Build Coastguard Worker // example of such a type is scoped_ptr/unique_ptr.
516*635a8641SAndroid Build Coastguard Worker template <typename V>
517*635a8641SAndroid Build Coastguard Worker class MoveOnlyType {
518*635a8641SAndroid Build Coastguard Worker  public:
MoveOnlyType()519*635a8641SAndroid Build Coastguard Worker   MoveOnlyType() : value_(0) {}
MoveOnlyType(V value)520*635a8641SAndroid Build Coastguard Worker   explicit MoveOnlyType(V value) : value_(value) {}
521*635a8641SAndroid Build Coastguard Worker 
MoveOnlyType(MoveOnlyType && other)522*635a8641SAndroid Build Coastguard Worker   MoveOnlyType(MoveOnlyType&& other) {
523*635a8641SAndroid Build Coastguard Worker     *this = std::move(other);
524*635a8641SAndroid Build Coastguard Worker   }
525*635a8641SAndroid Build Coastguard Worker 
operator =(MoveOnlyType && other)526*635a8641SAndroid Build Coastguard Worker   MoveOnlyType& operator=(MoveOnlyType&& other) {
527*635a8641SAndroid Build Coastguard Worker     value_ = other.value_;
528*635a8641SAndroid Build Coastguard Worker     other.value_ = 0;
529*635a8641SAndroid Build Coastguard Worker     return *this;
530*635a8641SAndroid Build Coastguard Worker   }
531*635a8641SAndroid Build Coastguard Worker 
532*635a8641SAndroid Build Coastguard Worker   MoveOnlyType(const MoveOnlyType&) = delete;
533*635a8641SAndroid Build Coastguard Worker   MoveOnlyType& operator=(const MoveOnlyType&) = delete;
534*635a8641SAndroid Build Coastguard Worker 
value() const535*635a8641SAndroid Build Coastguard Worker   V value() const { return value_; }
536*635a8641SAndroid Build Coastguard Worker 
537*635a8641SAndroid Build Coastguard Worker  private:
538*635a8641SAndroid Build Coastguard Worker   V value_;
539*635a8641SAndroid Build Coastguard Worker };
540*635a8641SAndroid Build Coastguard Worker 
541*635a8641SAndroid Build Coastguard Worker }  // namespace
542*635a8641SAndroid Build Coastguard Worker 
TEST(SmallMap,MoveOnlyValueType)543*635a8641SAndroid Build Coastguard Worker TEST(SmallMap, MoveOnlyValueType) {
544*635a8641SAndroid Build Coastguard Worker   small_map<std::map<int, MoveOnlyType<int>>, 2> m;
545*635a8641SAndroid Build Coastguard Worker 
546*635a8641SAndroid Build Coastguard Worker   m[0] = MoveOnlyType<int>(1);
547*635a8641SAndroid Build Coastguard Worker   m[1] = MoveOnlyType<int>(2);
548*635a8641SAndroid Build Coastguard Worker   m.erase(m.begin());
549*635a8641SAndroid Build Coastguard Worker 
550*635a8641SAndroid Build Coastguard Worker   // small_map will move m[1] to an earlier index in the internal array.
551*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.size(), 1u);
552*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m[1].value(), 2);
553*635a8641SAndroid Build Coastguard Worker 
554*635a8641SAndroid Build Coastguard Worker   m[0] = MoveOnlyType<int>(1);
555*635a8641SAndroid Build Coastguard Worker   // small_map must move the values from the array into the internal std::map.
556*635a8641SAndroid Build Coastguard Worker   m[2] = MoveOnlyType<int>(3);
557*635a8641SAndroid Build Coastguard Worker 
558*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.size(), 3u);
559*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m[0].value(), 1);
560*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m[1].value(), 2);
561*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m[2].value(), 3);
562*635a8641SAndroid Build Coastguard Worker 
563*635a8641SAndroid Build Coastguard Worker   m.erase(m.begin());
564*635a8641SAndroid Build Coastguard Worker 
565*635a8641SAndroid Build Coastguard Worker   // small_map should also let internal std::map erase with a move-only type.
566*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m.size(), 2u);
567*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m[1].value(), 2);
568*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(m[2].value(), 3);
569*635a8641SAndroid Build Coastguard Worker }
570*635a8641SAndroid Build Coastguard Worker 
TEST(SmallMap,Emplace)571*635a8641SAndroid Build Coastguard Worker TEST(SmallMap, Emplace) {
572*635a8641SAndroid Build Coastguard Worker   small_map<std::map<size_t, MoveOnlyType<size_t>>> sm;
573*635a8641SAndroid Build Coastguard Worker 
574*635a8641SAndroid Build Coastguard Worker   // loop through the transition from small map to map.
575*635a8641SAndroid Build Coastguard Worker   for (size_t i = 1; i <= 10; ++i) {
576*635a8641SAndroid Build Coastguard Worker     // insert an element
577*635a8641SAndroid Build Coastguard Worker     auto ret = sm.emplace(i, MoveOnlyType<size_t>(100 * i));
578*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(ret.second);
579*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(ret.first == sm.find(i));
580*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(ret.first->first, i);
581*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(ret.first->second.value(), 100 * i);
582*635a8641SAndroid Build Coastguard Worker 
583*635a8641SAndroid Build Coastguard Worker     // try to insert it again with different value, fails, but we still get an
584*635a8641SAndroid Build Coastguard Worker     // iterator back with the original value.
585*635a8641SAndroid Build Coastguard Worker     ret = sm.emplace(i, MoveOnlyType<size_t>(i));
586*635a8641SAndroid Build Coastguard Worker     EXPECT_FALSE(ret.second);
587*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(ret.first == sm.find(i));
588*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(ret.first->first, i);
589*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(ret.first->second.value(), 100 * i);
590*635a8641SAndroid Build Coastguard Worker 
591*635a8641SAndroid Build Coastguard Worker     // check the state of the map.
592*635a8641SAndroid Build Coastguard Worker     for (size_t j = 1; j <= i; ++j) {
593*635a8641SAndroid Build Coastguard Worker       const auto it = sm.find(j);
594*635a8641SAndroid Build Coastguard Worker       EXPECT_TRUE(it != sm.end());
595*635a8641SAndroid Build Coastguard Worker       EXPECT_EQ(it->first, j);
596*635a8641SAndroid Build Coastguard Worker       EXPECT_EQ(it->second.value(), j * 100);
597*635a8641SAndroid Build Coastguard Worker     }
598*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(sm.size(), i);
599*635a8641SAndroid Build Coastguard Worker     EXPECT_FALSE(sm.empty());
600*635a8641SAndroid Build Coastguard Worker   }
601*635a8641SAndroid Build Coastguard Worker }
602*635a8641SAndroid Build Coastguard Worker 
603*635a8641SAndroid Build Coastguard Worker }  // namespace base
604