]> git.tdb.fi Git - libs/game.git/blobdiff - source/game/system.h
Enforce correct access to buffered components
[libs/game.git] / source / game / system.h
index 3d62c06276553821694651c0c5f15020845cc083..e3d71171c1e19aa8e31da854aa007737885774ce 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <functional>
 #include <msp/time/timedelta.h>
+#include "accessguard.h"
 #include "component.h"
 #include "reflection.h"
 #include "stage.h"
@@ -28,6 +29,8 @@ public:
                const Reflection::ClassBase &type;
                void (*prepare)(Stage &) = nullptr;
                void (*commit)(Stage &) = nullptr;
+               void (*unblock)(DependencyFlags) = nullptr;
+               void (*block)(DependencyFlags) = nullptr;
 
                Dependency(const Reflection::ClassBase &t): type(t) { }
        };
@@ -86,11 +89,23 @@ inline void System::declare_dependency(DependencyFlags flags)
        Dependency &dep = (i!=dependencies.end() ? *i : dependencies.emplace_back(type));
        dep.flags = flags;
        if constexpr(requires(T &c) { typename T::Data; c.prepare_tick(); c.commit_tick(); })
+       {
+#ifdef DEBUG
+               dep.unblock = +[](DependencyFlags f){
+                       if(f&READ_OLD) AccessGuard::get_instance().unblock<AccessGuard::Read<typename T::Data>>();
+                       if(f&WRITE) AccessGuard::get_instance().unblock<AccessGuard::Write<typename T::Data>>();
+               };
+               dep.block = +[](DependencyFlags f){
+                       if(f&READ_OLD) AccessGuard::get_instance().block<AccessGuard::Read<typename T::Data>>();
+                       if(f&WRITE) AccessGuard::get_instance().block<AccessGuard::Write<typename T::Data>>();
+               };
+#endif
                if(flags&WRITE)
                {
                        dep.prepare = +[](Stage &s){ s.iterate_objects<T>([](T &c){ c.prepare_tick(); }); };
                        dep.commit = +[](Stage &s){ s.iterate_objects<T>([](T &c){ c.commit_tick(); }); };
                }
+       }
 }
 
 } // namespace Msp::Game