[PATCH] Add standard insert overloads to StringMap
Agustín Bergé
kaballo86 at hotmail.com
Sun Jun 15 18:17:54 PDT 2014
Hi timurrrr, dblaikie, bkramer,
This patch adds to `StringMap` overloads of `insert` taking a `std::pair<K, V>`, following the standard associative container interface. This was suggested in http://reviews.llvm.org/D4130
http://reviews.llvm.org/D4153
Files:
include/llvm/ADT/StringMap.h
unittests/ADT/StringMapTest.cpp
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<iterator, bool> insert(const std::pair<StringRef, ValueTy> &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<iterator, bool> insert(std::pair<StringRef, ValueTy> &&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<K, V>) 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) {}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D4153.10436.patch
Type: text/x-patch
Size: 2700 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140616/d2087e77/attachment.bin>
More information about the llvm-commits
mailing list