diff options
author | 2010-04-23 10:27:15 -0400 | |
---|---|---|
committer | 2010-04-23 10:27:15 -0400 | |
commit | 58e7297859f4a454218e94d346e4839961d30409 (patch) | |
tree | 98f44cca841b60de456a1ba7520ce4231f98cf0d /Eigen/src/Core/DenseBase.h | |
parent | 1dd27ce280355b61dc4da060dbeff5f4a260bb57 (diff) |
* remove class DenseDirectAccessBase
* remove member XprBase typedefs, use ei_dense_xpr_base
* remove member _HasDirectAccess typedefs, use ei_has_direct_access
Diffstat (limited to 'Eigen/src/Core/DenseBase.h')
-rw-r--r-- | Eigen/src/Core/DenseBase.h | 96 |
1 files changed, 92 insertions, 4 deletions
diff --git a/Eigen/src/Core/DenseBase.h b/Eigen/src/Core/DenseBase.h index da464067b..e93518dae 100644 --- a/Eigen/src/Core/DenseBase.h +++ b/Eigen/src/Core/DenseBase.h @@ -26,6 +26,53 @@ #ifndef EIGEN_DENSEBASE_H #define EIGEN_DENSEBASE_H +template<typename Derived> struct ei_has_direct_access +{ + enum { ret = (ei_traits<Derived>::Flags & DirectAccessBit) ? 1 : 0 }; +}; + +template<typename Derived, bool _HasDirectAccess = ei_has_direct_access<Derived>::ret> +struct ei_inner_stride_at_compile_time +{ + enum { ret = ei_traits<Derived>::InnerStrideAtCompileTime }; +}; + +template<typename Derived> +struct ei_inner_stride_at_compile_time<Derived, false> +{ + enum { ret = 0 }; +}; + +template<typename Derived, bool _HasDirectAccess = ei_has_direct_access<Derived>::ret> +struct ei_outer_stride_at_compile_time +{ + enum { ret = ei_traits<Derived>::OuterStrideAtCompileTime }; +}; + +template<typename Derived> +struct ei_outer_stride_at_compile_time<Derived, false> +{ + enum { ret = 0 }; +}; + +template<typename Derived, typename XprKind = typename ei_traits<Derived>::XprKind> +struct ei_dense_xpr_base +{ + /* ei_dense_xpr_base should only ever be used on dense expressions, thus falling either into the MatrixXpr or into the ArrayXpr cases */ +}; + +template<typename Derived> +struct ei_dense_xpr_base<Derived, MatrixXpr> +{ + typedef MatrixBase<Derived> type; +}; + +template<typename Derived> +struct ei_dense_xpr_base<Derived, ArrayXpr> +{ + typedef ArrayBase<Derived> type; +}; + /** \class DenseBase * * \brief Base class for all dense matrices, vectors, and arrays @@ -134,9 +181,8 @@ template<typename Derived> class DenseBase * this expression. */ -#ifndef EIGEN_PARSED_BY_DOXYGEN - _HasDirectAccess = (int(Flags)&DirectAccessBit) ? 1 : 0 // workaround sunCC -#endif + InnerStrideAtCompileTime = ei_inner_stride_at_compile_time<Derived>::ret, + OuterStrideAtCompileTime = ei_outer_stride_at_compile_time<Derived>::ret }; #ifndef EIGEN_PARSED_BY_DOXYGEN @@ -208,7 +254,7 @@ template<typename Derived> class DenseBase #ifndef EIGEN_PARSED_BY_DOXYGEN /** \internal the return type of coeff() */ - typedef typename ei_meta_if<_HasDirectAccess, const Scalar&, Scalar>::ret CoeffReturnType; + typedef typename ei_meta_if<ei_has_direct_access<Derived>::ret, const Scalar&, Scalar>::ret CoeffReturnType; /** \internal Represents a matrix with all coefficients equal to one another*/ typedef CwiseNullaryOp<ei_scalar_constant_op<Scalar>,Derived> ConstantReturnType; @@ -270,6 +316,48 @@ template<typename Derived> class DenseBase Derived& lazyAssign(const DenseBase<OtherDerived>& other); #endif // not EIGEN_PARSED_BY_DOXYGEN + /** \returns the pointer increment between two consecutive elements within a slice in the inner direction. + * + * \sa outerStride(), rowStride(), colStride() + */ + inline int innerStride() const + { + return derived().innerStride(); + } + + /** \returns the pointer increment between two consecutive inner slices (for example, between two consecutive columns + * in a column-major matrix). + * + * \sa innerStride(), rowStride(), colStride() + */ + inline int outerStride() const + { + return derived().outerStride(); + } + + inline int stride() const + { + return IsVectorAtCompileTime ? innerStride() : outerStride(); + } + + /** \returns the pointer increment between two consecutive rows. + * + * \sa innerStride(), outerStride(), colStride() + */ + inline int rowStride() const + { + return IsRowMajor ? outerStride() : innerStride(); + } + + /** \returns the pointer increment between two consecutive columns. + * + * \sa innerStride(), outerStride(), rowStride() + */ + inline int colStride() const + { + return IsRowMajor ? innerStride() : outerStride(); + } + CommaInitializer<Derived> operator<< (const Scalar& s); template<unsigned int Added,unsigned int Removed> |