iserializer.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 551 行 · 第 1/2 页

HPP
551
字号
#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(511)#pragma inline_recursion(on)#endif#if defined(__MWERKS__)#pragma inline_depth(511)#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, NULL#include <boost/config.hpp>#include <boost/detail/workaround.hpp>#if defined(BOOST_NO_STDC_NAMESPACE)namespace std{     using ::size_t; } // namespace std#endif#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/detail/no_exceptions_support.hpp>#include <boost/type_traits/is_pointer.hpp>#include <boost/type_traits/is_enum.hpp>#include <boost/type_traits/is_const.hpp>#include <boost/type_traits/remove_const.hpp>#include <boost/type_traits/remove_extent.hpp>#include <boost/serialization/assume_abstract.hpp>#include <boost/type_traits/is_polymorphic.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>#include <boost/mpl/bool.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_iarchive.hpp>#include <boost/archive/detail/basic_iserializer.hpp>#include <boost/archive/detail/archive_pointer_iserializer.hpp>#include <boost/archive/archive_exception.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>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 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));    }    // private constructor to inhibit any existence other than the     // static onepublic:    explicit iserializer() :        basic_iserializer(            boost::serialization::type_info_implementation<T>::type                ::get_const_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 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 ~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(        boost::serialization::smart_cast_reference<Archive &>(ar),        * static_cast<T *>(x),         file_version    );}template<class Archive, class T>class pointer_iserializer  : public archive_pointer_iserializer<Archive>{private:    virtual const basic_iserializer & get_basic_serializer() const {        return boost::serialization::singleton<            iserializer<Archive, T>        >::get_const_instance();    }    BOOST_DLLEXPORT virtual void load_object_ptr(        basic_iarchive & ar,         void * & x,        const unsigned int file_version    ) const BOOST_USED;public:    pointer_iserializer();};// 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>BOOST_DLLEXPORT void pointer_iserializer<Archive, T>::load_object_ptr(    basic_iarchive & ar,     void * & x,    const unsigned int file_version) const{    Archive & ar_impl =         boost::serialization::smart_cast_reference<Archive &>(ar);    auto_ptr_with_deleter<T> ap(heap_allocator<T>::invoke());    if(NULL == ap.get())        boost::serialization::throw_exception(std::bad_alloc()) ;    T * t = ap.get();    x = t;    // catch exception during load_construct_data so that we don't    // automatically delete the t which is most likely not fully    // constructed    BOOST_TRY {        // this addresses an obscure situtation that occurs when         // load_constructor de-serializes something through a pointer.        ar.next_object_pointer(t);        boost::serialization::load_construct_data_adl<Archive, T>(            ar_impl,            t,             file_version        );

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?