diff options
author | Deanna Hood <deanna.m.hood@gmail.com> | 2015-03-17 15:28:12 +1000 |
---|---|---|
committer | Deanna Hood <deanna.m.hood@gmail.com> | 2015-03-17 15:28:12 +1000 |
commit | 596be3cd86ad976c7e03a871fc44a95f377bfe0f (patch) | |
tree | 2ef972794c3562882f72105f52091987b111c223 | |
parent | e26134ed62082adb9c382631d8afab03c855de60 (diff) |
Use std::arg for real numbers when c++11 is used, custom implementation otherwise
-rw-r--r-- | Eigen/src/Core/MathFunctions.h | 85 |
1 files changed, 50 insertions, 35 deletions
diff --git a/Eigen/src/Core/MathFunctions.h b/Eigen/src/Core/MathFunctions.h index a7e75b4a9..734a5e373 100644 --- a/Eigen/src/Core/MathFunctions.h +++ b/Eigen/src/Core/MathFunctions.h @@ -134,41 +134,6 @@ struct imag_retval }; /**************************************************************************** -* Implementation of arg * -****************************************************************************/ - -template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex> -struct arg_default_impl -{ - typedef typename NumTraits<Scalar>::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar run(const Scalar& x) - { - const double pi = std::acos(-1.0); - return (x < 0.0) ? pi : 0.0; } -}; - -template<typename Scalar> -struct arg_default_impl<Scalar,true> -{ - typedef typename NumTraits<Scalar>::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar run(const Scalar& x) - { - using std::arg; - return arg(x); - } -}; - -template<typename Scalar> struct arg_impl : arg_default_impl<Scalar> {}; - -template<typename Scalar> -struct arg_retval -{ - typedef typename NumTraits<Scalar>::Real type; -}; - -/**************************************************************************** * Implementation of real_ref * ****************************************************************************/ @@ -432,6 +397,56 @@ struct round_retval }; /**************************************************************************** +* Implementation of arg * +****************************************************************************/ +// In C++11 we can specialize arg_impl for all Scalars +// Let's be conservative and enable the default C++11 implementation only if we are sure it exists +#if (__cplusplus >= 201103L) && (EIGEN_COMP_GNUC_STRICT || EIGEN_COMP_CLANG || EIGEN_COMP_MSVC || EIGEN_COMP_ICC) \ + && (EIGEN_ARCH_i386_OR_x86_64) && (EIGEN_OS_GNULINUX || EIGEN_OS_WIN_STRICT || EIGEN_OS_MAC) + template<typename Scalar> + struct arg_impl { + static inline Scalar run(const Scalar& x) + { + using std::arg; + return arg(x); + } + }; + +// No C++11, use our own implementation for real Scalars +#else + template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex> + struct arg_default_impl + { + typedef typename NumTraits<Scalar>::Real RealScalar; + EIGEN_DEVICE_FUNC + static inline RealScalar run(const Scalar& x) + { + const double pi = std::acos(-1.0); + return (x < 0.0) ? pi : 0.0; } + }; + + template<typename Scalar> + struct arg_default_impl<Scalar,true> + { + typedef typename NumTraits<Scalar>::Real RealScalar; + EIGEN_DEVICE_FUNC + static inline RealScalar run(const Scalar& x) + { + using std::arg; + return arg(x); + } + }; + + template<typename Scalar> struct arg_impl : arg_default_impl<Scalar> {}; +#endif + +template<typename Scalar> +struct arg_retval +{ + typedef typename NumTraits<Scalar>::Real type; +}; + +/**************************************************************************** * Implementation of log1p * ****************************************************************************/ template<typename Scalar, bool isComplex = NumTraits<Scalar>::IsComplex > |