From ab612d0f18ff545b4ebcb2bf2bb400996e751181 Mon Sep 17 00:00:00 2001 From: Kevin Smith Date: Thu, 29 May 2014 16:56:31 +0100 Subject: Add boost::optional serialization Needed by one of Richard's pending patches Change-Id: I64f6ab56065a51019a2d0c826e1bde6856970994 diff --git a/3rdParty/Boost/src/boost/serialization/optional.hpp b/3rdParty/Boost/src/boost/serialization/optional.hpp new file mode 100644 index 0000000..929fa07 --- /dev/null +++ b/3rdParty/Boost/src/boost/serialization/optional.hpp @@ -0,0 +1,127 @@ +/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 + +// (C) Copyright 2002-4 Pavel Vozenilek . +// 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) + +// Provides non-intrusive serialization for boost::optional. + +#ifndef BOOST_SERIALIZATION_OPTIONAL_HPP_ +#define BOOST_SERIALIZATION_OPTIONAL_HPP_ + +#if defined(_MSC_VER) && (_MSC_VER >= 1020) +# pragma once +#endif + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +// function specializations must be defined in the appropriate +// namespace - boost::serialization +namespace boost { +namespace serialization { + +template +void save( + Archive & ar, + const boost::optional< T > & t, + const unsigned int /*version*/ +){ + const bool tflag = t.is_initialized(); + ar << boost::serialization::make_nvp("initialized", tflag); + if (tflag){ + const boost::serialization::item_version_type item_version(version< T >::value); + #if 0 + const boost::archive::library_version_type library_version( + ar.get_library_version() + }; + if(boost::archive::library_version_type(3) < library_version){ + ar << BOOST_SERIALIZATION_NVP(item_version); + } + #else + ar << BOOST_SERIALIZATION_NVP(item_version); + #endif + ar << boost::serialization::make_nvp("value", *t); + } +} + +template +void load( + Archive & ar, + boost::optional< T > & t, + const unsigned int /*version*/ +){ + bool tflag; + ar >> boost::serialization::make_nvp("initialized", tflag); + if (tflag){ + boost::serialization::item_version_type item_version(0); + boost::archive::library_version_type library_version( + ar.get_library_version() + ); + if(boost::archive::library_version_type(3) < library_version){ + // item_version is handled as an attribute so it doesnt need an NVP + ar >> BOOST_SERIALIZATION_NVP(item_version); + } + detail::stack_construct aux(ar, item_version); + ar >> boost::serialization::make_nvp("value", aux.reference()); + t.reset(aux.reference()); + } + else { + t.reset(); + } +} + +template +void serialize( + Archive & ar, + boost::optional< T > & t, + const unsigned int version +){ + boost::serialization::split_free(ar, t, version); +} + +// the following would be slightly more efficient. But it +// would mean that archives created with programs that support +// TPS wouldn't be readable by programs that don't support TPS. +// Hence we decline to support this otherwise convenient optimization. +//#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +#if 0 + +template +struct implementation_level > +{ + typedef mpl::integral_c_tag tag; + typedef mpl::int_ type; + BOOST_STATIC_CONSTANT( + int , + value = boost::serialization::implementation_level::type::value + ); +}; + +template +struct tracking_level > +{ + typedef mpl::integral_c_tag tag; + typedef mpl::int_ type; + BOOST_STATIC_CONSTANT( + int , + value = boost::serialization::tracking_level::type::value + ); +}; + +#endif + +} // serialization +} // namespace boost + +#endif // BOOST_SERIALIZATION_OPTIONAL_HPP_ diff --git a/3rdParty/Boost/update.sh b/3rdParty/Boost/update.sh index 7996dfb..2fe348c 100755 --- a/3rdParty/Boost/update.sh +++ b/3rdParty/Boost/update.sh @@ -50,6 +50,7 @@ fi serialization/set.hpp \ serialization/version.hpp \ serialization/split_member.hpp \ + serialization/optional.hpp \ signals.hpp \ thread.hpp \ unordered_map.hpp \ -- cgit v0.10.2-6-g49f6