diff --git a/gtsam_unstable/base/tests/testBAD.cpp b/gtsam_unstable/base/tests/testBAD.cpp index 506e28010..18d5b7f54 100644 --- a/gtsam_unstable/base/tests/testBAD.cpp +++ b/gtsam_unstable/base/tests/testBAD.cpp @@ -44,9 +44,11 @@ class ExpressionNode { virtual void getKeys(std::set& keys) const = 0; virtual T value(const Values& values, boost::optional&> = boost::none) const = 0; - virtual ExpressionNode* clone() const = 0; }; +template +class Expression; + /// Constant Expression template class ConstantExpression : public ExpressionNode { @@ -68,7 +70,6 @@ class ConstantExpression : public ExpressionNode { boost::optional&> jacobians = boost::none) const { return value_; } - virtual ExpressionNode* clone() const { return new ConstantExpression(*this); } }; //----------------------------------------------------------------------------- @@ -103,7 +104,6 @@ class LeafExpression : public ExpressionNode { return value; } - virtual ExpressionNode* clone() const { return new LeafExpression(*this); } }; //----------------------------------------------------------------------------- @@ -125,8 +125,8 @@ class UnaryExpression : public ExpressionNode { typedef T type; /// Constructor with a single key - UnaryExpression(function f, const ExpressionNode& expression) : - expression_(expression.clone()), f_(f) { + UnaryExpression(function f, const Expression& expression) : + expression_(expression.root()), f_(f) { } virtual ~UnaryExpression(){} @@ -148,7 +148,6 @@ class UnaryExpression : public ExpressionNode { return value; } - virtual ExpressionNode* clone() const { return new UnaryExpression(*this); } }; //----------------------------------------------------------------------------- @@ -173,8 +172,8 @@ class BinaryExpression : public ExpressionNode { typedef T type; /// Constructor with a single key - BinaryExpression(function f, const ExpressionNode& expression1, const ExpressionNode& expression2) : - expression1_(expression1.clone()), expression2_(expression2.clone()), f_(f) { + BinaryExpression(function f, const Expression& expression1, const Expression& expression2) : + expression1_(expression1.root()), expression2_(expression2.root()), f_(f) { } virtual ~BinaryExpression(){} @@ -216,15 +215,11 @@ class BinaryExpression : public ExpressionNode { return val; } - virtual ExpressionNode* clone() const { return new BinaryExpression(*this); } }; template class Expression { public: - Expression(const ExpressionNode& root) { - root_.reset(root.clone()); - } // Initialize a constant expression Expression(const T& value) : @@ -239,7 +234,7 @@ class Expression { Expression(typename UnaryExpression::function f, const Expression& expression) { // TODO Assert that root of expression is not null. - root_.reset(new UnaryExpression(f, *expression.root())); + root_.reset(new UnaryExpression(f, expression)); } /// Initialize a binary expression @@ -248,8 +243,8 @@ class Expression { const Expression& expression1, const Expression& expression2) { // TODO Assert that root of expressions 1 and 2 are not null. - root_.reset(new BinaryExpression(f, *expression1.root(), - *expression2.root())); + root_.reset(new BinaryExpression(f, expression1, + expression2)); } void getKeys(std::set& keys) const { root_->getKeys(keys); }