#pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include // function specializations must be defined in the appropriate // namespace - boost::serialization namespace boost { namespace serialization { template void save(Archive& ar, const std::optional& t, const unsigned int /*version*/ ) { // It is an inherent limitation to the serialization of optional.hpp // that the underlying type must be either a pointer or must have a // default constructor. It's possible that this could change sometime // in the future, but for now, one will have to work around it. This can // be done by serialization the optional as optional #if !defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS) BOOST_STATIC_ASSERT(boost::serialization::detail::is_default_constructible::value || boost::is_pointer::value); #endif const bool tflag = t.has_value(); ar << boost::serialization::make_nvp("initialized", tflag); if (tflag) { ar << boost::serialization::make_nvp("value", *t); } } template void load(Archive& ar, std::optional& t, const unsigned int version) { bool tflag; ar >> boost::serialization::make_nvp("initialized", tflag); if (!tflag) { t.reset(); return; } if (0 == version) { boost::serialization::item_version_type item_version(0); boost::archive::library_version_type library_version(ar.get_library_version()); if (boost::archive::library_version_type(3) < library_version) { ar >> BOOST_SERIALIZATION_NVP(item_version); } } if (!t.has_value()) t = T(); ar >> boost::serialization::make_nvp("value", *t); } template void serialize(Archive& ar, std::optional& t, const unsigned int version) { boost::serialization::split_free(ar, t, version); } template struct version> { BOOST_STATIC_CONSTANT(int, value = 1); }; } // namespace serialization } // namespace boost