124 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			124 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								#ifndef BOOST_SERIALIZATION_NVP_HPP
							 | 
						||
| 
								 | 
							
								#define BOOST_SERIALIZATION_NVP_HPP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// MS compatible compilers support #pragma once
							 | 
						||
| 
								 | 
							
								#if defined(_MSC_VER)
							 | 
						||
| 
								 | 
							
								# pragma once
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
							 | 
						||
| 
								 | 
							
								// nvp.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 <utility>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/config.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/detail/workaround.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/serialization/level.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/serialization/tracking.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/serialization/split_member.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/serialization/base_object.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/serialization/traits.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/serialization/wrapper.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost {
							 | 
						||
| 
								 | 
							
								namespace serialization {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<class T>
							 | 
						||
| 
								 | 
							
								struct nvp : 
							 | 
						||
| 
								 | 
							
								    public std::pair<const char *, T *>,
							 | 
						||
| 
								 | 
							
								    public wrapper_traits<const nvp< T > >
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								//private:
							 | 
						||
| 
								 | 
							
								    nvp(const nvp & rhs) :
							 | 
						||
| 
								 | 
							
								        std::pair<const char *, T *>(rhs.first, rhs.second)
							 | 
						||
| 
								 | 
							
								    {}
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
								    explicit nvp(const char * name_, T & t) :
							 | 
						||
| 
								 | 
							
								        // note: added _ to suppress useless gcc warning
							 | 
						||
| 
								 | 
							
								        std::pair<const char *, T *>(name_, & t)
							 | 
						||
| 
								 | 
							
								    {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const char * name() const {
							 | 
						||
| 
								 | 
							
								        return this->first;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    T & value() const {
							 | 
						||
| 
								 | 
							
								        return *(this->second);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const T & const_value() const {
							 | 
						||
| 
								 | 
							
								        return *(this->second);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template<class Archive>
							 | 
						||
| 
								 | 
							
								    void save(
							 | 
						||
| 
								 | 
							
								        Archive & ar,
							 | 
						||
| 
								 | 
							
								        const unsigned int /* file_version */
							 | 
						||
| 
								 | 
							
								    ) const {
							 | 
						||
| 
								 | 
							
								        ar.operator<<(const_value());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    template<class Archive>
							 | 
						||
| 
								 | 
							
								    void load(
							 | 
						||
| 
								 | 
							
								        Archive & ar,
							 | 
						||
| 
								 | 
							
								        const unsigned int /* file_version */
							 | 
						||
| 
								 | 
							
								    ){
							 | 
						||
| 
								 | 
							
								        ar.operator>>(value());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    BOOST_SERIALIZATION_SPLIT_MEMBER()
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<class T>
							 | 
						||
| 
								 | 
							
								inline
							 | 
						||
| 
								 | 
							
								const nvp< T > make_nvp(const char * name, T & t){
							 | 
						||
| 
								 | 
							
								    return nvp< T >(name, t);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// to maintain efficiency and portability, we want to assign
							 | 
						||
| 
								 | 
							
								// specific serialization traits to all instances of this wrappers.
							 | 
						||
| 
								 | 
							
								// we can't strait forward method below as it depends upon
							 | 
						||
| 
								 | 
							
								// Partial Template Specialization and doing so would mean that wrappers
							 | 
						||
| 
								 | 
							
								// wouldn't be treated the same on different platforms.  This would
							 | 
						||
| 
								 | 
							
								// break archive portability. Leave this here as reminder not to use it !!!
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <class T>
							 | 
						||
| 
								 | 
							
								struct implementation_level<nvp< T > >
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    typedef mpl::integral_c_tag tag;
							 | 
						||
| 
								 | 
							
								    typedef mpl::int_<object_serializable> type;
							 | 
						||
| 
								 | 
							
								    BOOST_STATIC_CONSTANT(int, value = implementation_level::type::value);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// nvp objects are generally created on the stack and are never tracked
							 | 
						||
| 
								 | 
							
								template<class T>
							 | 
						||
| 
								 | 
							
								struct tracking_level<nvp< T > >
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    typedef mpl::integral_c_tag tag;
							 | 
						||
| 
								 | 
							
								    typedef mpl::int_<track_never> type;
							 | 
						||
| 
								 | 
							
								    BOOST_STATIC_CONSTANT(int, value = tracking_level::type::value);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								} // seralization
							 | 
						||
| 
								 | 
							
								} // boost
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/preprocessor/stringize.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define BOOST_SERIALIZATION_NVP(name)                              \
							 | 
						||
| 
								 | 
							
								    boost::serialization::make_nvp(BOOST_PP_STRINGIZE(name), name)
							 | 
						||
| 
								 | 
							
								/**/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define BOOST_SERIALIZATION_BASE_OBJECT_NVP(name)                  \
							 | 
						||
| 
								 | 
							
								    boost::serialization::make_nvp(                                \
							 | 
						||
| 
								 | 
							
								        BOOST_PP_STRINGIZE(name),                                  \
							 | 
						||
| 
								 | 
							
								        boost::serialization::base_object<name >(*this)            \
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								/**/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif // BOOST_SERIALIZATION_NVP_HPP
							 |