]> git.seodisparate.com - EntityComponentMetaSystem/commitdiff
Fix stored functions not being called in order
authorStephen Seo <seo.disparate@gmail.com>
Thu, 22 Nov 2018 05:28:31 +0000 (14:28 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Thu, 22 Nov 2018 05:31:55 +0000 (14:31 +0900)
Manager::callForMatchingFunctions should now call all functions in the
order they were added.

src/EC/Manager.hpp
src/test/ECTest.cpp

index 4191ce936bd8f8044e18233cfb8a04c333e1b936..4b5e4e4d7a555d6a9f4708ed5c2e0f514e5106ac 100644 (file)
@@ -784,7 +784,7 @@ namespace EC
 
 
     private:
-        std::unordered_map<std::size_t, std::tuple<
+        std::map<std::size_t, std::tuple<
             BitsetType,
             void*,
             std::function<void(
index 1e76c51187ecd3ef7fcff864edb39c8f093c62ca..f5f63fd79cf5d0555cf6ef01102f649f46db2721 100644 (file)
@@ -6,6 +6,7 @@
 #include <memory>
 #include <unordered_map>
 #include <mutex>
+#include <vector>
 
 #include <EC/Meta/Meta.hpp>
 #include <EC/EC.hpp>
@@ -1027,3 +1028,49 @@ TEST(EC, context)
     EXPECT_EQ(999, manager.getEntityData<C0>(e1)->x);
     EXPECT_EQ(1999, manager.getEntityData<C0>(e1)->y);
 }
+
+TEST(EC, FunctionStorageOrder)
+{
+    EC::Manager<ListComponentsAll, ListTagsAll> manager;
+    auto e0 = manager.addEntity();
+    manager.addComponent<C0>(e0, 1, 2);
+
+    std::vector<int> v;
+
+    using C0TL = EC::Meta::TypeList<C0>;
+
+    manager.addForMatchingFunction<C0TL>(
+        [&v] (std::size_t /* id */, void* /* context */, C0* c) {
+            v.push_back(c->x);
+            v.push_back(c->y);
+        });
+    manager.addForMatchingFunction<C0TL>(
+        [] (std::size_t /* id */, void* /* context */, C0* c) {
+            c->x += 2;
+            c->y += 2;
+        });
+    manager.addForMatchingFunction<C0TL>(
+        [&v] (std::size_t /* id */, void* /* context */, C0* c) {
+            v.push_back(c->x);
+            v.push_back(c->y);
+        });
+    manager.addForMatchingFunction<C0TL>(
+        [] (std::size_t /* id */, void* /* context */, C0* c) {
+            c->x += 2;
+            c->y += 2;
+        });
+    manager.addForMatchingFunction<C0TL>(
+        [&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));
+}