diff --git a/gtsam/base/concepts.h b/gtsam/base/concepts.h new file mode 100644 index 000000000..05d7e378b --- /dev/null +++ b/gtsam/base/concepts.h @@ -0,0 +1,71 @@ +/* + * concepts.h + * + * Created on: Dec 4, 2014 + * Author: mike bosse + */ + +#ifndef CONCEPTS_H_ +#define CONCEPTS_H_ + +#include "manifold.h" +#include "chart.h" + +namespace gtsam { + +namespace traits { + +template +struct TangentVector { + typedef Eigen::VectorXd type; +}; + +template +struct Manifold { + typedef Chart::value_type type; +}; + +} // namespace traits + +template +class ManifoldConcept { + public: + typedef T Manifold; + typedef traits::TangentVector::type TangentVector; + typedef traits::DefaultChart DefaultChart; + static const size_t dim = traits::dimension::value; + + BOOST_CONCEPT_USAGE(ManifoldConcept) { + + // assignable + T t2 = t; + + TangentVector v; + BOOST_STATIC_ASSERT(TangentVector::SizeAtCompileTime == dim); + + } + private: + Manifold p; +}; + +template +class ChartConcept { + public: + typedef C Chart; + typedef typename traits::Manifold::type Manifold; + typedef typename traits::TangentVector::type TangentVector; + + BOOST_CONCEPT_USAGE(ChartConcept) { + v = Chart::local(p,q); // returns local coordinates of q w.r.t. origin p + q = Chart::retract(p,v); // returns retracted update of p with v + } + + private: + Manifold p,q; + TangentVector v; + +}; + +} // namespace gtsam + +#endif /* CONCEPTS_H_ */