#pragma once #include #include #include class GameDatabase { public: GameDatabase() = default; /// вставляет в базу объект с именем [name] и позицией [x, y] /// если объект с таким id в базе уже есть, заменяет его новым void Insert(ObjectId id, string name, size_t x, size_t y) { int ind = IsInDb(id); if (ind == -1) dbase.push_back({id, name, x, y }); else dbase[ind] = {id, name, x, y}; } /// удаляет элемент по id /// если такого элемента нет, ничего не делает void Remove(ObjectId id) { int ind = IsInDb(id); if (ind != -1) dbase.erase(dbase.begin() + ind); } /// возвращает вектор объектов c именем [name] /// сортировка по убыванию id vector DataByName(string name) const { vector v; for (auto obj : dbase) if (obj.name == name) v.push_back(obj); std::sort(v.begin(), v.end(), compareById); return v; } /// возвращает вектор объектов, находящихся в позиции [x, y] /// сортировка по убыванию id vector DataByPosition(size_t x, size_t y) const { vector v; for (auto obj : dbase) if (obj.x == x && obj.y == y) v.push_back(obj); std::sort(v.begin(), v.end(), compareById); return v; } /// возвращает вектор всех объектов из базы /// сортировка по убыванию id vector Data() const { vector v = dbase; std::sort(v.begin(), v.end(), compareById); return v; } private: static int IsInDb(ObjectId id) { for (unsigned int i = 0; i < dbase.size(); i++) if (dbase[i].id == id) return i; return -1; } bool compareById(const GameObject& a, const GameObject& b) { return a.id > b.id; } std::vector dbase; };