move CommaInitializer out of MatrixBase and documment it (because of .finished())

This commit is contained in:
Gael Guennebaud 2008-09-13 18:51:51 +00:00
parent a62bd110a2
commit 8473a77f2f
4 changed files with 34 additions and 23 deletions

View File

@ -26,25 +26,34 @@
#ifndef EIGEN_COMMAINITIALIZER_H #ifndef EIGEN_COMMAINITIALIZER_H
#define EIGEN_COMMAINITIALIZER_H #define EIGEN_COMMAINITIALIZER_H
/** \internal /** \class CommaInitializer
* Helper class to define the MatrixBase::operator<< *
* \brief Helper class used by the comma initializer operator
*
* This class is internally used to implement the comma initializer feature. It is
* the return type of MatrixBase::operator<<, and most of the time this is the only
* way it is used.
*
* \sa \ref MatrixBaseCommaInitRef "MatrixBase::operator<<", CommaInitializer::finished()
*/ */
template<typename Derived> template<typename MatrixType>
struct MatrixBase<Derived>::CommaInitializer struct CommaInitializer
{ {
inline CommaInitializer(Derived& mat, const Scalar& s) typedef typename ei_traits<MatrixType>::Scalar Scalar;
inline CommaInitializer(MatrixType& mat, const Scalar& s)
: m_matrix(mat), m_row(0), m_col(1), m_currentBlockRows(1) : m_matrix(mat), m_row(0), m_col(1), m_currentBlockRows(1)
{ {
m_matrix.coeffRef(0,0) = s; m_matrix.coeffRef(0,0) = s;
} }
template<typename OtherDerived> template<typename OtherDerived>
inline CommaInitializer(Derived& mat, const MatrixBase<OtherDerived>& other) inline CommaInitializer(MatrixType& mat, const MatrixBase<OtherDerived>& other)
: m_matrix(mat), m_row(0), m_col(other.cols()), m_currentBlockRows(other.rows()) : m_matrix(mat), m_row(0), m_col(other.cols()), m_currentBlockRows(other.rows())
{ {
m_matrix.block(0, 0, other.rows(), other.cols()) = other; m_matrix.block(0, 0, other.rows(), other.cols()) = other;
} }
/* inserts a scalar value in the target matrix */
CommaInitializer& operator,(const Scalar& s) CommaInitializer& operator,(const Scalar& s)
{ {
if (m_col==m_matrix.cols()) if (m_col==m_matrix.cols())
@ -62,6 +71,7 @@ struct MatrixBase<Derived>::CommaInitializer
return *this; return *this;
} }
/* inserts a matrix expression in the target matrix */
template<typename OtherDerived> template<typename OtherDerived>
CommaInitializer& operator,(const MatrixBase<OtherDerived>& other) CommaInitializer& operator,(const MatrixBase<OtherDerived>& other)
{ {
@ -77,8 +87,8 @@ struct MatrixBase<Derived>::CommaInitializer
&& "Too many coefficients passed to comma initializer (operator<<)"); && "Too many coefficients passed to comma initializer (operator<<)");
ei_assert(m_currentBlockRows==other.rows()); ei_assert(m_currentBlockRows==other.rows());
if (OtherDerived::SizeAtCompileTime != Dynamic) if (OtherDerived::SizeAtCompileTime != Dynamic)
m_matrix.block<OtherDerived::RowsAtCompileTime != Dynamic ? OtherDerived::RowsAtCompileTime : 1, m_matrix.template block<OtherDerived::RowsAtCompileTime != Dynamic ? OtherDerived::RowsAtCompileTime : 1,
OtherDerived::ColsAtCompileTime != Dynamic ? OtherDerived::ColsAtCompileTime : 1> OtherDerived::ColsAtCompileTime != Dynamic ? OtherDerived::ColsAtCompileTime : 1>
(m_row, m_col) = other; (m_row, m_col) = other;
else else
m_matrix.block(m_row, m_col, other.rows(), other.cols()) = other; m_matrix.block(m_row, m_col, other.rows(), other.cols()) = other;
@ -100,11 +110,11 @@ struct MatrixBase<Derived>::CommaInitializer
* quaternion.fromRotationMatrix((Matrix3f() << axis0, axis1, axis2).finished()); * quaternion.fromRotationMatrix((Matrix3f() << axis0, axis1, axis2).finished());
* \endcode * \endcode
*/ */
inline Derived& finished() { return m_matrix; } inline MatrixType& finished() { return m_matrix; }
Derived& m_matrix; MatrixType& m_matrix; // target matrix
int m_row; // current row id int m_row; // current row id
int m_col; // current col id int m_col; // current col id
int m_currentBlockRows; // current block height int m_currentBlockRows; // current block height
}; };
@ -118,20 +128,22 @@ struct MatrixBase<Derived>::CommaInitializer
* *
* Example: \include MatrixBase_set.cpp * Example: \include MatrixBase_set.cpp
* Output: \verbinclude MatrixBase_set.out * Output: \verbinclude MatrixBase_set.out
*
* \sa CommaInitializer::finished(), class CommaInitializer
*/ */
template<typename Derived> template<typename Derived>
inline typename MatrixBase<Derived>::CommaInitializer MatrixBase<Derived>::operator<< (const Scalar& s) inline CommaInitializer<Derived> MatrixBase<Derived>::operator<< (const Scalar& s)
{ {
return CommaInitializer(*static_cast<Derived*>(this), s); return CommaInitializer<Derived>(*static_cast<Derived*>(this), s);
} }
/** \sa operator<<(const Scalar&) */ /** \sa operator<<(const Scalar&) */
template<typename Derived> template<typename Derived>
template<typename OtherDerived> template<typename OtherDerived>
inline typename MatrixBase<Derived>::CommaInitializer inline CommaInitializer<Derived>
MatrixBase<Derived>::operator<<(const MatrixBase<OtherDerived>& other) MatrixBase<Derived>::operator<<(const MatrixBase<OtherDerived>& other)
{ {
return CommaInitializer(*static_cast<Derived *>(this), other); return CommaInitializer<Derived>(*static_cast<Derived *>(this), other);
} }
#endif // EIGEN_COMMAINITIALIZER_H #endif // EIGEN_COMMAINITIALIZER_H

