2
0

MapTilesStorage.h 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /*
  2. * MapTilesStorage.h, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #pragma once
  11. #include "../int3.h"
  12. VCMI_LIB_NAMESPACE_BEGIN
  13. template<typename DataType>
  14. class MapTilesStorage
  15. {
  16. using TInternalContainer = std::vector<DataType>;
  17. TInternalContainer storage;
  18. int3 dimensions = {0,0,0};
  19. size_t getTileIndex(const int3 & tile) const
  20. {
  21. int32_t result = 0;
  22. result += tile.z * dimensions.x * dimensions.y;
  23. result += tile.x * dimensions.y;
  24. result += tile.y;
  25. assert(tile.x >= 0 && tile.x < dimensions.x);
  26. assert(tile.y >= 0 && tile.y < dimensions.y);
  27. assert(tile.z >= 0 && tile.z < dimensions.z);
  28. return result;
  29. }
  30. public:
  31. using const_reference = typename TInternalContainer::const_reference;
  32. using value_type = typename TInternalContainer::value_type;
  33. using const_iterator = typename TInternalContainer::const_iterator;
  34. using iterator = typename TInternalContainer::iterator;
  35. MapTilesStorage() = default;
  36. MapTilesStorage(int3 dimensions) :
  37. storage(dimensions.x * dimensions.y * dimensions.z),
  38. dimensions(dimensions)
  39. {}
  40. const_iterator begin() const { return storage.begin(); }
  41. const_iterator end() const { return storage.end(); }
  42. iterator begin() { return storage.begin(); }
  43. iterator end() { return storage.end(); }
  44. const DataType & operator[] (const int3 & tile) const { return storage[getTileIndex(tile)];}
  45. DataType & operator[](const int3 & tile) { return storage[getTileIndex(tile)];}
  46. template <typename Handler>
  47. void serialize(Handler &h)
  48. {
  49. uint32_t lengthUnused = 0;
  50. h & lengthUnused;
  51. h & dimensions.z;
  52. h & dimensions.x;
  53. h & dimensions.y;
  54. if (!h.saving)
  55. storage.resize(dimensions.x * dimensions.y * dimensions.z);
  56. for (auto & element : storage)
  57. h & element;
  58. }
  59. };
  60. VCMI_LIB_NAMESPACE_END