annotate DEPENDENCIES/generic/include/boost/serialization/variant.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children c530137014c0
rev   line source
Chris@16 1 #ifndef BOOST_SERIALIZATION_VARIANT_HPP
Chris@16 2 #define BOOST_SERIALIZATION_VARIANT_HPP
Chris@16 3
Chris@16 4 // MS compatible compilers support #pragma once
Chris@16 5 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
Chris@16 6 # pragma once
Chris@16 7 #endif
Chris@16 8
Chris@16 9 #if defined(_MSC_VER) && (_MSC_VER <= 1020)
Chris@16 10 # pragma warning (disable : 4786) // too long name, harmless warning
Chris@16 11 #endif
Chris@16 12
Chris@16 13 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
Chris@16 14 // variant.hpp - non-intrusive serialization of variant types
Chris@16 15 //
Chris@16 16 // copyright (c) 2005
Chris@16 17 // troy d. straszheim <troy@resophonic.com>
Chris@16 18 // http://www.resophonic.com
Chris@16 19 //
Chris@16 20 // Use, modification and distribution is subject to the Boost Software
Chris@16 21 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 22 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 23 //
Chris@16 24 // See http://www.boost.org for updates, documentation, and revision history.
Chris@16 25 //
Chris@16 26 // thanks to Robert Ramey, Peter Dimov, and Richard Crossley.
Chris@16 27 //
Chris@16 28
Chris@16 29 #include <boost/mpl/front.hpp>
Chris@16 30 #include <boost/mpl/pop_front.hpp>
Chris@16 31 #include <boost/mpl/eval_if.hpp>
Chris@16 32 #include <boost/mpl/identity.hpp>
Chris@16 33 #include <boost/mpl/size.hpp>
Chris@16 34 #include <boost/mpl/empty.hpp>
Chris@16 35
Chris@16 36 #include <boost/serialization/throw_exception.hpp>
Chris@16 37
Chris@16 38 #include <boost/variant.hpp>
Chris@16 39
Chris@16 40 #include <boost/archive/archive_exception.hpp>
Chris@16 41
Chris@16 42 #include <boost/serialization/split_free.hpp>
Chris@16 43 #include <boost/serialization/serialization.hpp>
Chris@16 44 #include <boost/serialization/nvp.hpp>
Chris@16 45
Chris@16 46 namespace boost {
Chris@16 47 namespace serialization {
Chris@16 48
Chris@16 49 template<class Archive>
Chris@16 50 struct variant_save_visitor :
Chris@16 51 boost::static_visitor<>
Chris@16 52 {
Chris@16 53 variant_save_visitor(Archive& ar) :
Chris@16 54 m_ar(ar)
Chris@16 55 {}
Chris@16 56 template<class T>
Chris@16 57 void operator()(T const & value) const
Chris@16 58 {
Chris@16 59 m_ar << BOOST_SERIALIZATION_NVP(value);
Chris@16 60 }
Chris@16 61 private:
Chris@16 62 Archive & m_ar;
Chris@16 63 };
Chris@16 64
Chris@16 65 template<class Archive, BOOST_VARIANT_ENUM_PARAMS(/* typename */ class T)>
Chris@16 66 void save(
Chris@16 67 Archive & ar,
Chris@16 68 boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> const & v,
Chris@16 69 unsigned int /*version*/
Chris@16 70 ){
Chris@16 71 int which = v.which();
Chris@16 72 ar << BOOST_SERIALIZATION_NVP(which);
Chris@16 73 typedef BOOST_DEDUCED_TYPENAME boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>::types types;
Chris@16 74 variant_save_visitor<Archive> visitor(ar);
Chris@16 75 v.apply_visitor(visitor);
Chris@16 76 }
Chris@16 77
Chris@16 78 template<class S>
Chris@16 79 struct variant_impl {
Chris@16 80
Chris@16 81 struct load_null {
Chris@16 82 template<class Archive, class V>
Chris@16 83 static void invoke(
Chris@16 84 Archive & /*ar*/,
Chris@16 85 int /*which*/,
Chris@16 86 V & /*v*/,
Chris@16 87 const unsigned int /*version*/
Chris@16 88 ){}
Chris@16 89 };
Chris@16 90
Chris@16 91 struct load_impl {
Chris@16 92 template<class Archive, class V>
Chris@16 93 static void invoke(
Chris@16 94 Archive & ar,
Chris@16 95 int which,
Chris@16 96 V & v,
Chris@16 97 const unsigned int version
Chris@16 98 ){
Chris@16 99 if(which == 0){
Chris@16 100 // note: A non-intrusive implementation (such as this one)
Chris@16 101 // necessary has to copy the value. This wouldn't be necessary
Chris@16 102 // with an implementation that de-serialized to the address of the
Chris@16 103 // aligned storage included in the variant.
Chris@16 104 typedef BOOST_DEDUCED_TYPENAME mpl::front<S>::type head_type;
Chris@16 105 head_type value;
Chris@16 106 ar >> BOOST_SERIALIZATION_NVP(value);
Chris@16 107 v = value;
Chris@16 108 ar.reset_object_address(& boost::get<head_type>(v), & value);
Chris@16 109 return;
Chris@16 110 }
Chris@16 111 typedef BOOST_DEDUCED_TYPENAME mpl::pop_front<S>::type type;
Chris@16 112 variant_impl<type>::load(ar, which - 1, v, version);
Chris@16 113 }
Chris@16 114 };
Chris@16 115
Chris@16 116 template<class Archive, class V>
Chris@16 117 static void load(
Chris@16 118 Archive & ar,
Chris@16 119 int which,
Chris@16 120 V & v,
Chris@16 121 const unsigned int version
Chris@16 122 ){
Chris@16 123 typedef BOOST_DEDUCED_TYPENAME mpl::eval_if<mpl::empty<S>,
Chris@16 124 mpl::identity<load_null>,
Chris@16 125 mpl::identity<load_impl>
Chris@16 126 >::type typex;
Chris@16 127 typex::invoke(ar, which, v, version);
Chris@16 128 }
Chris@16 129
Chris@16 130 };
Chris@16 131
Chris@16 132 template<class Archive, BOOST_VARIANT_ENUM_PARAMS(/* typename */ class T)>
Chris@16 133 void load(
Chris@16 134 Archive & ar,
Chris@16 135 boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>& v,
Chris@16 136 const unsigned int version
Chris@16 137 ){
Chris@16 138 int which;
Chris@16 139 typedef BOOST_DEDUCED_TYPENAME boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>::types types;
Chris@16 140 ar >> BOOST_SERIALIZATION_NVP(which);
Chris@16 141 if(which >= mpl::size<types>::value)
Chris@16 142 // this might happen if a type was removed from the list of variant types
Chris@16 143 boost::serialization::throw_exception(
Chris@16 144 boost::archive::archive_exception(
Chris@16 145 boost::archive::archive_exception::unsupported_version
Chris@16 146 )
Chris@16 147 );
Chris@16 148 variant_impl<types>::load(ar, which, v, version);
Chris@16 149 }
Chris@16 150
Chris@16 151 template<class Archive,BOOST_VARIANT_ENUM_PARAMS(/* typename */ class T)>
Chris@16 152 inline void serialize(
Chris@16 153 Archive & ar,
Chris@16 154 boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> & v,
Chris@16 155 const unsigned int file_version
Chris@16 156 ){
Chris@16 157 split_free(ar,v,file_version);
Chris@16 158 }
Chris@16 159
Chris@16 160 } // namespace serialization
Chris@16 161 } // namespace boost
Chris@16 162
Chris@16 163 #endif //BOOST_SERIALIZATION_VARIANT_HPP