#include <functional>
#include <msp/time/timedelta.h>
+#include "accessguard.h"
#include "component.h"
#include "reflection.h"
#include "stage.h"
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) { }
};
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