#include namespace psemek::ecs { bool entity_container::alive(handle const & entity) const { return entity_list_.get_entities()[entity.id].epoch == entity.epoch; } void entity_container::destroy(handle const & entity) { do_destroy(entity); entity_list_.destroy(entity.id); } accessor entity_container::get(handle const & entity) { auto const data = entity_list_.get_entities()[entity.id]; return {data.table, data.row}; } detail::table * entity_container::insert_table(std::vector> columns) { auto table = table_container_.insert(std::make_unique(std::move(columns))); query_cache_container_.apply([table](detail::query_cache & cache){ cache.add(table); }, [table](util::uuid const & uuid){ return table->column(uuid) != nullptr; }); return table; } void entity_container::do_destroy(handle const & entity) { auto entities = entity_list_.get_entities(); auto & data = entities[entity.id]; auto & iteration_data = data.table->get_iteration_data(); if (!iteration_data || iteration_data->current_row < data.row) remove_row(*data.table, data.row, entities); else data.table->push_remove(data.row); } void entity_container::remove_row(detail::table & table, std::uint32_t row, util::span entities) { // Swap with the last row in that table auto table_entity_handles = table.entity_handles(); table.swap_rows(row, table_entity_handles.size() - 1); table.pop_row(); auto swap_handle = table_entity_handles[row]; entities[swap_handle.id].row = row; } }