#ifndef GRID_CACHE_H_67BBE74D #define GRID_CACHE_H_67BBE74D #include #include #include "level.h" template class GridCache { public: explicit GridCache(const Level& level) : width_(level.getSize().w()) { } void set(T value, vec2s pos) { if (reverse_.count(value)) { size_t oldPosIndex = reverse_.at(value); lookup_[oldPosIndex].erase(value); } size_t newPosIndex = getIndex(pos); lookup_[newPosIndex].insert(value); reverse_[value] = newPosIndex; } void remove(T value) { if (reverse_.count(value)) { size_t index = reverse_.at(value); lookup_[index].erase(value); reverse_.erase(value); } } const std::unordered_set& at(vec2s pos) const { size_t index = getIndex(pos); return lookup_[index]; } private: inline size_t getIndex(const vec2s& pos) const { return pos.x() + pos.y() * width_; } size_t width_; mutable std::unordered_map> lookup_; std::unordered_map reverse_; }; #endif /* end of include guard: GRID_CACHE_H_67BBE74D */