From cc997dd7746799850aa10e86e09b7cea2fc3882a Mon Sep 17 00:00:00 2001 From: HannesSommer Date: Sat, 22 Nov 2014 19:19:17 +0100 Subject: [PATCH] adapted a view comments and friendships to the new virtual inheritance sceme visibility fine tuning --- gtsam_unstable/nonlinear/CallRecord.h | 89 +++++++++++++-------------- 1 file changed, 42 insertions(+), 47 deletions(-) diff --git a/gtsam_unstable/nonlinear/CallRecord.h b/gtsam_unstable/nonlinear/CallRecord.h index 6927a79be..97fe74093 100644 --- a/gtsam_unstable/nonlinear/CallRecord.h +++ b/gtsam_unstable/nonlinear/CallRecord.h @@ -84,13 +84,48 @@ struct ReverseADInterface<0, Cols> { JacobianMap& jacobians) const = 0; }; +/** + * ReverseADImplementor is a utility class used by CallRecordImplementor to + * implementing the recursive ReverseADInterface interface. + */ template -struct ReverseADImplementor; // forward for CallRecord's friend declaration -} +struct ReverseADImplementor: ReverseADImplementor { +private: + using ReverseADImplementor::_reverseAD; + virtual void _reverseAD( + const Eigen::Matrix & dFdT, + JacobianMap& jacobians) const { + static_cast(this)->reverseAD(dFdT, jacobians); + } + friend struct internal::ReverseADImplementor; +}; + +template +struct ReverseADImplementor + : virtual internal::ReverseADInterface { +private: + using internal::ReverseADInterface::_reverseAD; + const Derived & derived() const { + return static_cast(*this); + } + virtual void _reverseAD( + const Eigen::Matrix & dFdT, + JacobianMap& jacobians) const { + derived().reverseAD(dFdT, jacobians); + } + virtual void _reverseAD(const Matrix & dFdT, JacobianMap& jacobians) const { + derived().reverseAD(dFdT, jacobians); + } + friend struct internal::ReverseADImplementor; +}; + +} // namespace internal /** * The CallRecord class stores the Jacobians of applying a function - * with respect to each of its arguments. It also stores an executation trace + * with respect to each of its arguments. It also stores an execution trace * (defined below) for each of its arguments. * * It is implemented in the function-style ExpressionNode's nested Record class below. @@ -128,57 +163,16 @@ private: virtual void _startReverseAD(JacobianMap& jacobians) const = 0; using internal::ReverseADInterface::_reverseAD; - template - friend struct internal::ReverseADImplementor; }; namespace internal { - -/** - * ReverseADImplementor is a utility class used by CallRecordImplementor to - * implementing the recursive CallRecord interface. - */ -template -struct ReverseADImplementor: ReverseADImplementor { - -private: - using ReverseADImplementor::_reverseAD; - virtual void _reverseAD( - const Eigen::Matrix & dFdT, - JacobianMap& jacobians) const { - static_cast(this)->reverseAD(dFdT, jacobians); - } - friend struct internal::ReverseADImplementor; -}; - -template -struct ReverseADImplementor - : virtual internal::ReverseADInterface { -private: - using internal::ReverseADInterface::_reverseAD; - const Derived & derived() const { - return static_cast(*this); - } - virtual void _reverseAD( - const Eigen::Matrix & dFdT, - JacobianMap& jacobians) const { - derived().reverseAD(dFdT, jacobians); - } - virtual void _reverseAD(const Matrix & dFdT, JacobianMap& jacobians) const { - derived().reverseAD(dFdT, jacobians); - } - friend struct internal::ReverseADImplementor; -}; - /** * The CallRecordImplementor implements the CallRecord interface for a Derived class by * delegating to its corresponding (templated) non-virtual methods. */ template -struct CallRecordImplementor: ReverseADImplementor, CallRecord{ +struct CallRecordImplementor: public CallRecord, + private ReverseADImplementor { private: const Derived & derived() const { return static_cast(*this); @@ -189,8 +183,9 @@ private: virtual void _startReverseAD(JacobianMap& jacobians) const { derived().startReverseAD(jacobians); } + template friend class ReverseADImplementor; }; -} // internal +} // namespace internal } // gtsam