diff options
author | Gael Guennebaud <g.gael@free.fr> | 2019-10-08 09:15:17 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2019-10-08 09:15:17 +0200 |
commit | 87427d2eaa90bbc1c12eedecca95554d93c3c212 (patch) | |
tree | 80afa4fb6964154d46e42b877b2888122bbec70d | |
parent | 7a43af1a335da2c0489b4119a33ee1cbff0c15d6 (diff) |
PR 719: fix real/imag namespace conflict
-rw-r--r-- | Eigen/src/Core/GenericPacketMath.h | 4 | ||||
-rw-r--r-- | Eigen/src/Core/MathFunctions.h | 13 | ||||
-rw-r--r-- | Eigen/src/Core/functors/UnaryFunctors.h | 2 | ||||
-rw-r--r-- | Eigen/src/Core/products/GeneralBlockPanelKernel.h | 12 | ||||
-rw-r--r-- | test/array_cwise.cpp | 6 | ||||
-rw-r--r-- | test/main.h | 5 |
6 files changed, 25 insertions, 17 deletions
diff --git a/Eigen/src/Core/GenericPacketMath.h b/Eigen/src/Core/GenericPacketMath.h index 2d7b9f9e0..66db49f08 100644 --- a/Eigen/src/Core/GenericPacketMath.h +++ b/Eigen/src/Core/GenericPacketMath.h @@ -662,10 +662,10 @@ inline void palign(PacketType& first, const PacketType& second) #if !defined(EIGEN_GPUCC) template<> inline std::complex<float> pmul(const std::complex<float>& a, const std::complex<float>& b) -{ return std::complex<float>(real(a)*real(b) - imag(a)*imag(b), imag(a)*real(b) + real(a)*imag(b)); } +{ return std::complex<float>(a.real()*b.real() - a.imag()*b.imag(), a.imag()*b.real() + a.real()*b.imag()); } template<> inline std::complex<double> pmul(const std::complex<double>& a, const std::complex<double>& b) -{ return std::complex<double>(real(a)*real(b) - imag(a)*imag(b), imag(a)*real(b) + real(a)*imag(b)); } +{ return std::complex<double>(a.real()*b.real() - a.imag()*b.imag(), a.imag()*b.real() + a.real()*b.imag()); } #endif diff --git a/Eigen/src/Core/MathFunctions.h b/Eigen/src/Core/MathFunctions.h index f1feab508..4e6053b2e 100644 --- a/Eigen/src/Core/MathFunctions.h +++ b/Eigen/src/Core/MathFunctions.h @@ -300,7 +300,7 @@ struct abs2_impl_default<Scalar, true> // IsComplex EIGEN_DEVICE_FUNC static inline RealScalar run(const Scalar& x) { - return real(x)*real(x) + imag(x)*imag(x); + return x.real()*x.real() + x.imag()*x.imag(); } }; @@ -326,14 +326,17 @@ struct abs2_retval ****************************************************************************/ template<typename Scalar, bool IsComplex> -struct norm1_default_impl +struct norm1_default_impl; + +template<typename Scalar> +struct norm1_default_impl<Scalar,true> { typedef typename NumTraits<Scalar>::Real RealScalar; EIGEN_DEVICE_FUNC static inline RealScalar run(const Scalar& x) { EIGEN_USING_STD_MATH(abs); - return abs(real(x)) + abs(imag(x)); + return abs(x.real()) + abs(x.imag()); } }; @@ -753,8 +756,8 @@ struct random_default_impl<Scalar, true, false> { static inline Scalar run(const Scalar& x, const Scalar& y) { - return Scalar(random(real(x), real(y)), - random(imag(x), imag(y))); + return Scalar(random(x.real(), y.real()), + random(x.imag(), y.imag())); } static inline Scalar run() { diff --git a/Eigen/src/Core/functors/UnaryFunctors.h b/Eigen/src/Core/functors/UnaryFunctors.h index d17aaf9c9..dd256d16d 100644 --- a/Eigen/src/Core/functors/UnaryFunctors.h +++ b/Eigen/src/Core/functors/UnaryFunctors.h @@ -869,7 +869,7 @@ struct scalar_sign_op<Scalar,true> { if (aa==real_type(0)) return Scalar(0); aa = real_type(1)/aa; - return Scalar(real(a)*aa, imag(a)*aa ); + return Scalar(a.real()*aa, a.imag()*aa ); } //TODO //template <typename Packet> diff --git a/Eigen/src/Core/products/GeneralBlockPanelKernel.h b/Eigen/src/Core/products/GeneralBlockPanelKernel.h index 6c1d882fd..2ae8ece98 100644 --- a/Eigen/src/Core/products/GeneralBlockPanelKernel.h +++ b/Eigen/src/Core/products/GeneralBlockPanelKernel.h @@ -729,8 +729,8 @@ template<typename Scalar, typename RealPacket> void loadQuadToDoublePacket(const Scalar* b, DoublePacket<RealPacket>& dest, typename enable_if<unpacket_traits<RealPacket>::size<=8>::type* = 0) { - dest.first = pset1<RealPacket>(real(*b)); - dest.second = pset1<RealPacket>(imag(*b)); + dest.first = pset1<RealPacket>(numext::real(*b)); + dest.second = pset1<RealPacket>(numext::imag(*b)); } template<typename Scalar, typename RealPacket> @@ -739,8 +739,8 @@ void loadQuadToDoublePacket(const Scalar* b, DoublePacket<RealPacket>& dest, { // yes, that's pretty hackish too :( typedef typename NumTraits<Scalar>::Real RealScalar; - RealScalar r[4] = {real(b[0]), real(b[0]), real(b[1]), real(b[1])}; - RealScalar i[4] = {imag(b[0]), imag(b[0]), imag(b[1]), imag(b[1])}; + RealScalar r[4] = {numext::real(b[0]), numext::real(b[0]), numext::real(b[1]), numext::real(b[1])}; + RealScalar i[4] = {numext::imag(b[0]), numext::imag(b[0]), numext::imag(b[1]), numext::imag(b[1])}; dest.first = ploadquad<RealPacket>(r); dest.second = ploadquad<RealPacket>(i); } @@ -820,8 +820,8 @@ public: template<typename RealPacketType> EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, DoublePacket<RealPacketType>& dest) const { - dest.first = pset1<RealPacketType>(real(*b)); - dest.second = pset1<RealPacketType>(imag(*b)); + dest.first = pset1<RealPacketType>(numext::real(*b)); + dest.second = pset1<RealPacketType>(numext::imag(*b)); } EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacketx4& dest) const diff --git a/test/array_cwise.cpp b/test/array_cwise.cpp index 9e4adb701..ae0f9f97c 100644 --- a/test/array_cwise.cpp +++ b/test/array_cwise.cpp @@ -342,7 +342,7 @@ template<typename ArrayType> void array_real(const ArrayType& m) VERIFY_IS_APPROX(m1.sign() * m1.abs(), m1); VERIFY_IS_APPROX(numext::abs2(numext::real(m1)) + numext::abs2(numext::imag(m1)), numext::abs2(m1)); - VERIFY_IS_APPROX(numext::abs2(real(m1)) + numext::abs2(imag(m1)), numext::abs2(m1)); + VERIFY_IS_APPROX(numext::abs2(Eigen::real(m1)) + numext::abs2(Eigen::imag(m1)), numext::abs2(m1)); if(!NumTraits<Scalar>::IsComplex) VERIFY_IS_APPROX(numext::real(m1), m1); @@ -436,7 +436,7 @@ template<typename ArrayType> void array_complex(const ArrayType& m) for (Index i = 0; i < m.rows(); ++i) for (Index j = 0; j < m.cols(); ++j) - m3(i,j) = std::atan2(imag(m1(i,j)), real(m1(i,j))); + m3(i,j) = std::atan2(m1(i,j).imag(), m1(i,j).real()); VERIFY_IS_APPROX(arg(m1), m3); std::complex<RealScalar> zero(0.0,0.0); @@ -463,7 +463,7 @@ template<typename ArrayType> void array_complex(const ArrayType& m) VERIFY_IS_APPROX(inverse(inverse(m1)),m1); VERIFY_IS_APPROX(conj(m1.conjugate()), m1); - VERIFY_IS_APPROX(abs(m1), sqrt(square(real(m1))+square(imag(m1)))); + VERIFY_IS_APPROX(abs(m1), sqrt(square(m1.real())+square(m1.imag()))); VERIFY_IS_APPROX(abs(m1), sqrt(abs2(m1))); VERIFY_IS_APPROX(log10(m1), log(m1)/log(10)); diff --git a/test/main.h b/test/main.h index 4c1733b1f..54553f742 100644 --- a/test/main.h +++ b/test/main.h @@ -91,6 +91,11 @@ #define isfinite(X) please_protect_your_isfinite_with_parentheses #endif + +// test possible conflicts +struct real {}; +struct imag {}; + #ifdef M_PI #undef M_PI #endif |