aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen
diff options
context:
space:
mode:
authorGravatar Benoit Jacob <jacob.benoit.1@gmail.com>2009-09-22 12:20:45 -0400
committerGravatar Benoit Jacob <jacob.benoit.1@gmail.com>2009-09-22 12:20:45 -0400
commitc1c780a94f148c618a74cfcccf40037442ae2d7c (patch)
treee12cabb53fef344865631c7c9360d995000ea463 /Eigen
parent1df54e3ac23780cd67c91c50f27052199902f81f (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.h8
-rw-r--r--Eigen/src/Core/MatrixBase.h4
-rw-r--r--Eigen/src/Core/ReturnByValue.h38
-rw-r--r--Eigen/src/Core/util/ForwardDeclarations.h2
-rw-r--r--Eigen/src/Geometry/Homogeneous.h30
-rw-r--r--Eigen/src/Geometry/Transform.h8
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;