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
 | 
