diff --git a/unsupported/Eigen/CXX11/Tensor b/unsupported/Eigen/CXX11/Tensor index ee3a1cdb6..3331ccb55 100644 --- a/unsupported/Eigen/CXX11/Tensor +++ b/unsupported/Eigen/CXX11/Tensor @@ -57,9 +57,9 @@ #endif +#include "src/Tensor/TensorMacros.h" #include "src/Tensor/TensorForwardDeclarations.h" #include "src/Tensor/TensorMeta.h" -#include "src/Tensor/TensorMetaMacros.h" #include "src/Tensor/TensorDeviceType.h" #include "src/Tensor/TensorIndexList.h" #include "src/Tensor/TensorDimensionList.h" diff --git a/unsupported/Eigen/CXX11/src/Tensor/Tensor.h b/unsupported/Eigen/CXX11/src/Tensor/Tensor.h index d59fd21dc..57d44baf9 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/Tensor.h +++ b/unsupported/Eigen/CXX11/src/Tensor/Tensor.h @@ -88,10 +88,14 @@ class Tensor : public TensorBase m_storage; +#ifdef EIGEN_HAS_SFINAE template struct isOfNormalIndex{ - static const bool value = internal::is_base_of< array, CustomIndices >::value; + static const bool is_array = internal::is_base_of, CustomIndices >::value; + static const bool is_int = NumTraits::IsInteger; + static const bool value = is_array | is_int; }; +#endif public: // Metadata @@ -129,6 +133,7 @@ class Tensor : public TensorBase::value) ) > @@ -136,8 +141,7 @@ class Tensor : public TensorBase(indices)); } - - +#endif EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeff(Index index) const { @@ -163,6 +167,7 @@ class Tensor : public TensorBase::value) ) > @@ -170,7 +175,7 @@ class Tensor : public TensorBase(indices)); } - +#endif EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index index) { @@ -210,19 +215,19 @@ class Tensor : public TensorBase::value) ) > EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator()(const CustomIndices & indices) const { - //eigen_assert(checkIndexRange(indices)); /* already in coeff */ return coeff(internal::customIndices2Array(indices)); } +#endif // normal indices EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator()(const array& indices) const { - //eigen_assert(checkIndexRange(indices)); /* already in coeff */ return coeff(indices); } @@ -273,19 +278,19 @@ class Tensor : public TensorBase& indices) { - //eigen_assert(checkIndexRange(indices)); /* already in coeff */ return coeffRef(indices); } // custom indices +#ifdef EIGEN_HAS_SFINAE template::value) ) > EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()(const CustomIndices & indices) { - //eigen_assert(checkIndexRange(indices)); /* already in coeff */ return coeffRef(internal::customIndices2Array(indices)); } +#endif EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()(Index index) { @@ -355,13 +360,6 @@ class Tensor : public TensorBase::value) ) - > - inline explicit Tensor(const CustomDimension & dimensions) : Tensor(internal::customIndices2Array(dimensions)) - {} - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Tensor(const TensorBase& other) @@ -429,7 +427,6 @@ class Tensor : public TensorBase& dimensions) { array dims; @@ -440,15 +437,15 @@ class Tensor : public TensorBase::value) ) > EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void resize(const CustomDimension & dimensions) { - //eigen_assert(checkIndexRange(indices)); /* already in coeff */ return coeffRef(internal::customIndices2Array(dimensions)); } - +#endif #ifndef EIGEN_EMULATE_CXX11_META_H template diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorMetaMacros.h b/unsupported/Eigen/CXX11/src/Tensor/TensorMacros.h similarity index 84% rename from unsupported/Eigen/CXX11/src/Tensor/TensorMetaMacros.h rename to unsupported/Eigen/CXX11/src/Tensor/TensorMacros.h index 8cb46e703..6d9cc4f38 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorMetaMacros.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorMacros.h @@ -26,8 +26,19 @@ * void foo(){} */ +#ifdef EIGEN_HAS_VARIADIC_TEMPLATES +#define EIGEN_HAS_SFINAE +#endif + #define EIGEN_SFINAE_ENABLE_IF( __condition__ ) \ typename internal::enable_if< ( __condition__ ) , int >::type = 0 +#if defined(EIGEN_HAS_CONSTEXPR) +#define EIGEN_CONSTEXPR constexpr +#else +#define EIGEN_CONSTEXPR +#endif + + #endif diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorMeta.h b/unsupported/Eigen/CXX11/src/Tensor/TensorMeta.h index 01aedd3c9..d1efc1a87 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorMeta.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorMeta.h @@ -32,17 +32,6 @@ template <> struct max_n_1<0> { }; - - - - - -#if defined(EIGEN_HAS_CONSTEXPR) -#define EIGEN_CONSTEXPR constexpr -#else -#define EIGEN_CONSTEXPR -#endif - // Tuple mimics std::pair but works on e.g. nvcc. template struct Tuple { public: @@ -88,7 +77,7 @@ bool operator!=(const Tuple& x, const Tuple& y) { - +#ifdef EIGEN_HAS_SFINAE namespace internal{ template @@ -127,15 +116,10 @@ namespace internal{ }; } +#endif - - - - -#undef EIGEN_CONSTEXPR - } // namespace Eigen #endif // EIGEN_CXX11_TENSOR_TENSOR_META_H diff --git a/unsupported/test/CMakeLists.txt b/unsupported/test/CMakeLists.txt index e9656f404..8865892e6 100644 --- a/unsupported/test/CMakeLists.txt +++ b/unsupported/test/CMakeLists.txt @@ -142,7 +142,7 @@ if(EIGEN_TEST_CXX11) ei_add_test(cxx11_tensor_io "-std=c++0x") ei_add_test(cxx11_tensor_generator "-std=c++0x") ei_add_test(cxx11_tensor_custom_op "-std=c++0x") - ei_add_test(cxx11_tensor_customIndex "-std=c++0x") + ei_add_test(cxx11_tensor_custom_index "-std=c++0x") # These tests needs nvcc # ei_add_test(cxx11_tensor_device "-std=c++0x") diff --git a/unsupported/test/cxx11_tensor_customIndex.cpp b/unsupported/test/cxx11_tensor_custom_index.cpp similarity index 64% rename from unsupported/test/cxx11_tensor_customIndex.cpp rename to unsupported/test/cxx11_tensor_custom_index.cpp index 6ec809890..ff9545a7a 100644 --- a/unsupported/test/cxx11_tensor_customIndex.cpp +++ b/unsupported/test/cxx11_tensor_custom_index.cpp @@ -1,7 +1,7 @@ // This file is part of Eigen, a lightweight C++ template library // for linear algebra. // -// Copyright (C) 2014 Benoit Steiner +// Copyright (C) 2015 Benoit Steiner // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed @@ -17,25 +17,22 @@ using Eigen::Tensor; template -static void test_customIndex() { - +static void test_custom_index() { + Tensor tensor(2, 3, 5, 7); - - using NormalIndex = DSizes; - using CustomIndex = Matrix; - tensor.setRandom(); + using NormalIndex = DSizes; + using CustomIndex = Matrix; CustomIndex coeffC(1,2,4,1); NormalIndex coeff(1,2,4,1); - - VERIFY_IS_EQUAL(tensor.coeff( coeffC ), tensor.coeff( coeff )); - VERIFY_IS_EQUAL(tensor.coeffRef( coeffC ), tensor.coeffRef( coeff )); - + + VERIFY_IS_EQUAL(tensor.coeff(coeffC), tensor.coeff(coeff)); + VERIFY_IS_EQUAL(tensor.coeffRef(coeffC), tensor.coeffRef(coeff)); } -void test_cxx11_tensor_customIndex() { - CALL_SUBTEST(test_customIndex()); - CALL_SUBTEST(test_customIndex()); +void test_cxx11_tensor_custom_index() { + test_custom_index(); + test_custom_index(); }