#include #include namespace psemek::ecs::detail { table::table(std::vector> columns) { component_hasher hasher; for (auto & column : columns) { auto uuid = column->uuid(); hasher(uuid); component_uuid_to_column_.insert({uuid, std::move(column)}); } hash_ = hasher.result; } detail::column * table::column(util::uuid const & uuid) const { if (auto it = component_uuid_to_column_.find(uuid); it != component_uuid_to_column_.end()) return it->second.get(); return nullptr; } std::size_t table::push_row(entity_handle handle) { for (auto & pair : component_uuid_to_column_) pair.second->push_row(); entity_handles_.push_back(handle); return entity_handles_.size() - 1; } void table::swap_rows(std::size_t row1, std::size_t row2) { for (auto & pair : component_uuid_to_column_) pair.second->swap_rows(row1, row2); std::swap(entity_handles_[row1], entity_handles_[row2]); } void table::pop_row() { for (auto & pair : component_uuid_to_column_) pair.second->pop_row(); entity_handles_.pop_back(); } void table::clear() { for (auto & pair : component_uuid_to_column_) pair.second->clear(); entity_handles_.clear(); } void table::push_remove(std::uint32_t row) { remove_queue_.push_back(row); } std::vector table::grab_remove_queue() { return std::move(remove_queue_); } std::unique_ptr table::clone() const { std::vector> columns; for (auto const & pair : component_uuid_to_column_) columns.push_back(pair.second->clone()); return std::make_unique
(std::move(columns)); } table * table::get_delayed_table() { if (!delayed_table_) delayed_table_ = clone(); return delayed_table_.get(); } util::span table::flush_delayed() { if (!delayed_table_) return {}; std::size_t count = delayed_table_->row_count(); for (auto & pair : component_uuid_to_column_) { auto * src_column = delayed_table_->column(pair.second->uuid()); pair.second->emplace_rows(src_column->data(), count); } entity_handles_.insert(entity_handles_.end(), delayed_table_->entity_handles_.begin(), delayed_table_->entity_handles_.end()); delayed_table_->clear(); return {entity_handles_.data() + entity_handles_.size() - count, count}; } }