12#ifndef EIGEN_COMPLEX_GPU_H
13#define EIGEN_COMPLEX_GPU_H
46#if defined(EIGEN_GPUCC) && defined(EIGEN_GPU_COMPILE_PHASE)
55#if !(EIGEN_COMP_ICC && defined(_USE_COMPLEX_SPECIALIZATION_))
58#define EIGEN_USING_STD_COMPLEX_OPERATORS \
59 using Eigen::complex_operator_detail::operator+; \
60 using Eigen::complex_operator_detail::operator-; \
61 using Eigen::complex_operator_detail::operator*; \
62 using Eigen::complex_operator_detail::operator/; \
63 using Eigen::complex_operator_detail::operator+=; \
64 using Eigen::complex_operator_detail::operator-=; \
65 using Eigen::complex_operator_detail::operator*=; \
66 using Eigen::complex_operator_detail::operator/=; \
67 using Eigen::complex_operator_detail::operator==; \
68 using Eigen::complex_operator_detail::operator!=;
71#include "../../InternalHeaderCheck.h"
78EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> complex_multiply(
const std::complex<T>& a,
79 const std::complex<T>& b);
81EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> complex_divide(
const std::complex<T>& a,
82 const std::complex<T>& b);
86namespace complex_operator_detail {
97#define EIGEN_CREATE_STD_COMPLEX_OPERATOR_SPECIALIZATIONS(T) \
99 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator+(const std::complex<T>& a) { return a; } \
101 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator-(const std::complex<T>& a) { \
102 return std::complex<T>(-a.real(), -a.imag()); \
105 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator+(const std::complex<T>& a, \
106 const std::complex<T>& b) { \
107 return std::complex<T>(a.real() + b.real(), a.imag() + b.imag()); \
110 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator+(const std::complex<T>& a, const T& b) { \
111 return std::complex<T>(a.real() + b, a.imag()); \
114 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator+(const T& a, const std::complex<T>& b) { \
115 return std::complex<T>(a + b.real(), b.imag()); \
118 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator-(const std::complex<T>& a, \
119 const std::complex<T>& b) { \
120 return std::complex<T>(a.real() - b.real(), a.imag() - b.imag()); \
123 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator-(const std::complex<T>& a, const T& b) { \
124 return std::complex<T>(a.real() - b, a.imag()); \
127 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator-(const T& a, const std::complex<T>& b) { \
128 return std::complex<T>(a - b.real(), -b.imag()); \
131 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator*(const std::complex<T>& a, \
132 const std::complex<T>& b) { \
133 return internal::complex_multiply(a, b); \
136 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator*(const std::complex<T>& a, const T& b) { \
137 return std::complex<T>(a.real() * b, a.imag() * b); \
140 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator*(const T& a, const std::complex<T>& b) { \
141 return std::complex<T>(a * b.real(), a * b.imag()); \
144 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator/(const std::complex<T>& a, \
145 const std::complex<T>& b) { \
146 return internal::complex_divide(a, b); \
149 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator/(const std::complex<T>& a, const T& b) { \
150 return std::complex<T>(a.real() / b, a.imag() / b); \
153 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator/(const T& a, const std::complex<T>& b) { \
154 return internal::complex_divide(std::complex<T>(a, 0), b); \
157 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T>& operator+=(std::complex<T>& a, const std::complex<T>& b) { \
158 a = std::complex<T>(a.real() + b.real(), a.imag() + b.imag()); \
162 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T>& operator-=(std::complex<T>& a, const std::complex<T>& b) { \
163 a = std::complex<T>(a.real() - b.real(), a.imag() - b.imag()); \
167 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T>& operator*=(std::complex<T>& a, const std::complex<T>& b) { \
168 a = internal::complex_multiply(a, b); \
172 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T>& operator/=(std::complex<T>& a, const std::complex<T>& b) { \
173 a = internal::complex_divide(a, b); \
177 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator==(const std::complex<T>& a, const std::complex<T>& b) { \
178 return a.real() == b.real() && a.imag() == b.imag(); \
181 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator==(const std::complex<T>& a, const T& b) { \
182 return a.real() == b && a.imag() == 0; \
185 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator==(const T& a, const std::complex<T>& b) { \
186 return a == b.real() && 0 == b.imag(); \
189 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator!=(const std::complex<T>& a, const std::complex<T>& b) { \
193 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator!=(const std::complex<T>& a, const T& b) { return !(a == b); } \
195 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator!=(const T& a, const std::complex<T>& b) { return !(a == b); }
198EIGEN_CREATE_STD_COMPLEX_OPERATOR_SPECIALIZATIONS(
float)
199EIGEN_CREATE_STD_COMPLEX_OPERATOR_SPECIALIZATIONS(
double)
201#undef EIGEN_CREATE_STD_COMPLEX_OPERATOR_SPECIALIZATIONS
205EIGEN_USING_STD_COMPLEX_OPERATORS
208EIGEN_USING_STD_COMPLEX_OPERATORS
212EIGEN_USING_STD_COMPLEX_OPERATORS
217#undef EIGEN_USING_STD_COMPLEX_OPERATORS