| // This file is part of Eigen, a lightweight C++ template library | 
 | // for linear algebra. | 
 | // | 
 | // Copyright (C) 2008-2009 Guillaume Saupin <guillaume.saupin@cea.fr> | 
 | // | 
 | // This Source Code Form is subject to the terms of the Mozilla | 
 | // Public License v. 2.0. If a copy of the MPL was not distributed | 
 | // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. | 
 |  | 
 | #ifndef EIGEN_SKYLINEMATRIXBASE_H | 
 | #define EIGEN_SKYLINEMATRIXBASE_H | 
 |  | 
 | #include "SkylineUtil.h" | 
 |  | 
 | namespace Eigen {  | 
 |  | 
 | /** \ingroup Skyline_Module | 
 |  * | 
 |  * \class SkylineMatrixBase | 
 |  * | 
 |  * \brief Base class of any skyline matrices or skyline expressions | 
 |  * | 
 |  * \param Derived | 
 |  * | 
 |  */ | 
 | template<typename Derived> class SkylineMatrixBase : public EigenBase<Derived> { | 
 | public: | 
 |  | 
 |     typedef typename internal::traits<Derived>::Scalar Scalar; | 
 |     typedef typename internal::traits<Derived>::StorageKind StorageKind; | 
 |     typedef typename internal::index<StorageKind>::type Index; | 
 |  | 
 |     enum { | 
 |         RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime, | 
 |         /**< The number of rows at compile-time. This is just a copy of the value provided | 
 |          * by the \a Derived type. If a value is not known at compile-time, | 
 |          * it is set to the \a Dynamic constant. | 
 |          * \sa MatrixBase::rows(), MatrixBase::cols(), ColsAtCompileTime, SizeAtCompileTime */ | 
 |  | 
 |         ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime, | 
 |         /**< The number of columns at compile-time. This is just a copy of the value provided | 
 |          * by the \a Derived type. If a value is not known at compile-time, | 
 |          * it is set to the \a Dynamic constant. | 
 |          * \sa MatrixBase::rows(), MatrixBase::cols(), RowsAtCompileTime, SizeAtCompileTime */ | 
 |  | 
 |  | 
 |         SizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::RowsAtCompileTime, | 
 |         internal::traits<Derived>::ColsAtCompileTime>::ret), | 
 |         /**< This is equal to the number of coefficients, i.e. the number of | 
 |          * rows times the number of columns, or to \a Dynamic if this is not | 
 |          * known at compile-time. \sa RowsAtCompileTime, ColsAtCompileTime */ | 
 |  | 
 |         MaxRowsAtCompileTime = RowsAtCompileTime, | 
 |         MaxColsAtCompileTime = ColsAtCompileTime, | 
 |  | 
 |         MaxSizeAtCompileTime = (internal::size_at_compile_time<MaxRowsAtCompileTime, | 
 |         MaxColsAtCompileTime>::ret), | 
 |  | 
 |         IsVectorAtCompileTime = RowsAtCompileTime == 1 || ColsAtCompileTime == 1, | 
 |         /**< This is set to true if either the number of rows or the number of | 
 |          * columns is known at compile-time to be equal to 1. Indeed, in that case, | 
 |          * we are dealing with a column-vector (if there is only one column) or with | 
 |          * a row-vector (if there is only one row). */ | 
 |  | 
 |         Flags = internal::traits<Derived>::Flags, | 
 |         /**< This stores expression \ref flags flags which may or may not be inherited by new expressions | 
 |          * constructed from this one. See the \ref flags "list of flags". | 
 |          */ | 
 |  | 
 |         CoeffReadCost = internal::traits<Derived>::CoeffReadCost, | 
 |         /**< This is a rough measure of how expensive it is to read one coefficient from | 
 |          * this expression. | 
 |          */ | 
 |  | 
 |         IsRowMajor = Flags & RowMajorBit ? 1 : 0 | 
 |     }; | 
 |  | 
 | #ifndef EIGEN_PARSED_BY_DOXYGEN | 
 |     /** This is the "real scalar" type; if the \a Scalar type is already real numbers | 
 |      * (e.g. int, float or double) then \a RealScalar is just the same as \a Scalar. If | 
 |      * \a Scalar is \a std::complex<T> then RealScalar is \a T. | 
 |      * | 
 |      * \sa class NumTraits | 
 |      */ | 
 |     typedef typename NumTraits<Scalar>::Real RealScalar; | 
 |  | 
 |     /** type of the equivalent square matrix */ | 
 |     typedef Matrix<Scalar, EIGEN_SIZE_MAX(RowsAtCompileTime, ColsAtCompileTime), | 
 |                            EIGEN_SIZE_MAX(RowsAtCompileTime, ColsAtCompileTime) > SquareMatrixType; | 
 |  | 
 |     inline const Derived& derived() const { | 
 |         return *static_cast<const Derived*> (this); | 
 |     } | 
 |  | 
 |     inline Derived& derived() { | 
 |         return *static_cast<Derived*> (this); | 
 |     } | 
 |  | 
 |     inline Derived& const_cast_derived() const { | 
 |         return *static_cast<Derived*> (const_cast<SkylineMatrixBase*> (this)); | 
 |     } | 
 | #endif // not EIGEN_PARSED_BY_DOXYGEN | 
 |  | 
 |     /** \returns the number of rows. \sa cols(), RowsAtCompileTime */ | 
 |     inline Index rows() const { | 
 |         return derived().rows(); | 
 |     } | 
 |  | 
 |     /** \returns the number of columns. \sa rows(), ColsAtCompileTime*/ | 
 |     inline Index cols() const { | 
 |         return derived().cols(); | 
 |     } | 
 |  | 
 |     /** \returns the number of coefficients, which is \a rows()*cols(). | 
 |      * \sa rows(), cols(), SizeAtCompileTime. */ | 
 |     inline Index size() const { | 
 |         return rows() * cols(); | 
 |     } | 
 |  | 
 |     /** \returns the number of nonzero coefficients which is in practice the number | 
 |      * of stored coefficients. */ | 
 |     inline Index nonZeros() const { | 
 |         return derived().nonZeros(); | 
 |     } | 
 |  | 
 |     /** \returns the size of the storage major dimension, | 
 |      * i.e., the number of columns for a columns major matrix, and the number of rows otherwise */ | 
 |     Index outerSize() const { | 
 |         return (int(Flags) & RowMajorBit) ? this->rows() : this->cols(); | 
 |     } | 
 |  | 
 |     /** \returns the size of the inner dimension according to the storage order, | 
 |      * i.e., the number of rows for a columns major matrix, and the number of cols otherwise */ | 
 |     Index innerSize() const { | 
 |         return (int(Flags) & RowMajorBit) ? this->cols() : this->rows(); | 
 |     } | 
 |  | 
 |     bool isRValue() const { | 
 |         return m_isRValue; | 
 |     } | 
 |  | 
 |     Derived& markAsRValue() { | 
 |         m_isRValue = true; | 
 |         return derived(); | 
 |     } | 
 |  | 
 |     SkylineMatrixBase() : m_isRValue(false) { | 
 |         /* TODO check flags */ | 
 |     } | 
 |  | 
 |     inline Derived & operator=(const Derived& other) { | 
 |         this->operator=<Derived > (other); | 
 |         return derived(); | 
 |     } | 
 |  | 
 |     template<typename OtherDerived> | 
 |     inline void assignGeneric(const OtherDerived& other) { | 
 |         derived().resize(other.rows(), other.cols()); | 
 |         for (Index row = 0; row < rows(); row++) | 
 |             for (Index col = 0; col < cols(); col++) { | 
 |                 if (other.coeff(row, col) != Scalar(0)) | 
 |                     derived().insert(row, col) = other.coeff(row, col); | 
 |             } | 
 |         derived().finalize(); | 
 |     } | 
 |  | 
 |     template<typename OtherDerived> | 
 |             inline Derived & operator=(const SkylineMatrixBase<OtherDerived>& other) { | 
 |         //TODO | 
 |     } | 
 |  | 
 |     template<typename Lhs, typename Rhs> | 
 |             inline Derived & operator=(const SkylineProduct<Lhs, Rhs, SkylineTimeSkylineProduct>& product); | 
 |  | 
 |     friend std::ostream & operator <<(std::ostream & s, const SkylineMatrixBase& m) { | 
 |         s << m.derived(); | 
 |         return s; | 
 |     } | 
 |  | 
 |     template<typename OtherDerived> | 
 |     const typename SkylineProductReturnType<Derived, OtherDerived>::Type | 
 |     operator*(const MatrixBase<OtherDerived> &other) const; | 
 |  | 
 |     /** \internal use operator= */ | 
 |     template<typename DenseDerived> | 
 |     void evalTo(MatrixBase<DenseDerived>& dst) const { | 
 |         dst.setZero(); | 
 |         for (Index i = 0; i < rows(); i++) | 
 |             for (Index j = 0; j < rows(); j++) | 
 |                 dst(i, j) = derived().coeff(i, j); | 
 |     } | 
 |  | 
 |     Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime> toDense() const { | 
 |         return derived(); | 
 |     } | 
 |  | 
 |     /** \returns the matrix or vector obtained by evaluating this expression. | 
 |      * | 
 |      * Notice that in the case of a plain matrix or vector (not an expression) this function just returns | 
 |      * a const reference, in order to avoid a useless copy. | 
 |      */ | 
 |     EIGEN_STRONG_INLINE const typename internal::eval<Derived, IsSkyline>::type eval() const { | 
 |         return typename internal::eval<Derived>::type(derived()); | 
 |     } | 
 |  | 
 | protected: | 
 |     bool m_isRValue; | 
 | }; | 
 |  | 
 | } // end namespace Eigen | 
 |  | 
 | #endif // EIGEN_SkylineMatrixBase_H |