📄 iserializer.hpp
字号:
#ifndef BOOST_ARCHIVE_DETAIL_ISERIALIZER_HPP#define BOOST_ARCHIVE_DETAIL_ISERIALIZER_HPP// MS compatible compilers support #pragma once#if defined(_MSC_VER) && (_MSC_VER >= 1020)# pragma once#pragma inline_depth(255)#pragma inline_recursion(on)#endif#if defined(__MWERKS__)#pragma inline_depth(255)#endif/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8// iserializer.hpp: interface for serialization system.// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . // Use, modification and distribution is subject to the Boost Software// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at// http://www.boost.org/LICENSE_1_0.txt)// See http://www.boost.org for updates, documentation, and revision history.#include <new> // for placement new#include <memory> // for auto_ptr#include <cstddef> // size_t#include <boost/config.hpp>#if defined(BOOST_NO_STDC_NAMESPACE)namespace std{ using ::size_t; } // namespace std#endif#include <boost/detail/workaround.hpp>#include <boost/static_assert.hpp>#include <boost/static_warning.hpp>#include <boost/smart_cast.hpp>#include <boost/type_traits/is_pointer.hpp>#include <boost/type_traits/is_fundamental.hpp>#include <boost/type_traits/is_enum.hpp>#include <boost/type_traits/is_same.hpp>#include <boost/type_traits/remove_const.hpp>#include <boost/throw_exception.hpp>#include <boost/serialization/is_abstract.hpp>#include <boost/mpl/eval_if.hpp>#include <boost/mpl/if.hpp>#include <boost/mpl/identity.hpp>#include <boost/mpl/or.hpp>#include <boost/mpl/and.hpp>#include <boost/mpl/less.hpp>#include <boost/mpl/greater_equal.hpp>#include <boost/mpl/int.hpp>#include <boost/mpl/list.hpp>#include <boost/mpl/empty.hpp>#include <boost/mpl/not.hpp>// the following is only used with VC for now and it crashes// at least one other compiler (Borland)#if defined(BOOST_MSVC)#include <boost/mpl/find.hpp>#endif// the following is need only for dynamic cast of polymorphic pointers#include <boost/archive/detail/basic_iarchive.hpp>#include <boost/archive/detail/basic_iserializer.hpp>#include <boost/archive/detail/archive_pointer_iserializer.hpp>#include <boost/serialization/force_include.hpp>#include <boost/serialization/extended_type_info.hpp>#include <boost/serialization/serialization.hpp>#include <boost/serialization/version.hpp>#include <boost/serialization/level.hpp>#include <boost/serialization/tracking.hpp>#include <boost/serialization/type_info_implementation.hpp>#include <boost/serialization/nvp.hpp>#include <boost/serialization/force_include.hpp>#include <boost/archive/archive_exception.hpp>#include <boost/archive/detail/known_archive_types_fwd.hpp>namespace boost {namespace archive {// an accessor to permit friend access to archives. Needed because// some compilers don't handle friend templates completelyclass load_access {public: template<class Archive, class T> static void load_primitive(Archive &ar, T &t){ ar.load(t); }};namespace detail {template<class Archive, class T>class iserializer : public basic_iserializer{private: virtual void destroy(/*const*/ void *address) const { boost::serialization::access::destroy(static_cast<T *>(address)); }public: explicit iserializer() : basic_iserializer( * boost::serialization::type_info_implementation<T>::type::get_instance() ) {} virtual BOOST_DLLEXPORT void load_object_data( basic_iarchive & ar, void *x, const unsigned int file_version ) const BOOST_USED ; virtual bool class_info() const { return boost::serialization::implementation_level<T>::value >= boost::serialization::object_class_info; } virtual bool tracking() const { return boost::serialization::tracking_level<T>::value == boost::serialization::track_always || boost::serialization::tracking_level<T>::value == boost::serialization::track_selectivly && serialized_as_pointer(); } virtual unsigned int version() const { return ::boost::serialization::version<T>::value; } virtual bool is_polymorphic() const { typedef BOOST_DEDUCED_TYPENAME boost::serialization::type_info_implementation< T >::type::is_polymorphic::type typex; return typex::value; } static iserializer & instantiate(){ static iserializer instance; return instance; } virtual ~iserializer(){};};template<class Archive, class T>BOOST_DLLEXPORT void iserializer<Archive, T>::load_object_data( basic_iarchive & ar, void *x, const unsigned int file_version) const { // make sure call is routed through the higest interface that might // be specialized by the user. boost::serialization::serialize_adl<Archive, T>( boost::smart_cast_reference<Archive &>(ar), * static_cast<T *>(x), file_version );}// instantiation of this template creates a static object. Note inversion of// normal argument order to workaround bizarre error in MSVC 6.0 which only// manifests iftself during compiler time.template<class T, class Archive>class pointer_iserializer : public archive_pointer_iserializer<Archive> {private: virtual const basic_iserializer & get_basic_serializer() const { return iserializer<Archive, T>::instantiate(); } virtual BOOST_DLLEXPORT void load_object_ptr( basic_iarchive & ar, void * & x, const unsigned int file_version ) const BOOST_USED;public: static const pointer_iserializer instance; explicit pointer_iserializer() : archive_pointer_iserializer<Archive>( * boost::serialization::type_info_implementation<T>::type::get_instance() ) { basic_iserializer & bis = iserializer<Archive, T>::instantiate(); bis.set_bpis(this); } static BOOST_DLLEXPORT const pointer_iserializer & instantiate() BOOST_USED; virtual ~pointer_iserializer(){};};// note: instances of this template to be constructed before the main// is called in order for things to be initialized properly. For this// reason, hiding the instance in a static function as was done above// won't work here so we created a free instance here.template<class T, class Archive>const pointer_iserializer<T, Archive> pointer_iserializer<T, Archive>::instance;// note trick to be sure that operator new is using class specific// version if such exists. Due to Peter Dimov.// note: the following fails if T has no default constructor.// otherwise it would have been ideal//struct heap_allocator : public T //{// T * invoke(){// return ::new(sizeof(T));// }//}// note: this should really be a member of the load_ptr function// below but some compilers still complain about this.template<class T>struct heap_allocator{ #if 0 // note: this fails on msvc 7.0 and gcc 3.2 template <class U, U x> struct test; typedef char* yes; typedef int* no; template <class U> yes has_op_new(U*, test<void* (*)(std::size_t), &U::operator new>* = 0); no has_op_new(...); template<class U> T * new_operator(U); T * new_operator(yes){ return (T::operator new)(sizeof(T)); } T * new_operator(no){ return static_cast<T *>(operator new(sizeof(T))); } static T * invoke(){ return new_operator(has_op_new(static_cast<T *>(NULL))); } #else // while this doesn't handle operator new overload for class T static T * invoke(){ return static_cast<T *>(operator new(sizeof(T))); } #endif};// due to Martin Eckertemplate <typename T>class auto_ptr_with_deleter{public: explicit auto_ptr_with_deleter(T* p) : m_p(p) {} ~auto_ptr_with_deleter(){ if (m_p) boost::serialization::access::destroy(m_p); } T* get() const { return m_p; } T* release() { T* p = m_p; m_p = NULL; return p; }private: T* m_p;};template<class Archive, class T>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -