diff options
author | Gael Guennebaud <g.gael@free.fr> | 2015-02-19 15:18:37 +0100 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2015-02-19 15:18:37 +0100 |
commit | 829dddd0fdb1bfd4942ff35fe7dfd4ccdeddc97e (patch) | |
tree | 3db9cfc493019a33d12313e695e7057951ee6141 /Eigen/src/Core/util | |
parent | db05f2d01e6e5d8bcd67643ed2836028071d967f (diff) |
Add support for C++11 result_of/lambdas
Diffstat (limited to 'Eigen/src/Core/util')
-rw-r--r-- | Eigen/src/Core/util/Macros.h | 5 | ||||
-rw-r--r-- | Eigen/src/Core/util/Meta.h | 32 |
2 files changed, 31 insertions, 6 deletions
diff --git a/Eigen/src/Core/util/Macros.h b/Eigen/src/Core/util/Macros.h index e607cdd12..aaea9f035 100644 --- a/Eigen/src/Core/util/Macros.h +++ b/Eigen/src/Core/util/Macros.h @@ -382,6 +382,11 @@ #define EIGEN_HAVE_RVALUE_REFERENCES #endif +// Does the compiler support result_of? +#if (__has_feature(cxx_lambdas) || (defined(__cplusplus) && __cplusplus >= 201103L)) +#define EIGEN_HAS_STD_RESULT_OF 1 +#endif + // Does the compiler support variadic templates? #if __cplusplus > 199711L #define EIGEN_HAS_VARIADIC_TEMPLATES 1 diff --git a/Eigen/src/Core/util/Meta.h b/Eigen/src/Core/util/Meta.h index 3be9e6ca5..674cd8f97 100644 --- a/Eigen/src/Core/util/Meta.h +++ b/Eigen/src/Core/util/Meta.h @@ -165,6 +165,7 @@ template<typename T> struct result_of {}; struct has_none {int a[1];}; struct has_std_result_type {int a[2];}; struct has_tr1_result {int a[3];}; +struct has_cxx_eleven_result {int a[4];}; template<typename Func, typename ArgType, int SizeOf=sizeof(has_none)> struct unary_result_of_select {typedef ArgType type;}; @@ -175,13 +176,22 @@ struct unary_result_of_select<Func, ArgType, sizeof(has_std_result_type)> {typed template<typename Func, typename ArgType> struct unary_result_of_select<Func, ArgType, sizeof(has_tr1_result)> {typedef typename Func::template result<Func(ArgType)>::type type;}; +#ifdef EIGEN_HAS_STD_RESULT_OF +template<typename Func, typename ArgType> +struct unary_result_of_select<Func, ArgType, sizeof(has_cxx_eleven_result)> {typedef typename std::result_of<Func(ArgType)>::type type;}; +#endif + template<typename Func, typename ArgType> struct result_of<Func(ArgType)> { template<typename T> - static has_std_result_type testFunctor(T const *, typename T::result_type const * = 0); + static has_std_result_type testFunctor(T const *, typename T::result_type const * = 0); template<typename T> - static has_tr1_result testFunctor(T const *, typename T::template result<T(ArgType)>::type const * = 0); - static has_none testFunctor(...); + static has_tr1_result testFunctor(T const *, typename T::template result<T(ArgType)>::type const * = 0); +#ifdef EIGEN_HAS_STD_RESULT_OF + template<typename T> + static has_cxx_eleven_result testFunctor(T const *, typename std::result_of<T(ArgType)>::type const * = 0); +#endif + static has_none testFunctor(...); // note that the following indirection is needed for gcc-3.3 enum {FunctorType = sizeof(testFunctor(static_cast<Func*>(0)))}; @@ -199,13 +209,23 @@ template<typename Func, typename ArgType0, typename ArgType1> struct binary_result_of_select<Func, ArgType0, ArgType1, sizeof(has_tr1_result)> {typedef typename Func::template result<Func(ArgType0,ArgType1)>::type type;}; +#ifdef EIGEN_HAS_STD_RESULT_OF +template<typename Func, typename ArgType0, typename ArgType1> +struct binary_result_of_select<Func, ArgType0, ArgType1, sizeof(has_cxx_eleven_result)> +{typedef typename std::result_of<Func(ArgType0, ArgType1)>::type type;}; +#endif + template<typename Func, typename ArgType0, typename ArgType1> struct result_of<Func(ArgType0,ArgType1)> { template<typename T> - static has_std_result_type testFunctor(T const *, typename T::result_type const * = 0); + static has_std_result_type testFunctor(T const *, typename T::result_type const * = 0); template<typename T> - static has_tr1_result testFunctor(T const *, typename T::template result<T(ArgType0,ArgType1)>::type const * = 0); - static has_none testFunctor(...); + static has_tr1_result testFunctor(T const *, typename T::template result<T(ArgType0,ArgType1)>::type const * = 0); +#ifdef EIGEN_HAS_STD_RESULT_OF + template<typename T> + static has_cxx_eleven_result testFunctor(T const *, typename std::result_of<T(ArgType0, ArgType1)>::type const * = 0); +#endif + static has_none testFunctor(...); // note that the following indirection is needed for gcc-3.3 enum {FunctorType = sizeof(testFunctor(static_cast<Func*>(0)))}; |