Allow DenseMAp to take an explicit DenseMapKeyInfo

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34134 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner
2007-02-10 06:34:58 +00:00
parent 7cad3cf448
commit a76b1febd4

View File

@@ -40,12 +40,15 @@ struct DenseMapKeyInfo<T*> {
static bool isPod() { return true; } static bool isPod() { return true; }
}; };
template<typename KeyT, typename ValueT> template<typename KeyT, typename ValueT,
typename KeyInfoT = DenseMapKeyInfo<KeyT> >
class DenseMapIterator; class DenseMapIterator;
template<typename KeyT, typename ValueT> template<typename KeyT, typename ValueT,
typename KeyInfoT = DenseMapKeyInfo<KeyT> >
class DenseMapConstIterator; class DenseMapConstIterator;
template<typename KeyT, typename ValueT> template<typename KeyT, typename ValueT,
typename KeyInfoT = DenseMapKeyInfo<KeyT> >
class DenseMap { class DenseMap {
typedef std::pair<KeyT, ValueT> BucketT; typedef std::pair<KeyT, ValueT> BucketT;
unsigned NumBuckets; unsigned NumBuckets;
@@ -68,21 +71,19 @@ public:
delete[] (char*)Buckets; delete[] (char*)Buckets;
} }
typedef DenseMapIterator<KeyT, ValueT> iterator; typedef DenseMapIterator<KeyT, ValueT, KeyInfoT> iterator;
typedef DenseMapConstIterator<KeyT, ValueT> const_iterator; typedef DenseMapConstIterator<KeyT, ValueT, KeyInfoT> const_iterator;
inline iterator begin() { inline iterator begin() {
return DenseMapIterator<KeyT, ValueT>(Buckets, Buckets+NumBuckets); return iterator(Buckets, Buckets+NumBuckets);
} }
inline iterator end() { inline iterator end() {
return DenseMapIterator<KeyT, ValueT>(Buckets+NumBuckets, return iterator(Buckets+NumBuckets, Buckets+NumBuckets);
Buckets+NumBuckets);
} }
inline const_iterator begin() const { inline const_iterator begin() const {
return DenseMapConstIterator<KeyT, ValueT>(Buckets, Buckets+NumBuckets); return const_iterator(Buckets, Buckets+NumBuckets);
} }
inline const_iterator end() const { inline const_iterator end() const {
return DenseMapConstIterator<KeyT, ValueT>(Buckets+NumBuckets, return const_iterator(Buckets+NumBuckets, Buckets+NumBuckets);
Buckets+NumBuckets);
} }
bool empty() const { return NumEntries == 0; } bool empty() const { return NumEntries == 0; }
@@ -181,13 +182,13 @@ private:
} }
static unsigned getHashValue(const KeyT &Val) { static unsigned getHashValue(const KeyT &Val) {
return DenseMapKeyInfo<KeyT>::getHashValue(Val); return KeyInfoT::getHashValue(Val);
} }
static const KeyT getEmptyKey() { static const KeyT getEmptyKey() {
return DenseMapKeyInfo<KeyT>::getEmptyKey(); return KeyInfoT::getEmptyKey();
} }
static const KeyT getTombstoneKey() { static const KeyT getTombstoneKey() {
return DenseMapKeyInfo<KeyT>::getTombstoneKey(); return KeyInfoT::getTombstoneKey();
} }
/// LookupBucketFor - Lookup the appropriate bucket for Val, returning it in /// LookupBucketFor - Lookup the appropriate bucket for Val, returning it in
@@ -285,7 +286,7 @@ private:
} }
}; };
template<typename KeyT, typename ValueT> template<typename KeyT, typename ValueT, typename KeyInfoT>
class DenseMapIterator { class DenseMapIterator {
typedef std::pair<KeyT, ValueT> BucketT; typedef std::pair<KeyT, ValueT> BucketT;
protected: protected:
@@ -320,16 +321,16 @@ public:
private: private:
void AdvancePastEmptyBuckets() { void AdvancePastEmptyBuckets() {
const KeyT Empty = DenseMapKeyInfo<KeyT>::getEmptyKey(); const KeyT Empty = KeyInfoT::getEmptyKey();
const KeyT Tombstone = DenseMapKeyInfo<KeyT>::getTombstoneKey(); const KeyT Tombstone = KeyInfoT::getTombstoneKey();
while (Ptr != End && (Ptr->first == Empty || Ptr->first == Tombstone)) while (Ptr != End && (Ptr->first == Empty || Ptr->first == Tombstone))
++Ptr; ++Ptr;
} }
}; };
template<typename KeyT, typename ValueT> template<typename KeyT, typename ValueT, typename KeyInfoT>
class DenseMapConstIterator : public DenseMapIterator<KeyT, ValueT> { class DenseMapConstIterator : public DenseMapIterator<KeyT, ValueT, KeyInfoT> {
public: public:
DenseMapConstIterator(const std::pair<KeyT, ValueT> *Pos, DenseMapConstIterator(const std::pair<KeyT, ValueT> *Pos,
const std::pair<KeyT, ValueT> *E) const std::pair<KeyT, ValueT> *E)