From: Chris Lattner Date: Sun, 11 Feb 2007 21:46:36 +0000 (+0000) Subject: add new ShouldRehash method to factor out common code. Fix the dtor to not X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=a96b4ee7ff408f2fe23fa9b2788c1ed9cf87caf4;p=oota-llvm.git add new ShouldRehash method to factor out common code. Fix the dtor to not delete tombstones. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34189 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/ADT/StringMap.h b/include/llvm/ADT/StringMap.h index 0c6b76d5522..c035f8cc6d7 100644 --- a/include/llvm/ADT/StringMap.h +++ b/include/llvm/ADT/StringMap.h @@ -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(I->Item)) - Id->Destroy(Allocator); + if (I->Item && I->Item != getTombstoneVal()) + static_cast(I->Item)->Destroy(Allocator); } delete [] TheTable; }