diff options
author | Benoit Steiner <benoit.steiner.goog@gmail.com> | 2015-10-14 09:31:37 -0700 |
---|---|---|
committer | Benoit Steiner <benoit.steiner.goog@gmail.com> | 2015-10-14 09:31:37 -0700 |
commit | 6585efc55354b38c65de8c23599e99f3caaca843 (patch) | |
tree | ad42da7e739b65f78d542b53dfee4137ac63e5b9 /unsupported/Eigen/CXX11/src/Tensor/Tensor.h | |
parent | fc7478c04d16b8585d6eaff1ae2f473e247aaf2e (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.
Diffstat (limited to 'unsupported/Eigen/CXX11/src/Tensor/Tensor.h')
-rw-r--r-- | unsupported/Eigen/CXX11/src/Tensor/Tensor.h | 33 |
1 files changed, 15 insertions, 18 deletions
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> |