29 #ifndef CEREAL_ACCESS_HPP_ 30 #define CEREAL_ACCESS_HPP_ 32 #include <type_traits> 112 namespace memory_detail{
template <
class Ar,
class T>
struct LoadAndConstructLoadWrapper; }
174 template <
class ... Args>
175 void operator()( Args && ... args );
186 throw Exception(
"Object must be initialized prior to accessing members");
205 template <
class A,
class B>
friend struct ::cereal::memory_detail::LoadAndConstructLoadWrapper;
207 construct( T * p ) : itsPtr( p ), itsEnableSharedRestoreFunction( [](){} ), itsValid(
false ) {}
208 construct( T * p, std::function<
void()> enableSharedFunc ) :
209 itsPtr( p ), itsEnableSharedRestoreFunction( enableSharedFunc ), itsValid(
false ) {}
214 std::function<void()> itsEnableSharedRestoreFunction;
241 template<
class Archive,
class T>
inline 242 static auto member_serialize(Archive & ar, T & t) -> decltype(t.CEREAL_SERIALIZE_FUNCTION_NAME(ar))
243 {
return t.CEREAL_SERIALIZE_FUNCTION_NAME(ar); }
245 template<
class Archive,
class T>
inline 246 static auto member_save(Archive & ar, T
const & t) -> decltype(t.CEREAL_SAVE_FUNCTION_NAME(ar))
247 {
return t.CEREAL_SAVE_FUNCTION_NAME(ar); }
249 template<
class Archive,
class T>
inline 250 static auto member_save_non_const(Archive & ar, T & t) -> decltype(t.CEREAL_SAVE_FUNCTION_NAME(ar))
251 {
return t.CEREAL_SAVE_FUNCTION_NAME(ar); }
253 template<
class Archive,
class T>
inline 254 static auto member_load(Archive & ar, T & t) -> decltype(t.CEREAL_LOAD_FUNCTION_NAME(ar))
255 {
return t.CEREAL_LOAD_FUNCTION_NAME(ar); }
257 template<
class Archive,
class T>
inline 258 static auto member_save_minimal(Archive
const & ar, T
const & t) -> decltype(t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar))
259 {
return t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar); }
261 template<
class Archive,
class T>
inline 262 static auto member_save_minimal_non_const(Archive
const & ar, T & t) -> decltype(t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar))
263 {
return t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar); }
265 template<
class Archive,
class T,
class U>
inline 266 static auto member_load_minimal(Archive
const & ar, T & t, U && u) -> decltype(t.CEREAL_LOAD_MINIMAL_FUNCTION_NAME(ar, std::forward<U>(u)))
267 {
return t.CEREAL_LOAD_MINIMAL_FUNCTION_NAME(ar, std::forward<U>(u)); }
270 template<
class Archive,
class T>
inline 271 static auto member_serialize(Archive & ar, T & t,
const std::uint32_t version ) -> decltype(t.CEREAL_SERIALIZE_FUNCTION_NAME(ar, version))
272 {
return t.CEREAL_SERIALIZE_FUNCTION_NAME(ar, version); }
274 template<
class Archive,
class T>
inline 275 static auto member_save(Archive & ar, T
const & t,
const std::uint32_t version ) -> decltype(t.CEREAL_SAVE_FUNCTION_NAME(ar, version))
276 {
return t.CEREAL_SAVE_FUNCTION_NAME(ar, version); }
278 template<
class Archive,
class T>
inline 279 static auto member_save_non_const(Archive & ar, T & t,
const std::uint32_t version ) -> decltype(t.CEREAL_SAVE_FUNCTION_NAME(ar, version))
280 {
return t.CEREAL_SAVE_FUNCTION_NAME(ar, version); }
282 template<
class Archive,
class T>
inline 283 static auto member_load(Archive & ar, T & t,
const std::uint32_t version ) -> decltype(t.CEREAL_LOAD_FUNCTION_NAME(ar, version))
284 {
return t.CEREAL_LOAD_FUNCTION_NAME(ar, version); }
286 template<
class Archive,
class T>
inline 287 static auto member_save_minimal(Archive
const & ar, T
const & t,
const std::uint32_t version) -> decltype(t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar, version))
288 {
return t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar, version); }
290 template<
class Archive,
class T>
inline 291 static auto member_save_minimal_non_const(Archive
const & ar, T & t,
const std::uint32_t version) -> decltype(t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar, version))
292 {
return t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar, version); }
294 template<
class Archive,
class T,
class U>
inline 295 static auto member_load_minimal(Archive
const & ar, T & t, U && u,
const std::uint32_t version) -> decltype(t.CEREAL_LOAD_MINIMAL_FUNCTION_NAME(ar, std::forward<U>(u), version))
296 {
return t.CEREAL_LOAD_MINIMAL_FUNCTION_NAME(ar, std::forward<U>(u), version); }
300 template <
class T>
inline 301 static auto shared_from_this(T & t) -> decltype(t.shared_from_this());
304 template <
class T,
class ... Args>
inline 305 static void construct( T *& ptr, Args && ... args )
307 new (ptr) T( std::forward<Args>( args )... );
311 template <
class T>
inline 317 template <
class T>
inline 318 static std::false_type load_and_construct(...)
319 {
return std::false_type(); }
321 template<
class T,
class Archive>
inline 324 T::load_and_construct( ar, construct );
327 template<
class T,
class Archive>
inline 328 static auto load_and_construct(Archive & ar, ::
cereal::construct<T> & construct,
const std::uint32_t version) -> decltype(T::load_and_construct(ar, construct, version))
330 T::load_and_construct( ar, construct, version );
343 member_load_save_minimal,
344 non_member_serialize,
345 non_member_load_save,
346 non_member_load_save_minimal
403 template <
class Archive,
class T, specialization S>
417 #define CEREAL_SPECIALIZE_FOR_ALL_ARCHIVES( Type, Specialization ) \ 418 namespace cereal { template <class Archive> struct specialize<Archive, Type, Specialization> {}; } 431 #define CEREAL_SPECIALIZE_FOR_ARCHIVE( Archive, Type, Specialization ) \ 432 namespace cereal { template <> struct specialize<Archive, Type, Specialization> {}; } 436 template <
class T>
template <
class ... Args>
inline 440 throw Exception(
"Attempting to construct an already initialized object");
442 ::cereal::access::construct( itsPtr, std::forward<Args>( args )... );
443 itsEnableSharedRestoreFunction();
448 #endif // CEREAL_ACCESS_HPP_ T * operator->()
Get a reference to the initialized underlying object.
Definition: access.hpp:183
specialization
Definition: access.hpp:339
Used to construct types with no default constructor.
Definition: access.hpp:162
A class that allows cereal to load smart pointers to types that have no default constructor.
Definition: access.hpp:107
Internal helper functionality.
A class that can be made a friend to give cereal access to non public functions.
Definition: access.hpp:237
Definition: access.hpp:40
Preprocessor macros that can customise the cereal library.
T * ptr()
Returns a raw pointer to the initialized underlying object.
Definition: access.hpp:199
void operator()(Args &&... args)
Construct and initialize the type T with the given arguments.
Definition: access.hpp:437
A class used to disambiguate cases where cereal cannot detect a unique way of serializing a class...
Definition: access.hpp:404
An exception class thrown when things go wrong at runtime.
Definition: helpers.hpp:48