diff --git a/gtsam/hybrid/HybridGaussianFactor.cpp b/gtsam/hybrid/HybridGaussianFactor.cpp index 4d7490e49..ba0c0bf1a 100644 --- a/gtsam/hybrid/HybridGaussianFactor.cpp +++ b/gtsam/hybrid/HybridGaussianFactor.cpp @@ -16,20 +16,30 @@ */ #include +#include +#include #include namespace gtsam { /* ************************************************************************* */ -HybridGaussianFactor::HybridGaussianFactor(GaussianFactor::shared_ptr other) - : Base(other->keys()), inner_(other) {} +HybridGaussianFactor::HybridGaussianFactor( + const boost::shared_ptr &ptr) + : Base(ptr->keys()), inner_(ptr) {} + +HybridGaussianFactor::HybridGaussianFactor( + boost::shared_ptr &&ptr) + : Base(ptr->keys()), inner_(std::move(ptr)) {} -/* ************************************************************************* */ HybridGaussianFactor::HybridGaussianFactor(JacobianFactor &&jf) : Base(jf.keys()), inner_(boost::make_shared(std::move(jf))) {} +HybridGaussianFactor::HybridGaussianFactor(HessianFactor &&hf) + : Base(hf.keys()), + inner_(boost::make_shared(std::move(hf))) {} + /* ************************************************************************* */ bool HybridGaussianFactor::equals(const HybridFactor &other, double tol) const { const This *e = dynamic_cast(&other); diff --git a/gtsam/hybrid/HybridGaussianFactor.h b/gtsam/hybrid/HybridGaussianFactor.h index 6ca62921c..966524b81 100644 --- a/gtsam/hybrid/HybridGaussianFactor.h +++ b/gtsam/hybrid/HybridGaussianFactor.h @@ -19,10 +19,13 @@ #include #include -#include namespace gtsam { +// Forward declarations +class JacobianFactor; +class HessianFactor; + /** * A HybridGaussianFactor is a layer over GaussianFactor so that we do not have * a diamond inheritance i.e. an extra factor type that inherits from both @@ -41,12 +44,41 @@ class GTSAM_EXPORT HybridGaussianFactor : public HybridFactor { HybridGaussianFactor() = default; - // Explicit conversion from a shared ptr of GF - explicit HybridGaussianFactor(GaussianFactor::shared_ptr other); + /** + * Constructor from shared_ptr of GaussianFactor. + * Example: + * boost::shared_ptr ptr = + * boost::make_shared(...); + * + */ + explicit HybridGaussianFactor(const boost::shared_ptr &ptr); - // Forwarding constructor from concrete JacobianFactor + /** + * Forwarding constructor from shared_ptr of GaussianFactor. + * Examples: + * HybridGaussianFactor factor = boost::make_shared(...); + * HybridGaussianFactor factor(boost::make_shared(...)); + */ + explicit HybridGaussianFactor(boost::shared_ptr &&ptr); + + /** + * Forwarding constructor from rvalue reference of JacobianFactor. + * + * Examples: + * HybridGaussianFactor factor = JacobianFactor(...); + * HybridGaussianFactor factor(JacobianFactor(...)); + */ explicit HybridGaussianFactor(JacobianFactor &&jf); + /** + * Forwarding constructor from rvalue reference of JacobianFactor. + * + * Examples: + * HybridGaussianFactor factor = HessianFactor(...); + * HybridGaussianFactor factor(HessianFactor(...)); + */ + explicit HybridGaussianFactor(HessianFactor &&hf); + public: /// @name Testable /// @{ diff --git a/gtsam/hybrid/HybridGaussianFactorGraph.cpp b/gtsam/hybrid/HybridGaussianFactorGraph.cpp index b110f8586..b3e3be3da 100644 --- a/gtsam/hybrid/HybridGaussianFactorGraph.cpp +++ b/gtsam/hybrid/HybridGaussianFactorGraph.cpp @@ -394,7 +394,7 @@ void HybridGaussianFactorGraph::add(JacobianFactor &&factor) { } /* ************************************************************************ */ -void HybridGaussianFactorGraph::add(JacobianFactor::shared_ptr factor) { +void HybridGaussianFactorGraph::add(boost::shared_ptr &factor) { FactorGraph::add(boost::make_shared(factor)); } diff --git a/gtsam/hybrid/HybridGaussianFactorGraph.h b/gtsam/hybrid/HybridGaussianFactorGraph.h index 9de18b6af..08eee0bcf 100644 --- a/gtsam/hybrid/HybridGaussianFactorGraph.h +++ b/gtsam/hybrid/HybridGaussianFactorGraph.h @@ -36,7 +36,6 @@ class HybridEliminationTree; class HybridBayesTree; class HybridJunctionTree; class DecisionTreeFactor; - class JacobianFactor; /** @@ -130,7 +129,7 @@ class GTSAM_EXPORT HybridGaussianFactorGraph void add(JacobianFactor&& factor); /// Add a Jacobian factor as a shared ptr. - void add(JacobianFactor::shared_ptr factor); + void add(boost::shared_ptr& factor); /// Add a DecisionTreeFactor to the factor graph. void add(DecisionTreeFactor&& factor);