123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351 |
- #ifndef CEREAL_ACCESS_HPP_
- #define CEREAL_ACCESS_HPP_
- #include <type_traits>
- #include <iostream>
- #include <cstdint>
- #include <functional>
- #include "cereal/macros.hpp"
- #include "cereal/specialize.hpp"
- #include "cereal/details/helpers.hpp"
- namespace cereal
- {
-
-
-
- template <class T>
- struct LoadAndConstruct
- { };
-
-
- namespace memory_detail{ template <class Ar, class T> struct LoadAndConstructLoadWrapper; }
- namespace boost_variant_detail{ template <class Ar, class T> struct LoadAndConstructLoadWrapper; }
-
-
-
- template <class T>
- class construct
- {
- public:
-
-
- template <class ... Args>
- void operator()( Args && ... args );
-
-
-
- T * operator->()
- {
- if( !itsValid )
- throw Exception("Object must be initialized prior to accessing members");
- return itsPtr;
- }
-
-
- T * ptr()
- {
- return operator->();
- }
- private:
- template <class Ar, class TT> friend struct ::cereal::memory_detail::LoadAndConstructLoadWrapper;
- template <class Ar, class TT> friend struct ::cereal::boost_variant_detail::LoadAndConstructLoadWrapper;
- construct( T * p ) : itsPtr( p ), itsEnableSharedRestoreFunction( [](){} ), itsValid( false ) {}
- construct( T * p, std::function<void()> enableSharedFunc ) :
- itsPtr( p ), itsEnableSharedRestoreFunction( enableSharedFunc ), itsValid( false ) {}
- construct( construct const & ) = delete;
- construct & operator=( construct const & ) = delete;
- T * itsPtr;
- std::function<void()> itsEnableSharedRestoreFunction;
- bool itsValid;
- };
-
-
-
- class access
- {
- public:
-
- template<class Archive, class T> inline
- static auto member_serialize(Archive & ar, T & t) -> decltype(t.CEREAL_SERIALIZE_FUNCTION_NAME(ar))
- { return t.CEREAL_SERIALIZE_FUNCTION_NAME(ar); }
- template<class Archive, class T> inline
- static auto member_save(Archive & ar, T const & t) -> decltype(t.CEREAL_SAVE_FUNCTION_NAME(ar))
- { return t.CEREAL_SAVE_FUNCTION_NAME(ar); }
- template<class Archive, class T> inline
- static auto member_save_non_const(Archive & ar, T & t) -> decltype(t.CEREAL_SAVE_FUNCTION_NAME(ar))
- { return t.CEREAL_SAVE_FUNCTION_NAME(ar); }
- template<class Archive, class T> inline
- static auto member_load(Archive & ar, T & t) -> decltype(t.CEREAL_LOAD_FUNCTION_NAME(ar))
- { return t.CEREAL_LOAD_FUNCTION_NAME(ar); }
- template<class Archive, class T> inline
- static auto member_save_minimal(Archive const & ar, T const & t) -> decltype(t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar))
- { return t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar); }
- template<class Archive, class T> inline
- static auto member_save_minimal_non_const(Archive const & ar, T & t) -> decltype(t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar))
- { return t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar); }
- template<class Archive, class T, class U> inline
- static auto member_load_minimal(Archive const & ar, T & t, U && u) -> decltype(t.CEREAL_LOAD_MINIMAL_FUNCTION_NAME(ar, std::forward<U>(u)))
- { return t.CEREAL_LOAD_MINIMAL_FUNCTION_NAME(ar, std::forward<U>(u)); }
-
- template<class Archive, class T> inline
- static auto member_serialize(Archive & ar, T & t, const std::uint32_t version ) -> decltype(t.CEREAL_SERIALIZE_FUNCTION_NAME(ar, version))
- { return t.CEREAL_SERIALIZE_FUNCTION_NAME(ar, version); }
- template<class Archive, class T> inline
- static auto member_save(Archive & ar, T const & t, const std::uint32_t version ) -> decltype(t.CEREAL_SAVE_FUNCTION_NAME(ar, version))
- { return t.CEREAL_SAVE_FUNCTION_NAME(ar, version); }
- template<class Archive, class T> inline
- static auto member_save_non_const(Archive & ar, T & t, const std::uint32_t version ) -> decltype(t.CEREAL_SAVE_FUNCTION_NAME(ar, version))
- { return t.CEREAL_SAVE_FUNCTION_NAME(ar, version); }
- template<class Archive, class T> inline
- static auto member_load(Archive & ar, T & t, const std::uint32_t version ) -> decltype(t.CEREAL_LOAD_FUNCTION_NAME(ar, version))
- { return t.CEREAL_LOAD_FUNCTION_NAME(ar, version); }
- template<class Archive, class T> inline
- 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))
- { return t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar, version); }
- template<class Archive, class T> inline
- 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))
- { return t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar, version); }
- template<class Archive, class T, class U> inline
- 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))
- { return t.CEREAL_LOAD_MINIMAL_FUNCTION_NAME(ar, std::forward<U>(u), version); }
-
-
- template <class T> inline
- static auto shared_from_this(T & t) -> decltype(t.shared_from_this());
-
- template <class T, class ... Args> inline
- static void construct( T *& ptr, Args && ... args )
- {
- new (ptr) T( std::forward<Args>( args )... );
- }
-
- template <class T> inline
- static T * construct()
- {
- return new T();
- }
- template <class T> inline
- static std::false_type load_and_construct(...)
- { return std::false_type(); }
- template<class T, class Archive> inline
- static auto load_and_construct(Archive & ar, ::cereal::construct<T> & construct) -> decltype(T::load_and_construct(ar, construct))
- {
- T::load_and_construct( ar, construct );
- }
- template<class T, class Archive> inline
- static auto load_and_construct(Archive & ar, ::cereal::construct<T> & construct, const std::uint32_t version) -> decltype(T::load_and_construct(ar, construct, version))
- {
- T::load_and_construct( ar, construct, version );
- }
- };
-
-
- template <class T> template <class ... Args> inline
- void construct<T>::operator()( Args && ... args )
- {
- if( itsValid )
- throw Exception("Attempting to construct an already initialized object");
- ::cereal::access::construct( itsPtr, std::forward<Args>( args )... );
- itsEnableSharedRestoreFunction();
- itsValid = true;
- }
- }
- #endif
|