+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());
+}
+