#include <string>
#include <vector>
#include <msp/core/noncopyable.h>
+#include <msp/debug/demangle.h>
namespace Msp::Game {
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
void unblock() { get<T>() = UNBLOCKED; }
template<typename T>
- void check() { if(get<T>()!=UNBLOCKED) throw invalid_access(T::describe()); }
+ void check();
};
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