#include <map>
#include <string>
#include <vector>

using std::string;
using std::map;
using std::vector;

class GameDatabase
{
 private:
    map<ObjectId, GameObject> list;
 public:
    GameDatabase() = default;
    void Insert(ObjectId id, string name, size_t x, size_t y) {
        Remove(id);
        GameObject obj;
        obj.id = id;
        obj.name = name;
        obj.x = x;
        obj.y = y;
        list[id] = obj;
    }
    void Remove(ObjectId id) {
        if (list.find(id) != list.end()) {
            list.erase(list.find(id));
        }
    }
    vector<GameObject> DataByName(string name) {
        vector<GameObject> result;
        for (auto it = list.rbegin(); it != list.rend(); it++) {
            if (it->second.name == name) {
                result.push_back(it->second);
            }
        }
        return result;
    }
    vector<GameObject> DataByPosition(size_t x, size_t y) {
        vector<GameObject> result;
        for (auto it = list.rbegin(); it != list.rend(); it++) {
            if (it->second.x == x && it->second.y == y) {
                result.push_back(it->second);
            }
        }
        return result;
    }
    vector<GameObject> Data() {
        vector<GameObject> result;
        for (auto it = list.rbegin(); it != list.rend(); it++) {
            result.push_back(it->second);
        }
        return result;
    }
};