From b22a39e66370dc093bc388aaec4284fbca900577 Mon Sep 17 00:00:00 2001 From: Alex Cunningham Date: Sat, 15 Oct 2011 18:38:51 +0000 Subject: [PATCH] Cleaned up use of concept checks in generic factors --- gtsam/base/Testable.h | 8 ++++++-- gtsam/geometry/Pose2.cpp | 2 +- gtsam/geometry/Pose3.cpp | 2 +- gtsam/geometry/concepts.h | 25 ++++++++++++++++++------- gtsam/slam/BearingFactor.h | 2 ++ gtsam/slam/BearingRangeFactor.h | 3 ++- gtsam/slam/RangeFactor.h | 2 +- 7 files changed, 31 insertions(+), 13 deletions(-) diff --git a/gtsam/base/Testable.h b/gtsam/base/Testable.h index 51945f64f..b638e951a 100644 --- a/gtsam/base/Testable.h +++ b/gtsam/base/Testable.h @@ -67,7 +67,8 @@ namespace gtsam { /** * A testable concept check to be placed in unit tests, rather than subclassing - * + * See macros for details on using this structure + * @ingroup base */ template class TestableConcept { @@ -122,12 +123,15 @@ namespace gtsam { } }; -} // gtsam +} // \namespace gtsam /** * Macros for using the TestableConcept * - An instantiation for use inside unit tests * - A typedef for use inside generic algorithms + * + * NOTE: intentionally not in the gtsam namespace to allow for classes not in + * the gtsam namespace to be more easily enforced as testable */ #define GTSAM_CONCEPT_TESTABLE_INST(T) template class gtsam::TestableConcept; #define GTSAM_CONCEPT_TESTABLE_TYPE(T) typedef gtsam::TestableConcept _gtsam_TestableConcept_##T; diff --git a/gtsam/geometry/Pose2.cpp b/gtsam/geometry/Pose2.cpp index 021340ccd..a41968f79 100644 --- a/gtsam/geometry/Pose2.cpp +++ b/gtsam/geometry/Pose2.cpp @@ -27,7 +27,7 @@ namespace gtsam { INSTANTIATE_LIE(Pose2); /** instantiate concept checks */ - GTSAM_CONCEPT_POSE(Pose2); + GTSAM_CONCEPT_POSE_INST(Pose2); static const Matrix I3 = eye(3), Z12 = zeros(1,2); static const Rot2 R_PI_2(Rot2::fromCosSin(0., 1.)); diff --git a/gtsam/geometry/Pose3.cpp b/gtsam/geometry/Pose3.cpp index 60571d04f..b1b00582d 100644 --- a/gtsam/geometry/Pose3.cpp +++ b/gtsam/geometry/Pose3.cpp @@ -27,7 +27,7 @@ namespace gtsam { INSTANTIATE_LIE(Pose3); /** instantiate concept checks */ - GTSAM_CONCEPT_POSE(Pose3); + GTSAM_CONCEPT_POSE_INST(Pose3); static const Matrix I3 = eye(3), Z3 = zeros(3, 3); #ifdef CORRECT_POSE3_EXMAP diff --git a/gtsam/geometry/concepts.h b/gtsam/geometry/concepts.h index 86e7510e1..249e420a0 100644 --- a/gtsam/geometry/concepts.h +++ b/gtsam/geometry/concepts.h @@ -35,9 +35,6 @@ struct PoseConcept { } }; -/** Instantiation macro */ -#define GTSAM_CONCEPT_POSE(T) template class PoseConcept; - /** * Range measurement concept * Given a pair of Lie variables, there must exist a function to calculate @@ -51,12 +48,26 @@ struct RangeMeasurementConcept { static double checkRangeMeasurementDerivatives(const V1& x, const V2& p) { boost::optional H1, H2; - // FIXME: verify the dimensions of the derivative functions return x.range(p, H1, H2); } }; -/** Instantiation macro */ -#define GTSAM_CONCEPT_RANGE_MEASUREMENT(V1,V2) typedef RangeMeasurementConcept RangeMeasurementConcept##V1##V2; - } // \namespace gtsam + +/** + * Macros to use geometry concepts: + * - _INST macro: instantiates a struct: use in unit tests, but not in headers. + * - _TYPE macro: use in generic structures to validate the template arguments. + * + * NOTE: intentionally not in the gtsam namespace to avoid namespace complications + * when using with objects not inside gtsam namespace. + */ + +/** Pose Concept macros */ +#define GTSAM_CONCEPT_POSE_INST(T) template class gtsam::PoseConcept; +#define GTSAM_CONCEPT_POSE_TYPE(T) typedef gtsam::PoseConcept _gtsam_PoseConcept##T; + +/** Range Measurement macros */ +#define GTSAM_CONCEPT_RANGE_MEASUREMENT_INST(V1,V2) template class gtsam::RangeMeasurementConcept; +#define GTSAM_CONCEPT_RANGE_MEASUREMENT_TYPE(V1,V2) typedef gtsam::RangeMeasurementConcept _gtsam_RangeMeasurementConcept##V1##V2; + diff --git a/gtsam/slam/BearingFactor.h b/gtsam/slam/BearingFactor.h index 418e03350..80dea266e 100644 --- a/gtsam/slam/BearingFactor.h +++ b/gtsam/slam/BearingFactor.h @@ -17,6 +17,7 @@ #pragma once #include +#include #include namespace gtsam { @@ -39,6 +40,7 @@ namespace gtsam { /** concept check by type */ GTSAM_CONCEPT_TESTABLE_TYPE(Rot) + GTSAM_CONCEPT_POSE_TYPE(Pose) public: diff --git a/gtsam/slam/BearingRangeFactor.h b/gtsam/slam/BearingRangeFactor.h index 69f849391..3c4a7d8a8 100644 --- a/gtsam/slam/BearingRangeFactor.h +++ b/gtsam/slam/BearingRangeFactor.h @@ -44,7 +44,8 @@ namespace gtsam { /** concept check by type */ GTSAM_CONCEPT_TESTABLE_TYPE(Rot) - GTSAM_CONCEPT_RANGE_MEASUREMENT(Pose, Point) + GTSAM_CONCEPT_RANGE_MEASUREMENT_TYPE(Pose, Point) + GTSAM_CONCEPT_POSE_TYPE(Pose) public: diff --git a/gtsam/slam/RangeFactor.h b/gtsam/slam/RangeFactor.h index afa17cb19..89ed407fa 100644 --- a/gtsam/slam/RangeFactor.h +++ b/gtsam/slam/RangeFactor.h @@ -38,7 +38,7 @@ namespace gtsam { typedef typename POINTKEY::Value Point; // Concept requirements for this factor - GTSAM_CONCEPT_RANGE_MEASUREMENT(Pose, Point) + GTSAM_CONCEPT_RANGE_MEASUREMENT_TYPE(Pose, Point) public: