Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <functional>
- #include <utility>
- #include <set>
- #include <map>
- #include <string>
- #include <vector>
- #include <unordered_map>
- 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);
- }
- };
- class GameDatabase {
- private:
- std::map<ObjectId, GameObject, std::greater<ObjectId>> map_id;
- std::map<std::pair<size_t, size_t>,
- std::set<GameObject*, DereferenceCompare<GameObject, std::greater>>>
- set_pos;
- std::unordered_map<
- std::string,
- std::set<GameObject*, DereferenceCompare<GameObject, std::greater>>>
- set_name;
- public:
- GameDatabase() = default;
- void Insert(ObjectId id, std::string name, size_t x, size_t y) {
- if (map_id.find(id) != map_id.end()) Remove(id);
- GameObject obj = {id, name, x, y};
- map_id.insert({id, obj});
- set_pos[{x, y}].insert(&(map_id.find(id)->second));
- set_name[name].insert(&(map_id.find(id)->second));
- }
- void Remove(ObjectId id) {
- if (map_id.find(id) != map_id.end()) {
- set_pos[{map_id.find(id)->second.x, map_id.find(id)->second.y}].erase(
- &(map_id.find(id)->second));
- set_name[map_id.find(id)->second.name].erase(&(map_id.find(id)->second));
- map_id.erase(id);
- }
- }
- std::vector<GameObject> DataByName(std::string name) const {
- std::vector<GameObject> data;
- auto iter = set_name.find(name);
- for (auto i = iter->second.begin(); i != iter->second.end(); i++) {
- auto gameObject = *i;
- data.push_back(*gameObject);
- }
- return data;
- }
- std::vector<GameObject> DataByPosition(size_t x, size_t y) const {
- std::vector<GameObject> data;
- auto iter = set_pos.find({x, y});
- for (auto i = iter->second.begin(); i != iter->second.end(); i++) {
- auto gameObject = *i;
- data.push_back(*gameObject);
- }
- return data;
- }
- std::vector<GameObject> Data() const {
- std::vector<GameObject> data;
- for (auto i = map_id.begin(); i != map_id.end(); i++)
- data.push_back(i->second);
- return data;
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement