Fix destroying ecs tables

This commit is contained in:
Nikita Lisitsa 2023-08-23 16:28:20 +03:00
parent b99371dc29
commit d7babe6a0f

View file

@ -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<iteration_data> & 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 <typename ... Components>
void table_impl<Components...>::clear()
{
[[maybe_unused]] auto clear_column_impl = [&]<typename Component>(std::uint8_t * data)
{
auto ptr = reinterpret_cast<Component *>(data);
if constexpr (!detail::is_empty_v<Component>)
{
for (std::size_t i = 0; i < row_count_; ++i)
ptr[i]->~Component();
}
};
std::size_t i = 0;
(clear_column_impl.template operator()<Components>(component_pointers_[i++].data), ...);
row_count_ = 0;
entity_handles_.clear();
}
template <typename ... Components>
table_impl<Components...>::~table_impl()
{
clear();
[[maybe_unused]] auto delete_column_impl = [&]<typename Component>(std::uint8_t * & data)
{
if constexpr (detail::is_empty_v<Component>)
{
reinterpret_cast<Component *>(data)->~Component();
}
delete [] data;
data = nullptr;
};
std::size_t i = 0;
(delete_column_impl.template operator()<Components>(component_pointers_[i++].data), ...);
capacity_ = 0;
}
template <typename ... Components>
void table_impl<Components...>::reallocate()
{