Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <vector>
- #include <functional>
- #include <utility>
- #include <string>
- #include <map>
- #include <set>
- #include <unordered_map>
- bool operator>(const GameObject& a, const GameObject& b) { return a.id > b.id; }
- template <class Tp, template <class> class Compare>
- class DereferenceCompare {
- Compare<Tp> 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) {
- auto iter = map_find_id.find(id);
- GameObject tmp;
- tmp.id = id;
- tmp.name = name;
- tmp.x = x;
- tmp.y = y;
- Remove(iter->second.id);
- map_find_id.insert({id, tmp});
- iter = map_find_id.find(id);
- map_find_name[{iter->second.name}].insert(&iter->second);
- map_find_pos[{iter->second.x, iter->second.y}].insert(&iter->second);
- }
- void Remove(ObjectId id) {
- auto iter = map_find_id.find(id);
- if (iter != map_find_id.end()) {
- map_find_name[iter -> second.name].erase(&iter->second);
- map_find_pos[std::pair<size_t, size_t>(iter->second.x,
- iter->second.y)]
- .erase(&iter->second);
- map_find_id.erase(id);
- }
- }
- vector<GameObject> DataByName(string name) const {
- auto iter = map_find_name.find(name);
- vector<GameObject> h;
- if (iter != map_find_name.end()) {
- for (auto i = iter->second.begin(); i != iter->second.end(); ++i) {
- h.push_back(**i);
- }
- }
- return h;
- }
- vector<GameObject> DataByPosition(size_t x, size_t y) const {
- auto iter = map_find_pos.find(std::pair<size_t, size_t>(x, y));
- vector<GameObject> h;
- if (iter != map_find_pos.end()) {
- for (auto i = iter->second.begin(); i != iter->second.end(); ++i) {
- h.push_back(**i);
- }
- }
- return h;
- }
- vector<GameObject> Data() const {
- vector<GameObject> h;
- for (auto i = map_find_id.begin(); i != map_find_id.end(); ++i) {
- h.push_back(i->second);
- }
- return h;
- }
- private:
- std::map<ObjectId, GameObject, std::greater<ObjectId>> map_find_id;
- std::map<std::pair<size_t, size_t>,
- std::set<GameObject*, DereferenceCompare<GameObject, std::greater>>>
- map_find_pos;
- std::unordered_map<
- string,
- std::set<GameObject*, DereferenceCompare<GameObject, std::greater>>>
- map_find_name;
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement