Index: include/llvm/ADT/StringMap.h =================================================================== --- include/llvm/ADT/StringMap.h +++ include/llvm/ADT/StringMap.h @@ -323,6 +323,51 @@ return true; } + /// insert - Inserts the specified key/value pair into the map if the key + /// isn't already in the map. If the key is already in the map, it returns + // false and doesn't update the value. + std::pair insert(const std::pair &KV) { + unsigned BucketNo = LookupBucketFor(KV.first); + StringMapEntryBase *&Bucket = TheTable[BucketNo]; + if (Bucket && Bucket != getTombstoneVal()) + return std::make_pair(iterator(&Bucket, false), + false); // Already exists in map. + + MapEntryTy *NewItem = MapEntryTy::Create(KV.first, Allocator, KV.second); + + if (Bucket == getTombstoneVal()) + --NumTombstones; + Bucket = NewItem; + ++NumItems; + assert(NumItems + NumTombstones <= NumBuckets); + + RehashTable(); + return std::make_pair(iterator(&Bucket, false), true); + } + + /// insert - Inserts the specified key/value pair into the map if the key + /// isn't already in the map. If the key is already in the map, it returns + // false and doesn't update the value. + std::pair insert(std::pair &&KV) { + unsigned BucketNo = LookupBucketFor(KV.first); + StringMapEntryBase *&Bucket = TheTable[BucketNo]; + if (Bucket && Bucket != getTombstoneVal()) + return std::make_pair(iterator(&Bucket, false), + false); // Already exists in map. + + MapEntryTy *NewItem = + MapEntryTy::Create(KV.first, Allocator, std::move(KV.second)); + + if (Bucket == getTombstoneVal()) + --NumTombstones; + Bucket = NewItem; + ++NumItems; + assert(NumItems + NumTombstones <= NumBuckets); + + RehashTable(); + return std::make_pair(iterator(&Bucket, false), true); + } + // clear - Empties out the StringMap void clear() { if (empty()) return; Index: unittests/ADT/StringMapTest.cpp =================================================================== --- unittests/ADT/StringMapTest.cpp +++ unittests/ADT/StringMapTest.cpp @@ -203,6 +203,13 @@ assertSingleItemMap(); } +// Test insert(pair) method +TEST_F(StringMapTest, InsertTestPair) { + testMap.insert(std::make_pair(testKeyFirst, testValue)); + EXPECT_EQ(1u, testMap.size()); + EXPECT_EQ(testValue, testMap[testKeyFirst]); +} + // Create a non-default constructable value struct StringMapTestStruct { StringMapTestStruct(int i) : i(i) {}