From d7babe6a0f9f6a55e406ad2139b696ecde3ba053 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Wed, 23 Aug 2023 16:28:20 +0300 Subject: [PATCH] Fix destroying ecs tables --- libs/ecs/include/psemek/ecs/detail/table.hpp | 47 ++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/libs/ecs/include/psemek/ecs/detail/table.hpp b/libs/ecs/include/psemek/ecs/detail/table.hpp index 097f6006..5465adfa 100644 --- a/libs/ecs/include/psemek/ecs/detail/table.hpp +++ b/libs/ecs/include/psemek/ecs/detail/table.hpp @@ -56,6 +56,8 @@ namespace psemek::ecs::detail virtual void swap_rows(std::size_t row1, std::size_t row2) = 0; virtual void pop_row() = 0; + virtual void clear() = 0; + std::optional & get_iteration_data() { return iteration_data_; @@ -95,6 +97,10 @@ namespace psemek::ecs::detail void swap_rows(std::size_t row1, std::size_t row2) override; void pop_row() override; + void clear() override; + + ~table_impl() override; + private: std::size_t capacity_ = 0; @@ -167,6 +173,47 @@ namespace psemek::ecs::detail entity_handles_.pop_back(); } + template + void table_impl::clear() + { + [[maybe_unused]] auto clear_column_impl = [&](std::uint8_t * data) + { + auto ptr = reinterpret_cast(data); + if constexpr (!detail::is_empty_v) + { + for (std::size_t i = 0; i < row_count_; ++i) + ptr[i]->~Component(); + } + }; + + std::size_t i = 0; + (clear_column_impl.template operator()(component_pointers_[i++].data), ...); + + row_count_ = 0; + entity_handles_.clear(); + } + + template + table_impl::~table_impl() + { + clear(); + + [[maybe_unused]] auto delete_column_impl = [&](std::uint8_t * & data) + { + if constexpr (detail::is_empty_v) + { + reinterpret_cast(data)->~Component(); + } + delete [] data; + data = nullptr; + }; + + std::size_t i = 0; + (delete_column_impl.template operator()(component_pointers_[i++].data), ...); + + capacity_ = 0; + } + template void table_impl::reallocate() {