146 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
#ifndef BOOST_SERIALIZATION_ACCESS_HPP
 | 
						|
#define BOOST_SERIALIZATION_ACCESS_HPP
 | 
						|
 | 
						|
// MS compatible compilers support #pragma once
 | 
						|
#if defined(_MSC_VER)
 | 
						|
# pragma once
 | 
						|
#endif
 | 
						|
 | 
						|
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
 | 
						|
// access.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 <boost/config.hpp>
 | 
						|
 | 
						|
namespace boost {
 | 
						|
 | 
						|
namespace archive {
 | 
						|
namespace detail {
 | 
						|
    template<class Archive, class T>
 | 
						|
    class iserializer;
 | 
						|
    template<class Archive, class T>
 | 
						|
    class oserializer;
 | 
						|
} // namespace detail
 | 
						|
} // namespace archive
 | 
						|
 | 
						|
namespace serialization {
 | 
						|
 | 
						|
// forward declarations
 | 
						|
template<class Archive, class T>
 | 
						|
inline void serialize_adl(Archive &, T &, const unsigned int);
 | 
						|
namespace detail {
 | 
						|
    template<class Archive, class T>
 | 
						|
    struct member_saver;
 | 
						|
    template<class Archive, class T>
 | 
						|
    struct member_loader;
 | 
						|
} // namespace detail
 | 
						|
 | 
						|
// use an "accessor class so that we can use: 
 | 
						|
// "friend class boost::serialization::access;" 
 | 
						|
// in any serialized class to permit clean, safe access to private class members
 | 
						|
// by the serialization system
 | 
						|
 | 
						|
class access {
 | 
						|
public:
 | 
						|
    // grant access to "real" serialization defaults
 | 
						|
#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
 | 
						|
public:
 | 
						|
#else
 | 
						|
    template<class Archive, class T>
 | 
						|
    friend struct detail::member_saver;
 | 
						|
    template<class Archive, class T>
 | 
						|
    friend struct detail::member_loader;
 | 
						|
    template<class Archive, class T>
 | 
						|
    friend class archive::detail::iserializer;
 | 
						|
    template<class Archive, class T>
 | 
						|
    friend class archive::detail::oserializer;
 | 
						|
    template<class Archive, class T>
 | 
						|
    friend inline void serialize(
 | 
						|
        Archive & ar, 
 | 
						|
        T & t, 
 | 
						|
        const unsigned int file_version
 | 
						|
    );
 | 
						|
    template<class Archive, class T>
 | 
						|
    friend inline void save_construct_data(
 | 
						|
        Archive & ar, 
 | 
						|
        const T * t, 
 | 
						|
        const unsigned int file_version
 | 
						|
    );
 | 
						|
    template<class Archive, class T>
 | 
						|
    friend inline void load_construct_data(
 | 
						|
        Archive & ar, 
 | 
						|
        T * t, 
 | 
						|
        const unsigned int file_version
 | 
						|
    );
 | 
						|
#endif
 | 
						|
 | 
						|
    // pass calls to users's class implementation
 | 
						|
    template<class Archive, class T>
 | 
						|
    static void member_save(
 | 
						|
        Archive & ar, 
 | 
						|
        //const T & t,
 | 
						|
        T & t,
 | 
						|
        const unsigned int file_version
 | 
						|
    ){
 | 
						|
        t.save(ar, file_version);
 | 
						|
    }
 | 
						|
    template<class Archive, class T>
 | 
						|
    static void member_load(
 | 
						|
        Archive & ar, 
 | 
						|
        T & t,
 | 
						|
        const unsigned int file_version
 | 
						|
    ){
 | 
						|
        t.load(ar, file_version);
 | 
						|
    }
 | 
						|
    template<class Archive, class T>
 | 
						|
    static void serialize(
 | 
						|
        Archive & ar, 
 | 
						|
        T & t, 
 | 
						|
        const unsigned int file_version
 | 
						|
    ){
 | 
						|
        // note: if you get a compile time error here with a
 | 
						|
        // message something like:
 | 
						|
        // cannot convert parameter 1 from <file type 1> to <file type 2 &>
 | 
						|
        // a likely possible cause is that the class T contains a 
 | 
						|
        // serialize function - but that serialize function isn't 
 | 
						|
        // a template and corresponds to a file type different than
 | 
						|
        // the class Archive.  To resolve this, don't include an
 | 
						|
        // archive type other than that for which the serialization
 | 
						|
        // function is defined!!!
 | 
						|
        t.serialize(ar, file_version);
 | 
						|
    }
 | 
						|
    template<class T>
 | 
						|
    static void destroy( const T * t) // const appropriate here?
 | 
						|
    {
 | 
						|
        // the const business is an MSVC 6.0 hack that should be
 | 
						|
        // benign on everything else
 | 
						|
        delete const_cast<T *>(t);
 | 
						|
    }
 | 
						|
    template<class T>
 | 
						|
    static void construct(T * t){
 | 
						|
        // default is inplace invocation of default constructor
 | 
						|
        // Note the :: before the placement new. Required if the
 | 
						|
        // class doesn't have a class-specific placement new defined.
 | 
						|
        ::new(t)T;
 | 
						|
    }
 | 
						|
    template<class T, class U>
 | 
						|
    static T & cast_reference(U & u){
 | 
						|
        return static_cast<T &>(u);
 | 
						|
    }
 | 
						|
    template<class T, class U>
 | 
						|
    static T * cast_pointer(U * u){
 | 
						|
        return static_cast<T *>(u);
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
} // namespace serialization
 | 
						|
} // namespace boost
 | 
						|
 | 
						|
#endif // BOOST_SERIALIZATION_ACCESS_HPP
 |