* added _*coeffRef members in NestedByValue

* added ConjugateReturnType and AdjointReturnType that are type-defined to Derived&
  and Transpose<Derived> if the scalar type is not complex: this avoids abusive copies in
  the cache friendly Product
This commit is contained in:
Gael Guennebaud 2008-05-28 09:09:18 +00:00
parent f54760c889
commit 73084dc754
5 changed files with 27 additions and 11 deletions

View File

@ -143,10 +143,10 @@ MatrixBase<Derived>::cwiseAbs2() const
*
* \sa adjoint() */
template<typename Derived>
inline const CwiseUnaryOp<ei_scalar_conjugate_op<typename ei_traits<Derived>::Scalar>, Derived>
inline const typename MatrixBase<Derived>::ConjugateReturnType
MatrixBase<Derived>::conjugate() const
{
return derived();
return ConjugateReturnType(derived());
}
/** \returns an expression of *this with the \a Scalar type casted to

View File

@ -304,10 +304,17 @@ template<typename Derived> class MatrixBase
Transpose<Derived> transpose();
const Transpose<Derived> transpose() const;
const Transpose<
NestByValue<CwiseUnaryOp<ei_scalar_conjugate_op<typename ei_traits<Derived>::Scalar>, Derived> >
>
adjoint() const;
/** the return type of MatrixBase::conjugate() */
typedef typename ei_meta_if<NumTraits<Scalar>::IsComplex,
CwiseUnaryOp<ei_scalar_conjugate_op<Scalar>, Derived>,
Derived&
>::ret ConjugateReturnType;
/** the return type of MatrixBase::adjoint() */
typedef Transpose<
NestByValue<typename ei_unref<ConjugateReturnType>::type>
> AdjointReturnType;
const AdjointReturnType adjoint() const;
//@}
/// \name Sub-matrices
@ -465,7 +472,7 @@ template<typename Derived> class MatrixBase
/// \name Coefficient-wise operations
//@{
const CwiseUnaryOp<ei_scalar_conjugate_op<typename ei_traits<Derived>::Scalar>, Derived> conjugate() const;
const ConjugateReturnType conjugate() const;
template<typename OtherDerived>
const CwiseBinaryOp<ei_scalar_product_op<typename ei_traits<Derived>::Scalar>, Derived, OtherDerived>

View File

@ -71,12 +71,23 @@ template<typename ExpressionType> class NestByValue
return m_expression.coeff(row, col);
}
inline Scalar& _coeffRef(int row, int col)
{
return m_expression.const_cast_derived().coeffRef(row, col);
}
template<int LoadMode>
inline const PacketScalar _packetCoeff(int row, int col) const
{
return m_expression.template packetCoeff<LoadMode>(row, col);
}
template<int LoadMode>
inline void _writePacketCoeff(int row, int col, const PacketScalar& x)
{
m_expression.const_cast_derived().template writePacketCoeff<LoadMode>(row, col, x);
}
protected:
const ExpressionType m_expression;
};

View File

@ -228,7 +228,7 @@ struct ei_traits<Product<Lhs, Rhs, EvalMode> >
_LostBits = HereditaryBits & ~(
(_RowMajor ? 0 : RowMajorBit)
| ((RowsAtCompileTime == Dynamic || ColsAtCompileTime == Dynamic) ? 0 : LargeBit)),
Flags = ((unsigned int)(LhsFlags | RhsFlags) & _LostBits)
Flags = ((unsigned int)(LhsFlags | RhsFlags) & _LostBits & ~NestedByValue)
| EvalBeforeAssigningBit
| EvalBeforeNestingBit
| (_Vectorizable ? VectorizableBit : 0),

View File

@ -125,9 +125,7 @@ MatrixBase<Derived>::transpose() const
*
* \sa transpose(), conjugate(), class Transpose, class ei_scalar_conjugate_op */
template<typename Derived>
inline const Transpose<
NestByValue<CwiseUnaryOp<ei_scalar_conjugate_op<typename ei_traits<Derived>::Scalar>, Derived > >
>
inline const typename MatrixBase<Derived>::AdjointReturnType
MatrixBase<Derived>::adjoint() const
{
return conjugate().nestByValue();