]> git.tdb.fi Git - libs/game.git/blobdiff - source/game/accessguard.h
Minor optimization to AccessGuard::check
[libs/game.git] / source / game / accessguard.h
index c64efe75bee9de0ae04427f3b3589b295b8d6fdd..0f7bac76ab09f964e3623a14a0a22ec97b35af8d 100644 (file)
@@ -6,6 +6,7 @@
 #include <string>
 #include <vector>
 #include <msp/core/noncopyable.h>
+#include <msp/debug/demangle.h>
 
 namespace Msp::Game {
 
@@ -21,6 +22,8 @@ class AccessGuard
 public:
        struct Create { static std::string describe() { return "create"; } };
        struct Destroy { static std::string describe() { return "destroy"; } };
+       template<typename T> struct Read { static std::string describe(); };
+       template<typename T> struct Write { static std::string describe(); };
 
        template<typename T = void>
        struct BlockForScope: NonCopyable
@@ -66,7 +69,7 @@ public:
        void unblock() { get<T>() = UNBLOCKED; }
 
        template<typename T>
-       void check() { if(get<T>()!=UNBLOCKED) throw invalid_access(T::describe()); }
+       void check();
 };
 
 
@@ -94,6 +97,27 @@ template<>
 inline void AccessGuard::unblock<void>()
 { unblock_all(); }
 
+template<typename T>
+inline void AccessGuard::check()
+{
+       unsigned index = get_index<T>();
+       if((index<flags.size() ? flags[index] : default_flag) != UNBLOCKED)
+               throw invalid_access(T::describe());
+}
+
+
+template<typename T>
+inline std::string AccessGuard::Read<T>::describe()
+{
+       return "read "+Debug::demangle(typeid(T).name());
+}
+
+template<typename T>
+inline std::string AccessGuard::Write<T>::describe()
+{
+       return "write "+Debug::demangle(typeid(T).name());
+}
+
 } // namespace Msp::Game
 
 #endif