1 //===- unittest/ADT/MapVectorTest.cpp - MapVector unit tests ----*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "gtest/gtest.h"
11 #include "llvm/ADT/MapVector.h"
12 #include "llvm/ADT/iterator_range.h"
17 TEST(MapVectorTest, swap) {
18 MapVector<int, int> MV1, MV2;
19 std::pair<MapVector<int, int>::iterator, bool> R;
21 R = MV1.insert(std::make_pair(1, 2));
22 ASSERT_EQ(R.first, MV1.begin());
23 EXPECT_EQ(R.first->first, 1);
24 EXPECT_EQ(R.first->second, 2);
25 EXPECT_TRUE(R.second);
27 EXPECT_FALSE(MV1.empty());
28 EXPECT_TRUE(MV2.empty());
30 EXPECT_TRUE(MV1.empty());
31 EXPECT_FALSE(MV2.empty());
34 ASSERT_EQ(MV1.end(), I);
37 ASSERT_EQ(I, MV2.begin());
38 EXPECT_EQ(I->first, 1);
39 EXPECT_EQ(I->second, 2);
42 TEST(MapVectorTest, insert_pop) {
43 MapVector<int, int> MV;
44 std::pair<MapVector<int, int>::iterator, bool> R;
46 R = MV.insert(std::make_pair(1, 2));
47 ASSERT_EQ(R.first, MV.begin());
48 EXPECT_EQ(R.first->first, 1);
49 EXPECT_EQ(R.first->second, 2);
50 EXPECT_TRUE(R.second);
52 R = MV.insert(std::make_pair(1, 3));
53 ASSERT_EQ(R.first, MV.begin());
54 EXPECT_EQ(R.first->first, 1);
55 EXPECT_EQ(R.first->second, 2);
56 EXPECT_FALSE(R.second);
58 R = MV.insert(std::make_pair(4, 5));
59 ASSERT_NE(R.first, MV.end());
60 EXPECT_EQ(R.first->first, 4);
61 EXPECT_EQ(R.first->second, 5);
62 EXPECT_TRUE(R.second);
64 EXPECT_EQ(MV.size(), 2u);
69 EXPECT_EQ(MV.size(), 1u);
72 R = MV.insert(std::make_pair(4, 7));
73 ASSERT_NE(R.first, MV.end());
74 EXPECT_EQ(R.first->first, 4);
75 EXPECT_EQ(R.first->second, 7);
76 EXPECT_TRUE(R.second);
78 EXPECT_EQ(MV.size(), 2u);
83 TEST(MapVectorTest, erase) {
84 MapVector<int, int> MV;
86 MV.insert(std::make_pair(1, 2));
87 MV.insert(std::make_pair(3, 4));
88 MV.insert(std::make_pair(5, 6));
89 ASSERT_EQ(MV.size(), 3u);
92 ASSERT_EQ(MV.size(), 2u);
93 ASSERT_EQ(MV.find(1), MV.end());
97 ASSERT_EQ(MV.erase(3), 1u);
98 ASSERT_EQ(MV.size(), 1u);
99 ASSERT_EQ(MV.find(3), MV.end());
102 ASSERT_EQ(MV.erase(79), 0u);
103 ASSERT_EQ(MV.size(), 1u);
106 TEST(MapVectorTest, remove_if) {
107 MapVector<int, int> MV;
109 MV.insert(std::make_pair(1, 11));
110 MV.insert(std::make_pair(2, 12));
111 MV.insert(std::make_pair(3, 13));
112 MV.insert(std::make_pair(4, 14));
113 MV.insert(std::make_pair(5, 15));
114 MV.insert(std::make_pair(6, 16));
115 ASSERT_EQ(MV.size(), 6u);
117 MV.remove_if([](const std::pair<int, int> &Val) { return Val.second % 2; });
118 ASSERT_EQ(MV.size(), 3u);
119 ASSERT_EQ(MV.find(1), MV.end());
120 ASSERT_EQ(MV.find(3), MV.end());
121 ASSERT_EQ(MV.find(5), MV.end());
122 ASSERT_EQ(MV[2], 12);
123 ASSERT_EQ(MV[4], 14);
124 ASSERT_EQ(MV[6], 16);
127 TEST(MapVectorTest, iteration_test) {
128 MapVector<int, int> MV;
130 MV.insert(std::make_pair(1, 11));
131 MV.insert(std::make_pair(2, 12));
132 MV.insert(std::make_pair(3, 13));
133 MV.insert(std::make_pair(4, 14));
134 MV.insert(std::make_pair(5, 15));
135 MV.insert(std::make_pair(6, 16));
136 ASSERT_EQ(MV.size(), 6u);
139 for (auto P : make_range(MV.begin(), MV.end())) {
140 ASSERT_EQ(P.first, count);
145 for (auto P : make_range(MV.rbegin(), MV.rend())) {
146 ASSERT_EQ(P.first, count);
151 TEST(SmallMapVectorSmallTest, insert_pop) {
152 SmallMapVector<int, int, 32> MV;
153 std::pair<SmallMapVector<int, int, 32>::iterator, bool> R;
155 R = MV.insert(std::make_pair(1, 2));
156 ASSERT_EQ(R.first, MV.begin());
157 EXPECT_EQ(R.first->first, 1);
158 EXPECT_EQ(R.first->second, 2);
159 EXPECT_TRUE(R.second);
161 R = MV.insert(std::make_pair(1, 3));
162 ASSERT_EQ(R.first, MV.begin());
163 EXPECT_EQ(R.first->first, 1);
164 EXPECT_EQ(R.first->second, 2);
165 EXPECT_FALSE(R.second);
167 R = MV.insert(std::make_pair(4, 5));
168 ASSERT_NE(R.first, MV.end());
169 EXPECT_EQ(R.first->first, 4);
170 EXPECT_EQ(R.first->second, 5);
171 EXPECT_TRUE(R.second);
173 EXPECT_EQ(MV.size(), 2u);
178 EXPECT_EQ(MV.size(), 1u);
181 R = MV.insert(std::make_pair(4, 7));
182 ASSERT_NE(R.first, MV.end());
183 EXPECT_EQ(R.first->first, 4);
184 EXPECT_EQ(R.first->second, 7);
185 EXPECT_TRUE(R.second);
187 EXPECT_EQ(MV.size(), 2u);
192 TEST(SmallMapVectorSmallTest, erase) {
193 SmallMapVector<int, int, 32> MV;
195 MV.insert(std::make_pair(1, 2));
196 MV.insert(std::make_pair(3, 4));
197 MV.insert(std::make_pair(5, 6));
198 ASSERT_EQ(MV.size(), 3u);
200 MV.erase(MV.find(1));
201 ASSERT_EQ(MV.size(), 2u);
202 ASSERT_EQ(MV.find(1), MV.end());
206 ASSERT_EQ(MV.erase(3), 1u);
207 ASSERT_EQ(MV.size(), 1u);
208 ASSERT_EQ(MV.find(3), MV.end());
211 ASSERT_EQ(MV.erase(79), 0u);
212 ASSERT_EQ(MV.size(), 1u);
215 TEST(SmallMapVectorSmallTest, remove_if) {
216 SmallMapVector<int, int, 32> MV;
218 MV.insert(std::make_pair(1, 11));
219 MV.insert(std::make_pair(2, 12));
220 MV.insert(std::make_pair(3, 13));
221 MV.insert(std::make_pair(4, 14));
222 MV.insert(std::make_pair(5, 15));
223 MV.insert(std::make_pair(6, 16));
224 ASSERT_EQ(MV.size(), 6u);
226 MV.remove_if([](const std::pair<int, int> &Val) { return Val.second % 2; });
227 ASSERT_EQ(MV.size(), 3u);
228 ASSERT_EQ(MV.find(1), MV.end());
229 ASSERT_EQ(MV.find(3), MV.end());
230 ASSERT_EQ(MV.find(5), MV.end());
231 ASSERT_EQ(MV[2], 12);
232 ASSERT_EQ(MV[4], 14);
233 ASSERT_EQ(MV[6], 16);
236 TEST(SmallMapVectorSmallTest, iteration_test) {
237 SmallMapVector<int, int, 32> MV;
239 MV.insert(std::make_pair(1, 11));
240 MV.insert(std::make_pair(2, 12));
241 MV.insert(std::make_pair(3, 13));
242 MV.insert(std::make_pair(4, 14));
243 MV.insert(std::make_pair(5, 15));
244 MV.insert(std::make_pair(6, 16));
245 ASSERT_EQ(MV.size(), 6u);
248 for (auto P : make_range(MV.begin(), MV.end())) {
249 ASSERT_EQ(P.first, count);
254 for (auto P : make_range(MV.rbegin(), MV.rend())) {
255 ASSERT_EQ(P.first, count);
260 TEST(SmallMapVectorLargeTest, insert_pop) {
261 SmallMapVector<int, int, 1> MV;
262 std::pair<SmallMapVector<int, int, 1>::iterator, bool> R;
264 R = MV.insert(std::make_pair(1, 2));
265 ASSERT_EQ(R.first, MV.begin());
266 EXPECT_EQ(R.first->first, 1);
267 EXPECT_EQ(R.first->second, 2);
268 EXPECT_TRUE(R.second);
270 R = MV.insert(std::make_pair(1, 3));
271 ASSERT_EQ(R.first, MV.begin());
272 EXPECT_EQ(R.first->first, 1);
273 EXPECT_EQ(R.first->second, 2);
274 EXPECT_FALSE(R.second);
276 R = MV.insert(std::make_pair(4, 5));
277 ASSERT_NE(R.first, MV.end());
278 EXPECT_EQ(R.first->first, 4);
279 EXPECT_EQ(R.first->second, 5);
280 EXPECT_TRUE(R.second);
282 EXPECT_EQ(MV.size(), 2u);
287 EXPECT_EQ(MV.size(), 1u);
290 R = MV.insert(std::make_pair(4, 7));
291 ASSERT_NE(R.first, MV.end());
292 EXPECT_EQ(R.first->first, 4);
293 EXPECT_EQ(R.first->second, 7);
294 EXPECT_TRUE(R.second);
296 EXPECT_EQ(MV.size(), 2u);
301 TEST(SmallMapVectorLargeTest, erase) {
302 SmallMapVector<int, int, 1> MV;
304 MV.insert(std::make_pair(1, 2));
305 MV.insert(std::make_pair(3, 4));
306 MV.insert(std::make_pair(5, 6));
307 ASSERT_EQ(MV.size(), 3u);
309 MV.erase(MV.find(1));
310 ASSERT_EQ(MV.size(), 2u);
311 ASSERT_EQ(MV.find(1), MV.end());
315 ASSERT_EQ(MV.erase(3), 1u);
316 ASSERT_EQ(MV.size(), 1u);
317 ASSERT_EQ(MV.find(3), MV.end());
320 ASSERT_EQ(MV.erase(79), 0u);
321 ASSERT_EQ(MV.size(), 1u);
324 TEST(SmallMapVectorLargeTest, remove_if) {
325 SmallMapVector<int, int, 1> MV;
327 MV.insert(std::make_pair(1, 11));
328 MV.insert(std::make_pair(2, 12));
329 MV.insert(std::make_pair(3, 13));
330 MV.insert(std::make_pair(4, 14));
331 MV.insert(std::make_pair(5, 15));
332 MV.insert(std::make_pair(6, 16));
333 ASSERT_EQ(MV.size(), 6u);
335 MV.remove_if([](const std::pair<int, int> &Val) { return Val.second % 2; });
336 ASSERT_EQ(MV.size(), 3u);
337 ASSERT_EQ(MV.find(1), MV.end());
338 ASSERT_EQ(MV.find(3), MV.end());
339 ASSERT_EQ(MV.find(5), MV.end());
340 ASSERT_EQ(MV[2], 12);
341 ASSERT_EQ(MV[4], 14);
342 ASSERT_EQ(MV[6], 16);
345 TEST(SmallMapVectorLargeTest, iteration_test) {
346 SmallMapVector<int, int, 1> MV;
348 MV.insert(std::make_pair(1, 11));
349 MV.insert(std::make_pair(2, 12));
350 MV.insert(std::make_pair(3, 13));
351 MV.insert(std::make_pair(4, 14));
352 MV.insert(std::make_pair(5, 15));
353 MV.insert(std::make_pair(6, 16));
354 ASSERT_EQ(MV.size(), 6u);
357 for (auto P : make_range(MV.begin(), MV.end())) {
358 ASSERT_EQ(P.first, count);
363 for (auto P : make_range(MV.rbegin(), MV.rend())) {
364 ASSERT_EQ(P.first, count);