Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

179 rader
4.7 KiB

  1. #pragma once
  2. #include <ecs/core/entity/storage/base.h>
  3. namespace ecs {
  4. namespace core {
  5. namespace entity {
  6. namespace storage {
  7. /* entity_handle */
  8. inline entity_handle
  9. ::entity_handle(uint32_t i, uint32_t c)
  10. : _index (i)
  11. , _counter (c)
  12. { }
  13. inline auto entity_handle
  14. ::index() const
  15. {
  16. return _index;
  17. }
  18. inline auto entity_handle
  19. ::counter() const
  20. {
  21. return _counter;
  22. }
  23. inline int entity_handle
  24. ::compare(const entity_handle& other) const
  25. {
  26. if (_counter < other._counter) {
  27. return -1;
  28. } else if (_counter > other._counter) {
  29. return 1;
  30. } else if (_index < other._index) {
  31. return -1;
  32. } else if (_index > other._index) {
  33. return 1;
  34. } else {
  35. return 0;
  36. }
  37. }
  38. /* entity_meta_data */
  39. template <typename T_settings, typename T_storage_meta_data>
  40. inline entity_meta_data<T_settings, T_storage_meta_data>
  41. ::entity_meta_data()
  42. : _counter(0)
  43. { }
  44. template <typename T_settings, typename T_storage_meta_data>
  45. inline auto& entity_meta_data<T_settings, T_storage_meta_data>
  46. ::bitset()
  47. {
  48. return _bitset;
  49. }
  50. template <typename T_settings, typename T_storage_meta_data>
  51. inline const auto& entity_meta_data<T_settings, T_storage_meta_data>
  52. ::bitset() const
  53. {
  54. return _bitset;
  55. }
  56. template <typename T_settings, typename T_storage_meta_data>
  57. inline auto entity_meta_data<T_settings, T_storage_meta_data>
  58. ::counter() const
  59. {
  60. return _counter;
  61. }
  62. template <typename T_settings, typename T_storage_meta_data>
  63. inline auto& entity_meta_data<T_settings, T_storage_meta_data>
  64. ::storage_meta_data()
  65. {
  66. return *static_cast<storage_meta_data_type*>(this);
  67. }
  68. template <typename T_settings, typename T_storage_meta_data>
  69. inline void entity_meta_data<T_settings, T_storage_meta_data>
  70. ::reset()
  71. {
  72. ++_counter;
  73. _bitset.clear();
  74. }
  75. /* base */
  76. template<
  77. typename T_container_builder,
  78. typename T_settings,
  79. typename T_storage_meta_data>
  80. inline void base<T_container_builder, T_settings, T_storage_meta_data>
  81. ::grow(size_t count)
  82. {
  83. auto old_size = _container.size();
  84. _container.resize(old_size + count);
  85. for (size_t i = old_size; i < _container.size(); ++i)
  86. {
  87. _free_ids.emplace(i);
  88. }
  89. }
  90. template<
  91. typename T_container_builder,
  92. typename T_settings,
  93. typename T_storage_meta_data>
  94. inline bool base<T_container_builder, T_settings, T_storage_meta_data>
  95. ::is_valid(const entity_handle& handle) const
  96. {
  97. return handle.index() < _container.size()
  98. && _container.at(handle.index()).counter() == handle.counter();
  99. }
  100. template<
  101. typename T_container_builder,
  102. typename T_settings,
  103. typename T_storage_meta_data>
  104. inline decltype(auto) base<T_container_builder, T_settings, T_storage_meta_data>
  105. ::claim()
  106. {
  107. if (_free_ids.empty())
  108. {
  109. grow(grow_size);
  110. }
  111. assert(!_free_ids.empty());
  112. auto index = _free_ids.front();
  113. auto& item = _container.at(index);
  114. _free_ids.pop();
  115. return entity_handle(index, item.counter());
  116. }
  117. template<
  118. typename T_container_builder,
  119. typename T_settings,
  120. typename T_storage_meta_data>
  121. inline void base<T_container_builder, T_settings, T_storage_meta_data>
  122. ::reclaim(const entity_handle& handle)
  123. {
  124. if (!is_valid(handle))
  125. throw std::invalid_argument("invalid entity handle");
  126. auto index = handle.index();
  127. auto& item = _container.at(index);
  128. item.reset();
  129. _free_ids.emplace(index);
  130. }
  131. template<
  132. typename T_container_builder,
  133. typename T_settings,
  134. typename T_storage_meta_data>
  135. inline void base<T_container_builder, T_settings, T_storage_meta_data>
  136. ::clear()
  137. {
  138. _free_ids = queue_type { };
  139. for (size_t i = 0; i < _container.size(); ++i)
  140. {
  141. _container.at(i).reset();
  142. _free_ids.emplace(i);
  143. }
  144. }
  145. template<
  146. typename T_container_builder,
  147. typename T_settings,
  148. typename T_storage_meta_data>
  149. inline auto& base<T_container_builder, T_settings, T_storage_meta_data>
  150. ::meta_data(const entity_handle& handle)
  151. {
  152. if (!is_valid(handle))
  153. throw std::invalid_argument("invalid entity handle");
  154. auto index = handle.index();
  155. return _container.at(index);
  156. }
  157. } } } }