]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - opencl/llvm.git/commitdiff
add new ShouldRehash method to factor out common code. Fix the dtor to not
authorChris Lattner <sabre@nondot.org>
Sun, 11 Feb 2007 21:46:36 +0000 (21:46 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 11 Feb 2007 21:46:36 +0000 (21:46 +0000)
delete tombstones.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34189 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/StringMap.h

index 0c6b76d5522ddc5492304dabfd95ba37f277b63f..c035f8cc6d7e4844b84f2cdb691de02ca9f9c5c9 100644 (file)
@@ -58,6 +58,16 @@ protected:
   StringMapImpl(unsigned InitSize, unsigned ItemSize);
   void RehashTable();
   
+  /// ShouldRehash - Return true if the table should be rehashed after a new
+  /// element was recently inserted.
+  bool ShouldRehash() const {
+    // If the hash table is now more than 3/4 full, or if fewer than 1/8 of
+    // the buckets are empty (meaning that many are filled with tombstones),
+    // grow the table.
+    return NumItems*4 > NumBuckets*3 ||
+           NumBuckets-(NumItems+NumTombstones) < NumBuckets/8;
+  }
+  
   /// LookupBucketFor - Look up the bucket that the specified string should end
   /// up in.  If it already exists as a key in the map, the Item pointer for the
   /// specified bucket will be non-null.  Otherwise, it will be null.  In either
@@ -218,11 +228,7 @@ public:
     Bucket.Item = KeyValue;
     ++NumItems;
     
-    // If the hash table is now more than 3/4 full, or if fewer than 1/8 of
-    // the buckets are empty (meaning that many are filled with tombstones),
-    // grow the table.
-    if (NumItems*4 > NumBuckets*3 ||
-        NumBuckets-(NumItems+NumTombstones) < NumBuckets/8)
+    if (ShouldRehash())
       RehashTable();
     return true;
   }
@@ -247,11 +253,7 @@ public:
     // filled in by LookupBucketFor.
     Bucket.Item = NewItem;
     
-    // If the hash table is now more than 3/4 full, or if fewer than 1/8 of
-    // the buckets are empty (meaning that many are filled with tombstones),
-    // grow the table.
-    if (NumItems*4 > NumBuckets*3 ||
-        NumBuckets-(NumItems+NumTombstones) < NumBuckets/8)
+    if (ShouldRehash())
       RehashTable();
     return *NewItem;
   }
@@ -264,8 +266,8 @@ public:
   
   ~StringMap() {
     for (ItemBucket *I = TheTable, *E = TheTable+NumBuckets; I != E; ++I) {
-      if (MapEntryTy *Id = static_cast<MapEntryTy*>(I->Item))
-        Id->Destroy(Allocator);
+      if (I->Item && I->Item != getTombstoneVal())
+        static_cast<MapEntryTy*>(I->Item)->Destroy(Allocator);
     }
     delete [] TheTable;
   }