27 #ifndef CEREAL_TYPES_BOOST_VARIANT_HPP_
28 #define CEREAL_TYPES_BOOST_VARIANT_HPP_
30 #include <cereal/cereal.hpp>
31 #include <boost/variant.hpp>
32 #include <boost/mpl/size.hpp>
36 namespace binary_detail
38 template <
class Archive>
44 void operator()(T
const & value)
const
46 ar( _CEREAL_NVP(
"data", value) );
52 template<
int N,
class Variant,
class ... Args,
class Archive>
53 typename std::enable_if<N == boost::mpl::size<typename Variant::types>::value,
void>::type
54 load_variant(Archive & ar,
int target, Variant & variant)
56 throw ::cereal::Exception(
"Error traversing variant during load");
59 template<
int N,
class Variant,
class H,
class ... T,
class Archive>
60 typename std::enable_if<N < boost::mpl::size<typename Variant::types>::value,
void>::type
61 load_variant(Archive & ar,
int target, Variant & variant)
70 load_variant<N+1, Variant, T...>(ar, target, variant);
76 template <
class Archive,
typename... VariantTypes>
inline
77 void save( Archive & ar, boost::variant<VariantTypes...>
const & variant )
79 int32_t which = variant.which();
80 ar( _CEREAL_NVP(
"which", which) );
81 binary_detail::variant_save_visitor<Archive> visitor(ar);
82 variant.apply_visitor(visitor);
86 template <
class Archive,
typename... VariantTypes>
inline
87 void load( Archive & ar, boost::variant<VariantTypes...> & variant )
89 typedef typename boost::variant<VariantTypes...>::types types;
93 if(which >= boost::mpl::size<types>::value)
94 throw Exception(
"Invalid 'which' selector when deserializing boost::variant");
96 binary_detail::load_variant<0, boost::variant<VariantTypes...>, VariantTypes...>(ar, which, variant);
100 #endif // CEREAL_TYPES_BOOST_VARIANT_HPP_