+#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