Adding Scope lookup utility class.
This commit is contained in:
parent
12dedc1cef
commit
a509a61bfb
47
Scope.hpp
Normal file
47
Scope.hpp
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
#ifndef SCOPE_HPP
|
||||||
|
#define SCOPE_HPP
|
||||||
|
|
||||||
|
#include <boost/optional.hpp>
|
||||||
|
#include <boost/range/adaptor/reversed.hpp>
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
|
|
||||||
|
namespace monicelli {
|
||||||
|
|
||||||
|
template<class Key, class Value>
|
||||||
|
class Scope {
|
||||||
|
public:
|
||||||
|
boost::optional<Value> lookup(Key name) {
|
||||||
|
for (auto const& table: boost::adaptors::reverse(tables)) {
|
||||||
|
auto result = table.find(name);
|
||||||
|
if (result != table.end()) {
|
||||||
|
return result->second;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return boost::none;
|
||||||
|
}
|
||||||
|
|
||||||
|
void push(Key const& key, Value const& value) {
|
||||||
|
tables.back().insert({key, value});
|
||||||
|
}
|
||||||
|
|
||||||
|
void enter() {
|
||||||
|
tables.emplace_back();
|
||||||
|
}
|
||||||
|
|
||||||
|
void leave() {
|
||||||
|
if (!tables.empty()) {
|
||||||
|
tables.pop_back();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<std::unordered_map<Key, Value>> tables;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Reference in New Issue
Block a user