From 080893ee96bb80226395ec9d34187bbbd59ab3d9 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Sat, 6 Jan 2024 22:21:07 +0300 Subject: [PATCH] Fix copying entities --- libs/ecs/include/psemek/ecs/detail/column.hpp | 29 +++++++++++-------- libs/ecs/source/detail/table.cpp | 6 ++-- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/libs/ecs/include/psemek/ecs/detail/column.hpp b/libs/ecs/include/psemek/ecs/detail/column.hpp index 3f240138..01340554 100644 --- a/libs/ecs/include/psemek/ecs/detail/column.hpp +++ b/libs/ecs/include/psemek/ecs/detail/column.hpp @@ -17,6 +17,11 @@ namespace psemek::ecs::detail return data_; } + std::uint8_t const * data() const + { + return data_; + } + std::size_t stride() const { return stride_; @@ -38,8 +43,8 @@ namespace psemek::ecs::detail } virtual void push_row() = 0; - virtual void emplace_rows(std::uint8_t * data, std::size_t count) = 0; - virtual void insert_rows(std::uint8_t const * data, std::size_t count) = 0; + virtual void emplace_rows(column * from, std::size_t from_row, std::size_t count) = 0; + virtual void insert_rows(column const * from, std::size_t from_row, std::size_t count) = 0; virtual void swap_rows(std::size_t row1, std::size_t row2) = 0; virtual void pop_row() = 0; virtual void clear() = 0; @@ -70,8 +75,8 @@ namespace psemek::ecs::detail column_impl(); void push_row() override; - void emplace_rows(std::uint8_t * data, std::size_t count) override; - void insert_rows(std::uint8_t const * data, std::size_t count) override; + void emplace_rows(column * from, std::size_t from_row, std::size_t count) override; + void insert_rows(column const * from, std::size_t from_row, std::size_t count) override; void swap_rows(std::size_t row1, std::size_t row2) override; void pop_row() override; void clear() override; @@ -94,8 +99,8 @@ namespace psemek::ecs::detail column_impl(); void push_row() override; - void emplace_rows(std::uint8_t * data, std::size_t count) override; - void insert_rows(std::uint8_t const * data, std::size_t count) override; + void emplace_rows(column * from, std::size_t from_row, std::size_t count) override; + void insert_rows(column const * from, std::size_t from_row, std::size_t count) override; void swap_rows(std::size_t row1, std::size_t row2) override; void pop_row() override; void clear() override; @@ -120,11 +125,11 @@ namespace psemek::ecs::detail } template - void column_impl::emplace_rows(std::uint8_t * data, std::size_t count) + void column_impl::emplace_rows(column * from, std::size_t from_row, std::size_t count) { allocate(row_count_ + count); - auto src = reinterpret_cast(data); + auto src = reinterpret_cast(from->data()) + from_row; auto dst = reinterpret_cast(data_) + row_count_; auto src_end = src + count; while (src != src_end) @@ -138,13 +143,13 @@ namespace psemek::ecs::detail } template - void column_impl::insert_rows(std::uint8_t const * data, std::size_t count) + void column_impl::insert_rows(column const * from, std::size_t from_row, std::size_t count) { if constexpr (std::is_copy_constructible_v) { allocate(row_count_ + count); - auto src = reinterpret_cast(data); + auto src = reinterpret_cast(from->data()) + from_row; auto dst = reinterpret_cast(data_) + row_count_; auto src_end = src + count; while (src != src_end) @@ -238,11 +243,11 @@ namespace psemek::ecs::detail {} template - void column_impl::emplace_rows(std::uint8_t *, std::size_t) + void column_impl::emplace_rows(column *, std::size_t, std::size_t) {} template - void column_impl::insert_rows(std::uint8_t const *, std::size_t) + void column_impl::insert_rows(column const *, std::size_t, std::size_t) {} template diff --git a/libs/ecs/source/detail/table.cpp b/libs/ecs/source/detail/table.cpp index 8eb903b0..4e383da1 100644 --- a/libs/ecs/source/detail/table.cpp +++ b/libs/ecs/source/detail/table.cpp @@ -51,7 +51,7 @@ namespace psemek::ecs::detail for (auto & column : columns_) { if (auto other_column = from->column(column->uuid())) - column->emplace_rows(other_column->data() + other_column->stride() * from_row, 1); + column->emplace_rows(other_column, from_row, 1); else column->push_row(); } @@ -64,7 +64,7 @@ namespace psemek::ecs::detail for (std::size_t i = 0; i < columns_.size(); ++i) { auto from_column = from->columns_[i].get(); - columns_[i]->insert_rows(from_column->data() + from_column->stride() * from_row, 1); + columns_[i]->insert_rows(from_column, from_row, 1); } entity_handles_.push_back(handle); return entity_handles_.size() - 1; @@ -129,7 +129,7 @@ namespace psemek::ecs::detail for (std::size_t i = 0; i < columns_.size(); ++i) { auto * src_column = delayed_table_->columns_[i].get(); - columns_[i]->emplace_rows(src_column->data(), count); + columns_[i]->emplace_rows(src_column, 0, count); } entity_handles_.insert(entity_handles_.end(), delayed_table_->entity_handles_.begin(), delayed_table_->entity_handles_.end());