#pragma once // Adapts boost::serialization to support std::optional, serializing just as a boost::optional would // be serialized (so that the serialized boost::optional and std::optional values are // interchangeable). // #include #include #include #include #include #include #include #include namespace boost::serialization { template void save(Archive& ar, std::optional const& v, unsigned int /*version*/) { static_assert(std::is_default_constructible_v || std::is_pointer_v); const bool have = v.has_value(); ar << boost::serialization::make_nvp("initialized", have); if (have) ar << boost::serialization::make_nvp("value", *v); } template void load(Archive& ar, std::optional& v, const unsigned int version) { bool have; ar >> boost::serialization::make_nvp("initialized", have); if (!have) { v.reset(); return; } if (version == 0 && ar.get_library_version() > boost::archive::library_version_type{3}) { boost::serialization::item_version_type ver{0}; ar >> boost::serialization::make_nvp("item_version", ver); } if (!v) v = std::make_optional(); ar >> boost::serialization::make_nvp("value", *v); } template inline void serialize(Archive& ar, std::optional& v, const unsigned int file_version) { split_free(ar, v, file_version); } } // namespace boost::serialization