1 // This file is part of Eigen, a lightweight C++ template library 2 // for linear algebra. 3 // 4 // Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com> 5 // 6 // This Source Code Form is subject to the terms of the Mozilla 7 // Public License v. 2.0. If a copy of the MPL was not distributed 8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9 10 #ifndef EIGEN_MISC_IMAGE_H 11 #define EIGEN_MISC_IMAGE_H 12 13 namespace Eigen { 14 15 namespace internal { 16 17 /** \class image_retval_base 18 * 19 */ 20 template<typename DecompositionType> 21 struct traits<image_retval_base<DecompositionType> > 22 { 23 typedef typename DecompositionType::MatrixType MatrixType; 24 typedef Matrix< 25 typename MatrixType::Scalar, 26 MatrixType::RowsAtCompileTime, // the image is a subspace of the destination space, whose 27 // dimension is the number of rows of the original matrix 28 Dynamic, // we don't know at compile time the dimension of the image (the rank) 29 MatrixType::Options, 30 MatrixType::MaxRowsAtCompileTime, // the image matrix will consist of columns from the original matrix, 31 MatrixType::MaxColsAtCompileTime // so it has the same number of rows and at most as many columns. 32 > ReturnType; 33 }; 34 35 template<typename _DecompositionType> struct image_retval_base 36 : public ReturnByValue<image_retval_base<_DecompositionType> > 37 { 38 typedef _DecompositionType DecompositionType; 39 typedef typename DecompositionType::MatrixType MatrixType; 40 typedef ReturnByValue<image_retval_base> Base; 41 42 image_retval_base(const DecompositionType& dec, const MatrixType& originalMatrix) 43 : m_dec(dec), m_rank(dec.rank()), 44 m_cols(m_rank == 0 ? 1 : m_rank), 45 m_originalMatrix(originalMatrix) 46 {} 47 48 inline Index rows() const { return m_dec.rows(); } 49 inline Index cols() const { return m_cols; } 50 inline Index rank() const { return m_rank; } 51 inline const DecompositionType& dec() const { return m_dec; } 52 inline const MatrixType& originalMatrix() const { return m_originalMatrix; } 53 54 template<typename Dest> inline void evalTo(Dest& dst) const 55 { 56 static_cast<const image_retval<DecompositionType>*>(this)->evalTo(dst); 57 } 58 59 protected: 60 const DecompositionType& m_dec; 61 Index m_rank, m_cols; 62 const MatrixType& m_originalMatrix; 63 }; 64 65 } // end namespace internal 66 67 #define EIGEN_MAKE_IMAGE_HELPERS(DecompositionType) \ 68 typedef typename DecompositionType::MatrixType MatrixType; \ 69 typedef typename MatrixType::Scalar Scalar; \ 70 typedef typename MatrixType::RealScalar RealScalar; \ 71 typedef Eigen::internal::image_retval_base<DecompositionType> Base; \ 72 using Base::dec; \ 73 using Base::originalMatrix; \ 74 using Base::rank; \ 75 using Base::rows; \ 76 using Base::cols; \ 77 image_retval(const DecompositionType& dec, const MatrixType& originalMatrix) \ 78 : Base(dec, originalMatrix) {} 79 80 } // end namespace Eigen 81 82 #endif // EIGEN_MISC_IMAGE_H 83