Another set of UI messages fixes and tweaks! No functional changes.
[blender.git] / extern / Eigen3 / Eigen / src / Core / Select.h
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
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_SELECT_H
26 #define EIGEN_SELECT_H
27
28 /** \class Select
29   * \ingroup Core_Module
30   *
31   * \brief Expression of a coefficient wise version of the C++ ternary operator ?:
32   *
33   * \param ConditionMatrixType the type of the \em condition expression which must be a boolean matrix
34   * \param ThenMatrixType the type of the \em then expression
35   * \param ElseMatrixType the type of the \em else expression
36   *
37   * This class represents an expression of a coefficient wise version of the C++ ternary operator ?:.
38   * It is the return type of DenseBase::select() and most of the time this is the only way it is used.
39   *
40   * \sa DenseBase::select(const DenseBase<ThenDerived>&, const DenseBase<ElseDerived>&) const
41   */
42
43 namespace internal {
44 template<typename ConditionMatrixType, typename ThenMatrixType, typename ElseMatrixType>
45 struct traits<Select<ConditionMatrixType, ThenMatrixType, ElseMatrixType> >
46  : traits<ThenMatrixType>
47 {
48   typedef typename traits<ThenMatrixType>::Scalar Scalar;
49   typedef Dense StorageKind;
50   typedef typename traits<ThenMatrixType>::XprKind XprKind;
51   typedef typename ConditionMatrixType::Nested ConditionMatrixNested;
52   typedef typename ThenMatrixType::Nested ThenMatrixNested;
53   typedef typename ElseMatrixType::Nested ElseMatrixNested;
54   enum {
55     RowsAtCompileTime = ConditionMatrixType::RowsAtCompileTime,
56     ColsAtCompileTime = ConditionMatrixType::ColsAtCompileTime,
57     MaxRowsAtCompileTime = ConditionMatrixType::MaxRowsAtCompileTime,
58     MaxColsAtCompileTime = ConditionMatrixType::MaxColsAtCompileTime,
59     Flags = (unsigned int)ThenMatrixType::Flags & ElseMatrixType::Flags & HereditaryBits,
60     CoeffReadCost = traits<typename remove_all<ConditionMatrixNested>::type>::CoeffReadCost
61                   + EIGEN_SIZE_MAX(traits<typename remove_all<ThenMatrixNested>::type>::CoeffReadCost,
62                                    traits<typename remove_all<ElseMatrixNested>::type>::CoeffReadCost)
63   };
64 };
65 }
66
67 template<typename ConditionMatrixType, typename ThenMatrixType, typename ElseMatrixType>
68 class Select : internal::no_assignment_operator,
69   public internal::dense_xpr_base< Select<ConditionMatrixType, ThenMatrixType, ElseMatrixType> >::type
70 {
71   public:
72
73     typedef typename internal::dense_xpr_base<Select>::type Base;
74     EIGEN_DENSE_PUBLIC_INTERFACE(Select)
75
76     Select(const ConditionMatrixType& conditionMatrix,
77            const ThenMatrixType& thenMatrix,
78            const ElseMatrixType& elseMatrix)
79       : m_condition(conditionMatrix), m_then(thenMatrix), m_else(elseMatrix)
80     {
81       eigen_assert(m_condition.rows() == m_then.rows() && m_condition.rows() == m_else.rows());
82       eigen_assert(m_condition.cols() == m_then.cols() && m_condition.cols() == m_else.cols());
83     }
84
85     Index rows() const { return m_condition.rows(); }
86     Index cols() const { return m_condition.cols(); }
87
88     const Scalar coeff(Index i, Index j) const
89     {
90       if (m_condition.coeff(i,j))
91         return m_then.coeff(i,j);
92       else
93         return m_else.coeff(i,j);
94     }
95
96     const Scalar coeff(Index i) const
97     {
98       if (m_condition.coeff(i))
99         return m_then.coeff(i);
100       else
101         return m_else.coeff(i);
102     }
103
104   protected:
105     const typename ConditionMatrixType::Nested m_condition;
106     const typename ThenMatrixType::Nested m_then;
107     const typename ElseMatrixType::Nested m_else;
108 };
109
110
111 /** \returns a matrix where each coefficient (i,j) is equal to \a thenMatrix(i,j)
112   * if \c *this(i,j), and \a elseMatrix(i,j) otherwise.
113   *
114   * Example: \include MatrixBase_select.cpp
115   * Output: \verbinclude MatrixBase_select.out
116   *
117   * \sa class Select
118   */
119 template<typename Derived>
120 template<typename ThenDerived,typename ElseDerived>
121 inline const Select<Derived,ThenDerived,ElseDerived>
122 DenseBase<Derived>::select(const DenseBase<ThenDerived>& thenMatrix,
123                             const DenseBase<ElseDerived>& elseMatrix) const
124 {
125   return Select<Derived,ThenDerived,ElseDerived>(derived(), thenMatrix.derived(), elseMatrix.derived());
126 }
127
128 /** Version of DenseBase::select(const DenseBase&, const DenseBase&) with
129   * the \em else expression being a scalar value.
130   *
131   * \sa DenseBase::select(const DenseBase<ThenDerived>&, const DenseBase<ElseDerived>&) const, class Select
132   */
133 template<typename Derived>
134 template<typename ThenDerived>
135 inline const Select<Derived,ThenDerived, typename ThenDerived::ConstantReturnType>
136 DenseBase<Derived>::select(const DenseBase<ThenDerived>& thenMatrix,
137                             typename ThenDerived::Scalar elseScalar) const
138 {
139   return Select<Derived,ThenDerived,typename ThenDerived::ConstantReturnType>(
140     derived(), thenMatrix.derived(), ThenDerived::Constant(rows(),cols(),elseScalar));
141 }
142
143 /** Version of DenseBase::select(const DenseBase&, const DenseBase&) with
144   * the \em then expression being a scalar value.
145   *
146   * \sa DenseBase::select(const DenseBase<ThenDerived>&, const DenseBase<ElseDerived>&) const, class Select
147   */
148 template<typename Derived>
149 template<typename ElseDerived>
150 inline const Select<Derived, typename ElseDerived::ConstantReturnType, ElseDerived >
151 DenseBase<Derived>::select(typename ElseDerived::Scalar thenScalar,
152                             const DenseBase<ElseDerived>& elseMatrix) const
153 {
154   return Select<Derived,typename ElseDerived::ConstantReturnType,ElseDerived>(
155     derived(), ElseDerived::Constant(rows(),cols(),thenScalar), elseMatrix.derived());
156 }
157
158 #endif // EIGEN_SELECT_H