From aad97d6d425a229257d0a6d7c570349f32b13e98 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Thu, 28 Sep 2017 16:05:05 +0900 Subject: [PATCH] Add feature to cleanup function in manager ECManager's cleanup function now returns a map detailing info on all entities changed by cleanup. --- src/EC/Manager.hpp | 27 ++++++++++++++++++++++++--- src/test/ECTest.cpp | 29 +++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/src/EC/Manager.hpp b/src/EC/Manager.hpp index 263f501..6fdf038 100644 --- a/src/EC/Manager.hpp +++ b/src/EC/Manager.hpp @@ -280,12 +280,22 @@ namespace EC This function should be called periodically to correctly handle deletion of entities. + + The map returned by this function lists all entities that have + changed as a result of calling this function. + The size_t key refers to the original entity id of the entity, + the bool value refers to whether or not the entity is still alive, + and the size_t value refers to the new entity id if the entity + is still alive. */ - void cleanup() + using CleanupReturnType = + std::unordered_map >; + CleanupReturnType cleanup() { + CleanupReturnType changedMap; if(currentSize == 0) { - return; + return changedMap; } std::size_t rhs = currentSize - 1; @@ -298,8 +308,10 @@ namespace EC if(rhs == 0) { currentSize = 0; - return; + return changedMap; } + changedMap.insert(std::make_pair(rhs, std::make_pair( + false, 0))); std::get(entities[rhs]).reset(); --rhs; } @@ -310,6 +322,13 @@ namespace EC else if(!std::get(entities[lhs])) { // lhs is marked for deletion + + // store deleted and changed id to map + changedMap.insert(std::make_pair(lhs, std::make_pair( + false, 0))); + changedMap.insert(std::make_pair(rhs, std::make_pair( + true, lhs))); + // swap lhs entity with rhs entity std::swap(entities[lhs], entities.at(rhs)); @@ -325,6 +344,8 @@ namespace EC } } currentSize = rhs + 1; + + return changedMap; } /*! diff --git a/src/test/ECTest.cpp b/src/test/ECTest.cpp index e0c4c89..028b175 100644 --- a/src/test/ECTest.cpp +++ b/src/test/ECTest.cpp @@ -429,3 +429,32 @@ TEST(EC, DataPointers) EXPECT_EQ(10, newcptr->y); } +TEST(EC, DeletedEntityID) +{ + EC::Manager manager; + + auto e0 = manager.addEntity(); + auto e1 = manager.addEntity(); + auto e2 = manager.addEntity(); + + manager.deleteEntity(e0); + + auto changedMap = manager.cleanup(); + + for(decltype(changedMap)::value_type& p : changedMap) + { + if(p.first == 0) + { + EXPECT_FALSE(p.second.first); + } + else if(p.first == 2) + { + EXPECT_TRUE(p.second.first); + EXPECT_EQ(0, p.second.second); + } + } + + EXPECT_FALSE(manager.hasEntity(2)); + EXPECT_TRUE(manager.hasEntity(0)); +} +