]> git.tdb.fi Git - libs/game.git/blobdiff - source/game/accessguard.cpp
Enforce no creation or destruction of objects during tick
[libs/game.git] / source / game / accessguard.cpp
diff --git a/source/game/accessguard.cpp b/source/game/accessguard.cpp
new file mode 100644 (file)
index 0000000..d4c2113
--- /dev/null
@@ -0,0 +1,61 @@
+#include "accessguard.h"
+
+namespace Msp::Game {
+
+thread_local AccessGuard *AccessGuard::instance = nullptr;
+
+AccessGuard::AccessGuard()
+{
+       if(!instance)
+               instance = this;
+}
+
+AccessGuard::AccessGuard(AccessGuard &&other):
+       flags(std::move(other.flags))
+{
+       if(&other==instance)
+               instance = this;
+}
+
+AccessGuard &AccessGuard::operator=(AccessGuard &&other)
+{
+       flags = std::move(other.flags);
+       if(&other==instance)
+               instance = this;
+       return *this;
+}
+
+AccessGuard::~AccessGuard()
+{
+       if(this==instance)
+               instance = nullptr;
+}
+
+AccessGuard &AccessGuard::get_instance()
+{
+       if(!instance)
+               throw std::logic_error("no AccessGuard instance");
+       return *instance;
+}
+
+void AccessGuard::block_all()
+{
+       default_flag = BLOCKED;
+       for(uint8_t &f: flags)
+               f = BLOCKED;
+}
+
+void AccessGuard::unblock_all()
+{
+       default_flag = UNBLOCKED;
+       for(uint8_t &f: flags)
+               f = UNBLOCKED;
+}
+
+unsigned AccessGuard::get_next_index()
+{
+       static unsigned next_index = 0;
+       return next_index++;
+}
+
+} // namespace Msp::Game