[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