diff --git a/gtsam/base/std_optional_serialization.h b/gtsam/base/std_optional_serialization.h index ae85907c8..f285ae931 100644 --- a/gtsam/base/std_optional_serialization.h +++ b/gtsam/base/std_optional_serialization.h @@ -1,6 +1,7 @@ -// A hack to serialize std::optional to boost::archive -// Don't know if it will work. Trying to follow this: +// Functionality to serialize std::optional to boost::archive +// Following this: // PR: https://github.com/boostorg/serialization/pull/148/files# + #pragma once #include #include diff --git a/gtsam/base/tests/testStdOptionalSerialization.cpp b/gtsam/base/tests/testStdOptionalSerialization.cpp index 5affb9e69..a5aa815cd 100644 --- a/gtsam/base/tests/testStdOptionalSerialization.cpp +++ b/gtsam/base/tests/testStdOptionalSerialization.cpp @@ -60,6 +60,10 @@ public: TestOptionalStruct() = default; TestOptionalStruct(const int& opt) : opt(opt) {} + bool operator==(const TestOptionalStruct& other) const { + // check the values are equal + return *opt == *other.opt; + } friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int /*version*/) { @@ -104,6 +108,47 @@ TEST(StdOptionalSerialization, SerializTestOptionalStructUninitialized) { EXPECT(serializationTestHelpers::equalsXML(optStruct)); EXPECT(serializationTestHelpers::equalsBinary(optStruct)); } + +// Test for serialization of std::optional +TEST(StdOptionalSerialization, SerializTestOptionalStructPointer) { + // Create an optional + std::optional opt(TestOptionalStruct(42)); + + // Serialize it + std::stringstream ss; + boost::archive::text_oarchive oa(ss); + oa << opt; + + // Deserialize it + std::optional opt2; + boost::archive::text_iarchive ia(ss); + ia >> opt2; + + // Check that it worked + EXPECT(opt2.has_value()); + EXPECT(*opt2 == TestOptionalStruct(42)); +} + +// Test for serialization of std::optional +TEST(StdOptionalSerialization, SerializTestOptionalStructPointerPointer) { + // Create an optional + std::optional opt(new TestOptionalStruct(42)); + + // Serialize it + std::stringstream ss; + boost::archive::text_oarchive oa(ss); + oa << opt; + + // Deserialize it + std::optional opt2; + boost::archive::text_iarchive ia(ss); + ia >> opt2; + + // Check that it worked + EXPECT(opt2.has_value()); + EXPECT(**opt2 == TestOptionalStruct(42)); +} + int main() { TestResult tr; return TestRegistry::runAllTests(tr);