Flagged.h
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2008 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_FLAGGED_H
11#define EIGEN_FLAGGED_H
12
13namespace Eigen {
14
30
31namespace internal {
32template<typename ExpressionType, unsigned int Added, unsigned int Removed>
33struct traits<Flagged<ExpressionType, Added, Removed> > : traits<ExpressionType>
34{
35 enum { Flags = (ExpressionType::Flags | Added) & ~Removed };
36};
37}
38
39template<typename ExpressionType, unsigned int Added, unsigned int Removed> class Flagged
40 : public MatrixBase<Flagged<ExpressionType, Added, Removed> >
41{
42 public:
43
44 typedef MatrixBase<Flagged> Base;
45
46 EIGEN_DENSE_PUBLIC_INTERFACE(Flagged)
47 typedef typename internal::conditional<internal::must_nest_by_value<ExpressionType>::ret,
48 ExpressionType, const ExpressionType&>::type ExpressionTypeNested;
49 typedef typename ExpressionType::InnerIterator InnerIterator;
50
51 inline Flagged(const ExpressionType& matrix) : m_matrix(matrix) {}
52
53 inline Index rows() const { return m_matrix.rows(); }
54 inline Index cols() const { return m_matrix.cols(); }
55 inline Index outerStride() const { return m_matrix.outerStride(); }
56 inline Index innerStride() const { return m_matrix.innerStride(); }
57
58 inline CoeffReturnType coeff(Index row, Index col) const
59 {
60 return m_matrix.coeff(row, col);
61 }
62
63 inline CoeffReturnType coeff(Index index) const
64 {
65 return m_matrix.coeff(index);
66 }
67
68 inline const Scalar& coeffRef(Index row, Index col) const
69 {
70 return m_matrix.const_cast_derived().coeffRef(row, col);
71 }
72
73 inline const Scalar& coeffRef(Index index) const
74 {
75 return m_matrix.const_cast_derived().coeffRef(index);
76 }
77
78 inline Scalar& coeffRef(Index row, Index col)
79 {
80 return m_matrix.const_cast_derived().coeffRef(row, col);
81 }
82
83 inline Scalar& coeffRef(Index index)
84 {
85 return m_matrix.const_cast_derived().coeffRef(index);
86 }
87
88 template<int LoadMode>
89 inline const PacketScalar packet(Index row, Index col) const
90 {
91 return m_matrix.template packet<LoadMode>(row, col);
92 }
93
94 template<int LoadMode>
95 inline void writePacket(Index row, Index col, const PacketScalar& x)
96 {
97 m_matrix.const_cast_derived().template writePacket<LoadMode>(row, col, x);
98 }
99
100 template<int LoadMode>
101 inline const PacketScalar packet(Index index) const
102 {
103 return m_matrix.template packet<LoadMode>(index);
104 }
105
106 template<int LoadMode>
107 inline void writePacket(Index index, const PacketScalar& x)
108 {
109 m_matrix.const_cast_derived().template writePacket<LoadMode>(index, x);
110 }
111
112 const ExpressionType& _expression() const { return m_matrix; }
113
114 template<typename OtherDerived>
115 typename ExpressionType::PlainObject solveTriangular(const MatrixBase<OtherDerived>& other) const;
116
117 template<typename OtherDerived>
118 void solveTriangularInPlace(const MatrixBase<OtherDerived>& other) const;
119
120 protected:
121 ExpressionTypeNested m_matrix;
122};
123
130template<typename Derived>
131template<unsigned int Added,unsigned int Removed>
132inline const Flagged<Derived, Added, Removed>
134{
135 return derived();
136}
137
138} // end namespace Eigen
139
140#endif // EIGEN_FLAGGED_H
internal::traits< Flagged< ExpressionType, Added, Removed > >::Index Index
Definition DenseBase.h:51
ColXpr col(Index i)
Definition DenseBase.h:553
RowXpr row(Index i)
Definition DenseBase.h:570
const Flagged< Derived, Added, Removed > flagged() const
Definition Flagged.h:133
Base class for all dense matrices, vectors, and expressions.
Definition MatrixBase.h:50
Definition LDLT.h:18