Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef EIGEN_COMMAINITIALIZER_H
00027 #define EIGEN_COMMAINITIALIZER_H
00028
00029 namespace Eigen {
00030
00042 template<typename XprType>
00043 struct CommaInitializer
00044 {
00045 typedef typename XprType::Scalar Scalar;
00046 typedef typename XprType::Index Index;
00047
00048 inline CommaInitializer(XprType& xpr, const Scalar& s)
00049 : m_xpr(xpr), m_row(0), m_col(1), m_currentBlockRows(1)
00050 {
00051 m_xpr.coeffRef(0,0) = s;
00052 }
00053
00054 template<typename OtherDerived>
00055 inline CommaInitializer(XprType& xpr, const DenseBase<OtherDerived>& other)
00056 : m_xpr(xpr), m_row(0), m_col(other.cols()), m_currentBlockRows(other.rows())
00057 {
00058 m_xpr.block(0, 0, other.rows(), other.cols()) = other;
00059 }
00060
00061
00062 CommaInitializer& operator,(const Scalar& s)
00063 {
00064 if (m_col==m_xpr.cols())
00065 {
00066 m_row+=m_currentBlockRows;
00067 m_col = 0;
00068 m_currentBlockRows = 1;
00069 eigen_assert(m_row<m_xpr.rows()
00070 && "Too many rows passed to comma initializer (operator<<)");
00071 }
00072 eigen_assert(m_col<m_xpr.cols()
00073 && "Too many coefficients passed to comma initializer (operator<<)");
00074 eigen_assert(m_currentBlockRows==1);
00075 m_xpr.coeffRef(m_row, m_col++) = s;
00076 return *this;
00077 }
00078
00079
00080 template<typename OtherDerived>
00081 CommaInitializer& operator,(const DenseBase<OtherDerived>& other)
00082 {
00083 if (m_col==m_xpr.cols())
00084 {
00085 m_row+=m_currentBlockRows;
00086 m_col = 0;
00087 m_currentBlockRows = other.rows();
00088 eigen_assert(m_row+m_currentBlockRows<=m_xpr.rows()
00089 && "Too many rows passed to comma initializer (operator<<)");
00090 }
00091 eigen_assert(m_col<m_xpr.cols()
00092 && "Too many coefficients passed to comma initializer (operator<<)");
00093 eigen_assert(m_currentBlockRows==other.rows());
00094 if (OtherDerived::SizeAtCompileTime != Dynamic)
00095 m_xpr.template block<OtherDerived::RowsAtCompileTime != Dynamic ? OtherDerived::RowsAtCompileTime : 1,
00096 OtherDerived::ColsAtCompileTime != Dynamic ? OtherDerived::ColsAtCompileTime : 1>
00097 (m_row, m_col) = other;
00098 else
00099 m_xpr.block(m_row, m_col, other.rows(), other.cols()) = other;
00100 m_col += other.cols();
00101 return *this;
00102 }
00103
00104 inline ~CommaInitializer()
00105 {
00106 eigen_assert((m_row+m_currentBlockRows) == m_xpr.rows()
00107 && m_col == m_xpr.cols()
00108 && "Too few coefficients passed to comma initializer (operator<<)");
00109 }
00110
00118 inline XprType& finished() { return m_xpr; }
00119
00120 XprType& m_xpr;
00121 Index m_row;
00122 Index m_col;
00123 Index m_currentBlockRows;
00124 };
00125
00137 template<typename Derived>
00138 inline CommaInitializer<Derived> DenseBase<Derived>::operator<< (const Scalar& s)
00139 {
00140 return CommaInitializer<Derived>(*static_cast<Derived*>(this), s);
00141 }
00142
00144 template<typename Derived>
00145 template<typename OtherDerived>
00146 inline CommaInitializer<Derived>
00147 DenseBase<Derived>::operator<<(const DenseBase<OtherDerived>& other)
00148 {
00149 return CommaInitializer<Derived>(*static_cast<Derived *>(this), other);
00150 }
00151
00152 }
00153
00154 #endif // EIGEN_COMMAINITIALIZER_H