From 8f133acbc689e1fff036d2e2dc48471994ee0856 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Thu, 22 Nov 2018 14:28:31 +0900 Subject: [PATCH] Fix stored functions not being called in order Manager::callForMatchingFunctions should now call all functions in the order they were added. --- src/EC/Manager.hpp | 2 +- src/test/ECTest.cpp | 47 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/EC/Manager.hpp b/src/EC/Manager.hpp index 4191ce9..4b5e4e4 100644 --- a/src/EC/Manager.hpp +++ b/src/EC/Manager.hpp @@ -784,7 +784,7 @@ namespace EC private: - std::unordered_map #include #include +#include #include #include @@ -1027,3 +1028,49 @@ TEST(EC, context) EXPECT_EQ(999, manager.getEntityData(e1)->x); EXPECT_EQ(1999, manager.getEntityData(e1)->y); } + +TEST(EC, FunctionStorageOrder) +{ + EC::Manager manager; + auto e0 = manager.addEntity(); + manager.addComponent(e0, 1, 2); + + std::vector v; + + using C0TL = EC::Meta::TypeList; + + manager.addForMatchingFunction( + [&v] (std::size_t /* id */, void* /* context */, C0* c) { + v.push_back(c->x); + v.push_back(c->y); + }); + manager.addForMatchingFunction( + [] (std::size_t /* id */, void* /* context */, C0* c) { + c->x += 2; + c->y += 2; + }); + manager.addForMatchingFunction( + [&v] (std::size_t /* id */, void* /* context */, C0* c) { + v.push_back(c->x); + v.push_back(c->y); + }); + manager.addForMatchingFunction( + [] (std::size_t /* id */, void* /* context */, C0* c) { + c->x += 2; + c->y += 2; + }); + manager.addForMatchingFunction( + [&v] (std::size_t /* id */, void* /* context */, C0* c) { + v.push_back(c->x); + v.push_back(c->y); + }); + + manager.callForMatchingFunctions(); + + EXPECT_EQ(1, v.at(0)); + EXPECT_EQ(2, v.at(1)); + EXPECT_EQ(3, v.at(2)); + EXPECT_EQ(4, v.at(3)); + EXPECT_EQ(5, v.at(4)); + EXPECT_EQ(6, v.at(5)); +}