MSVC variant support

This commit is contained in:
Shane Grant
2019-10-20 19:24:14 -07:00
parent 6ccd33fe37
commit 7fcfa29353

View File

@@ -60,16 +60,6 @@ namespace cereal
Archive & ar;
};
//! @internal
template<class T, class Variant, class Archive>
typename std::enable_if<std::is_default_constructible<T>::value>::type
load_variant(Archive & ar, Variant & variant)
{
T value;
ar( CEREAL_NVP_("data", value) );
variant = std::move(value);
}
//! @internal
template <class Archive, class T>
struct LoadAndConstructLoadWrapper
@@ -98,15 +88,48 @@ namespace cereal
};
//! @internal
template<class T, class Variant, class Archive>
typename std::enable_if<!std::is_default_constructible<T>::value>::type
load_variant(Archive & ar, Variant & variant)
{
LoadAndConstructLoadWrapper<Archive, T> loadWrapper;
template <class T> struct load_variant_wrapper;
ar( CEREAL_NVP_("data", loadWrapper) );
variant = std::move(*loadWrapper.construct.ptr());
}
//! Avoid serializing variant void_ type
/*! @internal */
template <>
struct load_variant_wrapper<boost::detail::variant::void_>
{
template <class Variant, class Archive>
static void load_variant( Archive &, Variant & )
{ }
};
//! @internal
template <class T>
struct load_variant_wrapper
{
// default constructible
template <class Archive, class Variant>
static void load_variant_impl( Archive & ar, Variant & variant, std::true_type )
{
T value;
ar( CEREAL_NVP_("data", value) );
variant = std::move(value);
}
// not default constructible
template<class Variant, class Archive>
static void load_variant_impl(Archive & ar, Variant & variant, std::false_type )
{
LoadAndConstructLoadWrapper<Archive, T> loadWrapper;
ar( CEREAL_NVP_("data", loadWrapper) );
variant = std::move(*loadWrapper.construct.ptr());
}
//! @internal
template<class Variant, class Archive>
static void load_variant(Archive & ar, Variant & variant)
{
load_variant_impl( ar, variant, typename std::is_default_constructible<T>::type() );
}
};
} // namespace boost_variant_detail
//! Saving for boost::variant
@@ -127,7 +150,7 @@ namespace cereal
ar( CEREAL_NVP_("which", which) );
using LoadFuncType = void(*)(Archive &, boost::variant<VariantTypes...> &);
CEREAL_CONSTEXPR_LAMBDA LoadFuncType loadFuncArray[] = {&boost_variant_detail::load_variant<VariantTypes>...};
CEREAL_CONSTEXPR_LAMBDA LoadFuncType loadFuncArray[] = {&boost_variant_detail::load_variant_wrapper<VariantTypes>::load_variant...};
if(which >= int32_t(sizeof(loadFuncArray)/sizeof(loadFuncArray[0])))
throw Exception("Invalid 'which' selector when deserializing boost::variant");