#ifndef CEREAL_BINARY_ARCHIVE_SHARED_PTR_HPP_ #define CEREAL_BINARY_ARCHIVE_SHARED_PTR_HPP_ #include #include namespace cereal { //! Saving std::shared_ptr to binary template void save( BinaryOutputArchive & ar, std::shared_ptr const & ptr ) { uint32_t id = ar.registerSharedPointer( ptr.get() ); ar & id; if( id & msb_32bit ) { ar & *ptr; } } //! Loading std::shared_ptr to binary template void load( BinaryInputArchive & ar, std::shared_ptr & ptr ) { uint32_t id; ar & id; if( id & msb_32bit ) { ptr.reset( new T ); ar & *ptr; ar.registerSharedPointer(id, ptr); } else { ptr = std::static_pointer_cast(ar.getSharedPointer(id)); } } //! Saving std::weak_ptr to binary template void save( BinaryOutputArchive & ar, std::weak_ptr const & ptr ) { auto sptr = ptr.lock(); ar & sptr; } //! Loading std::weak_ptr from binary template void load( BinaryInputArchive & ar, std::weak_ptr & ptr ) { std::shared_ptr sptr; ar & sptr; ptr = sptr; } //! Saving std::unique_ptr to binary template void save( BinaryOutputArchive & ar, std::unique_ptr const & ptr ) { ar & *ptr; } //! Loading std::unique_ptr from binary template void load( BinaryInputArchive & ar, std::unique_ptr & ptr ) { ptr.reset(new T); ar & *ptr; } } // namespace cereal #endif // CEREAL_BINARY_ARCHIVE_SHARED_PTR_HPP_