#include <map>
#include <vector>
#include <utility>
#include <string>
#include <functional>

class GameDatabase {
 public:
    GameDatabase() = default;

    void Insert(ObjectId id, std::string name, size_t x, size_t y) {
        objects[id] = {name, {x, y}};
    }

    void Remove(ObjectId id) {
        objects.erase(id);
    }

    vector<GameObject> DataByName(string name) const {
        vector<GameObject> answer;
        for (auto item : objects) {
            if (item.second.first == name) {
                answer.push_back({item.first, 
                                  item.second.first, 
                                  item.second.second.first,
                                  item.second.second.second});
            }
        }
        return answer;
    }

    vector<GameObject> DataByPosition(size_t x, size_t y) const {
        vector<GameObject> answer;
        for (auto item : objects) {
            if (item.second.second.first == x &&
                item.second.second.second == y) {
                answer.push_back({item.first, 
                                  item.second.first, 
                                  item.second.second.first, 
                                  item.second.second.second});
            }
        }
        return answer;
    }

    vector<GameObject> Data() const {
        vector<GameObject> answer;
        for (auto item : objects) {
            answer.push_back({item.first, 
                              item.second.first, 
                              item.second.second.first, 
                              item.second.second.second});
        }
        return answer;
    }

 private:
    map<ObjectId, pair<string, pair<size_t, size_t>>,
            std::greater<ObjectId>> objects;
};