From 5e89573e2a1018afa1e0ef6394f5f33851c3bc6f Mon Sep 17 00:00:00 2001 From: Rasmus Munk Larsen Date: Sat, 20 Nov 2021 00:22:46 +0000 Subject: [PATCH] Implement Eigen::array<...>::reverse_iterator if std::reverse_iterator exists. --- unsupported/Eigen/CXX11/Tensor | 3 +- .../Eigen/CXX11/src/util/EmulateArray.h | 36 ++++++++++++++----- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/unsupported/Eigen/CXX11/Tensor b/unsupported/Eigen/CXX11/Tensor index 5251ff9e4..c269289d9 100644 --- a/unsupported/Eigen/CXX11/Tensor +++ b/unsupported/Eigen/CXX11/Tensor @@ -38,9 +38,10 @@ #include #include #include +#include +#include #include #include -#include #if defined(EIGEN_USE_THREADS) || defined(EIGEN_USE_SYCL) #include "ThreadPool" diff --git a/unsupported/Eigen/CXX11/src/util/EmulateArray.h b/unsupported/Eigen/CXX11/src/util/EmulateArray.h index e51001070..f87cb811a 100644 --- a/unsupported/Eigen/CXX11/src/util/EmulateArray.h +++ b/unsupported/Eigen/CXX11/src/util/EmulateArray.h @@ -17,11 +17,38 @@ namespace Eigen { template class array { + public: typedef T value_type; typedef T* iterator; typedef const T* const_iterator; + EIGEN_DEVICE_FUNC + EIGEN_STRONG_INLINE iterator begin() { return values; } + EIGEN_DEVICE_FUNC + EIGEN_STRONG_INLINE const_iterator begin() const { return values; } + + EIGEN_DEVICE_FUNC + EIGEN_STRONG_INLINE iterator end() { return values + n; } + EIGEN_DEVICE_FUNC + EIGEN_STRONG_INLINE const_iterator end() const { return values + n; } + + +#if !defined(EIGEN_GPUCC) + typedef std::reverse_iterator reverse_iterator; + typedef std::reverse_iterator const_reverse_iterator; + + EIGEN_DEVICE_FUNC + EIGEN_STRONG_INLINE reverse_iterator rbegin() { return reverse_iterator(end());} + EIGEN_DEVICE_FUNC + EIGEN_STRONG_INLINE const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } + + EIGEN_DEVICE_FUNC + EIGEN_STRONG_INLINE reverse_iterator rend() { return reverse_iterator(begin()); } + EIGEN_DEVICE_FUNC + EIGEN_STRONG_INLINE const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } +#endif + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& operator[] (size_t index) { eigen_internal_assert(index < size()); return values[index]; } EIGEN_DEVICE_FUNC @@ -42,15 +69,6 @@ template class array { EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T& back() const { return values[n-1]; } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE iterator begin() { return values; } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const_iterator begin() const { return values; } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE iterator end() { return values + n; } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const_iterator end() const { return values + n; } EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static std::size_t size() { return n; }