Advertisement
Guest User

Untitled

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