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