Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef EIGEN_COMMAINITIALIZER_H
00012 #define EIGEN_COMMAINITIALIZER_H
00013
00014 namespace Eigen {
00015
00027 template<typename XprType>
00028 struct CommaInitializer
00029 {
00030 typedef typename XprType::Scalar Scalar;
00031 typedef typename XprType::Index Index;
00032
00033 inline CommaInitializer(XprType& xpr, const Scalar& s)
00034 : m_xpr(xpr), m_row(0), m_col(1), m_currentBlockRows(1)
00035 {
00036 m_xpr.coeffRef(0,0) = s;
00037 }
00038
00039 template<typename OtherDerived>
00040 inline CommaInitializer(XprType& xpr, const DenseBase<OtherDerived>& other)
00041 : m_xpr(xpr), m_row(0), m_col(other.cols()), m_currentBlockRows(other.rows())
00042 {
00043 m_xpr.block(0, 0, other.rows(), other.cols()) = other;
00044 }
00045
00046
00047
00048
00049 inline CommaInitializer(const CommaInitializer& o)
00050 : m_xpr(o.m_xpr), m_row(o.m_row), m_col(o.m_col), m_currentBlockRows(o.m_currentBlockRows) {
00051
00052 const_cast<CommaInitializer&>(o).m_row = m_xpr.rows();
00053 const_cast<CommaInitializer&>(o).m_col = m_xpr.cols();
00054 const_cast<CommaInitializer&>(o).m_currentBlockRows = 0;
00055 }
00056
00057
00058 CommaInitializer& operator,(const Scalar& s)
00059 {
00060 if (m_col==m_xpr.cols())
00061 {
00062 m_row+=m_currentBlockRows;
00063 m_col = 0;
00064 m_currentBlockRows = 1;
00065 eigen_assert(m_row<m_xpr.rows()
00066 && "Too many rows passed to comma initializer (operator<<)");
00067 }
00068 eigen_assert(m_col<m_xpr.cols()
00069 && "Too many coefficients passed to comma initializer (operator<<)");
00070 eigen_assert(m_currentBlockRows==1);
00071 m_xpr.coeffRef(m_row, m_col++) = s;
00072 return *this;
00073 }
00074
00075
00076 template<typename OtherDerived>
00077 CommaInitializer& operator,(const DenseBase<OtherDerived>& other)
00078 {
00079 if(other.cols()==0 || other.rows()==0)
00080 return *this;
00081 if (m_col==m_xpr.cols())
00082 {
00083 m_row+=m_currentBlockRows;
00084 m_col = 0;
00085 m_currentBlockRows = other.rows();
00086 eigen_assert(m_row+m_currentBlockRows<=m_xpr.rows()
00087 && "Too many rows passed to comma initializer (operator<<)");
00088 }
00089 eigen_assert(m_col<m_xpr.cols()
00090 && "Too many coefficients passed to comma initializer (operator<<)");
00091 eigen_assert(m_currentBlockRows==other.rows());
00092 if (OtherDerived::SizeAtCompileTime != Dynamic)
00093 m_xpr.template block<OtherDerived::RowsAtCompileTime != Dynamic ? OtherDerived::RowsAtCompileTime : 1,
00094 OtherDerived::ColsAtCompileTime != Dynamic ? OtherDerived::ColsAtCompileTime : 1>
00095 (m_row, m_col) = other;
00096 else
00097 m_xpr.block(m_row, m_col, other.rows(), other.cols()) = other;
00098 m_col += other.cols();
00099 return *this;
00100 }
00101
00102 inline ~CommaInitializer()
00103 {
00104 eigen_assert((m_row+m_currentBlockRows) == m_xpr.rows()
00105 && m_col == m_xpr.cols()
00106 && "Too few coefficients passed to comma initializer (operator<<)");
00107 }
00108
00116 inline XprType& finished() { return m_xpr; }
00117
00118 XprType& m_xpr;
00119 Index m_row;
00120 Index m_col;
00121 Index m_currentBlockRows;
00122 };
00123
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