1 //===- unittest/ADT/MapVectorTest.cpp - MapVector unit tests ----*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "gtest/gtest.h" 11 #include "llvm/ADT/MapVector.h" 12 #include "llvm/ADT/iterator_range.h" 13 #include <utility> 14 15 using namespace llvm; 16 17 TEST(MapVectorTest, swap) { 18 MapVector<int, int> MV1, MV2; 19 std::pair<MapVector<int, int>::iterator, bool> R; 20 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); 26 27 EXPECT_FALSE(MV1.empty()); 28 EXPECT_TRUE(MV2.empty()); 29 MV2.swap(MV1); 30 EXPECT_TRUE(MV1.empty()); 31 EXPECT_FALSE(MV2.empty()); 32 33 auto I = MV1.find(1); 34 ASSERT_EQ(MV1.end(), I); 35 36 I = MV2.find(1); 37 ASSERT_EQ(I, MV2.begin()); 38 EXPECT_EQ(I->first, 1); 39 EXPECT_EQ(I->second, 2); 40 } 41 42 TEST(MapVectorTest, insert_pop) { 43 MapVector<int, int> MV; 44 std::pair<MapVector<int, int>::iterator, bool> R; 45 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); 51 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); 57 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); 63 64 EXPECT_EQ(MV.size(), 2u); 65 EXPECT_EQ(MV[1], 2); 66 EXPECT_EQ(MV[4], 5); 67 68 MV.pop_back(); 69 EXPECT_EQ(MV.size(), 1u); 70 EXPECT_EQ(MV[1], 2); 71 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); 77 78 EXPECT_EQ(MV.size(), 2u); 79 EXPECT_EQ(MV[1], 2); 80 EXPECT_EQ(MV[4], 7); 81 } 82 83 TEST(MapVectorTest, erase) { 84 MapVector<int, int> MV; 85 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); 90 91 MV.erase(MV.find(1)); 92 ASSERT_EQ(MV.size(), 2u); 93 ASSERT_EQ(MV.find(1), MV.end()); 94 ASSERT_EQ(MV[3], 4); 95 ASSERT_EQ(MV[5], 6); 96 97 ASSERT_EQ(MV.erase(3), 1u); 98 ASSERT_EQ(MV.size(), 1u); 99 ASSERT_EQ(MV.find(3), MV.end()); 100 ASSERT_EQ(MV[5], 6); 101 102 ASSERT_EQ(MV.erase(79), 0u); 103 ASSERT_EQ(MV.size(), 1u); 104 } 105 106 TEST(MapVectorTest, remove_if) { 107 MapVector<int, int> MV; 108 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); 116 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); 125 } 126 127 TEST(MapVectorTest, iteration_test) { 128 MapVector<int, int> MV; 129 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); 137 138 int count = 1; 139 for (auto P : make_range(MV.begin(), MV.end())) { 140 ASSERT_EQ(P.first, count); 141 count++; 142 } 143 144 count = 6; 145 for (auto P : make_range(MV.rbegin(), MV.rend())) { 146 ASSERT_EQ(P.first, count); 147 count--; 148 } 149 } 150 151 TEST(SmallMapVectorSmallTest, insert_pop) { 152 SmallMapVector<int, int, 32> MV; 153 std::pair<SmallMapVector<int, int, 32>::iterator, bool> R; 154 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); 160 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); 166 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); 172 173 EXPECT_EQ(MV.size(), 2u); 174 EXPECT_EQ(MV[1], 2); 175 EXPECT_EQ(MV[4], 5); 176 177 MV.pop_back(); 178 EXPECT_EQ(MV.size(), 1u); 179 EXPECT_EQ(MV[1], 2); 180 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); 186 187 EXPECT_EQ(MV.size(), 2u); 188 EXPECT_EQ(MV[1], 2); 189 EXPECT_EQ(MV[4], 7); 190 } 191 192 TEST(SmallMapVectorSmallTest, erase) { 193 SmallMapVector<int, int, 32> MV; 194 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); 199 200 MV.erase(MV.find(1)); 201 ASSERT_EQ(MV.size(), 2u); 202 ASSERT_EQ(MV.find(1), MV.end()); 203 ASSERT_EQ(MV[3], 4); 204 ASSERT_EQ(MV[5], 6); 205 206 ASSERT_EQ(MV.erase(3), 1u); 207 ASSERT_EQ(MV.size(), 1u); 208 ASSERT_EQ(MV.find(3), MV.end()); 209 ASSERT_EQ(MV[5], 6); 210 211 ASSERT_EQ(MV.erase(79), 0u); 212 ASSERT_EQ(MV.size(), 1u); 213 } 214 215 TEST(SmallMapVectorSmallTest, remove_if) { 216 SmallMapVector<int, int, 32> MV; 217 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); 225 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); 234 } 235 236 TEST(SmallMapVectorSmallTest, iteration_test) { 237 SmallMapVector<int, int, 32> MV; 238 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); 246 247 int count = 1; 248 for (auto P : make_range(MV.begin(), MV.end())) { 249 ASSERT_EQ(P.first, count); 250 count++; 251 } 252 253 count = 6; 254 for (auto P : make_range(MV.rbegin(), MV.rend())) { 255 ASSERT_EQ(P.first, count); 256 count--; 257 } 258 } 259 260 TEST(SmallMapVectorLargeTest, insert_pop) { 261 SmallMapVector<int, int, 1> MV; 262 std::pair<SmallMapVector<int, int, 1>::iterator, bool> R; 263 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); 269 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); 275 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); 281 282 EXPECT_EQ(MV.size(), 2u); 283 EXPECT_EQ(MV[1], 2); 284 EXPECT_EQ(MV[4], 5); 285 286 MV.pop_back(); 287 EXPECT_EQ(MV.size(), 1u); 288 EXPECT_EQ(MV[1], 2); 289 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); 295 296 EXPECT_EQ(MV.size(), 2u); 297 EXPECT_EQ(MV[1], 2); 298 EXPECT_EQ(MV[4], 7); 299 } 300 301 TEST(SmallMapVectorLargeTest, erase) { 302 SmallMapVector<int, int, 1> MV; 303 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); 308 309 MV.erase(MV.find(1)); 310 ASSERT_EQ(MV.size(), 2u); 311 ASSERT_EQ(MV.find(1), MV.end()); 312 ASSERT_EQ(MV[3], 4); 313 ASSERT_EQ(MV[5], 6); 314 315 ASSERT_EQ(MV.erase(3), 1u); 316 ASSERT_EQ(MV.size(), 1u); 317 ASSERT_EQ(MV.find(3), MV.end()); 318 ASSERT_EQ(MV[5], 6); 319 320 ASSERT_EQ(MV.erase(79), 0u); 321 ASSERT_EQ(MV.size(), 1u); 322 } 323 324 TEST(SmallMapVectorLargeTest, remove_if) { 325 SmallMapVector<int, int, 1> MV; 326 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); 334 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); 343 } 344 345 TEST(SmallMapVectorLargeTest, iteration_test) { 346 SmallMapVector<int, int, 1> MV; 347 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); 355 356 int count = 1; 357 for (auto P : make_range(MV.begin(), MV.end())) { 358 ASSERT_EQ(P.first, count); 359 count++; 360 } 361 362 count = 6; 363 for (auto P : make_range(MV.rbegin(), MV.rend())) { 364 ASSERT_EQ(P.first, count); 365 count--; 366 } 367 } 368