Another set of UI messages fixes and tweaks! No functional changes.
[blender.git] / extern / Eigen3 / Eigen / src / plugins / CommonCwiseUnaryOps.h
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>
5 // Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>
6 //
7 // Eigen is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU Lesser General Public
9 // License as published by the Free Software Foundation; either
10 // version 3 of the License, or (at your option) any later version.
11 //
12 // Alternatively, you can redistribute it and/or
13 // modify it under the terms of the GNU General Public License as
14 // published by the Free Software Foundation; either version 2 of
15 // the License, or (at your option) any later version.
16 //
17 // Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
19 // FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the
20 // GNU General Public License for more details.
21 //
22 // You should have received a copy of the GNU Lesser General Public
23 // License and a copy of the GNU General Public License along with
24 // Eigen. If not, see <http://www.gnu.org/licenses/>.
25
26 // This file is a base class plugin containing common coefficient wise functions.
27
28 #ifndef EIGEN_PARSED_BY_DOXYGEN
29
30 /** \internal Represents a scalar multiple of an expression */
31 typedef CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const Derived> ScalarMultipleReturnType;
32 /** \internal Represents a quotient of an expression by a scalar*/
33 typedef CwiseUnaryOp<internal::scalar_quotient1_op<Scalar>, const Derived> ScalarQuotient1ReturnType;
34 /** \internal the return type of conjugate() */
35 typedef typename internal::conditional<NumTraits<Scalar>::IsComplex,
36                     const CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, const Derived>,
37                     const Derived&
38                   >::type ConjugateReturnType;
39 /** \internal the return type of real() const */
40 typedef typename internal::conditional<NumTraits<Scalar>::IsComplex,
41                     const CwiseUnaryOp<internal::scalar_real_op<Scalar>, const Derived>,
42                     const Derived&
43                   >::type RealReturnType;
44 /** \internal the return type of real() */
45 typedef typename internal::conditional<NumTraits<Scalar>::IsComplex,
46                     CwiseUnaryView<internal::scalar_real_ref_op<Scalar>, Derived>,
47                     Derived&
48                   >::type NonConstRealReturnType;
49 /** \internal the return type of imag() const */
50 typedef CwiseUnaryOp<internal::scalar_imag_op<Scalar>, const Derived> ImagReturnType;
51 /** \internal the return type of imag() */
52 typedef CwiseUnaryView<internal::scalar_imag_ref_op<Scalar>, Derived> NonConstImagReturnType;
53
54 #endif // not EIGEN_PARSED_BY_DOXYGEN
55
56 /** \returns an expression of the opposite of \c *this
57   */
58 inline const CwiseUnaryOp<internal::scalar_opposite_op<typename internal::traits<Derived>::Scalar>, const Derived>
59 operator-() const { return derived(); }
60
61
62 /** \returns an expression of \c *this scaled by the scalar factor \a scalar */
63 inline const ScalarMultipleReturnType
64 operator*(const Scalar& scalar) const
65 {
66   return CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const Derived>
67     (derived(), internal::scalar_multiple_op<Scalar>(scalar));
68 }
69
70 #ifdef EIGEN_PARSED_BY_DOXYGEN
71 const ScalarMultipleReturnType operator*(const RealScalar& scalar) const;
72 #endif
73
74 /** \returns an expression of \c *this divided by the scalar value \a scalar */
75 inline const CwiseUnaryOp<internal::scalar_quotient1_op<typename internal::traits<Derived>::Scalar>, const Derived>
76 operator/(const Scalar& scalar) const
77 {
78   return CwiseUnaryOp<internal::scalar_quotient1_op<Scalar>, const Derived>
79     (derived(), internal::scalar_quotient1_op<Scalar>(scalar));
80 }
81
82 /** Overloaded for efficient real matrix times complex scalar value */
83 inline const CwiseUnaryOp<internal::scalar_multiple2_op<Scalar,std::complex<Scalar> >, const Derived>
84 operator*(const std::complex<Scalar>& scalar) const
85 {
86   return CwiseUnaryOp<internal::scalar_multiple2_op<Scalar,std::complex<Scalar> >, const Derived>
87     (*static_cast<const Derived*>(this), internal::scalar_multiple2_op<Scalar,std::complex<Scalar> >(scalar));
88 }
89
90 inline friend const ScalarMultipleReturnType
91 operator*(const Scalar& scalar, const StorageBaseType& matrix)
92 { return matrix*scalar; }
93
94 inline friend const CwiseUnaryOp<internal::scalar_multiple2_op<Scalar,std::complex<Scalar> >, const Derived>
95 operator*(const std::complex<Scalar>& scalar, const StorageBaseType& matrix)
96 { return matrix*scalar; }
97
98 /** \returns an expression of *this with the \a Scalar type casted to
99   * \a NewScalar.
100   *
101   * The template parameter \a NewScalar is the type we are casting the scalars to.
102   *
103   * \sa class CwiseUnaryOp
104   */
105 template<typename NewType>
106 typename internal::cast_return_type<Derived,const CwiseUnaryOp<internal::scalar_cast_op<typename internal::traits<Derived>::Scalar, NewType>, const Derived> >::type
107 cast() const
108 {
109   return derived();
110 }
111
112 /** \returns an expression of the complex conjugate of \c *this.
113   *
114   * \sa adjoint() */
115 inline ConjugateReturnType
116 conjugate() const
117 {
118   return ConjugateReturnType(derived());
119 }
120
121 /** \returns a read-only expression of the real part of \c *this.
122   *
123   * \sa imag() */
124 inline RealReturnType
125 real() const { return derived(); }
126
127 /** \returns an read-only expression of the imaginary part of \c *this.
128   *
129   * \sa real() */
130 inline const ImagReturnType
131 imag() const { return derived(); }
132
133 /** \brief Apply a unary operator coefficient-wise
134   * \param[in]  func  Functor implementing the unary operator
135   * \tparam  CustomUnaryOp Type of \a func  
136   * \returns An expression of a custom coefficient-wise unary operator \a func of *this
137   *
138   * The function \c ptr_fun() from the C++ standard library can be used to make functors out of normal functions.
139   *
140   * Example:
141   * \include class_CwiseUnaryOp_ptrfun.cpp
142   * Output: \verbinclude class_CwiseUnaryOp_ptrfun.out
143   *
144   * Genuine functors allow for more possibilities, for instance it may contain a state.
145   *
146   * Example:
147   * \include class_CwiseUnaryOp.cpp
148   * Output: \verbinclude class_CwiseUnaryOp.out
149   *
150   * \sa class CwiseUnaryOp, class CwiseBinaryOp
151   */
152 template<typename CustomUnaryOp>
153 inline const CwiseUnaryOp<CustomUnaryOp, const Derived>
154 unaryExpr(const CustomUnaryOp& func = CustomUnaryOp()) const
155 {
156   return CwiseUnaryOp<CustomUnaryOp, const Derived>(derived(), func);
157 }
158
159 /** \returns an expression of a custom coefficient-wise unary operator \a func of *this
160   *
161   * The template parameter \a CustomUnaryOp is the type of the functor
162   * of the custom unary operator.
163   *
164   * Example:
165   * \include class_CwiseUnaryOp.cpp
166   * Output: \verbinclude class_CwiseUnaryOp.out
167   *
168   * \sa class CwiseUnaryOp, class CwiseBinaryOp
169   */
170 template<typename CustomViewOp>
171 inline const CwiseUnaryView<CustomViewOp, const Derived>
172 unaryViewExpr(const CustomViewOp& func = CustomViewOp()) const
173 {
174   return CwiseUnaryView<CustomViewOp, const Derived>(derived(), func);
175 }
176
177 /** \returns a non const expression of the real part of \c *this.
178   *
179   * \sa imag() */
180 inline NonConstRealReturnType
181 real() { return derived(); }
182
183 /** \returns a non const expression of the imaginary part of \c *this.
184   *
185   * \sa real() */
186 inline NonConstImagReturnType
187 imag() { return derived(); }