|  | // This file is part of Eigen, a lightweight C++ template library | 
|  | // for linear algebra. | 
|  | // | 
|  | // Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr> | 
|  | // Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com> | 
|  | // | 
|  | // Eigen is free software; you can redistribute it and/or | 
|  | // modify it under the terms of the GNU Lesser General Public | 
|  | // License as published by the Free Software Foundation; either | 
|  | // version 3 of the License, or (at your option) any later version. | 
|  | // | 
|  | // Alternatively, you can redistribute it and/or | 
|  | // modify it under the terms of the GNU General Public License as | 
|  | // published by the Free Software Foundation; either version 2 of | 
|  | // the License, or (at your option) any later version. | 
|  | // | 
|  | // Eigen is distributed in the hope that it will be useful, but WITHOUT ANY | 
|  | // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | 
|  | // FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the | 
|  | // GNU General Public License for more details. | 
|  | // | 
|  | // You should have received a copy of the GNU Lesser General Public | 
|  | // License and a copy of the GNU General Public License along with | 
|  | // Eigen. If not, see <http://www.gnu.org/licenses/>. | 
|  |  | 
|  | #ifndef EIGEN_COMMAINITIALIZER_H | 
|  | #define EIGEN_COMMAINITIALIZER_H | 
|  |  | 
|  | /** \class CommaInitializer | 
|  | * | 
|  | * \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 XprType> | 
|  | struct CommaInitializer | 
|  | { | 
|  | typedef typename XprType::Scalar Scalar; | 
|  | typedef typename XprType::Index Index; | 
|  |  | 
|  | inline CommaInitializer(XprType& xpr, const Scalar& s) | 
|  | : m_xpr(xpr), m_row(0), m_col(1), m_currentBlockRows(1) | 
|  | { | 
|  | m_xpr.coeffRef(0,0) = s; | 
|  | } | 
|  |  | 
|  | template<typename OtherDerived> | 
|  | inline CommaInitializer(XprType& xpr, const DenseBase<OtherDerived>& other) | 
|  | : m_xpr(xpr), m_row(0), m_col(other.cols()), m_currentBlockRows(other.rows()) | 
|  | { | 
|  | m_xpr.block(0, 0, other.rows(), other.cols()) = other; | 
|  | } | 
|  |  | 
|  | /* inserts a scalar value in the target matrix */ | 
|  | CommaInitializer& operator,(const Scalar& s) | 
|  | { | 
|  | if (m_col==m_xpr.cols()) | 
|  | { | 
|  | m_row+=m_currentBlockRows; | 
|  | m_col = 0; | 
|  | m_currentBlockRows = 1; | 
|  | ei_assert(m_row<m_xpr.rows() | 
|  | && "Too many rows passed to comma initializer (operator<<)"); | 
|  | } | 
|  | ei_assert(m_col<m_xpr.cols() | 
|  | && "Too many coefficients passed to comma initializer (operator<<)"); | 
|  | ei_assert(m_currentBlockRows==1); | 
|  | m_xpr.coeffRef(m_row, m_col++) = s; | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | /* inserts a matrix expression in the target matrix */ | 
|  | template<typename OtherDerived> | 
|  | CommaInitializer& operator,(const DenseBase<OtherDerived>& other) | 
|  | { | 
|  | if (m_col==m_xpr.cols()) | 
|  | { | 
|  | m_row+=m_currentBlockRows; | 
|  | m_col = 0; | 
|  | m_currentBlockRows = other.rows(); | 
|  | ei_assert(m_row+m_currentBlockRows<=m_xpr.rows() | 
|  | && "Too many rows passed to comma initializer (operator<<)"); | 
|  | } | 
|  | ei_assert(m_col<m_xpr.cols() | 
|  | && "Too many coefficients passed to comma initializer (operator<<)"); | 
|  | ei_assert(m_currentBlockRows==other.rows()); | 
|  | if (OtherDerived::SizeAtCompileTime != Dynamic) | 
|  | m_xpr.template block<OtherDerived::RowsAtCompileTime != Dynamic ? OtherDerived::RowsAtCompileTime : 1, | 
|  | OtherDerived::ColsAtCompileTime != Dynamic ? OtherDerived::ColsAtCompileTime : 1> | 
|  | (m_row, m_col) = other; | 
|  | else | 
|  | m_xpr.block(m_row, m_col, other.rows(), other.cols()) = other; | 
|  | m_col += other.cols(); | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | inline ~CommaInitializer() | 
|  | { | 
|  | ei_assert((m_row+m_currentBlockRows) == m_xpr.rows() | 
|  | && m_col == m_xpr.cols() | 
|  | && "Too few coefficients passed to comma initializer (operator<<)"); | 
|  | } | 
|  |  | 
|  | /** \returns the built matrix once all its coefficients have been set. | 
|  | * Calling finished is 100% optional. Its purpose is to write expressions | 
|  | * like this: | 
|  | * \code | 
|  | * quaternion.fromRotationMatrix((Matrix3f() << axis0, axis1, axis2).finished()); | 
|  | * \endcode | 
|  | */ | 
|  | inline XprType& finished() { return m_xpr; } | 
|  |  | 
|  | XprType& m_xpr;   // target expression | 
|  | Index m_row;              // current row id | 
|  | Index m_col;              // current col id | 
|  | Index m_currentBlockRows; // current block height | 
|  | }; | 
|  |  | 
|  | /** \anchor MatrixBaseCommaInitRef | 
|  | * Convenient operator to set the coefficients of a matrix. | 
|  | * | 
|  | * The coefficients must be provided in a row major order and exactly match | 
|  | * the size of the matrix. Otherwise an assertion is raised. | 
|  | * | 
|  | * Example: \include MatrixBase_set.cpp | 
|  | * Output: \verbinclude MatrixBase_set.out | 
|  | * | 
|  | * \sa CommaInitializer::finished(), class CommaInitializer | 
|  | */ | 
|  | template<typename Derived> | 
|  | inline CommaInitializer<Derived> DenseBase<Derived>::operator<< (const Scalar& s) | 
|  | { | 
|  | return CommaInitializer<Derived>(*static_cast<Derived*>(this), s); | 
|  | } | 
|  |  | 
|  | /** \sa operator<<(const Scalar&) */ | 
|  | template<typename Derived> | 
|  | template<typename OtherDerived> | 
|  | inline CommaInitializer<Derived> | 
|  | DenseBase<Derived>::operator<<(const DenseBase<OtherDerived>& other) | 
|  | { | 
|  | return CommaInitializer<Derived>(*static_cast<Derived *>(this), other); | 
|  | } | 
|  |  | 
|  | #endif // EIGEN_COMMAINITIALIZER_H |