Merge of itasc branch. Project files, scons and cmake should be working. Makefile...
[blender.git] / extern / Eigen2 / Eigen / src / Core / DiagonalCoeffs.h
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra. Eigen itself is part of the KDE project.
3 //
4 // Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>
5 //
6 // Eigen is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 3 of the License, or (at your option) any later version.
10 //
11 // Alternatively, you can redistribute it and/or
12 // modify it under the terms of the GNU General Public License as
13 // published by the Free Software Foundation; either version 2 of
14 // the License, or (at your option) any later version.
15 //
16 // Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
17 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
18 // FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the
19 // GNU General Public License for more details.
20 //
21 // You should have received a copy of the GNU Lesser General Public
22 // License and a copy of the GNU General Public License along with
23 // Eigen. If not, see <http://www.gnu.org/licenses/>.
24
25 #ifndef EIGEN_DIAGONALCOEFFS_H
26 #define EIGEN_DIAGONALCOEFFS_H
27
28 /** \class DiagonalCoeffs
29   *
30   * \brief Expression of the main diagonal of a matrix
31   *
32   * \param MatrixType the type of the object in which we are taking the main diagonal
33   *
34   * The matrix is not required to be square.
35   *
36   * This class represents an expression of the main diagonal of a square matrix.
37   * It is the return type of MatrixBase::diagonal() and most of the time this is
38   * the only way it is used.
39   *
40   * \sa MatrixBase::diagonal()
41   */
42 template<typename MatrixType>
43 struct ei_traits<DiagonalCoeffs<MatrixType> >
44 {
45   typedef typename MatrixType::Scalar Scalar;
46   typedef typename ei_nested<MatrixType>::type MatrixTypeNested;
47   typedef typename ei_unref<MatrixTypeNested>::type _MatrixTypeNested;
48   enum {
49     RowsAtCompileTime = int(MatrixType::SizeAtCompileTime) == Dynamic ? Dynamic
50                       : EIGEN_ENUM_MIN(MatrixType::RowsAtCompileTime,
51                                        MatrixType::ColsAtCompileTime),
52     ColsAtCompileTime = 1,
53     MaxRowsAtCompileTime = int(MatrixType::MaxSizeAtCompileTime) == Dynamic ? Dynamic
54                             : EIGEN_ENUM_MIN(MatrixType::MaxRowsAtCompileTime,
55                                              MatrixType::MaxColsAtCompileTime),
56     MaxColsAtCompileTime = 1,
57     Flags = (unsigned int)_MatrixTypeNested::Flags & (HereditaryBits | LinearAccessBit),
58     CoeffReadCost = _MatrixTypeNested::CoeffReadCost
59   };
60 };
61
62 template<typename MatrixType> class DiagonalCoeffs
63    : public MatrixBase<DiagonalCoeffs<MatrixType> >
64 {
65   public:
66
67     EIGEN_GENERIC_PUBLIC_INTERFACE(DiagonalCoeffs)
68
69     inline DiagonalCoeffs(const MatrixType& matrix) : m_matrix(matrix) {}
70
71     EIGEN_INHERIT_ASSIGNMENT_OPERATORS(DiagonalCoeffs)
72
73     inline int rows() const { return std::min(m_matrix.rows(), m_matrix.cols()); }
74     inline int cols() const { return 1; }
75
76     inline Scalar& coeffRef(int row, int)
77     {
78       return m_matrix.const_cast_derived().coeffRef(row, row);
79     }
80
81     inline const Scalar coeff(int row, int) const
82     {
83       return m_matrix.coeff(row, row);
84     }
85
86     inline Scalar& coeffRef(int index)
87     {
88       return m_matrix.const_cast_derived().coeffRef(index, index);
89     }
90
91     inline const Scalar coeff(int index) const
92     {
93       return m_matrix.coeff(index, index);
94     }
95
96   protected:
97
98     const typename MatrixType::Nested m_matrix;
99 };
100
101 /** \returns an expression of the main diagonal of the matrix \c *this
102   *
103   * \c *this is not required to be square.
104   *
105   * Example: \include MatrixBase_diagonal.cpp
106   * Output: \verbinclude MatrixBase_diagonal.out
107   *
108   * \sa class DiagonalCoeffs */
109 template<typename Derived>
110 inline DiagonalCoeffs<Derived>
111 MatrixBase<Derived>::diagonal()
112 {
113   return DiagonalCoeffs<Derived>(derived());
114 }
115
116 /** This is the const version of diagonal(). */
117 template<typename Derived>
118 inline const DiagonalCoeffs<Derived>
119 MatrixBase<Derived>::diagonal() const
120 {
121   return DiagonalCoeffs<Derived>(derived());
122 }
123
124 #endif // EIGEN_DIAGONALCOEFFS_H