Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifndef GAMEBASE_GAME_DATABASE_H
- #define GAMEBASE_GAME_DATABASE_H
- #endif // GAMEBASE_GAME_DATABASE_H
- #include <functional>
- #include <map>
- #include <utility>
- #include <string>
- #include <unordered_map>
- #include <set>
- #include <vector>
- 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);
- }
- };
- std::map<ObjectId, GameObject, std::greater<ObjectId>> listId;
- std::map<std::pair<size_t, size_t>, std::set<GameObject*,
- DereferenceCompare<GameObject, std::greater>>> listPos;
- std::unordered_map<string, std::set<GameObject*,
- DereferenceCompare<GameObject, std::greater>>> listName;
- class GameDatabase {
- public:
- GameDatabase() = default;
- void Insert(ObjectId id, string name, size_t x, size_t y) {
- GameObject go{id, name, x, y};
- std::pair<size_t, size_t> cords = {x, y};
- int cnt = listId.count(id);
- if (cnt != 0) {
- Remove(id);
- }
- listId.insert({go.id, go});
- listPos[cords].insert(&listId[id]);
- listName[name].insert(&listId[id]);
- }
- void Remove(ObjectId id) {
- std::string name = listId[id].name;
- std::pair<size_t, size_t> cords = {listId[id].x, listId[id].y};
- listName.erase(name);
- listPos.erase(cords);
- listId.erase(id);
- }
- vector<GameObject> DataByName(string name) const {
- vector<GameObject> v;
- auto it = listName[name].begin();
- for (auto i = it; i != listName[name].end(); i++) {
- v.push_back(*(*i));
- }
- return v;
- }
- vector<GameObject> DataByPosition(size_t x, size_t y) const {
- vector<GameObject> v;
- auto it = listPos[{x, y}].begin();
- for (auto i = it; i != listPos[{x, y}].end(); i++) {
- v.push_back(*(*i));
- }
- return v;
- }
- vector<GameObject> Data() const{
- vector<GameObject> v;
- for (auto it = listId.begin(); it != listId.end(); it++) {
- v.push_back(it->second);
- }
- return v;
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement