diff --git a/gtsam/base/ChartValue.h b/gtsam/base/ChartValue.h index 2f7cd5813..6f0cf1406 100644 --- a/gtsam/base/ChartValue.h +++ b/gtsam/base/ChartValue.h @@ -158,9 +158,9 @@ private: friend class boost::serialization::access; template void serialize(ARCHIVE & ar, const unsigned int version) { - ar & boost::serialization::make_nvp("value", GenericValue::value()); + // ar & boost::serialization::make_nvp("value",); // todo: implement a serialization for charts - //ar & boost::serialization::make_nvp("Chart", boost::serialization::base_object(*this)); + ar & boost::serialization::make_nvp("GenericValue", boost::serialization::base_object< GenericValue >(*this)); } /// @} diff --git a/gtsam/base/GenericValue.h b/gtsam/base/GenericValue.h index a4446d53c..0869769c4 100644 --- a/gtsam/base/GenericValue.h +++ b/gtsam/base/GenericValue.h @@ -56,7 +56,6 @@ public: virtual bool equals_(const Value& p, double tol = 1e-9) const { // Cast the base class Value pointer to a templated generic class pointer const GenericValue& genericValue2 = static_cast(p); - // Return the result of using the equals traits for the derived class return traits::equals(this->value_, genericValue2.value_, tol); } @@ -69,7 +68,12 @@ public: virtual void print(const std::string& str) const { traits::print(value_,str); } - + friend class boost::serialization::access; + template + void serialize(ARCHIVE & ar, const unsigned int version) { + ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Value); + ar & BOOST_SERIALIZATION_NVP(value_); + } protected: /// Assignment operator for this class not needed since GenricValue is an abstract class diff --git a/gtsam/nonlinear/tests/testSerializationNonlinear.cpp b/gtsam/nonlinear/tests/testSerializationNonlinear.cpp index 87c75dd5e..a8f287d1e 100644 --- a/gtsam/nonlinear/tests/testSerializationNonlinear.cpp +++ b/gtsam/nonlinear/tests/testSerializationNonlinear.cpp @@ -32,22 +32,37 @@ using namespace gtsam::serializationTestHelpers; /* ************************************************************************* */ // Export all classes derived from Value -BOOST_CLASS_EXPORT(gtsam::Cal3_S2) -BOOST_CLASS_EXPORT(gtsam::Cal3Bundler) -BOOST_CLASS_EXPORT(gtsam::Point3) -BOOST_CLASS_EXPORT(gtsam::Pose3) -BOOST_CLASS_EXPORT(gtsam::Rot3) -BOOST_CLASS_EXPORT(gtsam::PinholeCamera) -BOOST_CLASS_EXPORT(gtsam::PinholeCamera) -BOOST_CLASS_EXPORT(gtsam::PinholeCamera) +BOOST_CLASS_EXPORT(gtsam::Cal3_S2); +BOOST_CLASS_EXPORT(gtsam::Cal3Bundler); +BOOST_CLASS_EXPORT(gtsam::Point3); +BOOST_CLASS_EXPORT(gtsam::Pose3); +BOOST_CLASS_EXPORT(gtsam::Rot3); +BOOST_CLASS_EXPORT(gtsam::PinholeCamera); +BOOST_CLASS_EXPORT(gtsam::PinholeCamera); +BOOST_CLASS_EXPORT(gtsam::PinholeCamera); + +namespace detail { +template struct pack { + typedef T type; +}; +} +#define CHART_VALUE_EXPORT(UNIQUE_NAME, TYPE) \ + typedef gtsam::ChartValue > UNIQUE_NAME; \ + BOOST_CLASS_EXPORT( UNIQUE_NAME ); -BOOST_CLASS_EXPORT(gtsam::ChartValue); /* ************************************************************************* */ typedef PinholeCamera PinholeCal3S2; typedef PinholeCamera PinholeCal3DS2; typedef PinholeCamera PinholeCal3Bundler; +CHART_VALUE_EXPORT(gtsamPoint3Chart, gtsam::Point3); +CHART_VALUE_EXPORT(Cal3S2Chart, PinholeCal3S2); +CHART_VALUE_EXPORT(Cal3DS2Chart, PinholeCal3DS2); +CHART_VALUE_EXPORT(Cal3BundlerChart, PinholeCal3Bundler); + + + /* ************************************************************************* */ static Point3 pt3(1.0, 2.0, 3.0); static Rot3 rt3 = Rot3::RzRyRx(1.0, 3.0, 2.0);