#ifndef BOOST_SERIALIZATION_NVP_HPP | |
#define BOOST_SERIALIZATION_NVP_HPP | |
// MS compatible compilers support #pragma once | |
#if defined(_MSC_VER) && (_MSC_VER >= 1020) | |
# 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> | |
// supress noise | |
#if BOOST_WORKAROUND(BOOST_MSVC, <= 1200) | |
# pragma warning (disable : 4786) // too long name, harmless warning | |
#endif | |
#include <boost/mpl/integral_c.hpp> | |
#include <boost/mpl/integral_c_tag.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 > > | |
{ | |
explicit nvp(const char * name_, T & t) : | |
// note: redundant cast works around borland issue | |
// note: added _ to suppress useless gcc warning | |
std::pair<const char *, T *>(name_, (T*)(& t)) | |
{} | |
nvp(const nvp & rhs) : | |
// note: redundant cast works around borland issue | |
std::pair<const char *, T *>(rhs.first, (T*)rhs.second) | |
{} | |
const char * name() const { | |
return this->first; | |
} | |
T & value() const { | |
return *(this->second); | |
} | |
const T & const_value() const { | |
return *(this->second); | |
} | |
// True64 compiler complains with a warning about the use of | |
// the name "Archive" hiding some higher level usage. I'm sure this | |
// is an error but I want to accomodated as it generates a long warning | |
// listing and might be related to a lot of test failures. | |
// default treatment for name-value pairs. The name is | |
// just discarded and only the value is serialized. | |
template<class Archivex> | |
void save( | |
Archivex & ar, | |
const unsigned int /* file_version */ | |
) const { | |
// CodeWarrior 8.x can't seem to resolve the << op for a rhs of "const T *" | |
ar.operator<<(const_value()); | |
} | |
template<class Archivex> | |
void load( | |
Archivex & ar, | |
const unsigned int /* file_version */ | |
){ | |
// CodeWarrior 8.x can't seem to resolve the >> op for a rhs of "const T *" | |
ar.operator>>(value()); | |
} | |
BOOST_SERIALIZATION_SPLIT_MEMBER() | |
}; | |
template<class T> | |
inline | |
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING | |
const | |
#endif | |
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 !!! | |
#if 0 // #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION | |
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); | |
}; | |
#endif | |
} // 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 |