diff options
Diffstat (limited to 'llvm/lib/Support')
| -rw-r--r-- | llvm/lib/Support/StringMap.cpp | 26 | ||||
| -rw-r--r-- | llvm/lib/Support/StringPool.cpp | 7 | 
2 files changed, 14 insertions, 19 deletions
diff --git a/llvm/lib/Support/StringMap.cpp b/llvm/lib/Support/StringMap.cpp index 0c61732a61b..040308bbfd4 100644 --- a/llvm/lib/Support/StringMap.cpp +++ b/llvm/lib/Support/StringMap.cpp @@ -65,14 +65,13 @@ static unsigned HashString(const char *Start, const char *End) {  /// specified bucket will be non-null.  Otherwise, it will be null.  In either  /// case, the FullHashValue field of the bucket will be set to the hash value  /// of the string. -unsigned StringMapImpl::LookupBucketFor(const char *NameStart, -                                        const char *NameEnd) { +unsigned StringMapImpl::LookupBucketFor(const StringRef &Name) {    unsigned HTSize = NumBuckets;    if (HTSize == 0) {  // Hash table unallocated so far?      init(16);      HTSize = NumBuckets;    } -  unsigned FullHashValue = HashString(NameStart, NameEnd); +  unsigned FullHashValue = HashString(Name.begin(), Name.end());    unsigned BucketNo = FullHashValue & (HTSize-1);    unsigned ProbeAmt = 1; @@ -102,12 +101,10 @@ unsigned StringMapImpl::LookupBucketFor(const char *NameStart,        // being non-null and for the full hash value) not at the items.  This        // is important for cache locality. -      // Do the comparison like this because NameStart isn't necessarily +      // Do the comparison like this because Name isn't necessarily        // null-terminated!        char *ItemStr = (char*)BucketItem+ItemSize; -      unsigned ItemStrLen = BucketItem->getKeyLength(); -      if (unsigned(NameEnd-NameStart) == ItemStrLen && -          memcmp(ItemStr, NameStart, ItemStrLen) == 0) { +      if (Name == StringRef(ItemStr, BucketItem->getKeyLength())) {          // We found a match!          return BucketNo;        } @@ -126,10 +123,10 @@ unsigned StringMapImpl::LookupBucketFor(const char *NameStart,  /// FindKey - Look up the bucket that contains the specified key. If it exists  /// in the map, return the bucket number of the key.  Otherwise return -1.  /// This does not modify the map. -int StringMapImpl::FindKey(const char *KeyStart, const char *KeyEnd) const { +int StringMapImpl::FindKey(const StringRef &Key) const {    unsigned HTSize = NumBuckets;    if (HTSize == 0) return -1;  // Really empty table? -  unsigned FullHashValue = HashString(KeyStart, KeyEnd); +  unsigned FullHashValue = HashString(Key.begin(), Key.end());    unsigned BucketNo = FullHashValue & (HTSize-1);    unsigned ProbeAmt = 1; @@ -151,9 +148,7 @@ int StringMapImpl::FindKey(const char *KeyStart, const char *KeyEnd) const {        // Do the comparison like this because NameStart isn't necessarily        // null-terminated!        char *ItemStr = (char*)BucketItem+ItemSize; -      unsigned ItemStrLen = BucketItem->getKeyLength(); -      if (unsigned(KeyEnd-KeyStart) == ItemStrLen && -          memcmp(ItemStr, KeyStart, ItemStrLen) == 0) { +      if (Key == StringRef(ItemStr, BucketItem->getKeyLength())) {          // We found a match!          return BucketNo;        } @@ -172,16 +167,15 @@ int StringMapImpl::FindKey(const char *KeyStart, const char *KeyEnd) const {  /// delete it.  This aborts if the value isn't in the table.  void StringMapImpl::RemoveKey(StringMapEntryBase *V) {    const char *VStr = (char*)V + ItemSize; -  StringMapEntryBase *V2 = RemoveKey(VStr, VStr+V->getKeyLength()); +  StringMapEntryBase *V2 = RemoveKey(StringRef(VStr, V->getKeyLength()));    V2 = V2;    assert(V == V2 && "Didn't find key?");  }  /// RemoveKey - Remove the StringMapEntry for the specified key from the  /// table, returning it.  If the key is not in the table, this returns null. -StringMapEntryBase *StringMapImpl::RemoveKey(const char *KeyStart, -                                             const char *KeyEnd) { -  int Bucket = FindKey(KeyStart, KeyEnd); +StringMapEntryBase *StringMapImpl::RemoveKey(const StringRef &Key) { +  int Bucket = FindKey(Key);    if (Bucket == -1) return 0;    StringMapEntryBase *Result = TheTable[Bucket].Item; diff --git a/llvm/lib/Support/StringPool.cpp b/llvm/lib/Support/StringPool.cpp index b9c1fd0465b..735472e26a5 100644 --- a/llvm/lib/Support/StringPool.cpp +++ b/llvm/lib/Support/StringPool.cpp @@ -13,6 +13,7 @@  #include "llvm/Support/StringPool.h"  #include "llvm/Support/Streams.h" +#include "llvm/ADT/StringRef.h"  using namespace llvm; @@ -22,12 +23,12 @@ StringPool::~StringPool() {    assert(InternTable.empty() && "PooledStringPtr leaked!");  } -PooledStringPtr StringPool::intern(const char *Begin, const char *End) { -  table_t::iterator I = InternTable.find(Begin, End); +PooledStringPtr StringPool::intern(const StringRef &Key) { +  table_t::iterator I = InternTable.find(Key);    if (I != InternTable.end())      return PooledStringPtr(&*I); -  entry_t *S = entry_t::Create(Begin, End); +  entry_t *S = entry_t::Create(Key.begin(), Key.end());    S->getValue().Pool = this;    InternTable.insert(S);  | 

