Eigen  5.0.1
 
Loading...
Searching...
No Matches
ArrayCwiseBinaryOps.inc
1// SPDX-FileCopyrightText: The Eigen Authors
2// SPDX-License-Identifier: MPL-2.0
3
8template <typename OtherDerived>
9EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const EIGEN_CWISE_BINARY_RETURN_TYPE(Derived, OtherDerived,
10 internal::scalar_product_op)
11operator*(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const {
12 return EIGEN_CWISE_BINARY_RETURN_TYPE(Derived, OtherDerived, internal::scalar_product_op)(derived(), other.derived());
13}
14
19template <typename OtherDerived>
20EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const CwiseBinaryOp<
21 internal::scalar_quotient_op<Scalar, typename OtherDerived::Scalar>, const Derived, const OtherDerived>
22operator/(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const {
23 return CwiseBinaryOp<internal::scalar_quotient_op<Scalar, typename OtherDerived::Scalar>, const Derived,
24 const OtherDerived>(derived(), other.derived());
25}
26
34template <int NaNPropagation = PropagateFast, typename OtherDerived>
35EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const
36 CwiseBinaryOp<internal::scalar_min_op<Scalar, Scalar, NaNPropagation>, const Derived, const OtherDerived>
37#ifdef EIGEN_PARSED_BY_DOXYGEN
38 min
39#else
40 (min)
41#endif
42 (const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const {
43 return CwiseBinaryOp<internal::scalar_min_op<Scalar, Scalar, NaNPropagation>, const Derived, const OtherDerived>(
44 derived(), other.derived());
45}
46
51template <int NaNPropagation = PropagateFast>
52EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const
53 CwiseBinaryOp<internal::scalar_min_op<Scalar, Scalar, NaNPropagation>, const Derived,
54 const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> >
55#ifdef EIGEN_PARSED_BY_DOXYGEN
56 min
57#else
58 (min)
59#endif
60 (const Scalar &other) const {
61 return (min<NaNPropagation>)(Derived::PlainObject::Constant(rows(), cols(), other));
62}
63
71template <int NaNPropagation = PropagateFast, typename OtherDerived>
72EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const
73 CwiseBinaryOp<internal::scalar_max_op<Scalar, Scalar, NaNPropagation>, const Derived, const OtherDerived>
74#ifdef EIGEN_PARSED_BY_DOXYGEN
75 max
76#else
77 (max)
78#endif
79 (const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const {
80 return CwiseBinaryOp<internal::scalar_max_op<Scalar, Scalar, NaNPropagation>, const Derived, const OtherDerived>(
81 derived(), other.derived());
82}
83
88template <int NaNPropagation = PropagateFast>
89EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const
90 CwiseBinaryOp<internal::scalar_max_op<Scalar, Scalar, NaNPropagation>, const Derived,
91 const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> >
92#ifdef EIGEN_PARSED_BY_DOXYGEN
93 max
94#else
95 (max)
96#endif
97 (const Scalar &other) const {
98 return (max<NaNPropagation>)(Derived::PlainObject::Constant(rows(), cols(), other));
99}
100
105EIGEN_MAKE_CWISE_BINARY_OP(absolute_difference, internal::scalar_absolute_difference_op)
106
107
111EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const
112 CwiseBinaryOp<internal::scalar_absolute_difference_op<Scalar, Scalar>, const Derived,
113 const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> >
114#ifdef EIGEN_PARSED_BY_DOXYGEN
115 absolute_difference
116#else
117 (absolute_difference)
118#endif
119 (const Scalar &other) const {
120 return (absolute_difference)(Derived::PlainObject::Constant(rows(), cols(), other));
121}
122
130EIGEN_MAKE_CWISE_BINARY_OP(pow, internal::scalar_pow_op)
131
132
137EIGEN_MAKE_CWISE_BINARY_OP(atan2, internal::scalar_atan2_op)
138
139// TODO: code generating macros could be moved to Macros.h and could include generation of documentation
140#define EIGEN_MAKE_CWISE_COMP_OP(OP, COMPARATOR) \
141 template <typename OtherDerived> \
142 EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const \
143 CwiseBinaryOp<internal::scalar_cmp_op<Scalar, typename OtherDerived::Scalar, internal::cmp_##COMPARATOR>, \
144 const Derived, const OtherDerived> \
145 OP(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const { \
146 return CwiseBinaryOp<internal::scalar_cmp_op<Scalar, typename OtherDerived::Scalar, internal::cmp_##COMPARATOR>, \
147 const Derived, const OtherDerived>(derived(), other.derived()); \
148 } \
149 typedef CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_##COMPARATOR>, const Derived, \
150 const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> > \
151 Cmp##COMPARATOR##ReturnType; \
152 typedef CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_##COMPARATOR>, \
153 const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject>, const Derived> \
154 RCmp##COMPARATOR##ReturnType; \
155 EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const Cmp##COMPARATOR##ReturnType OP(const Scalar &s) const { \
156 return this->OP(Derived::PlainObject::Constant(rows(), cols(), s)); \
157 } \
158 EIGEN_DEVICE_FUNC constexpr friend EIGEN_STRONG_INLINE const RCmp##COMPARATOR##ReturnType OP( \
159 const Scalar &s, const EIGEN_CURRENT_STORAGE_BASE_CLASS<Derived> &d) { \
160 return Derived::PlainObject::Constant(d.rows(), d.cols(), s).OP(d); \
161 }
162
163#define EIGEN_MAKE_CWISE_COMP_R_OP(OP, R_OP, RCOMPARATOR) \
164 template <typename OtherDerived> \
165 EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const \
166 CwiseBinaryOp<internal::scalar_cmp_op<typename OtherDerived::Scalar, Scalar, internal::cmp_##RCOMPARATOR>, \
167 const OtherDerived, const Derived> \
168 OP(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const { \
169 return CwiseBinaryOp<internal::scalar_cmp_op<typename OtherDerived::Scalar, Scalar, internal::cmp_##RCOMPARATOR>, \
170 const OtherDerived, const Derived>(other.derived(), derived()); \
171 } \
172 EIGEN_DEVICE_FUNC constexpr inline const RCmp##RCOMPARATOR##ReturnType OP(const Scalar &s) const { \
173 return Derived::PlainObject::Constant(rows(), cols(), s).R_OP(*this); \
174 } \
175 friend inline const Cmp##RCOMPARATOR##ReturnType OP(const Scalar &s, const Derived &d) { \
176 return d.R_OP(Derived::PlainObject::Constant(d.rows(), d.cols(), s)); \
177 }
178
186EIGEN_MAKE_CWISE_COMP_OP(operator<, LT)
187
188
195EIGEN_MAKE_CWISE_COMP_OP(operator<=, LE)
196
197
204EIGEN_MAKE_CWISE_COMP_R_OP(operator>, operator<, LT)
205
206
213EIGEN_MAKE_CWISE_COMP_R_OP(operator>=, operator<=, LE)
214
215
227EIGEN_MAKE_CWISE_COMP_OP(operator==, EQ)
228
229
241EIGEN_MAKE_CWISE_COMP_OP(operator!=, NEQ)
242
243#undef EIGEN_MAKE_CWISE_COMP_OP
244#undef EIGEN_MAKE_CWISE_COMP_R_OP
245
246// scalar addition
247#ifndef EIGEN_PARSED_BY_DOXYGEN
248EIGEN_MAKE_SCALAR_BINARY_OP(operator+, internal::scalar_sum_op)
249#else
259template <typename T>
260const CwiseBinaryOp<internal::scalar_sum_op<Scalar, T>, Derived, Constant<T> > operator+(const T &scalar) const;
265template <typename T>
266friend const CwiseBinaryOp<internal::scalar_sum_op<T, Scalar>, Constant<T>, Derived> operator+(
267 const T &scalar, const StorageBaseType &expr);
268#endif
269
270#ifndef EIGEN_PARSED_BY_DOXYGEN
271EIGEN_MAKE_SCALAR_BINARY_OP(operator-, internal::scalar_difference_op)
272#else
282template <typename T>
283const CwiseBinaryOp<internal::scalar_difference_op<Scalar, T>, Derived, Constant<T> > operator-(const T &scalar) const;
288template <typename T>
289friend const CwiseBinaryOp<internal::scalar_difference_op<T, Scalar>, Constant<T>, Derived> operator-(
290 const T &scalar, const StorageBaseType &expr);
291#endif
292
293#ifndef EIGEN_PARSED_BY_DOXYGEN
294EIGEN_MAKE_SCALAR_BINARY_OP_ONTHELEFT(operator/, internal::scalar_quotient_op)
295#else
302template <typename T>
303friend inline const CwiseBinaryOp<internal::scalar_quotient_op<T, Scalar>, Constant<T>, Derived> operator/(
304 const T &s, const StorageBaseType &a);
305#endif
306
323template <typename DerivedQ>
324inline const CwiseBinaryOp<internal::scalar_zeta_op<Scalar>, const Derived, const DerivedQ> zeta(
325 const EIGEN_CURRENT_STORAGE_BASE_CLASS<DerivedQ> &q) const {
326 return CwiseBinaryOp<internal::scalar_zeta_op<Scalar>, const Derived, const DerivedQ>(this->derived(), q.derived());
327}