145 lines
4.5 KiB
C++
145 lines
4.5 KiB
C++
|
#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
|