1 #ifndef TESSERACT_COMMON_STD_VARIANT_SERIALIZATION_H
2 #define TESSERACT_COMMON_STD_VARIANT_SERIALIZATION_H
4 #if BOOST_VERSION > 108300
5 #include <boost/serialization/std_variant.hpp>
22 #include <boost/serialization/throw_exception.hpp>
26 #include <boost/archive/archive_exception.hpp>
28 #include <boost/serialization/split_free.hpp>
29 #include <boost/serialization/serialization.hpp>
30 #include <boost/serialization/nvp.hpp>
34 namespace serialization
36 template <
class Archive>
43 m_ar << BOOST_SERIALIZATION_NVP(value);
50 template <
class Archive>
57 m_ar >> BOOST_SERIALIZATION_NVP(value);
64 template <
class Archive,
class... Types>
65 void save(Archive& ar, std::variant<Types...>
const& v,
unsigned int
68 const std::size_t which = v.index();
69 ar << BOOST_SERIALIZATION_NVP(which);
71 std::visit(visitor, v);
79 template <
typename Seq>
82 template <
template <
typename...>
class Seq,
typename T,
typename... Ts>
88 template <
typename Seq>
91 template <
template <
typename...>
class Seq,
typename T,
typename... Ts>
98 template <
typename... Ts>
103 template <
typename Seq>
106 template <
typename Seq>
110 template <std::
size_t N,
class Seq>
113 template <
class Archive,
class V>
114 static void load(Archive& ar, std::size_t which, V& v,
const unsigned int version)
124 ar >> BOOST_SERIALIZATION_NVP(value);
125 v = std::move(value);
126 type* new_address = &std::get<type>(v);
127 ar.reset_object_address(new_address, &value);
139 template <
class Archive,
class V>
140 static void load(Archive& , std::size_t , V& ,
const unsigned int
146 template <
class Archive,
class... Types>
147 void load(Archive& ar, std::variant<Types...>& v,
const unsigned int version)
150 ar >> BOOST_SERIALIZATION_NVP(which);
151 if (which >=
sizeof...(Types))
153 boost::serialization::throw_exception(
154 boost::archive::archive_exception(boost::archive::archive_exception::unsupported_version));
158 template <
class Archive,
class... Types>
159 inline void serialize(Archive& ar, std::variant<Types...>& v,
const unsigned int file_version)
161 split_free(ar, v, file_version);
165 template <
class Archive>
166 void serialize(Archive& ar, std::monostate&,
const unsigned int )
175 #include <boost/serialization/tracking.hpp>
179 namespace serialization
181 template <
class... Types>
182 struct tracking_level<std::variant<Types...> >
184 typedef mpl::integral_c_tag
tag;
185 typedef mpl::int_< ::boost::serialization::track_always>
type;
186 BOOST_STATIC_CONSTANT(
int, value = type::value);
194 #endif // TESSERACT_COMMON_STD_VARIANT_SERIALIZATION_H