diff options
author | Benoit Jacob <jacob.benoit.1@gmail.com> | 2009-09-22 12:20:45 -0400 |
---|---|---|
committer | Benoit Jacob <jacob.benoit.1@gmail.com> | 2009-09-22 12:20:45 -0400 |
commit | c1c780a94f148c618a74cfcccf40037442ae2d7c (patch) | |
tree | e12cabb53fef344865631c7c9360d995000ea463 /Eigen | |
parent | 1df54e3ac23780cd67c91c50f27052199902f81f (diff) |
* ReturnByValue:
-- simpplify by removing the 2nd template parameter
-- rename Functor to Derived, as now it's a usual CRTP
* Homogeneous:
-- in products, honor the Max sizes etc.
Diffstat (limited to 'Eigen')
-rw-r--r-- | Eigen/src/Core/Matrix.h | 8 | ||||
-rw-r--r-- | Eigen/src/Core/MatrixBase.h | 4 | ||||
-rw-r--r-- | Eigen/src/Core/ReturnByValue.h | 38 | ||||
-rw-r--r-- | Eigen/src/Core/util/ForwardDeclarations.h | 2 | ||||
-rw-r--r-- | Eigen/src/Geometry/Homogeneous.h | 30 | ||||
-rw-r--r-- | Eigen/src/Geometry/Transform.h | 8 |
6 files changed, 50 insertions, 40 deletions
diff --git a/Eigen/src/Core/Matrix.h b/Eigen/src/Core/Matrix.h index c08f12491..aea0f15c8 100644 --- a/Eigen/src/Core/Matrix.h +++ b/Eigen/src/Core/Matrix.h @@ -399,8 +399,8 @@ class Matrix return Base::lazyAssign(other.derived()); } - template<typename OtherDerived,typename OtherEvalType> - EIGEN_STRONG_INLINE Matrix& operator=(const ReturnByValue<OtherDerived,OtherEvalType>& func) + template<typename OtherDerived> + EIGEN_STRONG_INLINE Matrix& operator=(const ReturnByValue<OtherDerived>& func) { resize(func.rows(), func.cols()); return Base::operator=(func); @@ -504,8 +504,8 @@ class Matrix _set_noalias(other); } /** Copy constructor with in-place evaluation */ - template<typename OtherDerived,typename OtherEvalType> - EIGEN_STRONG_INLINE Matrix(const ReturnByValue<OtherDerived,OtherEvalType>& other) + template<typename OtherDerived> + EIGEN_STRONG_INLINE Matrix(const ReturnByValue<OtherDerived>& other) { _check_template_params(); resize(other.rows(), other.cols()); diff --git a/Eigen/src/Core/MatrixBase.h b/Eigen/src/Core/MatrixBase.h index 4835f167c..a1659e2a7 100644 --- a/Eigen/src/Core/MatrixBase.h +++ b/Eigen/src/Core/MatrixBase.h @@ -271,8 +271,8 @@ template<typename Derived> class MatrixBase template<typename OtherDerived> Derived& operator-=(const AnyMatrixBase<OtherDerived> &other); - template<typename OtherDerived,typename OtherEvalType> - Derived& operator=(const ReturnByValue<OtherDerived,OtherEvalType>& func); + template<typename OtherDerived> + Derived& operator=(const ReturnByValue<OtherDerived>& func); #ifndef EIGEN_PARSED_BY_DOXYGEN /** Copies \a other into *this without evaluating other. \returns a reference to *this. */ diff --git a/Eigen/src/Core/ReturnByValue.h b/Eigen/src/Core/ReturnByValue.h index 3f2b478ff..4a5d5c105 100644 --- a/Eigen/src/Core/ReturnByValue.h +++ b/Eigen/src/Core/ReturnByValue.h @@ -28,45 +28,37 @@ /** \class ReturnByValue * */ -template<typename Functor, typename _Scalar,int _Rows,int _Cols,int _Options,int _MaxRows,int _MaxCols> -struct ei_traits<ReturnByValue<Functor,Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> > > - : public ei_traits<Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> > +template<typename Derived> +struct ei_traits<ReturnByValue<Derived> > + : public ei_traits<typename ei_traits<Derived>::ReturnMatrixType> { enum { - Flags = ei_traits<Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> >::Flags | EvalBeforeNestingBit + Flags = ei_traits<typename ei_traits<Derived>::ReturnMatrixType>::Flags | EvalBeforeNestingBit }; }; -template<typename Functor,typename EvalTypeDerived,int n> -struct ei_nested<ReturnByValue<Functor,MatrixBase<EvalTypeDerived> >, n, EvalTypeDerived> -{ - typedef EvalTypeDerived type; -}; - -template<typename Functor, typename EvalType> class ReturnByValue +template<typename Derived,int n,typename PlainMatrixType> +struct ei_nested<ReturnByValue<Derived>, n, PlainMatrixType> { - public: - template<typename Dest> inline void evalTo(Dest& dst) const - { static_cast<const Functor*>(this)->evalTo(dst); } + typedef typename ei_traits<Derived>::ReturnMatrixType type; }; -template<typename Functor, typename _Scalar,int _Rows,int _Cols,int _Options,int _MaxRows,int _MaxCols> - class ReturnByValue<Functor,Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> > - : public MatrixBase<ReturnByValue<Functor,Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> > > +template<typename Derived> + class ReturnByValue : public MatrixBase<ReturnByValue<Derived> > { - typedef Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> EvalType; + typedef typename ei_traits<Derived>::ReturnMatrixType ReturnMatrixType; public: EIGEN_GENERIC_PUBLIC_INTERFACE(ReturnByValue) template<typename Dest> inline void evalTo(Dest& dst) const - { static_cast<const Functor* const>(this)->evalTo(dst); } - inline int rows() const { return static_cast<const Functor* const>(this)->rows(); } - inline int cols() const { return static_cast<const Functor* const>(this)->cols(); } + { static_cast<const Derived* const>(this)->evalTo(dst); } + inline int rows() const { return static_cast<const Derived* const>(this)->rows(); } + inline int cols() const { return static_cast<const Derived* const>(this)->cols(); } }; template<typename Derived> -template<typename OtherDerived,typename OtherEvalType> -Derived& MatrixBase<Derived>::operator=(const ReturnByValue<OtherDerived,OtherEvalType>& other) +template<typename OtherDerived> +Derived& MatrixBase<Derived>::operator=(const ReturnByValue<OtherDerived>& other) { other.evalTo(derived()); return derived(); diff --git a/Eigen/src/Core/util/ForwardDeclarations.h b/Eigen/src/Core/util/ForwardDeclarations.h index 3f66738f0..65e5ce687 100644 --- a/Eigen/src/Core/util/ForwardDeclarations.h +++ b/Eigen/src/Core/util/ForwardDeclarations.h @@ -64,7 +64,7 @@ template<typename MatrixType, unsigned int Mode> class SelfAdjointView; template<typename ExpressionType> class Cwise; template<typename ExpressionType> class WithFormat; template<typename MatrixType> struct CommaInitializer; -template<typename Functor, typename EvalType> class ReturnByValue; +template<typename Derived> class ReturnByValue; template<typename _Scalar, int Rows=Dynamic, int Cols=Dynamic, int Supers=Dynamic, int Subs=Dynamic, int Options=0> class BandMatrix; diff --git a/Eigen/src/Geometry/Homogeneous.h b/Eigen/src/Geometry/Homogeneous.h index 2de99b5de..035d213b7 100644 --- a/Eigen/src/Geometry/Homogeneous.h +++ b/Eigen/src/Geometry/Homogeneous.h @@ -207,10 +207,19 @@ VectorwiseOp<ExpressionType,Direction>::hnormalized() const } template<typename MatrixType,typename Lhs> +struct ei_traits<ei_homogeneous_left_product_impl<Homogeneous<MatrixType,Vertical>,Lhs> > +{ + typedef Matrix<typename ei_traits<MatrixType>::Scalar, + Lhs::RowsAtCompileTime, + MatrixType::ColsAtCompileTime, + MatrixType::PlainMatrixType::Options, + Lhs::MaxRowsAtCompileTime, + MatrixType::MaxColsAtCompileTime> ReturnMatrixType; +}; + +template<typename MatrixType,typename Lhs> struct ei_homogeneous_left_product_impl<Homogeneous<MatrixType,Vertical>,Lhs> - : public ReturnByValue<ei_homogeneous_left_product_impl<Homogeneous<MatrixType,Vertical>,Lhs>, - Matrix<typename ei_traits<MatrixType>::Scalar, - Lhs::RowsAtCompileTime,MatrixType::ColsAtCompileTime> > + : public ReturnByValue<ei_homogeneous_left_product_impl<Homogeneous<MatrixType,Vertical>,Lhs> > { typedef typename ei_cleantype<typename Lhs::Nested>::type LhsNested; ei_homogeneous_left_product_impl(const Lhs& lhs, const MatrixType& rhs) @@ -236,10 +245,19 @@ struct ei_homogeneous_left_product_impl<Homogeneous<MatrixType,Vertical>,Lhs> }; template<typename MatrixType,typename Rhs> +struct ei_traits<ei_homogeneous_right_product_impl<Homogeneous<MatrixType,Horizontal>,Rhs> > +{ + typedef Matrix<typename ei_traits<MatrixType>::Scalar, + MatrixType::RowsAtCompileTime, + Rhs::ColsAtCompileTime, + MatrixType::PlainMatrixType::Options, + MatrixType::MaxRowsAtCompileTime, + Rhs::MaxColsAtCompileTime> ReturnMatrixType; +}; + +template<typename MatrixType,typename Rhs> struct ei_homogeneous_right_product_impl<Homogeneous<MatrixType,Horizontal>,Rhs> - : public ReturnByValue<ei_homogeneous_right_product_impl<Homogeneous<MatrixType,Horizontal>,Rhs>, - Matrix<typename ei_traits<MatrixType>::Scalar, - MatrixType::RowsAtCompileTime, Rhs::ColsAtCompileTime> > + : public ReturnByValue<ei_homogeneous_right_product_impl<Homogeneous<MatrixType,Horizontal>,Rhs> > { typedef typename ei_cleantype<typename Rhs::Nested>::type RhsNested; ei_homogeneous_right_product_impl(const MatrixType& lhs, const Rhs& rhs) diff --git a/Eigen/src/Geometry/Transform.h b/Eigen/src/Geometry/Transform.h index e89581e21..d03fd52fd 100644 --- a/Eigen/src/Geometry/Transform.h +++ b/Eigen/src/Geometry/Transform.h @@ -247,14 +247,14 @@ public: ei_transform_construct_from_matrix<OtherMatrixType,Mode,Dim,HDim>::run(this, other.matrix()); } - template<typename OtherDerived,typename OtherEvalType> - Transform(const ReturnByValue<OtherDerived,OtherEvalType>& other) + template<typename OtherDerived> + Transform(const ReturnByValue<OtherDerived>& other) { other.evalTo(*this); } - template<typename OtherDerived,typename OtherEvalType> - Transform& operator=(const ReturnByValue<OtherDerived,OtherEvalType>& other) + template<typename OtherDerived> + Transform& operator=(const ReturnByValue<OtherDerived>& other) { other.evalTo(*this); return *this; |