#include #include #include #include #include #include #include bool operator>(const GameObject &a, const GameObject &b) { return a.id > b.id; } template class Compare> class DereferenceCompare { Compare comp; public: bool operator()(const Tp *const a, const Tp *const b) const { return comp(*a, *b); } }; class GameDatabase { public: GameDatabase() = default; void Insert(ObjectId id, string name, size_t x, size_t y) { fastId.erase(id); fastId.insert({id, GameObject{id, name, x, y}}); fastPos[pair(x, y)].insert(&fastId[id]); fastName[name].insert(&fastId[id]); } void Remove(ObjectId id) { fastId.erase(id); } vector DataByName(string name) const { vector out; if (fastName.count(name)) { for (auto it : fastName.find(name)->second) { out.push_back(*it); } } return out; } vector DataByPosition(size_t x, size_t y) const { vector out; if (fastPos.count(pair(x, y))) { for (auto it : fastPos.find(pair(x, y))->second) { out.push_back(*it); } } return out; } vector Data() const { vector out; for (auto it : fastId) { out.push_back(it.second); } return out; } private: map> fastId; map, std::set>> fastPos; unordered_map>> fastName; };