diff --git a/gtsam/inference/FactorGraphUnordered.h b/gtsam/inference/FactorGraphUnordered.h index 972ae410f..f6c8f4cd5 100644 --- a/gtsam/inference/FactorGraphUnordered.h +++ b/gtsam/inference/FactorGraphUnordered.h @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -123,10 +124,11 @@ namespace gtsam { void push_back(const This& factors) { factors_.insert(end(), factors.begin(), factors.end()); } - /** push back many factors with an iterator */ + /** push back many factors with an iterator over shared_ptr (factors are not copied) */ template - void push_back(ITERATOR firstFactor, ITERATOR lastFactor) { - factors_.insert(end(), firstFactor, lastFactor); } + typename std::enable_if::value>::type + push_back(ITERATOR firstFactor, ITERATOR lastFactor) { + factors_.insert(end(), firstFactor, lastFactor); } protected: /** push back a BayesTree as a collection of factors. NOTE: This should be hidden in derived @@ -138,6 +140,14 @@ namespace gtsam { void push_back(const DERIVEDFACTOR& factor) { add(factor); } + /** push back many factors with an iterator over plain factors (factors are copied) */ + template + typename std::enable_if::value>::type + push_back(ITERATOR firstFactor, ITERATOR lastFactor) { + for(ITERATOR f = firstFactor; f != lastFactor; ++f) + add(*f); + } + public: /** += syntax for push_back, e.g. graph += f1, f2, f3 */ template diff --git a/gtsam/symbolic/SymbolicBayesNetUnordered.h b/gtsam/symbolic/SymbolicBayesNetUnordered.h index 1d4d1f608..0f45d4a46 100644 --- a/gtsam/symbolic/SymbolicBayesNetUnordered.h +++ b/gtsam/symbolic/SymbolicBayesNetUnordered.h @@ -48,6 +48,14 @@ namespace gtsam { /** Construct from iterator over conditionals */ template SymbolicBayesNetUnordered(ITERATOR firstConditional, ITERATOR lastConditional) : Base(firstConditional, lastConditional) {} + + /** Construct from container of factors (shared_ptr or plain objects) */ + template + explicit SymbolicBayesNetUnordered(const CONTAINER& conditionals) : Base(conditionals) {} + + /** Implicit copy/downcast constructor to override explicit template container constructor */ + template + SymbolicBayesNetUnordered(const FactorGraphUnordered& graph) : Base(graph) {} /// @}