6#ifndef TTG_SERIALIZATION_STD_VARIANT_H
7#define TTG_SERIALIZATION_STD_VARIANT_H
11#ifdef TTG_SERIALIZATION_SUPPORTS_MADNESS
15#ifdef TTG_SERIALIZATION_SUPPORTS_BOOST
18 namespace serialization {
22 template <
typename Archive,
typename... Ts, std::size_t I0, std::size_t... Is>
23 Archive& variant_load_impl(Archive& ar, std::variant<Ts...>& v, std::size_t which,
24 std::index_sequence<I0, Is...>) {
25 constexpr bool writing = ttg::detail::is_output_archive_v<Archive>;
26 static_assert(!writing);
28 using type = std::variant_alternative_t<I0, std::variant<Ts...>>;
29 if (!std::is_same_v<type, std::monostate>) {
32 v.template emplace<I0>(std::move(value));
35 if constexpr (
sizeof...(Is) == 0)
36 throw std::logic_error(
37 "boost::serialization::detail::variant_load_impl(ar,v,idx,idxs): idx is not present in idxs");
39 return variant_load_impl(ar, v, which, std::index_sequence<Is...>{});
46 template <
typename Archive,
typename... Ts>
47 Archive& serialize(Archive& ar, std::variant<Ts...>& t,
const unsigned int version) {
48 constexpr bool writing = ttg::detail::is_output_archive_v<Archive>;
49 const auto index = t.index();
52 if constexpr (writing) {
54 [&ar](
const auto& v) {
55 if constexpr (!std::is_same_v<std::decay_t<
decltype(v)>, std::monostate>) ar& v;
59 detail::variant_load_impl(ar, t, index, std::make_index_sequence<
sizeof...(Ts)>{});
67 template <
typename Archive,
typename... Ts>
68 inline static constexpr bool is_stlcontainer_boost_serializable_v<Archive, std::variant<Ts...>> =
69 (is_boost_serializable_v<Archive, Ts> && ...);
70 template <
typename Archive,
typename... Ts>
71 inline static constexpr bool is_stlcontainer_boost_serializable_v<Archive,
const std::variant<Ts...>> =
72 (is_boost_serializable_v<Archive, const Ts> && ...);