std_variant_serialization.h
Go to the documentation of this file.
1 #ifndef TESSERACT_COMMON_STD_VARIANT_SERIALIZATION_H
2 #define TESSERACT_COMMON_STD_VARIANT_SERIALIZATION_H
3 
4 #if BOOST_VERSION > 108300
5 #include <boost/serialization/std_variant.hpp>
6 #else
7 
9 // variant.hpp - non-intrusive serialization of variant types
10 //
11 // copyright (c) 2019 Samuel Debionne, ESRF
12 //
13 // Use, modification and distribution is subject to the Boost Software
14 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
15 // http://www.boost.org/LICENSE_1_0.txt)
16 //
17 // See http://www.boost.org for updates, documentation, and revision history.
18 //
19 // Widely inspired form boost::variant serialization
20 //
21 
22 #include <boost/serialization/throw_exception.hpp>
23 
24 #include <variant>
25 
26 #include <boost/archive/archive_exception.hpp>
27 
28 #include <boost/serialization/split_free.hpp>
29 #include <boost/serialization/serialization.hpp>
30 #include <boost/serialization/nvp.hpp>
31 
32 namespace boost
33 {
34 namespace serialization
35 {
36 template <class Archive>
38 {
39  std_variant_save_visitor(Archive& ar) : m_ar(ar) {}
40  template <class T>
41  void operator()(T const& value) const
42  {
43  m_ar << BOOST_SERIALIZATION_NVP(value);
44  }
45 
46 private:
47  Archive& m_ar;
48 };
49 
50 template <class Archive>
52 {
53  std_variant_load_visitor(Archive& ar) : m_ar(ar) {}
54  template <class T>
55  void operator()(T& value) const
56  {
57  m_ar >> BOOST_SERIALIZATION_NVP(value);
58  }
59 
60 private:
61  Archive& m_ar;
62 };
63 
64 template <class Archive, class... Types>
65 void save(Archive& ar, std::variant<Types...> const& v, unsigned int /*version*/
66 )
67 {
68  const std::size_t which = v.index();
69  ar << BOOST_SERIALIZATION_NVP(which);
71  std::visit(visitor, v);
72 }
73 
74 // Minimalist metaprogramming for handling parameter pack
75 namespace mp
76 {
77 namespace detail
78 {
79 template <typename Seq>
80 struct front_impl;
81 
82 template <template <typename...> class Seq, typename T, typename... Ts>
83 struct front_impl<Seq<T, Ts...> >
84 {
85  using type = T;
86 };
87 
88 template <typename Seq>
90 
91 template <template <typename...> class Seq, typename T, typename... Ts>
92 struct pop_front_impl<Seq<T, Ts...> >
93 {
94  using type = Seq<Ts...>;
95 };
96 } // namespace detail
97 
98 template <typename... Ts>
99 struct typelist
100 {
101 };
102 
103 template <typename Seq>
105 
106 template <typename Seq>
108 } // namespace mp
109 
110 template <std::size_t N, class Seq>
112 {
113  template <class Archive, class V>
114  static void load(Archive& ar, std::size_t which, V& v, const unsigned int version)
115  {
116  if (which == 0)
117  {
118  // note: A non-intrusive implementation (such as this one)
119  // necessary has to copy the value. This wouldn't be necessary
120  // with an implementation that de-serialized to the address of the
121  // aligned storage included in the variant.
122  using type = mp::front<Seq>;
123  type value;
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);
128  return;
129  }
130  // typedef typename mpl::pop_front<S>::type type;
131  using types = mp::pop_front<Seq>;
132  variant_impl<N - 1, types>::load(ar, which - 1, v, version);
133  }
134 };
135 
136 template <class Seq>
137 struct variant_impl<0, Seq>
138 {
139  template <class Archive, class V>
140  static void load(Archive& /*ar*/, std::size_t /*which*/, V& /*v*/, const unsigned int /*version*/
141  )
142  {
143  }
144 };
145 
146 template <class Archive, class... Types>
147 void load(Archive& ar, std::variant<Types...>& v, const unsigned int version)
148 {
149  std::size_t which;
150  ar >> BOOST_SERIALIZATION_NVP(which);
151  if (which >= sizeof...(Types))
152  // this might happen if a type was removed from the list of variant types
153  boost::serialization::throw_exception(
154  boost::archive::archive_exception(boost::archive::archive_exception::unsupported_version));
155  variant_impl<sizeof...(Types), mp::typelist<Types...> >::load(ar, which, v, version);
156 }
157 
158 template <class Archive, class... Types>
159 inline void serialize(Archive& ar, std::variant<Types...>& v, const unsigned int file_version)
160 {
161  split_free(ar, v, file_version);
162 }
163 
164 // Specialization for std::monostate
165 template <class Archive>
166 void serialize(Archive& ar, std::monostate&, const unsigned int /*version*/)
167 {
168 }
169 
170 } // namespace serialization
171 } // namespace boost
172 
173 // template<typename T0_, BOOST_VARIANT_ENUM_SHIFTED_PARAMS(typename T)>
174 
175 #include <boost/serialization/tracking.hpp>
176 
177 namespace boost
178 {
179 namespace serialization
180 {
181 template <class... Types>
182 struct tracking_level<std::variant<Types...> >
183 {
184  typedef mpl::integral_c_tag tag;
185  typedef mpl::int_< ::boost::serialization::track_always> type;
186  BOOST_STATIC_CONSTANT(int, value = type::value);
187 };
188 
189 } // namespace serialization
190 } // namespace boost
191 
192 #endif
193 
194 #endif // TESSERACT_COMMON_STD_VARIANT_SERIALIZATION_H
boost::serialization::mp::typelist
Definition: std_variant_serialization.h:99
boost::serialization::mp::front
typename detail::front_impl< Seq >::type front
Definition: std_variant_serialization.h:104
boost::serialization::std_variant_save_visitor::m_ar
Archive & m_ar
Definition: std_variant_serialization.h:47
boost::serialization::load
void load(Archive &ar, std::atomic< T > &t, const unsigned int)
Definition: atomic_serialization.h:49
boost::serialization::serialize
void serialize(Archive &ar, std::atomic< T > &t, const unsigned int version)
Definition: atomic_serialization.h:57
boost::serialization::std_variant_save_visitor
Definition: std_variant_serialization.h:37
boost::serialization::mp::detail::pop_front_impl< Seq< T, Ts... > >::type
Seq< Ts... > type
Definition: std_variant_serialization.h:94
boost
Definition: allowed_collision_matrix.h:14
boost::serialization::std_variant_save_visitor::std_variant_save_visitor
std_variant_save_visitor(Archive &ar)
Definition: std_variant_serialization.h:39
boost::serialization::mp::pop_front
typename detail::pop_front_impl< Seq >::type pop_front
Definition: std_variant_serialization.h:107
boost::serialization::variant_impl::load
static void load(Archive &ar, std::size_t which, V &v, const unsigned int version)
Definition: std_variant_serialization.h:114
boost::serialization::std_variant_load_visitor::m_ar
Archive & m_ar
Definition: std_variant_serialization.h:61
boost::serialization::mp::detail::front_impl< Seq< T, Ts... > >::type
T type
Definition: std_variant_serialization.h:85
boost::serialization::tracking_level< std::variant< Types... > >::type
mpl::int_< ::boost::serialization::track_always > type
Definition: std_variant_serialization.h:185
boost::serialization::std_variant_load_visitor::operator()
void operator()(T &value) const
Definition: std_variant_serialization.h:55
boost::serialization::std_variant_load_visitor
Definition: std_variant_serialization.h:51
boost::serialization::std_variant_load_visitor::std_variant_load_visitor
std_variant_load_visitor(Archive &ar)
Definition: std_variant_serialization.h:53
boost::serialization::variant_impl
Definition: std_variant_serialization.h:111
boost::serialization::tracking_level< std::variant< Types... > >::tag
mpl::integral_c_tag tag
Definition: std_variant_serialization.h:184
type
type
boost::serialization::mp::detail::front_impl
Definition: std_variant_serialization.h:80
boost::serialization::variant_impl< 0, Seq >::load
static void load(Archive &, std::size_t, V &, const unsigned int)
Definition: std_variant_serialization.h:140
boost::serialization::std_variant_save_visitor::operator()
void operator()(T const &value) const
Definition: std_variant_serialization.h:41
boost::serialization::save
void save(Archive &ar, const std::atomic< T > &t, const unsigned int)
Definition: atomic_serialization.h:42
boost::serialization::mp::detail::pop_front_impl
Definition: std_variant_serialization.h:89


tesseract_common
Author(s): Levi Armstrong
autogenerated on Sun May 18 2025 03:01:40