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