Index: include/llvm/ADT/DenseMap.h =================================================================== --- include/llvm/ADT/DenseMap.h +++ include/llvm/ADT/DenseMap.h @@ -203,6 +203,24 @@ return try_emplace(std::move(KV.first), std::move(KV.second)); } + template + std::pair insert_or_assign(KeyT &&Key, V &&Val) { + BucketT *B; + bool Added = !LookupBucketFor(Key, B); + if (Added) { + B = InsertIntoBucket(B, std::move(Key), std::forward(Val)); + } else { + B->getSecond().~ValueT(); + ::new (&B->getSecond()) ValueT(std::forward(Val)); + } + return std::make_pair(makeIterator(B, getBucketsEnd(), *this, true), Added); + } + + template + std::pair insert_or_assign(const KeyT &Key, V &&Val) { + return insert_or_assign(Key, std::forward(Val)); + } + // Inserts key,value pair into the map if the key isn't already in the map. // The value is constructed in-place if the key is not in the map, otherwise // it is not moved. Index: unittests/ADT/DenseMapTest.cpp =================================================================== --- unittests/ADT/DenseMapTest.cpp +++ unittests/ADT/DenseMapTest.cpp @@ -191,6 +191,16 @@ EXPECT_EQ(this->getValue(), this->Map[this->getKey()]); } +TEST(DenseMapCustomTest, InsertOrAssignTest) { + DenseMap> Map; + auto Try1 = Map.insert_or_assign(0, new int(1)); + EXPECT_TRUE(Try1.second); + auto Try2 = Map.insert_or_assign(0, new int(2)); + EXPECT_FALSE(Try2.second); + EXPECT_EQ(2, *Try2.first->getSecond()); + EXPECT_EQ(Try1.first, Try2.first); +} + // Test copy constructor method TYPED_TEST(DenseMapTest, CopyConstructorTest) { this->Map[this->getKey()] = this->getValue();