Advertisement
Guest User

Untitled

a guest
Dec 7th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.24 KB | None | 0 0
  1. #include <functional>
  2. #include <utility>
  3. #include <set>
  4. #include <map>
  5. #include <string>
  6. #include <vector>
  7. #include <unordered_map>
  8.  
  9. bool operator>(const GameObject& a, const GameObject& b) { return a.id > b.id; }
  10.  
  11. template <class Tp, template <class> class Compare>
  12. class DereferenceCompare {
  13.   Compare<Tp> comp;
  14.  
  15.  public:
  16.   bool operator()(const Tp* const a, const Tp* const b) const {
  17.     return comp(*a, *b);
  18.   }
  19. };
  20.  
  21. class GameDatabase {
  22.  private:
  23.   std::map<ObjectId, GameObject, std::greater<ObjectId>> map_id;
  24.   std::map<std::pair<size_t, size_t>,
  25.            std::set<GameObject*, DereferenceCompare<GameObject, std::greater>>>
  26.       set_pos;
  27.   std::unordered_map<
  28.       std::string,
  29.       std::set<GameObject*, DereferenceCompare<GameObject, std::greater>>>
  30.       set_name;
  31.  
  32.  public:
  33.   GameDatabase() = default;
  34.   void Insert(ObjectId id, std::string name, size_t x, size_t y) {
  35.     if (map_id.find(id) != map_id.end()) Remove(id);
  36.     GameObject obj = {id, name, x, y};
  37.     map_id.insert({id, obj});
  38.     set_pos[{x, y}].insert(&(map_id.find(id)->second));
  39.     set_name[name].insert(&(map_id.find(id)->second));
  40.   }
  41.  
  42.   void Remove(ObjectId id) {
  43.     if (map_id.find(id) != map_id.end()) {
  44.       set_pos[{map_id.find(id)->second.x, map_id.find(id)->second.y}].erase(
  45.           &(map_id.find(id)->second));
  46.       set_name[map_id.find(id)->second.name].erase(&(map_id.find(id)->second));
  47.       map_id.erase(id);
  48.     }
  49.   }
  50.  
  51.   std::vector<GameObject> DataByName(std::string name) const {
  52.     std::vector<GameObject> data;
  53.     auto iter = set_name.find(name);
  54.     for (auto i = iter->second.begin(); i != iter->second.end(); i++) {
  55.       auto gameObject = *i;
  56.       data.push_back(*gameObject);
  57.     }
  58.     return data;
  59.   }
  60.  
  61.   std::vector<GameObject> DataByPosition(size_t x, size_t y) const {
  62.     std::vector<GameObject> data;
  63.     auto iter = set_pos.find({x, y});
  64.     for (auto i = iter->second.begin(); i != iter->second.end(); i++) {
  65.       auto gameObject = *i;
  66.       data.push_back(*gameObject);
  67.     }
  68.     return data;
  69.   }
  70.   std::vector<GameObject> Data() const {
  71.     std::vector<GameObject> data;
  72.     for (auto i = map_id.begin(); i != map_id.end(); i++)
  73.       data.push_back(i->second);
  74.     return data;
  75.   }
  76. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement