add the ability to walk the scope tree and insert at not-the-current

scope.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@126591 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2011-02-27 22:51:57 +00:00
parent 878ad7afa5
commit cdac46d18e

View File

@ -96,6 +96,9 @@ public:
ScopedHashTableScope(ScopedHashTable<K, V, KInfo, AllocatorTy> &HT); ScopedHashTableScope(ScopedHashTable<K, V, KInfo, AllocatorTy> &HT);
~ScopedHashTableScope(); ~ScopedHashTableScope();
ScopedHashTableScope *getParentScope() { return PrevScope; }
const ScopedHashTableScope *getParentScope() const { return PrevScope; }
private: private:
friend class ScopedHashTable<K, V, KInfo, AllocatorTy>; friend class ScopedHashTable<K, V, KInfo, AllocatorTy>;
ScopedHashTableVal<K, V> *getLastValInScope() { ScopedHashTableVal<K, V> *getLastValInScope() {
@ -141,9 +144,14 @@ public:
template <typename K, typename V, typename KInfo, typename AllocatorTy> template <typename K, typename V, typename KInfo, typename AllocatorTy>
class ScopedHashTable { class ScopedHashTable {
public:
/// ScopeTy - This is a helpful typedef that allows clients to get easy access
/// to the name of the scope for this hash table.
typedef ScopedHashTableScope<K, V, KInfo, AllocatorTy> ScopeTy;
private:
typedef ScopedHashTableVal<K, V> ValTy; typedef ScopedHashTableVal<K, V> ValTy;
DenseMap<K, ValTy*, KInfo> TopLevelMap; DenseMap<K, ValTy*, KInfo> TopLevelMap;
ScopedHashTableScope<K, V, KInfo, AllocatorTy> *CurScope; ScopeTy *CurScope;
AllocatorTy Allocator; AllocatorTy Allocator;
@ -157,9 +165,6 @@ public:
assert(CurScope == 0 && TopLevelMap.empty() && "Scope imbalance!"); assert(CurScope == 0 && TopLevelMap.empty() && "Scope imbalance!");
} }
/// ScopeTy - This is a helpful typedef that allows clients to get easy access
/// to the name of the scope for this hash table.
typedef ScopedHashTableScope<K, V, KInfo, AllocatorTy> ScopeTy;
/// Access to the allocator. /// Access to the allocator.
typedef typename ReferenceAdder<AllocatorTy>::result AllocatorRefTy; typedef typename ReferenceAdder<AllocatorTy>::result AllocatorRefTy;
@ -180,13 +185,7 @@ public:
} }
void insert(const K &Key, const V &Val) { void insert(const K &Key, const V &Val) {
assert(CurScope && "No scope active!"); insertIntoScope(CurScope, Key, Val);
ScopedHashTableVal<K, V> *&KeyEntry = TopLevelMap[Key];
KeyEntry = ValTy::Create(CurScope->getLastValInScope(), KeyEntry, Key, Val,
Allocator);
CurScope->setLastValInScope(KeyEntry);
} }
typedef ScopedHashTableIterator<K, V, KInfo> iterator; typedef ScopedHashTableIterator<K, V, KInfo> iterator;
@ -199,6 +198,21 @@ public:
if (I == TopLevelMap.end()) return end(); if (I == TopLevelMap.end()) return end();
return iterator(I->second); return iterator(I->second);
} }
ScopeTy *getCurScope() { return CurScope; }
const ScopeTy *getCurScope() const { return CurScope; }
/// insertIntoScope - This inserts the specified key/value at the specified
/// (possibly not the current) scope. While it is ok to insert into a scope
/// that isn't the current one, it isn't ok to insert *underneath* an existing
/// value of the specified key.
void insertIntoScope(ScopeTy *S, const K &Key, const V &Val) {
assert(S && "No scope active!");
ScopedHashTableVal<K, V> *&KeyEntry = TopLevelMap[Key];
KeyEntry = ValTy::Create(S->getLastValInScope(), KeyEntry, Key, Val,
Allocator);
S->setLastValInScope(KeyEntry);
}
}; };
/// ScopedHashTableScope ctor - Install this as the current scope for the hash /// ScopedHashTableScope ctor - Install this as the current scope for the hash