mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-05 12:31:33 +00:00
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:
parent
878ad7afa5
commit
cdac46d18e
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user