11ed3663b49c7a00fa2bec8a70ee59fe05b9173ecBill Wendling//===- llvm/unittest/ADT/StringMapMap.cpp - StringMap unit tests ----------===// 28bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman// 38bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman// The LLVM Compiler Infrastructure 48bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman// 58bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman// This file is distributed under the University of Illinois Open Source 68bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman// License. See LICENSE.TXT for details. 78bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman// 88bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman//===----------------------------------------------------------------------===// 98bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 108bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman#include "gtest/gtest.h" 118bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman#include "llvm/ADT/StringMap.h" 121f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/DataTypes.h" 13cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include <tuple> 148bb5e9901346f448461289f2d0079ed6d534b571Misha Brukmanusing namespace llvm; 158bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 168bb5e9901346f448461289f2d0079ed6d534b571Misha Brukmannamespace { 178bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 188bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman// Test fixture 198bb5e9901346f448461289f2d0079ed6d534b571Misha Brukmanclass StringMapTest : public testing::Test { 208bb5e9901346f448461289f2d0079ed6d534b571Misha Brukmanprotected: 218bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman StringMap<uint32_t> testMap; 228bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 238bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman static const char testKey[]; 248bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman static const uint32_t testValue; 258bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman static const char* testKeyFirst; 266316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar static size_t testKeyLength; 278bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman static const std::string testKeyStr; 288bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 298bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman void assertEmptyMap() { 308bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman // Size tests 318bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_EQ(0u, testMap.size()); 328bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_TRUE(testMap.empty()); 338bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 348bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman // Iterator tests 358bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_TRUE(testMap.begin() == testMap.end()); 368bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 378bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman // Lookup tests 388bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_EQ(0u, testMap.count(testKey)); 396316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar EXPECT_EQ(0u, testMap.count(StringRef(testKeyFirst, testKeyLength))); 408bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_EQ(0u, testMap.count(testKeyStr)); 418bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_TRUE(testMap.find(testKey) == testMap.end()); 426316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar EXPECT_TRUE(testMap.find(StringRef(testKeyFirst, testKeyLength)) == 436316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar testMap.end()); 448bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_TRUE(testMap.find(testKeyStr) == testMap.end()); 458bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman } 468bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 478bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman void assertSingleItemMap() { 488bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman // Size tests 498bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_EQ(1u, testMap.size()); 508bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_FALSE(testMap.begin() == testMap.end()); 518bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_FALSE(testMap.empty()); 528bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 538bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman // Iterator tests 548bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman StringMap<uint32_t>::iterator it = testMap.begin(); 55d7c027322ebccd9666c3f46d9a5236ba76fda434Chris Lattner EXPECT_STREQ(testKey, it->first().data()); 568bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_EQ(testValue, it->second); 578bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman ++it; 588bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_TRUE(it == testMap.end()); 598bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 608bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman // Lookup tests 618bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_EQ(1u, testMap.count(testKey)); 626316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar EXPECT_EQ(1u, testMap.count(StringRef(testKeyFirst, testKeyLength))); 638bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_EQ(1u, testMap.count(testKeyStr)); 648bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_TRUE(testMap.find(testKey) == testMap.begin()); 656316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar EXPECT_TRUE(testMap.find(StringRef(testKeyFirst, testKeyLength)) == 666316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar testMap.begin()); 678bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_TRUE(testMap.find(testKeyStr) == testMap.begin()); 688bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman } 698bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman}; 708bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 718bb5e9901346f448461289f2d0079ed6d534b571Misha Brukmanconst char StringMapTest::testKey[] = "key"; 728bb5e9901346f448461289f2d0079ed6d534b571Misha Brukmanconst uint32_t StringMapTest::testValue = 1u; 738bb5e9901346f448461289f2d0079ed6d534b571Misha Brukmanconst char* StringMapTest::testKeyFirst = testKey; 746316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbarsize_t StringMapTest::testKeyLength = sizeof(testKey) - 1; 758bb5e9901346f448461289f2d0079ed6d534b571Misha Brukmanconst std::string StringMapTest::testKeyStr(testKey); 768bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 776b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling// Empty map tests. 788bb5e9901346f448461289f2d0079ed6d534b571Misha BrukmanTEST_F(StringMapTest, EmptyMapTest) { 798bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman assertEmptyMap(); 808bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman} 818bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 826b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling// Constant map tests. 838bb5e9901346f448461289f2d0079ed6d534b571Misha BrukmanTEST_F(StringMapTest, ConstEmptyMapTest) { 848bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman const StringMap<uint32_t>& constTestMap = testMap; 858bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 868bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman // Size tests 878bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_EQ(0u, constTestMap.size()); 888bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_TRUE(constTestMap.empty()); 898bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 908bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman // Iterator tests 918bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_TRUE(constTestMap.begin() == constTestMap.end()); 928bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 938bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman // Lookup tests 948bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_EQ(0u, constTestMap.count(testKey)); 956316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar EXPECT_EQ(0u, constTestMap.count(StringRef(testKeyFirst, testKeyLength))); 968bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_EQ(0u, constTestMap.count(testKeyStr)); 978bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_TRUE(constTestMap.find(testKey) == constTestMap.end()); 986316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar EXPECT_TRUE(constTestMap.find(StringRef(testKeyFirst, testKeyLength)) == 996b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling constTestMap.end()); 1008bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman EXPECT_TRUE(constTestMap.find(testKeyStr) == constTestMap.end()); 1018bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman} 1028bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 1036b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling// A map with a single entry. 1048bb5e9901346f448461289f2d0079ed6d534b571Misha BrukmanTEST_F(StringMapTest, SingleEntryMapTest) { 1058bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman testMap[testKey] = testValue; 1068bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman assertSingleItemMap(); 1078bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman} 1088bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 1096b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling// Test clear() method. 1108bb5e9901346f448461289f2d0079ed6d534b571Misha BrukmanTEST_F(StringMapTest, ClearTest) { 1118bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman testMap[testKey] = testValue; 1128bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman testMap.clear(); 1138bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman assertEmptyMap(); 1148bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman} 1158bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 1166b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling// Test erase(iterator) method. 1178bb5e9901346f448461289f2d0079ed6d534b571Misha BrukmanTEST_F(StringMapTest, EraseIteratorTest) { 1188bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman testMap[testKey] = testValue; 1198bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman testMap.erase(testMap.begin()); 1208bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman assertEmptyMap(); 1218bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman} 1228bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 1236b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling// Test erase(value) method. 1248bb5e9901346f448461289f2d0079ed6d534b571Misha BrukmanTEST_F(StringMapTest, EraseValueTest) { 1258bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman testMap[testKey] = testValue; 1268bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman testMap.erase(testKey); 1278bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman assertEmptyMap(); 1288bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman} 1298bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 1306b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling// Test inserting two values and erasing one. 1318bb5e9901346f448461289f2d0079ed6d534b571Misha BrukmanTEST_F(StringMapTest, InsertAndEraseTest) { 1328bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman testMap[testKey] = testValue; 1338bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman testMap["otherKey"] = 2; 1348bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman testMap.erase("otherKey"); 1358bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman assertSingleItemMap(); 1368bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman} 1378bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 1382a79116940012acaad9cc70efef79d7359f27513Chandler CarruthTEST_F(StringMapTest, SmallFullMapTest) { 1392a79116940012acaad9cc70efef79d7359f27513Chandler Carruth // StringMap has a tricky corner case when the map is small (<8 buckets) and 1402a79116940012acaad9cc70efef79d7359f27513Chandler Carruth // it fills up through a balanced pattern of inserts and erases. This can 1412a79116940012acaad9cc70efef79d7359f27513Chandler Carruth // lead to inf-loops in some cases (PR13148) so we test it explicitly here. 1422a79116940012acaad9cc70efef79d7359f27513Chandler Carruth llvm::StringMap<int> Map(2); 1432a79116940012acaad9cc70efef79d7359f27513Chandler Carruth 1442a79116940012acaad9cc70efef79d7359f27513Chandler Carruth Map["eins"] = 1; 1452a79116940012acaad9cc70efef79d7359f27513Chandler Carruth Map["zwei"] = 2; 1462a79116940012acaad9cc70efef79d7359f27513Chandler Carruth Map["drei"] = 3; 1472a79116940012acaad9cc70efef79d7359f27513Chandler Carruth Map.erase("drei"); 1482a79116940012acaad9cc70efef79d7359f27513Chandler Carruth Map.erase("eins"); 1492a79116940012acaad9cc70efef79d7359f27513Chandler Carruth Map["veir"] = 4; 1502a79116940012acaad9cc70efef79d7359f27513Chandler Carruth Map["funf"] = 5; 1512a79116940012acaad9cc70efef79d7359f27513Chandler Carruth 1522a79116940012acaad9cc70efef79d7359f27513Chandler Carruth EXPECT_EQ(3u, Map.size()); 1532a79116940012acaad9cc70efef79d7359f27513Chandler Carruth EXPECT_EQ(0, Map.lookup("eins")); 1542a79116940012acaad9cc70efef79d7359f27513Chandler Carruth EXPECT_EQ(2, Map.lookup("zwei")); 1552a79116940012acaad9cc70efef79d7359f27513Chandler Carruth EXPECT_EQ(0, Map.lookup("drei")); 1562a79116940012acaad9cc70efef79d7359f27513Chandler Carruth EXPECT_EQ(4, Map.lookup("veir")); 1572a79116940012acaad9cc70efef79d7359f27513Chandler Carruth EXPECT_EQ(5, Map.lookup("funf")); 1582a79116940012acaad9cc70efef79d7359f27513Chandler Carruth} 1592a79116940012acaad9cc70efef79d7359f27513Chandler Carruth 1606b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling// A more complex iteration test. 1618bb5e9901346f448461289f2d0079ed6d534b571Misha BrukmanTEST_F(StringMapTest, IterationTest) { 1628bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman bool visited[100]; 1638bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 1648bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman // Insert 100 numbers into the map 1658bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman for (int i = 0; i < 100; ++i) { 1668bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman std::stringstream ss; 1678bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman ss << "key_" << i; 1688bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman testMap[ss.str()] = i; 1698bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman visited[i] = false; 1708bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman } 1718bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 1728bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman // Iterate over all numbers and mark each one found. 1738bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman for (StringMap<uint32_t>::iterator it = testMap.begin(); 1748bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman it != testMap.end(); ++it) { 1758bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman std::stringstream ss; 1768bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman ss << "key_" << it->second; 177d7c027322ebccd9666c3f46d9a5236ba76fda434Chris Lattner ASSERT_STREQ(ss.str().c_str(), it->first().data()); 1788bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman visited[it->second] = true; 1798bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman } 1808bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 1818bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman // Ensure every number was visited. 1828bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman for (int i = 0; i < 100; ++i) { 1838bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman ASSERT_TRUE(visited[i]) << "Entry #" << i << " was never visited"; 1848bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman } 1858bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman} 1868bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman 1876b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling// Test StringMapEntry::Create() method. 1886b223d71e5e5e123137f0f056541de4212f5c878Bill WendlingTEST_F(StringMapTest, StringMapEntryTest) { 1896b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling StringMap<uint32_t>::value_type* entry = 1906b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling StringMap<uint32_t>::value_type::Create( 191cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines StringRef(testKeyFirst, testKeyLength), 1u); 192d7c027322ebccd9666c3f46d9a5236ba76fda434Chris Lattner EXPECT_STREQ(testKey, entry->first().data()); 1936b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling EXPECT_EQ(1u, entry->second); 194d8735356a36fb04dfcfd9520f9785c0c3739b4a1Jeffrey Yasskin free(entry); 1956b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling} 1966b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling 1976b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling// Test insert() method. 1986b223d71e5e5e123137f0f056541de4212f5c878Bill WendlingTEST_F(StringMapTest, InsertTest) { 1996b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling SCOPED_TRACE("InsertTest"); 2006b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling testMap.insert( 2016b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling StringMap<uint32_t>::value_type::Create( 202cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines StringRef(testKeyFirst, testKeyLength), 2036316fbcb04af00fe76b6526fab09f51484014b3eDaniel Dunbar testMap.getAllocator(), 1u)); 2046b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling assertSingleItemMap(); 2058bb5e9901346f448461289f2d0079ed6d534b571Misha Brukman} 2066b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling 207cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// Test insert(pair<K, V>) method 208cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesTEST_F(StringMapTest, InsertPairTest) { 209cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool Inserted; 210cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines StringMap<uint32_t>::iterator NewIt; 211cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines std::tie(NewIt, Inserted) = 212cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines testMap.insert(std::make_pair(testKeyFirst, testValue)); 213cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ(1u, testMap.size()); 214cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ(testValue, testMap[testKeyFirst]); 215cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ(testKeyFirst, NewIt->first()); 216cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ(testValue, NewIt->second); 217cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_TRUE(Inserted); 218cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 219cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines StringMap<uint32_t>::iterator ExistingIt; 220cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines std::tie(ExistingIt, Inserted) = 221cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines testMap.insert(std::make_pair(testKeyFirst, testValue + 1)); 222cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ(1u, testMap.size()); 223cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ(testValue, testMap[testKeyFirst]); 224cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_FALSE(Inserted); 225cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ(NewIt, ExistingIt); 226cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 227cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 228cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// Test insert(pair<K, V>) method when rehashing occurs 229cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesTEST_F(StringMapTest, InsertRehashingPairTest) { 230cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Check that the correct iterator is returned when the inserted element is 231cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // moved to a different bucket during internal rehashing. This depends on 232cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // the particular key, and the implementation of StringMap and HashString. 233cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Changes to those might result in this test not actually checking that. 234cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines StringMap<uint32_t> t(1); 235cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ(1u, t.getNumBuckets()); 236cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 237cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines StringMap<uint32_t>::iterator It = 238cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines t.insert(std::make_pair("abcdef", 42)).first; 239cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ(2u, t.getNumBuckets()); 240cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ("abcdef", It->first()); 241cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_EQ(42u, It->second); 242cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 243cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 24436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Create a non-default constructable value 24536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct StringMapTestStruct { 24636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringMapTestStruct(int i) : i(i) {} 24736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringMapTestStruct() LLVM_DELETED_FUNCTION; 24836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int i; 24936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 25036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 25136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesTEST_F(StringMapTest, NonDefaultConstructable) { 25236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringMap<StringMapTestStruct> t; 25336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines t.GetOrCreateValue("Test", StringMapTestStruct(123)); 25436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringMap<StringMapTestStruct>::iterator iter = t.find("Test"); 25536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ASSERT_NE(iter, t.end()); 25636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ASSERT_EQ(iter->second.i, 123); 25736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 25836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 259dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstruct MoveOnly { 260dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines int i; 261dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MoveOnly(int i) : i(i) {} 262dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MoveOnly(MoveOnly &&RHS) : i(RHS.i) {} 263dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MoveOnly &operator=(MoveOnly &&RHS) { 264dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines i = RHS.i; 265dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return *this; 266dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 267dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 268dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesprivate: 269cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines MoveOnly(const MoveOnly &) LLVM_DELETED_FUNCTION; 270cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines MoveOnly &operator=(const MoveOnly &) LLVM_DELETED_FUNCTION; 271dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}; 272dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 273dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesTEST_F(StringMapTest, MoveOnlyKey) { 274dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines StringMap<MoveOnly> t; 275dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines t.GetOrCreateValue("Test", MoveOnly(42)); 276dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines StringRef Key = "Test"; 277cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines StringMapEntry<MoveOnly>::Create(Key, MoveOnly(42)) 278dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ->Destroy(); 279dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 280dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 281dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesTEST_F(StringMapTest, MoveConstruct) { 282dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines StringMap<int> A; 283dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines A.GetOrCreateValue("x", 42); 284dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines StringMap<int> B = std::move(A); 285dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ASSERT_EQ(A.size(), 0u); 286dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ASSERT_EQ(B.size(), 1u); 287dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ASSERT_EQ(B["x"], 42); 288dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ASSERT_EQ(B.count("y"), 0u); 289dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 290dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 291dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesTEST_F(StringMapTest, MoveAssignment) { 292dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines StringMap<int> A; 293dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines A["x"] = 42; 294dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines StringMap<int> B; 295dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines B["y"] = 117; 296dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines A = std::move(B); 297dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ASSERT_EQ(A.size(), 1u); 298dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ASSERT_EQ(B.size(), 0u); 299dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ASSERT_EQ(A["y"], 117); 300dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ASSERT_EQ(B.count("x"), 0u); 301dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 302dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 303dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstruct Countable { 304dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines int &InstanceCount; 305dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines int Number; 306dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Countable(int Number, int &InstanceCount) 307dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines : InstanceCount(InstanceCount), Number(Number) { 308dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ++InstanceCount; 309dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 310dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Countable(Countable &&C) : InstanceCount(C.InstanceCount), Number(C.Number) { 311dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ++InstanceCount; 312dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines C.Number = -1; 313dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 314dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Countable(const Countable &C) 315dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines : InstanceCount(C.InstanceCount), Number(C.Number) { 316dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ++InstanceCount; 317dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 318dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Countable &operator=(Countable C) { 319dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Number = C.Number; 320dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return *this; 321dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 322dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ~Countable() { --InstanceCount; } 323dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}; 324dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 325dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesTEST_F(StringMapTest, MoveDtor) { 326dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines int InstanceCount = 0; 327dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines StringMap<Countable> A; 328dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines A.GetOrCreateValue("x", Countable(42, InstanceCount)); 329dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ASSERT_EQ(InstanceCount, 1); 330dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto I = A.find("x"); 331dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ASSERT_NE(I, A.end()); 332dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ASSERT_EQ(I->second.Number, 42); 333dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 334dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines StringMap<Countable> B; 335dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines B = std::move(A); 336dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ASSERT_EQ(InstanceCount, 1); 337dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ASSERT_TRUE(A.empty()); 338dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines I = B.find("x"); 339dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ASSERT_NE(I, B.end()); 340dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ASSERT_EQ(I->second.Number, 42); 341dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 342dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines B = StringMap<Countable>(); 343dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ASSERT_EQ(InstanceCount, 0); 344dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ASSERT_TRUE(B.empty()); 345dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 346dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 3476b223d71e5e5e123137f0f056541de4212f5c878Bill Wendling} // end anonymous namespace 348