#pragma once #include #include #include #include #include #include #include using std::vector; 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) { GameObject g = { id, name, x, y }; if (ids.find(id) != ids.end()) Remove(id); ids.insert({ id, g }); auto item = &ids.at(id); positions[{ x, y }].insert(item); names[name].insert(item); } void Remove(ObjectId id) { auto item = ids.find(id); if (item != ids.end()) { GameObject *g = &((*item).second); (*positions.find({ g->x, g->y })).second.erase(g); (*names.find(g->name)).second.erase(g); ids.erase(item); } } vector DataByName(string name) const { vector v; auto it = names.find(name); if (it == names.end()) return v; for (auto b = (*it).second.begin(); b != (*it).second.end(); b++) v.push_back(**b); return v; } vector DataByPosition(size_t x, size_t y) const { vector v; auto it = positions.find({ x, y }); if (it == positions.end()) return v; for (auto b = (*it).second.begin(); b != (*it).second.end(); b++) v.push_back(**b); return v; } vector Data() const { vector v; for (auto it = ids.begin(); it != ids.end(); it++) v.push_back((*it).second); return v; } private: std::map> ids; std::map< std::pair, std::set< GameObject*, DereferenceCompare > > positions; std::unordered_map< string, std::set< GameObject*, DereferenceCompare > > names; };