aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Deanna Hood <deanna.m.hood@gmail.com>2015-03-17 15:28:12 +1000
committerGravatar Deanna Hood <deanna.m.hood@gmail.com>2015-03-17 15:28:12 +1000
commit596be3cd86ad976c7e03a871fc44a95f377bfe0f (patch)
tree2ef972794c3562882f72105f52091987b111c223
parente26134ed62082adb9c382631d8afab03c855de60 (diff)
Use std::arg for real numbers when c++11 is used, custom implementation otherwise
-rw-r--r--Eigen/src/Core/MathFunctions.h85
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 >