mirror of
https://github.com/RPCS3/cereal.git
synced 2026-01-31 01:25:20 +01:00
MSVC variant support
This commit is contained in:
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user