diff options
author | Gael Guennebaud <g.gael@free.fr> | 2010-07-21 10:57:01 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2010-07-21 10:57:01 +0200 |
commit | 95f2e7f3f5ebdda92d7c16e2aa3df291b54a4d2f (patch) | |
tree | 603ddaf48cd0525fcb1c57e7c0a813940d25e0af /Eigen | |
parent | 3abbdfd621420a97b794ea52492486d7f12679c8 (diff) |
introduce a new LvalueBit flag and split DenseCoeffBase into three level of accessors
Diffstat (limited to 'Eigen')
-rw-r--r-- | Eigen/src/Core/BandMatrix.h | 2 | ||||
-rw-r--r-- | Eigen/src/Core/Block.h | 2 | ||||
-rw-r--r-- | Eigen/src/Core/CwiseUnaryView.h | 2 | ||||
-rw-r--r-- | Eigen/src/Core/DenseCoeffsBase.h | 28 | ||||
-rw-r--r-- | Eigen/src/Core/Diagonal.h | 2 | ||||
-rw-r--r-- | Eigen/src/Core/DiagonalMatrix.h | 5 | ||||
-rw-r--r-- | Eigen/src/Core/Reverse.h | 2 | ||||
-rw-r--r-- | Eigen/src/Core/util/Constants.h | 12 | ||||
-rw-r--r-- | Eigen/src/Core/util/ForwardDeclarations.h | 5 | ||||
-rw-r--r-- | Eigen/src/Core/util/XprHelper.h | 4 | ||||
-rw-r--r-- | Eigen/src/Eigenvalues/HessenbergDecomposition.h | 6 | ||||
-rw-r--r-- | Eigen/src/Sparse/DynamicSparseMatrix.h | 2 | ||||
-rw-r--r-- | Eigen/src/Sparse/SparseMatrix.h | 2 | ||||
-rw-r--r-- | Eigen/src/Sparse/SparseVector.h | 2 |
14 files changed, 56 insertions, 20 deletions
diff --git a/Eigen/src/Core/BandMatrix.h b/Eigen/src/Core/BandMatrix.h index e846b38e5..2f94d12dc 100644 --- a/Eigen/src/Core/BandMatrix.h +++ b/Eigen/src/Core/BandMatrix.h @@ -55,7 +55,7 @@ struct ei_traits<BandMatrix<_Scalar,Rows,Cols,Supers,Subs,Options> > ColsAtCompileTime = Cols, MaxRowsAtCompileTime = Rows, MaxColsAtCompileTime = Cols, - Flags = 0 + Flags = LvalueBit }; }; diff --git a/Eigen/src/Core/Block.h b/Eigen/src/Core/Block.h index f888d5ea0..7d9ae500d 100644 --- a/Eigen/src/Core/Block.h +++ b/Eigen/src/Core/Block.h @@ -93,7 +93,7 @@ struct ei_traits<Block<XprType, BlockRows, BlockCols, HasDirectAccess> > : ei_tr && (InnerStrideAtCompileTime == 1) ? PacketAccessBit : 0, FlagsLinearAccessBit = (RowsAtCompileTime == 1 || ColsAtCompileTime == 1) ? LinearAccessBit : 0, - Flags0 = ei_traits<XprType>::Flags & (HereditaryBits | MaskPacketAccessBit | DirectAccessBit), + Flags0 = ei_traits<XprType>::Flags & (HereditaryBits | MaskPacketAccessBit | LvalueBit | DirectAccessBit), Flags1 = Flags0 | FlagsLinearAccessBit, Flags = (Flags1 & ~RowMajorBit) | (IsRowMajor ? RowMajorBit : 0) }; diff --git a/Eigen/src/Core/CwiseUnaryView.h b/Eigen/src/Core/CwiseUnaryView.h index 612b28f1f..37c58223e 100644 --- a/Eigen/src/Core/CwiseUnaryView.h +++ b/Eigen/src/Core/CwiseUnaryView.h @@ -48,7 +48,7 @@ struct ei_traits<CwiseUnaryView<ViewOp, MatrixType> > typedef typename MatrixType::Nested MatrixTypeNested; typedef typename ei_cleantype<MatrixTypeNested>::type _MatrixTypeNested; enum { - Flags = (ei_traits<_MatrixTypeNested>::Flags & (HereditaryBits | LinearAccessBit | DirectAccessBit)), + Flags = (ei_traits<_MatrixTypeNested>::Flags & (HereditaryBits | LvalueBit | LinearAccessBit | DirectAccessBit)), CoeffReadCost = ei_traits<_MatrixTypeNested>::CoeffReadCost + ei_functor_traits<ViewOp>::Cost, MatrixTypeInnerStride = ei_inner_stride_at_compile_time<MatrixType>::ret, // need to cast the sizeof's from size_t to int explicitly, otherwise: diff --git a/Eigen/src/Core/DenseCoeffsBase.h b/Eigen/src/Core/DenseCoeffsBase.h index 6802cea24..0b348c81d 100644 --- a/Eigen/src/Core/DenseCoeffsBase.h +++ b/Eigen/src/Core/DenseCoeffsBase.h @@ -25,15 +25,15 @@ #ifndef EIGEN_DENSECOEFFSBASE_H #define EIGEN_DENSECOEFFSBASE_H -template<typename Derived, bool EnableDirectAccessAPI> -class DenseCoeffsBase : public EigenBase<Derived> +template<typename Derived> +class DenseCoeffsBase<Derived,ReadOnlyAccessors> : public EigenBase<Derived> { public: typedef typename ei_traits<Derived>::StorageKind StorageKind; typedef typename ei_traits<Derived>::Index Index; typedef typename ei_traits<Derived>::Scalar Scalar; typedef typename ei_packet_traits<Scalar>::type PacketScalar; - typedef typename ei_meta_if<ei_has_direct_access<Derived>::ret, + typedef typename ei_meta_if<bool(ei_traits<Derived>::Flags&LvalueBit), const Scalar&, typename ei_meta_if<ei_is_arithmetic<Scalar>::ret, Scalar, const Scalar>::ret >::ret CoeffReturnType; @@ -239,11 +239,11 @@ class DenseCoeffsBase : public EigenBase<Derived> }; template<typename Derived> -class DenseCoeffsBase<Derived, true> : public DenseCoeffsBase<Derived, false> +class DenseCoeffsBase<Derived, WriteAccessors> : public DenseCoeffsBase<Derived, ReadOnlyAccessors> { public: - typedef DenseCoeffsBase<Derived, false> Base; + typedef DenseCoeffsBase<Derived, ReadOnlyAccessors> Base; typedef typename ei_traits<Derived>::StorageKind StorageKind; typedef typename ei_traits<Derived>::Index Index; @@ -512,6 +512,23 @@ class DenseCoeffsBase<Derived, true> : public DenseCoeffsBase<Derived, false> } #endif +}; + +template<typename Derived> +class DenseCoeffsBase<Derived, DirectAccessors> : public DenseCoeffsBase<Derived, WriteAccessors> +{ + public: + + typedef DenseCoeffsBase<Derived, WriteAccessors> Base; + typedef typename ei_traits<Derived>::Index Index; + typedef typename ei_traits<Derived>::Scalar Scalar; + typedef typename NumTraits<Scalar>::Real RealScalar; + + using Base::rows; + using Base::cols; + using Base::size; + using Base::derived; + /** \returns the pointer increment between two consecutive elements within a slice in the inner direction. * * \sa outerStride(), rowStride(), colStride() @@ -531,6 +548,7 @@ class DenseCoeffsBase<Derived, true> : public DenseCoeffsBase<Derived, false> return derived().outerStride(); } + // FIXME shall we remove it ? inline Index stride() const { return Derived::IsVectorAtCompileTime ? innerStride() : outerStride(); diff --git a/Eigen/src/Core/Diagonal.h b/Eigen/src/Core/Diagonal.h index 8c2eacd96..0b7d14179 100644 --- a/Eigen/src/Core/Diagonal.h +++ b/Eigen/src/Core/Diagonal.h @@ -62,7 +62,7 @@ struct ei_traits<Diagonal<MatrixType,DiagIndex> > MatrixType::MaxColsAtCompileTime) : (EIGEN_SIZE_MIN_PREFER_FIXED(MatrixType::MaxRowsAtCompileTime, MatrixType::MaxColsAtCompileTime) - AbsDiagIndex), MaxColsAtCompileTime = 1, - Flags = (unsigned int)_MatrixTypeNested::Flags & (HereditaryBits | LinearAccessBit | DirectAccessBit) & ~RowMajorBit, + Flags = (unsigned int)_MatrixTypeNested::Flags & (HereditaryBits | LinearAccessBit | LvalueBit | DirectAccessBit) & ~RowMajorBit, CoeffReadCost = _MatrixTypeNested::CoeffReadCost, MatrixTypeOuterStride = ei_outer_stride_at_compile_time<MatrixType>::ret, InnerStrideAtCompileTime = MatrixTypeOuterStride == Dynamic ? Dynamic : MatrixTypeOuterStride+1, diff --git a/Eigen/src/Core/DiagonalMatrix.h b/Eigen/src/Core/DiagonalMatrix.h index 8c4200a6f..0c0525028 100644 --- a/Eigen/src/Core/DiagonalMatrix.h +++ b/Eigen/src/Core/DiagonalMatrix.h @@ -105,6 +105,9 @@ struct ei_traits<DiagonalMatrix<_Scalar,SizeAtCompileTime,MaxSizeAtCompileTime> typedef Matrix<_Scalar,SizeAtCompileTime,1,0,MaxSizeAtCompileTime,1> DiagonalVectorType; typedef Dense StorageKind; typedef DenseIndex Index; + enum { + Flags = LvalueBit + }; }; template<typename _Scalar, int SizeAtCompileTime, int MaxSizeAtCompileTime> @@ -213,7 +216,7 @@ struct ei_traits<DiagonalWrapper<_DiagonalVectorType> > ColsAtCompileTime = DiagonalVectorType::SizeAtCompileTime, MaxRowsAtCompileTime = DiagonalVectorType::SizeAtCompileTime, MaxColsAtCompileTime = DiagonalVectorType::SizeAtCompileTime, - Flags = 0 + Flags = ei_traits<DiagonalVectorType>::Flags & LvalueBit }; }; diff --git a/Eigen/src/Core/Reverse.h b/Eigen/src/Core/Reverse.h index 5858e684c..6051f7366 100644 --- a/Eigen/src/Core/Reverse.h +++ b/Eigen/src/Core/Reverse.h @@ -59,7 +59,7 @@ struct ei_traits<Reverse<MatrixType, Direction> > LinearAccess = ( (Direction==BothDirections) && (int(_MatrixTypeNested::Flags)&PacketAccessBit) ) ? LinearAccessBit : 0, - Flags = int(_MatrixTypeNested::Flags) & (HereditaryBits | PacketAccessBit | LinearAccess | DirectAccessBit), + Flags = int(_MatrixTypeNested::Flags) & (HereditaryBits | LvalueBit | PacketAccessBit | LinearAccess), CoeffReadCost = _MatrixTypeNested::CoeffReadCost }; diff --git a/Eigen/src/Core/util/Constants.h b/Eigen/src/Core/util/Constants.h index d758c2a0b..2c100c809 100644 --- a/Eigen/src/Core/util/Constants.h +++ b/Eigen/src/Core/util/Constants.h @@ -139,6 +139,14 @@ const unsigned int DirectAccessBit = 0x20; * means the first coefficient packet is guaranteed to be aligned */ const unsigned int AlignedBit = 0x40; +/** \ingroup flags + * + * Means the expression is writable. Note that DirectAccessBit implies LvalueBit. + * Internaly, it is mainly used to enable the writable coeff accessors, and makes + * the read-only coeff accessors to return by const reference. + */ +const unsigned int LvalueBit = 0x80; + const unsigned int NestByRefBit = 0x100; // list of flags that are inherited by default @@ -234,6 +242,10 @@ enum { IsSparse }; +enum AccessorLevels { + ReadOnlyAccessors, WriteAccessors, DirectAccessors +}; + enum DecompositionOptions { Pivoting = 0x01, // LDLT, NoPivoting = 0x02, // LDLT, diff --git a/Eigen/src/Core/util/ForwardDeclarations.h b/Eigen/src/Core/util/ForwardDeclarations.h index 310ffa4b3..c3ff9d7c4 100644 --- a/Eigen/src/Core/util/ForwardDeclarations.h +++ b/Eigen/src/Core/util/ForwardDeclarations.h @@ -36,7 +36,10 @@ template<typename Derived> struct ei_has_direct_access template<typename Derived> struct EigenBase; template<typename Derived> class DenseBase; -template<typename Derived, bool EnableDirectAccessAPI = ei_has_direct_access<Derived>::ret> +template<typename Derived, + AccessorLevels Level = (ei_traits<Derived>::Flags & DirectAccessBit) ? DirectAccessors + : (ei_traits<Derived>::Flags & LvalueBit) ? WriteAccessors + : ReadOnlyAccessors> class DenseCoeffsBase; template<typename _Scalar, int _Rows, int _Cols, diff --git a/Eigen/src/Core/util/XprHelper.h b/Eigen/src/Core/util/XprHelper.h index c93398092..3c89a7f3f 100644 --- a/Eigen/src/Core/util/XprHelper.h +++ b/Eigen/src/Core/util/XprHelper.h @@ -155,7 +155,7 @@ class ei_compute_matrix_flags }; public: - enum { ret = LinearAccessBit | DirectAccessBit | NestByRefBit | packet_access_bit | row_major_bit | aligned_bit }; + enum { ret = LinearAccessBit | LvalueBit | DirectAccessBit | NestByRefBit | packet_access_bit | row_major_bit | aligned_bit }; }; template<int _Rows, int _Cols> struct ei_size_at_compile_time @@ -355,7 +355,7 @@ template<typename T, int n=1, typename PlainObject = typename ei_eval<T>::type> template<unsigned int Flags> struct ei_are_flags_consistent { - enum { ret = true }; + enum { ret = EIGEN_IMPLIES(bool(Flags&DirectAccessBit), bool(Flags&LvalueBit)) }; }; template<typename Derived, typename XprKind = typename ei_traits<Derived>::XprKind> diff --git a/Eigen/src/Eigenvalues/HessenbergDecomposition.h b/Eigen/src/Eigenvalues/HessenbergDecomposition.h index 0f2b78e27..79554187a 100644 --- a/Eigen/src/Eigenvalues/HessenbergDecomposition.h +++ b/Eigen/src/Eigenvalues/HessenbergDecomposition.h @@ -130,7 +130,7 @@ template<typename _MatrixType> class HessenbergDecomposition { if(matrix.rows()<2) { - m_isInitialized = true; + m_isInitialized = true; return; } m_hCoeffs.resize(matrix.rows()-1,1); @@ -160,7 +160,7 @@ template<typename _MatrixType> class HessenbergDecomposition m_matrix = matrix; if(matrix.rows()<2) { - m_isInitialized = true; + m_isInitialized = true; return *this; } m_hCoeffs.resize(matrix.rows()-1,1); @@ -360,7 +360,7 @@ template<typename MatrixType> struct HessenbergDecompositionMatrixHReturnType result = m_hess.packedMatrix(); Index n = result.rows(); if (n>2) - result.bottomLeftCorner(n-2, n-2).template triangularView<Lower>().setZero(); + result.bottomLeftCorner(n-2, n-2).template triangularView<Lower>().setZero(); } Index rows() const { return m_hess.packedMatrix().rows(); } diff --git a/Eigen/src/Sparse/DynamicSparseMatrix.h b/Eigen/src/Sparse/DynamicSparseMatrix.h index 69e1f55ba..620f09289 100644 --- a/Eigen/src/Sparse/DynamicSparseMatrix.h +++ b/Eigen/src/Sparse/DynamicSparseMatrix.h @@ -54,7 +54,7 @@ struct ei_traits<DynamicSparseMatrix<_Scalar, _Flags, _Index> > ColsAtCompileTime = Dynamic, MaxRowsAtCompileTime = Dynamic, MaxColsAtCompileTime = Dynamic, - Flags = _Flags | NestByRefBit, + Flags = _Flags | NestByRefBit | LvalueBit, CoeffReadCost = NumTraits<Scalar>::ReadCost, SupportedAccessPatterns = OuterRandomAccessPattern }; diff --git a/Eigen/src/Sparse/SparseMatrix.h b/Eigen/src/Sparse/SparseMatrix.h index ecf8efbe7..820cf2884 100644 --- a/Eigen/src/Sparse/SparseMatrix.h +++ b/Eigen/src/Sparse/SparseMatrix.h @@ -54,7 +54,7 @@ struct ei_traits<SparseMatrix<_Scalar, _Options, _Index> > ColsAtCompileTime = Dynamic, MaxRowsAtCompileTime = Dynamic, MaxColsAtCompileTime = Dynamic, - Flags = _Options | NestByRefBit, + Flags = _Options | NestByRefBit | LvalueBit, CoeffReadCost = NumTraits<Scalar>::ReadCost, SupportedAccessPatterns = InnerRandomAccessPattern }; diff --git a/Eigen/src/Sparse/SparseVector.h b/Eigen/src/Sparse/SparseVector.h index dfe79a3b2..c5d0a6981 100644 --- a/Eigen/src/Sparse/SparseVector.h +++ b/Eigen/src/Sparse/SparseVector.h @@ -48,7 +48,7 @@ struct ei_traits<SparseVector<_Scalar, _Options, _Index> > ColsAtCompileTime = IsColVector ? 1 : Dynamic, MaxRowsAtCompileTime = RowsAtCompileTime, MaxColsAtCompileTime = ColsAtCompileTime, - Flags = _Options | NestByRefBit, + Flags = _Options | NestByRefBit | LvalueBit, CoeffReadCost = NumTraits<Scalar>::ReadCost, SupportedAccessPatterns = InnerRandomAccessPattern }; |