1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_FLAGGED_H
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_FLAGGED_H
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class Flagged
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \ingroup Core_Module
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \brief Expression with modified flags
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \param ExpressionType the type of the object of which we are modifying the flags
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \param Added the flags added to the expression
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \param Removed the flags removed from the expression (has priority over Added).
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * This class represents an expression whose flags have been modified.
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * It is the return type of MatrixBase::flagged()
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * and most of the time this is the only way it is used.
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa MatrixBase::flagged()
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType, unsigned int Added, unsigned int Removed>
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct traits<Flagged<ExpressionType, Added, Removed> > : traits<ExpressionType>
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  enum { Flags = (ExpressionType::Flags | Added) & ~Removed };
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType, unsigned int Added, unsigned int Removed> class Flagged
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  : public MatrixBase<Flagged<ExpressionType, Added, Removed> >
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef MatrixBase<Flagged> Base;
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_DENSE_PUBLIC_INTERFACE(Flagged)
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::conditional<internal::must_nest_by_value<ExpressionType>::ret,
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        ExpressionType, const ExpressionType&>::type ExpressionTypeNested;
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename ExpressionType::InnerIterator InnerIterator;
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Flagged(const ExpressionType& matrix) : m_matrix(matrix) {}
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index rows() const { return m_matrix.rows(); }
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index cols() const { return m_matrix.cols(); }
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index outerStride() const { return m_matrix.outerStride(); }
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index innerStride() const { return m_matrix.innerStride(); }
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline CoeffReturnType coeff(Index row, Index col) const
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_matrix.coeff(row, col);
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline CoeffReturnType coeff(Index index) const
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_matrix.coeff(index);
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const Scalar& coeffRef(Index row, Index col) const
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_matrix.const_cast_derived().coeffRef(row, col);
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const Scalar& coeffRef(Index index) const
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_matrix.const_cast_derived().coeffRef(index);
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Scalar& coeffRef(Index row, Index col)
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_matrix.const_cast_derived().coeffRef(row, col);
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Scalar& coeffRef(Index index)
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_matrix.const_cast_derived().coeffRef(index);
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int LoadMode>
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const PacketScalar packet(Index row, Index col) const
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_matrix.template packet<LoadMode>(row, col);
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int LoadMode>
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline void writePacket(Index row, Index col, const PacketScalar& x)
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      m_matrix.const_cast_derived().template writePacket<LoadMode>(row, col, x);
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int LoadMode>
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const PacketScalar packet(Index index) const
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_matrix.template packet<LoadMode>(index);
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int LoadMode>
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline void writePacket(Index index, const PacketScalar& x)
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      m_matrix.const_cast_derived().template writePacket<LoadMode>(index, x);
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const ExpressionType& _expression() const { return m_matrix; }
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typename ExpressionType::PlainObject solveTriangular(const MatrixBase<OtherDerived>& other) const;
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void solveTriangularInPlace(const MatrixBase<OtherDerived>& other) const;
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ExpressionTypeNested m_matrix;
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns an expression of *this with added and removed flags
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * This is mostly for internal use.
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa class Flagged
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<unsigned int Added,unsigned int Removed>
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const Flagged<Derived, Added, Removed>
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::flagged() const
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return derived();
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_FLAGGED_H
141