aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Benoit Steiner <benoit.steiner.goog@gmail.com>2015-10-14 09:31:37 -0700
committerGravatar Benoit Steiner <benoit.steiner.goog@gmail.com>2015-10-14 09:31:37 -0700
commit6585efc55354b38c65de8c23599e99f3caaca843 (patch)
treead42da7e739b65f78d542b53dfee4137ac63e5b9
parentfc7478c04d16b8585d6eaff1ae2f473e247aaf2e (diff)
Tightened the definition of isOfNormalIndex to take into account integer types in addition to arrays of indices
Only compile the custom index code when EIGEN_HAS_SFINAE is defined. For the time beeing, EIGEN_HAS_SFINAE is a synonym for EIGEN_HAS_VARIADIC_TEMPLATES, but this might evolve in the future. Moved some code around.
-rw-r--r--unsupported/Eigen/CXX11/Tensor2
-rw-r--r--unsupported/Eigen/CXX11/src/Tensor/Tensor.h33
-rw-r--r--unsupported/Eigen/CXX11/src/Tensor/TensorMacros.h (renamed from unsupported/Eigen/CXX11/src/Tensor/TensorMetaMacros.h)11
-rw-r--r--unsupported/Eigen/CXX11/src/Tensor/TensorMeta.h20
-rw-r--r--unsupported/test/CMakeLists.txt2
-rw-r--r--unsupported/test/cxx11_tensor_custom_index.cpp (renamed from unsupported/test/cxx11_tensor_customIndex.cpp)25
6 files changed, 41 insertions, 52 deletions
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<Tensor<Scalar_, NumIndices_, Options_, IndexTyp
protected:
TensorStorage<Scalar, Dimensions, Options> m_storage;
+#ifdef EIGEN_HAS_SFINAE
template<typename CustomIndices>
struct isOfNormalIndex{
- static const bool value = internal::is_base_of< array<Index, NumIndices>, CustomIndices >::value;
+ static const bool is_array = internal::is_base_of<array<Index, NumIndices>, CustomIndices >::value;
+ static const bool is_int = NumTraits<CustomIndices>::IsInteger;
+ static const bool value = is_array | is_int;
};
+#endif
public:
// Metadata
@@ -129,6 +133,7 @@ class Tensor : public TensorBase<Tensor<Scalar_, NumIndices_, Options_, IndexTyp
}
// custom indices
+#ifdef EIGEN_HAS_SFINAE
template<typename CustomIndices,
EIGEN_SFINAE_ENABLE_IF( !(isOfNormalIndex<CustomIndices>::value) )
>
@@ -136,8 +141,7 @@ class Tensor : public TensorBase<Tensor<Scalar_, NumIndices_, Options_, IndexTyp
{
return coeff(internal::customIndices2Array<Index,NumIndices>(indices));
}
-
-
+#endif
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeff(Index index) const
{
@@ -163,6 +167,7 @@ class Tensor : public TensorBase<Tensor<Scalar_, NumIndices_, Options_, IndexTyp
}
// custom indices
+#ifdef EIGEN_HAS_SFINAE
template<typename CustomIndices,
EIGEN_SFINAE_ENABLE_IF( !(isOfNormalIndex<CustomIndices>::value) )
>
@@ -170,7 +175,7 @@ class Tensor : public TensorBase<Tensor<Scalar_, NumIndices_, Options_, IndexTyp
{
return coeffRef(internal::customIndices2Array<Index,NumIndices>(indices));
}
-
+#endif
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index index)
{
@@ -210,19 +215,19 @@ class Tensor : public TensorBase<Tensor<Scalar_, NumIndices_, Options_, IndexTyp
#endif
// custom indices
+#ifdef EIGEN_HAS_SFINAE
template<typename CustomIndices,
EIGEN_SFINAE_ENABLE_IF( !(isOfNormalIndex<CustomIndices>::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<Index,NumIndices>(indices));
}
+#endif
// normal indices
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator()(const array<Index, NumIndices>& indices) const
{
- //eigen_assert(checkIndexRange(indices)); /* already in coeff */
return coeff(indices);
}
@@ -273,19 +278,19 @@ class Tensor : public TensorBase<Tensor<Scalar_, NumIndices_, Options_, IndexTyp
// normal indices
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()(const array<Index, NumIndices>& indices)
{
- //eigen_assert(checkIndexRange(indices)); /* already in coeff */
return coeffRef(indices);
}
// custom indices
+#ifdef EIGEN_HAS_SFINAE
template<typename CustomIndices,
EIGEN_SFINAE_ENABLE_IF( !(isOfNormalIndex<CustomIndices>::value) )
>
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()(const CustomIndices & indices)
{
- //eigen_assert(checkIndexRange(indices)); /* already in coeff */
return coeffRef(internal::customIndices2Array<Index,NumIndices>(indices));
}
+#endif
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()(Index index)
{
@@ -355,13 +360,6 @@ class Tensor : public TensorBase<Tensor<Scalar_, NumIndices_, Options_, IndexTyp
EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
}
- /** Custom Dimension (delegating constructor c++11) */
- template<typename CustomDimension,
- EIGEN_SFINAE_ENABLE_IF( !(isOfNormalIndex<CustomDimension>::value) )
- >
- inline explicit Tensor(const CustomDimension & dimensions) : Tensor(internal::customIndices2Array<Index,NumIndices>(dimensions))
- {}
-
template<typename OtherDerived>
EIGEN_DEVICE_FUNC
EIGEN_STRONG_INLINE Tensor(const TensorBase<OtherDerived, ReadOnlyAccessors>& other)
@@ -429,7 +427,6 @@ class Tensor : public TensorBase<Tensor<Scalar_, NumIndices_, Options_, IndexTyp
#endif
}
-
// Why this overload, DSizes is derived from array ??? //
EIGEN_DEVICE_FUNC void resize(const DSizes<Index, NumIndices>& dimensions) {
array<Index, NumIndices> dims;
@@ -440,15 +437,15 @@ class Tensor : public TensorBase<Tensor<Scalar_, NumIndices_, Options_, IndexTyp
}
/** Custom Dimension */
+#ifdef EIGEN_HAS_SFINAE
template<typename CustomDimension,
EIGEN_SFINAE_ENABLE_IF( !(isOfNormalIndex<CustomDimension>::value) )
>
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void resize(const CustomDimension & dimensions)
{
- //eigen_assert(checkIndexRange(indices)); /* already in coeff */
return coeffRef(internal::customIndices2Array<Index,NumIndices>(dimensions));
}
-
+#endif
#ifndef EIGEN_EMULATE_CXX11_META_H
template <typename std::ptrdiff_t... Indices>
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorMetaMacros.h b/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 <typename U, typename V> struct Tuple {
public:
@@ -88,7 +77,7 @@ bool operator!=(const Tuple<U, V>& x, const Tuple<U, V>& y) {
-
+#ifdef EIGEN_HAS_SFINAE
namespace internal{
template<typename IndexType, Index... Is>
@@ -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
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 <benoit.steiner.goog@gmail.com>
+// Copyright (C) 2015 Benoit Steiner <benoit.steiner.goog@gmail.com>
//
// 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 <int DataLayout>
-static void test_customIndex() {
-
+static void test_custom_index() {
+
Tensor<float, 4, DataLayout> tensor(2, 3, 5, 7);
-
- using NormalIndex = DSizes<ptrdiff_t, 4>;
- using CustomIndex = Matrix<unsigned int , 4, 1>;
-
tensor.setRandom();
+ using NormalIndex = DSizes<ptrdiff_t, 4>;
+ using CustomIndex = Matrix<unsigned int , 4, 1>;
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<ColMajor>());
- CALL_SUBTEST(test_customIndex<RowMajor>());
+void test_cxx11_tensor_custom_index() {
+ test_custom_index<ColMajor>();
+ test_custom_index<RowMajor>();
}