diff --git a/gtsam_unstable/nonlinear/tests/testExpressionFactor.cpp b/gtsam_unstable/nonlinear/tests/testExpressionFactor.cpp index 62ad55294..d7fe87c87 100644 --- a/gtsam_unstable/nonlinear/tests/testExpressionFactor.cpp +++ b/gtsam_unstable/nonlinear/tests/testExpressionFactor.cpp @@ -425,7 +425,6 @@ TEST(ExpressionFactor, composeTernary) { } /* ************************************************************************* */ - namespace mpl = boost::mpl; #include @@ -441,43 +440,96 @@ BOOST_MPL_ASSERT((boost::is_same< Matrix2, Generated::Record::Jacobian2T >)); // Try generating vectors of ExecutionTrace typedef mpl::vector, ExecutionTrace > ExpectedTraces; -typedef mpl::transform >::type MyTraces; +typedef mpl::transform >::type MyTraces; BOOST_MPL_ASSERT((mpl::equal< ExpectedTraces, MyTraces >)); -template +template struct MakeTrace { typedef ExecutionTrace type; }; -typedef mpl::transform >::type MyTraces1; +typedef mpl::transform >::type MyTraces1; BOOST_MPL_ASSERT((mpl::equal< ExpectedTraces, MyTraces1 >)); // Try generating vectors of Expression types typedef mpl::vector, Expression > ExpectedExpressions; -typedef mpl::transform >::type Expressions; +typedef mpl::transform >::type Expressions; BOOST_MPL_ASSERT((mpl::equal< ExpectedExpressions, Expressions >)); // Try generating vectors of Jacobian types -typedef mpl::vector ExpectedJacobians; -typedef mpl::transform >::type Jacobians; +typedef mpl::vector ExpectedJacobians; +typedef mpl::transform >::type Jacobians; BOOST_MPL_ASSERT((mpl::equal< ExpectedJacobians, Jacobians >)); // Try accessing a Jacobian -typedef mpl::at_c::type Jacobian23; // base zero ! +typedef mpl::at_c::type Jacobian23; // base zero ! BOOST_MPL_ASSERT((boost::is_same< Matrix23, Jacobian23>)); // Create a value and access it TEST(ExpressionFactor, JacobiansValue) { + using boost::fusion::at_c; Matrix23 expected; Jacobians jacobians; - using boost::fusion::at_c; - at_c<1>(jacobians) << 1,2,3,4,5,6; + at_c<1>(jacobians) << 1, 2, 3, 4, 5, 6; Matrix23 actual = at_c<1>(jacobians); CHECK(actual.cols() == expected.cols()); CHECK(actual.rows() == expected.rows()); } +/* ************************************************************************* */ +#include + +struct triple { + template struct result; // says we will provide result + + template + struct result { + typedef double type; // result for int argument + }; + + template + struct result { + typedef double type; // result for double argument + }; + + // actual function + template + typename result::type operator()(T& x) const { + return (double) x; + } +}; + + +// Test out polymorphic transform +TEST(ExpressionFactor, Triple) { + typedef boost::fusion::vector IntDouble; + IntDouble H = boost::fusion::make_vector(1, 2.0); + + // Only works if I use Double2 + typedef boost::fusion::result_of::transform::type Result; + typedef boost::fusion::vector Double2; + Double2 D = boost::fusion::transform(H, triple()); + + using boost::fusion::at_c; + DOUBLES_EQUAL(1.0, at_c<0>(D), 1e-9); + DOUBLES_EQUAL(2.0, at_c<1>(D), 1e-9); +} + +/* ************************************************************************* */ +#include +#include + +// Test out polymorphic transform +TEST(ExpressionFactor, Invoke) { + std::plus add; + assert(invoke(add,boost::fusion::make_vector(1,1)) == 2); + + // Creating a Pose3 (is there another way?) + boost::fusion::vector pair; + Pose3 pose = boost::fusion::invoke(boost::value_factory(), pair); +} + /* ************************************************************************* */ int main() { TestResult tr;