This repository has been archived on 2024-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
pacciani/Scope.hpp
2015-03-05 22:30:08 +01:00

48 lines
870 B
C++

#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