Adding Scope lookup utility class.

This commit is contained in:
Stefano Sanfilippo 2015-03-05 22:30:08 +01:00
parent 12dedc1cef
commit a509a61bfb

47
Scope.hpp Normal file
View 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