oserializer.hpp
来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 547 行 · 第 1/2 页
HPP
547 行
#ifndef BOOST_ARCHIVE_OSERIALIZER_HPP#define BOOST_ARCHIVE_OSERIALIZER_HPP// MS compatible compilers support #pragma once#if defined(_MSC_VER) && (_MSC_VER >= 1020)# pragma once#pragma inline_depth(511)#pragma inline_recursion(on)#endif#if defined(__MWERKS__)#pragma inline_depth(511)#endif/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8// oserializer.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 <cassert>#include <cstddef> // NULL#include <boost/config.hpp>#include <boost/detail/workaround.hpp>#include <boost/serialization/throw_exception.hpp>#include <boost/serialization/smart_cast.hpp>#include <boost/static_assert.hpp>#include <boost/serialization/static_warning.hpp>#include <boost/type_traits/is_pointer.hpp>#include <boost/type_traits/is_enum.hpp>//#include <boost/type_traits/is_volatile.hpp>#include <boost/type_traits/is_const.hpp>//#include <boost/type_traits/is_same.hpp>#include <boost/type_traits/is_polymorphic.hpp>#include <boost/type_traits/remove_extent.hpp>#include <boost/serialization/assume_abstract.hpp>#include <boost/mpl/eval_if.hpp>#include <boost/mpl/and.hpp>//#include <boost/mpl/less.hpp>#include <boost/mpl/greater_equal.hpp>#include <boost/mpl/equal_to.hpp>#include <boost/mpl/int.hpp>#include <boost/mpl/identity.hpp>//#include <boost/mpl/list.hpp>//#include <boost/mpl/empty.hpp>#include <boost/mpl/not.hpp> #ifndef BOOST_SERIALIZATION_DEFAULT_TYPE_INFO #include <boost/serialization/extended_type_info_typeid.hpp> #endif // the following is need only for dynamic cast of polymorphic pointers#include <boost/archive/detail/basic_oarchive.hpp>#include <boost/archive/detail/basic_oserializer.hpp>#include <boost/archive/detail/archive_pointer_oserializer.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/void_cast.hpp>#include <boost/serialization/array.hpp>#include <boost/serialization/collection_size_type.hpp>#include <boost/serialization/singleton.hpp>#include <boost/archive/archive_exception.hpp>namespace boost {namespace serialization { class extended_type_info;} // namespace serializationnamespace archive {// an accessor to permit friend access to archives. Needed because// some compilers don't handle friend templates completelyclass save_access {public: template<class Archive> static void end_preamble(Archive & ar){ ar.end_preamble(); } template<class Archive, class T> static void save_primitive(Archive & ar, const T & t){ ar.end_preamble(); ar.save(t); }};namespace detail {template<class Archive, class T>class oserializer : public basic_oserializer{private: // private constructor to inhibit any existence other than the // static onepublic: explicit BOOST_DLLEXPORT oserializer() : basic_oserializer( boost::serialization::type_info_implementation<T>::type ::get_const_instance() ) {} virtual BOOST_DLLEXPORT void save_object_data( basic_oarchive & ar, const void *x ) const BOOST_USED; virtual bool class_info() const { return boost::serialization::implementation_level<T>::value >= boost::serialization::object_class_info; } virtual bool tracking(const unsigned int /* flags */) const { return boost::serialization::tracking_level<T>::value == boost::serialization::track_always || (boost::serialization::tracking_level<T>::value == boost::serialization::track_selectively && serialized_as_pointer()); } virtual unsigned int version() const { return ::boost::serialization::version<T>::value; } virtual bool is_polymorphic() const { return boost::is_polymorphic<T>::value; } virtual ~oserializer(){}};template<class Archive, class T>BOOST_DLLEXPORT void oserializer<Archive, T>::save_object_data( basic_oarchive & ar, const void *x) const { // make sure call is routed through the highest interface that might // be specialized by the user. BOOST_STATIC_ASSERT(boost::is_const<T>::value == false); boost::serialization::serialize_adl( boost::serialization::smart_cast_reference<Archive &>(ar), * static_cast<T *>(const_cast<void *>(x)), version() );}template<class Archive, class T>class pointer_oserializer : public archive_pointer_oserializer<Archive>{ const basic_oserializer & get_basic_serializer() const;private: virtual BOOST_DLLEXPORT void save_object_ptr( basic_oarchive & ar, const void * x ) const BOOST_USED;public: explicit BOOST_DLLEXPORT pointer_oserializer() BOOST_USED;};template<class Archive, class T>const basic_oserializer & pointer_oserializer<Archive, T>::get_basic_serializer() const { return boost::serialization::singleton< oserializer<Archive, T> >::get_const_instance();}template<class Archive, class T>BOOST_DLLEXPORT void pointer_oserializer<Archive, T>::save_object_ptr( basic_oarchive & ar, const void * x) const { assert(NULL != x); // make sure call is routed through the highest interface that might // be specialized by the user. T * t = static_cast<T *>(const_cast<void *>(x)); const unsigned int file_version = boost::serialization::version<T>::value; Archive & ar_impl = boost::serialization::smart_cast_reference<Archive &>(ar); boost::serialization::save_construct_data_adl<Archive, T>( ar_impl, t, file_version ); ar_impl << boost::serialization::make_nvp(NULL, * t);}template<class Archive, class T>BOOST_DLLEXPORT pointer_oserializer<Archive, T>::pointer_oserializer() : archive_pointer_oserializer<Archive>( boost::serialization::type_info_implementation<T>::type ::get_const_instance() ){ // make sure appropriate member function is instantiated boost::serialization::singleton< oserializer<Archive, T> >::get_mutable_instance().set_bpos(this);}template<class Archive, class T>struct save_non_pointer_type { // note this bounces the call right back to the archive // with no runtime overhead struct save_primitive { static void invoke(Archive & ar, const T & t){ save_access::save_primitive(ar, t); } }; // same as above but passes through serialization struct save_only { static void invoke(Archive & ar, const T & t){ // make sure call is routed through the highest interface that might // be specialized by the user. boost::serialization::serialize_adl( ar, const_cast<T &>(t), ::boost::serialization::version<T>::value ); } }; // adds class information to the archive. This includes // serialization level and class version struct save_standard { static void invoke(Archive &ar, const T & t){ ar.save_object( & t, boost::serialization::singleton< oserializer<Archive, T> >::get_const_instance() ); } }; // adds class information to the archive. This includes // serialization level and class version struct save_conditional { static void invoke(Archive &ar, const T &t){ //if(0 == (ar.get_flags() & no_tracking)) save_standard::invoke(ar, t); //else // save_only::invoke(ar, t); } }; typedef BOOST_DEDUCED_TYPENAME mpl::eval_if< // if its primitive mpl::equal_to< boost::serialization::implementation_level<T>, mpl::int_<boost::serialization::primitive_type> >, mpl::identity<save_primitive>, // else BOOST_DEDUCED_TYPENAME mpl::eval_if< // class info / version mpl::greater_equal< boost::serialization::implementation_level<T>, mpl::int_<boost::serialization::object_class_info> >, // do standard save mpl::identity<save_standard>, // else BOOST_DEDUCED_TYPENAME mpl::eval_if< // no tracking mpl::equal_to< boost::serialization::tracking_level<T>, mpl::int_<boost::serialization::track_never> >,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?