Make abs2 compatible with custom complex types

This commit is contained in:
Gael Guennebaud 2015-10-02 10:33:25 +02:00
parent 75a60d3ac0
commit deb261f64b

View File

@ -241,8 +241,8 @@ struct conj_retval
* Implementation of abs2 * * Implementation of abs2 *
****************************************************************************/ ****************************************************************************/
template<typename Scalar> template<typename Scalar,bool IsComplex>
struct abs2_impl struct abs2_impl_default
{ {
typedef typename NumTraits<Scalar>::Real RealScalar; typedef typename NumTraits<Scalar>::Real RealScalar;
EIGEN_DEVICE_FUNC EIGEN_DEVICE_FUNC
@ -252,16 +252,28 @@ struct abs2_impl
} }
}; };
template<typename RealScalar> template<typename Scalar>
struct abs2_impl<std::complex<RealScalar> > struct abs2_impl_default<Scalar, true> // IsComplex
{ {
typedef typename NumTraits<Scalar>::Real RealScalar;
EIGEN_DEVICE_FUNC EIGEN_DEVICE_FUNC
static inline RealScalar run(const std::complex<RealScalar>& x) static inline RealScalar run(const Scalar& x)
{ {
return real(x)*real(x) + imag(x)*imag(x); return real(x)*real(x) + imag(x)*imag(x);
} }
}; };
template<typename Scalar>
struct abs2_impl
{
typedef typename NumTraits<Scalar>::Real RealScalar;
EIGEN_DEVICE_FUNC
static inline RealScalar run(const Scalar& x)
{
return abs2_impl_default<Scalar,NumTraits<Scalar>::IsComplex>::run(x);
}
};
template<typename Scalar> template<typename Scalar>
struct abs2_retval struct abs2_retval
{ {