diff options
author | Gael Guennebaud <g.gael@free.fr> | 2014-06-27 15:53:51 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2014-06-27 15:53:51 +0200 |
commit | ae039dde135a6af852d7028abd772316613a5249 (patch) | |
tree | 41e2bf4a7aa0c49e316b74dc8c860366349619d9 /Eigen/src/Core | |
parent | f0648f886058a85930186bd935ffb2c9fa87b1f3 (diff) |
Add a NoPreferredStorageOrderBit flag for expression having no preferred storage order.
It is currently only used in Product.
Diffstat (limited to 'Eigen/src/Core')
-rw-r--r-- | Eigen/src/Core/DiagonalMatrix.h | 6 | ||||
-rw-r--r-- | Eigen/src/Core/Product.h | 15 | ||||
-rw-r--r-- | Eigen/src/Core/util/Constants.h | 10 |
3 files changed, 27 insertions, 4 deletions
diff --git a/Eigen/src/Core/DiagonalMatrix.h b/Eigen/src/Core/DiagonalMatrix.h index fc9ecf561..7a0b736f1 100644 --- a/Eigen/src/Core/DiagonalMatrix.h +++ b/Eigen/src/Core/DiagonalMatrix.h @@ -30,7 +30,7 @@ class DiagonalBase : public EigenBase<Derived> MaxRowsAtCompileTime = DiagonalVectorType::MaxSizeAtCompileTime, MaxColsAtCompileTime = DiagonalVectorType::MaxSizeAtCompileTime, IsVectorAtCompileTime = 0, - Flags = 0 + Flags = NoPreferredStorageOrderBit }; typedef Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime, 0, MaxRowsAtCompileTime, MaxColsAtCompileTime> DenseMatrixType; @@ -159,7 +159,7 @@ struct traits<DiagonalMatrix<_Scalar,SizeAtCompileTime,MaxSizeAtCompileTime> > typedef Dense StorageKind; typedef DenseIndex Index; enum { - Flags = LvalueBit + Flags = LvalueBit | NoPreferredStorageOrderBit }; }; } @@ -287,7 +287,7 @@ struct traits<DiagonalWrapper<_DiagonalVectorType> > ColsAtCompileTime = DiagonalVectorType::SizeAtCompileTime, MaxRowsAtCompileTime = DiagonalVectorType::SizeAtCompileTime, MaxColsAtCompileTime = DiagonalVectorType::SizeAtCompileTime, - Flags = traits<DiagonalVectorType>::Flags & LvalueBit + Flags = (traits<DiagonalVectorType>::Flags & LvalueBit) | NoPreferredStorageOrderBit #ifndef EIGEN_TEST_EVALUATORS , CoeffReadCost = traits<_DiagonalVectorType>::CoeffReadCost diff --git a/Eigen/src/Core/Product.h b/Eigen/src/Core/Product.h index 626b737c7..e381ac46a 100644 --- a/Eigen/src/Core/Product.h +++ b/Eigen/src/Core/Product.h @@ -82,7 +82,10 @@ struct traits<Product<Lhs, Rhs, Option> > #endif // The storage order is somewhat arbitrary here. The correct one will be determined through the evaluator. - Flags = (MaxRowsAtCompileTime==1 ? RowMajorBit : 0) + Flags = ( MaxRowsAtCompileTime==1 + || ((LhsCleaned::Flags&NoPreferredStorageOrderBit) && (RhsCleaned::Flags&RowMajorBit)) + || ((RhsCleaned::Flags&NoPreferredStorageOrderBit) && (LhsCleaned::Flags&RowMajorBit)) ) + ? RowMajorBit : (MaxColsAtCompileTime==1 ? 0 : NoPreferredStorageOrderBit) }; }; @@ -156,6 +159,16 @@ public: } // namespace internal +#ifdef EIGEN_TEST_EVALUATORS +// Generic API dispatcher +template<typename Lhs, typename Rhs, int Option, typename StorageKind> +class ProductImpl : public internal::generic_xpr_base<Product<Lhs,Rhs,Option>, MatrixXpr, StorageKind>::type +{ + public: + typedef typename internal::generic_xpr_base<Product<Lhs,Rhs,Option>, MatrixXpr, StorageKind>::type Base; +}; +#endif + template<typename Lhs, typename Rhs, int Option> class ProductImpl<Lhs,Rhs,Option,Dense> : public internal::dense_product_base<Lhs,Rhs,Option> diff --git a/Eigen/src/Core/util/Constants.h b/Eigen/src/Core/util/Constants.h index aae8625d1..131f5d793 100644 --- a/Eigen/src/Core/util/Constants.h +++ b/Eigen/src/Core/util/Constants.h @@ -154,6 +154,16 @@ const unsigned int AlignedBit = 0x80; const unsigned int NestByRefBit = 0x100; +/** \ingroup flags + * + * for an expression, this means that the storage order + * can be either row-major or column-major. + * The precise choice will be decided at evaluation time or when + * combined with other expressions. + * \sa \ref RowMajorBit, \ref TopicStorageOrders */ +const unsigned int NoPreferredStorageOrderBit = 0x200; + + // list of flags that are inherited by default const unsigned int HereditaryBits = RowMajorBit | EvalBeforeNestingBit |