annotate DEPENDENCIES/generic/include/boost/serialization/variant.hpp @ 133:4acb5d8d80b6 tip

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