View File

@ -53,8 +53,6 @@
*/ */
template<typename Derived> class MatrixBase template<typename Derived> class MatrixBase
{ {
struct CommaInitializer;
public: public:
class InnerIterator; class InnerIterator;
@ -236,10 +234,10 @@ template<typename Derived> class MatrixBase
template<typename Derived1, typename Derived2> template<typename Derived1, typename Derived2>
Derived& lazyAssign(const Product<Derived1,Derived2,SparseProduct>& product); Derived& lazyAssign(const Product<Derived1,Derived2,SparseProduct>& product);
CommaInitializer operator<< (const Scalar& s); CommaInitializer<Derived> operator<< (const Scalar& s);
template<typename OtherDerived> template<typename OtherDerived>
CommaInitializer operator<< (const MatrixBase<OtherDerived>& other); CommaInitializer<Derived> operator<< (const MatrixBase<OtherDerived>& other);
const Scalar coeff(int row, int col) const; const Scalar coeff(int row, int col) const;
const Scalar operator()(int row, int col) const; const Scalar operator()(int row, int col) const;

View File

@ -91,9 +91,8 @@ MatrixBase<Derived>::redux(const BinaryOp& func) const
const bool unroll = SizeAtCompileTime * CoeffReadCost const bool unroll = SizeAtCompileTime * CoeffReadCost
+ (SizeAtCompileTime-1) * ei_functor_traits<BinaryOp>::Cost + (SizeAtCompileTime-1) * ei_functor_traits<BinaryOp>::Cost
<= EIGEN_UNROLLING_LIMIT; <= EIGEN_UNROLLING_LIMIT;
return ei_redux_impl<BinaryOp, Derived, 0, return ei_redux_impl<BinaryOp, Derived, 0, unroll ? int(SizeAtCompileTime) : Dynamic>
unroll ? int(SizeAtCompileTime) : Dynamic> ::run(derived(), func);
::run(derived(), func);
} }
/** \returns the minimum of all coefficients of *this /** \returns the minimum of all coefficients of *this

View File

@ -51,6 +51,8 @@ template<typename MatrixType, unsigned int Mode> class Part;
template<typename MatrixType, unsigned int Mode> class Extract; template<typename MatrixType, unsigned int Mode> class Extract;
template<typename ExpressionType> class Cwise; template<typename ExpressionType> class Cwise;
template<typename ExpressionType> class WithFormat; template<typename ExpressionType> class WithFormat;
template<typename MatrixType> struct CommaInitializer;
template<typename Lhs, typename Rhs> struct ei_product_mode; template<typename Lhs, typename Rhs> struct ei_product_mode;
template<typename Lhs, typename Rhs, int ProductMode = ei_product_mode<Lhs,Rhs>::value> struct ProductReturnType; template<typename Lhs, typename Rhs, int ProductMode = ei_product_mode<Lhs,Rhs>::value> struct ProductReturnType;