tint: Make ScopeStack key type generic

The scope stack has potential uses other than mapping from symbols.

Change-Id: I1eaedb9a9c913a7b2cda41bb99a986c552a66110
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/89720
Reviewed-by: Ben Clayton <bclayton@google.com>
This commit is contained in:
James Price 2022-05-11 13:50:33 +00:00
parent 791b4351d1
commit 2cf32b13d7
3 changed files with 14 additions and 14 deletions

View File

@ -420,7 +420,7 @@ class DependencyScanner {
DependencyGraph& graph_;
DependencyEdges& dependency_edges_;
ScopeStack<const ast::Node*> scope_stack_;
ScopeStack<Symbol, const ast::Node*> scope_stack_;
Global* current_global_ = nullptr;
};

View File

@ -24,7 +24,7 @@ namespace tint {
/// Used to store a stack of scope information.
/// The stack starts with a global scope which can not be popped.
template <class T>
template <class K, class V>
class ScopeStack {
public:
/// Constructor
@ -47,32 +47,32 @@ class ScopeStack {
}
/// Assigns the value into the top most scope of the stack.
/// @param symbol the symbol of the value
/// @param key the key of the value
/// @param val the value
/// @returns the old value if there was an existing symbol at the top of the
/// @returns the old value if there was an existing key at the top of the
/// stack, otherwise the zero initializer for type T.
T Set(const Symbol& symbol, T val) {
std::swap(val, stack_.back()[symbol]);
V Set(const K& key, V val) {
std::swap(val, stack_.back()[key]);
return val;
}
/// Retrieves a value from the stack
/// @param symbol the symbol to look for
/// @param key the key to look for
/// @returns the value, or the zero initializer if the value was not found
T Get(const Symbol& symbol) const {
V Get(const K& key) const {
for (auto iter = stack_.rbegin(); iter != stack_.rend(); ++iter) {
auto& map = *iter;
auto val = map.find(symbol);
auto val = map.find(key);
if (val != map.end()) {
return val->second;
}
}
return T{};
return V{};
}
private:
std::vector<std::unordered_map<Symbol, T>> stack_;
std::vector<std::unordered_map<K, V>> stack_;
};
} // namespace tint

View File

@ -22,7 +22,7 @@ namespace {
class ScopeStackTest : public ProgramBuilder, public testing::Test {};
TEST_F(ScopeStackTest, Get) {
ScopeStack<uint32_t> s;
ScopeStack<Symbol, uint32_t> s;
Symbol a(1, ID());
Symbol b(3, ID());
s.Push();
@ -44,13 +44,13 @@ TEST_F(ScopeStackTest, Get) {
}
TEST_F(ScopeStackTest, Get_MissingSymbol) {
ScopeStack<uint32_t> s;
ScopeStack<Symbol, uint32_t> s;
Symbol sym(1, ID());
EXPECT_EQ(s.Get(sym), 0u);
}
TEST_F(ScopeStackTest, Set) {
ScopeStack<uint32_t> s;
ScopeStack<Symbol, uint32_t> s;
Symbol a(1, ID());
Symbol b(2, ID());