#ifndef BOOST_SERIALIZATION_STD_VARIANT_HPP #define BOOST_SERIALIZATION_STD_VARIANT_HPP // MS compatible compilers support #pragma once #if defined(_MSC_VER) # pragma once #endif /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 // variant.hpp - non-intrusive serialization of variant types // // copyright (c) 2019 Samuel Debionne, ESRF // // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // See http://www.boost.org for updates, documentation, and revision history. // // Widely inspired form boost::variant serialization // #include #include #include #include #include #include namespace boost { namespace serialization { template struct std_variant_save_visitor { std_variant_save_visitor(Archive& ar) : m_ar(ar) {} template void operator()(T const & value) const { m_ar << BOOST_SERIALIZATION_NVP(value); } private: Archive & m_ar; }; template struct std_variant_load_visitor { std_variant_load_visitor(Archive& ar) : m_ar(ar) {} template void operator()(T & value) const { m_ar >> BOOST_SERIALIZATION_NVP(value); } private: Archive & m_ar; }; template void save( Archive & ar, std::variant const & v, unsigned int /*version*/ ){ const std::size_t which = v.index(); ar << BOOST_SERIALIZATION_NVP(which); std_variant_save_visitor visitor(ar); std::visit(visitor, v); } // Minimalist metaprogramming for handling parameter pack namespace mp { namespace detail { template struct front_impl; template