upstream: remove serialization for tools::variant and add std::variant
This commit is contained in:
+43
-10
@@ -38,11 +38,10 @@
|
||||
|
||||
#include <boost/variant/variant.hpp>
|
||||
#include <boost/variant/apply_visitor.hpp>
|
||||
#include <boost/variant/static_visitor.hpp>
|
||||
#include <boost/mpl/empty.hpp>
|
||||
#include <boost/mpl/if.hpp>
|
||||
#include <boost/mpl/front.hpp>
|
||||
#include <boost/mpl/pop_front.hpp>
|
||||
#include <boost/mpl/vector.hpp>
|
||||
|
||||
#include <variant>
|
||||
|
||||
#include "serialization.h"
|
||||
|
||||
/*! \struct variant_serialization_triats
|
||||
@@ -100,13 +99,41 @@ struct variant_reader<Archive, Variant, TBegin, TBegin>
|
||||
}
|
||||
};
|
||||
|
||||
template <template <bool> class Archive, typename... T>
|
||||
static bool do_serialize(Archive<false> &ar, boost::variant<T...> &v) {
|
||||
using types = typename boost::variant<T...>::types;
|
||||
namespace detail
|
||||
{
|
||||
template <typename T>
|
||||
struct is_variant_like: std::false_type {};
|
||||
|
||||
template <typename... T>
|
||||
struct is_variant_like<boost::variant<T...>>: std::true_type {};
|
||||
|
||||
template <typename... T>
|
||||
struct is_variant_like<std::variant<T...>>: std::true_type {};
|
||||
|
||||
template <typename T>
|
||||
struct get_variant_types {};
|
||||
|
||||
template <typename... T>
|
||||
struct get_variant_types<boost::variant<T...>>
|
||||
{ using types = typename boost::variant<T...>::types; };
|
||||
|
||||
template <typename... T>
|
||||
struct get_variant_types<std::variant<T...>>
|
||||
{ using types = boost::mpl::vector<T...>; };
|
||||
|
||||
} //namespace detail
|
||||
|
||||
template <
|
||||
template <bool> class Archive,
|
||||
typename Variant,
|
||||
typename = std::enable_if_t<detail::is_variant_like<Variant>::value>
|
||||
>
|
||||
static bool do_serialize(Archive<false> &ar, Variant &v) {
|
||||
using types = typename detail::get_variant_types<Variant>::types;
|
||||
typename Archive<false>::variant_tag_type t;
|
||||
ar.begin_variant();
|
||||
ar.read_variant_tag(t);
|
||||
if(!variant_reader<Archive<false>, boost::variant<T...>,
|
||||
if(!variant_reader<Archive<false>, Variant,
|
||||
typename boost::mpl::begin<types>::type,
|
||||
typename boost::mpl::end<types>::type>::read(ar, v, t))
|
||||
{
|
||||
@@ -118,7 +145,7 @@ static bool do_serialize(Archive<false> &ar, boost::variant<T...> &v) {
|
||||
}
|
||||
|
||||
template <template <bool> class Archive>
|
||||
struct variant_write_visitor : public boost::static_visitor<bool>
|
||||
struct variant_write_visitor
|
||||
{
|
||||
Archive<true> &ar;
|
||||
|
||||
@@ -144,3 +171,9 @@ static bool do_serialize(Archive<true> &ar, boost::variant<T...> &v)
|
||||
{
|
||||
return boost::apply_visitor(variant_write_visitor<Archive>(ar), v);
|
||||
}
|
||||
|
||||
template <template <bool> class Archive, typename... T>
|
||||
static bool do_serialize(Archive<true> &ar, std::variant<T...> &v)
|
||||
{
|
||||
return std::visit(variant_write_visitor<Archive>(ar), v);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user