xref: /aosp_15_r20/external/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.h (revision bf2c37156dfe67e5dfebd6d394bad8b2ab5804d4)
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2008-2009 Gael Guennebaud <[email protected]>
5 // Copyright (C) 2006-2008 Benoit Jacob <[email protected]>
6 //
7 // This Source Code Form is subject to the terms of the Mozilla
8 // Public License v. 2.0. If a copy of the MPL was not distributed
9 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10 
11 // This file is a base class plugin containing common coefficient wise functions.
12 
13 #ifndef EIGEN_PARSED_BY_DOXYGEN
14 
15 /** \internal the return type of conjugate() */
16 typedef typename internal::conditional<NumTraits<Scalar>::IsComplex,
17                     const CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, const Derived>,
18                     const Derived&
19                   >::type ConjugateReturnType;
20 /** \internal the return type of real() const */
21 typedef typename internal::conditional<NumTraits<Scalar>::IsComplex,
22                     const CwiseUnaryOp<internal::scalar_real_op<Scalar>, const Derived>,
23                     const Derived&
24                   >::type RealReturnType;
25 /** \internal the return type of real() */
26 typedef typename internal::conditional<NumTraits<Scalar>::IsComplex,
27                     CwiseUnaryView<internal::scalar_real_ref_op<Scalar>, Derived>,
28                     Derived&
29                   >::type NonConstRealReturnType;
30 /** \internal the return type of imag() const */
31 typedef CwiseUnaryOp<internal::scalar_imag_op<Scalar>, const Derived> ImagReturnType;
32 /** \internal the return type of imag() */
33 typedef CwiseUnaryView<internal::scalar_imag_ref_op<Scalar>, Derived> NonConstImagReturnType;
34 
35 typedef CwiseUnaryOp<internal::scalar_opposite_op<Scalar>, const Derived> NegativeReturnType;
36 
37 #endif // not EIGEN_PARSED_BY_DOXYGEN
38 
39 /// \returns an expression of the opposite of \c *this
40 ///
41 EIGEN_DOC_UNARY_ADDONS(operator-,opposite)
42 ///
43 EIGEN_DEVICE_FUNC
44 inline const NegativeReturnType
45 operator-() const { return NegativeReturnType(derived()); }
46 
47 
48 template<class NewType> struct CastXpr { typedef typename internal::cast_return_type<Derived,const CwiseUnaryOp<internal::scalar_cast_op<Scalar, NewType>, const Derived> >::type Type; };
49 
50 /// \returns an expression of \c *this with the \a Scalar type casted to
51 /// \a NewScalar.
52 ///
53 /// The template parameter \a NewScalar is the type we are casting the scalars to.
54 ///
EIGEN_DOC_UNARY_ADDONS(cast,conversion function)55 EIGEN_DOC_UNARY_ADDONS(cast,conversion function)
56 ///
57 /// \sa class CwiseUnaryOp
58 ///
59 template<typename NewType>
60 EIGEN_DEVICE_FUNC
61 typename CastXpr<NewType>::Type
62 cast() const
63 {
64   return typename CastXpr<NewType>::Type(derived());
65 }
66 
67 /// \returns an expression of the complex conjugate of \c *this.
68 ///
EIGEN_DOC_UNARY_ADDONS(conjugate,complex conjugate)69 EIGEN_DOC_UNARY_ADDONS(conjugate,complex conjugate)
70 ///
71 /// \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_conj">Math functions</a>, MatrixBase::adjoint()
72 EIGEN_DEVICE_FUNC
73 inline ConjugateReturnType
74 conjugate() const
75 {
76   return ConjugateReturnType(derived());
77 }
78 
79 /// \returns an expression of the complex conjugate of \c *this if Cond==true, returns derived() otherwise.
80 ///
EIGEN_DOC_UNARY_ADDONS(conjugate,complex conjugate)81 EIGEN_DOC_UNARY_ADDONS(conjugate,complex conjugate)
82 ///
83 /// \sa conjugate()
84 template<bool Cond>
85 EIGEN_DEVICE_FUNC
86 inline typename internal::conditional<Cond,ConjugateReturnType,const Derived&>::type
87 conjugateIf() const
88 {
89   typedef typename internal::conditional<Cond,ConjugateReturnType,const Derived&>::type ReturnType;
90   return ReturnType(derived());
91 }
92 
93 /// \returns a read-only expression of the real part of \c *this.
94 ///
EIGEN_DOC_UNARY_ADDONS(real,real part function)95 EIGEN_DOC_UNARY_ADDONS(real,real part function)
96 ///
97 /// \sa imag()
98 EIGEN_DEVICE_FUNC
99 inline RealReturnType
100 real() const { return RealReturnType(derived()); }
101 
102 /// \returns an read-only expression of the imaginary part of \c *this.
103 ///
EIGEN_DOC_UNARY_ADDONS(imag,imaginary part function)104 EIGEN_DOC_UNARY_ADDONS(imag,imaginary part function)
105 ///
106 /// \sa real()
107 EIGEN_DEVICE_FUNC
108 inline const ImagReturnType
109 imag() const { return ImagReturnType(derived()); }
110 
111 /// \brief Apply a unary operator coefficient-wise
112 /// \param[in]  func  Functor implementing the unary operator
113 /// \tparam  CustomUnaryOp Type of \a func
114 /// \returns An expression of a custom coefficient-wise unary operator \a func of *this
115 ///
116 /// The function \c ptr_fun() from the C++ standard library can be used to make functors out of normal functions.
117 ///
118 /// Example:
119 /// \include class_CwiseUnaryOp_ptrfun.cpp
120 /// Output: \verbinclude class_CwiseUnaryOp_ptrfun.out
121 ///
122 /// Genuine functors allow for more possibilities, for instance it may contain a state.
123 ///
124 /// Example:
125 /// \include class_CwiseUnaryOp.cpp
126 /// Output: \verbinclude class_CwiseUnaryOp.out
127 ///
EIGEN_DOC_UNARY_ADDONS(unaryExpr,unary function)128 EIGEN_DOC_UNARY_ADDONS(unaryExpr,unary function)
129 ///
130 /// \sa unaryViewExpr, binaryExpr, class CwiseUnaryOp
131 ///
132 template<typename CustomUnaryOp>
133 EIGEN_DEVICE_FUNC
134 inline const CwiseUnaryOp<CustomUnaryOp, const Derived>
135 unaryExpr(const CustomUnaryOp& func = CustomUnaryOp()) const
136 {
137   return CwiseUnaryOp<CustomUnaryOp, const Derived>(derived(), func);
138 }
139 
140 /// \returns an expression of a custom coefficient-wise unary operator \a func of *this
141 ///
142 /// The template parameter \a CustomUnaryOp is the type of the functor
143 /// of the custom unary operator.
144 ///
145 /// Example:
146 /// \include class_CwiseUnaryOp.cpp
147 /// Output: \verbinclude class_CwiseUnaryOp.out
148 ///
EIGEN_DOC_UNARY_ADDONS(unaryViewExpr,unary function)149 EIGEN_DOC_UNARY_ADDONS(unaryViewExpr,unary function)
150 ///
151 /// \sa unaryExpr, binaryExpr class CwiseUnaryOp
152 ///
153 template<typename CustomViewOp>
154 EIGEN_DEVICE_FUNC
155 inline const CwiseUnaryView<CustomViewOp, const Derived>
156 unaryViewExpr(const CustomViewOp& func = CustomViewOp()) const
157 {
158   return CwiseUnaryView<CustomViewOp, const Derived>(derived(), func);
159 }
160 
161 /// \returns a non const expression of the real part of \c *this.
162 ///
EIGEN_DOC_UNARY_ADDONS(real,real part function)163 EIGEN_DOC_UNARY_ADDONS(real,real part function)
164 ///
165 /// \sa imag()
166 EIGEN_DEVICE_FUNC
167 inline NonConstRealReturnType
168 real() { return NonConstRealReturnType(derived()); }
169 
170 /// \returns a non const expression of the imaginary part of \c *this.
171 ///
EIGEN_DOC_UNARY_ADDONS(imag,imaginary part function)172 EIGEN_DOC_UNARY_ADDONS(imag,imaginary part function)
173 ///
174 /// \sa real()
175 EIGEN_DEVICE_FUNC
176 inline NonConstImagReturnType
177 imag() { return NonConstImagReturnType(derived()); }
178