X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgame%2Faccessguard.cpp;fp=source%2Fgame%2Faccessguard.cpp;h=d4c211300b2f093cb24ec0e9193743d6290eb40b;hb=48051ee2bab13f65e48c371e453b9ea65920921e;hp=0000000000000000000000000000000000000000;hpb=cb4e8bbe06dc64aff932784541a29493723fc03e;p=libs%2Fgame.git diff --git a/source/game/accessguard.cpp b/source/game/accessguard.cpp new file mode 100644 index 0000000..d4c2113 --- /dev/null +++ b/source/game/accessguard.cpp @@ -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