From 9f836ef25c85faae8074b52da16a176bfef0a119 Mon Sep 17 00:00:00 2001 From: Levi Armstrong Date: Fri, 22 Sep 2023 09:34:04 -0500 Subject: [PATCH] Add std::variant boost serialization support --- .../std_variant_serialization.h | 205 ++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 tesseract_common/include/tesseract_common/std_variant_serialization.h diff --git a/tesseract_common/include/tesseract_common/std_variant_serialization.h b/tesseract_common/include/tesseract_common/std_variant_serialization.h new file mode 100644 index 00000000000..1729758fa53 --- /dev/null +++ b/tesseract_common/include/tesseract_common/std_variant_serialization.h @@ -0,0 +1,205 @@ +#ifndef TESSERACT_COMMON_STD_VARIANT_SERIALIZATION_H +#define TESSERACT_COMMON_STD_VARIANT_SERIALIZATION_H + +#if BOOST_VERSION > 108300 +#include +#else + +/////////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