#include <vector>
#include <msp/core/noncopyable.h>
#include <msp/debug/demangle.h>
+#include "mspgame_api.h"
namespace Msp::Game {
-class invalid_access: public std::logic_error
+class MSPGAME_API invalid_access: public std::logic_error
{
public:
invalid_access(const std::string &w): logic_error(w) { }
};
-class AccessGuard
+class MSPGAME_API AccessGuard
{
public:
struct Create { static std::string describe() { return "create"; } };
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()