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