aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--Eigen/src/Core/ArithmeticSequence.h10
-rw-r--r--Eigen/src/Core/IndexedView.h4
-rw-r--r--test/indexed_view.cpp11
3 files changed, 20 insertions, 5 deletions
diff --git a/Eigen/src/Core/ArithmeticSequence.h b/Eigen/src/Core/ArithmeticSequence.h
index 1e7812c8c..06b6b53eb 100644
--- a/Eigen/src/Core/ArithmeticSequence.h
+++ b/Eigen/src/Core/ArithmeticSequence.h
@@ -159,16 +159,16 @@ span(FirstType first, SizeType size) {
namespace internal {
-template<typename T, typename EnableIf = void> struct get_compile_time_size {
+template<typename T, int XprSize, typename EnableIf = void> struct get_compile_time_size {
enum { value = -1 };
};
-template<typename T> struct get_compile_time_size<T,typename internal::enable_if<((T::SizeAtCompileTime&0)==0)>::type> {
+template<typename T, int XprSize> struct get_compile_time_size<T,XprSize,typename internal::enable_if<((T::SizeAtCompileTime&0)==0)>::type> {
enum { value = T::SizeAtCompileTime };
};
#ifdef EIGEN_HAS_CXX11
-template<typename T,int N> struct get_compile_time_size<std::array<T,N> > {
+template<typename T, int XprSize, int N> struct get_compile_time_size<std::array<T,N>,XprSize> {
enum { value = N };
};
#endif
@@ -250,6 +250,10 @@ AllRange make_indexing(all_t , Index size) {
return AllRange(size);
}
+template<int XprSize> struct get_compile_time_size<AllRange,XprSize> {
+ enum { value = XprSize };
+};
+
} // end namespace internal
} // end namespace Eigen
diff --git a/Eigen/src/Core/IndexedView.h b/Eigen/src/Core/IndexedView.h
index 7fc856feb..bc1eff8f9 100644
--- a/Eigen/src/Core/IndexedView.h
+++ b/Eigen/src/Core/IndexedView.h
@@ -19,8 +19,8 @@ struct traits<IndexedView<XprType, RowIndices, ColIndices> >
: traits<XprType>
{
enum {
- RowsAtCompileTime = get_compile_time_size<RowIndices>::value,
- ColsAtCompileTime = get_compile_time_size<ColIndices>::value,
+ RowsAtCompileTime = get_compile_time_size<RowIndices,traits<XprType>::RowsAtCompileTime>::value,
+ ColsAtCompileTime = get_compile_time_size<ColIndices,traits<XprType>::ColsAtCompileTime>::value,
MaxRowsAtCompileTime = RowsAtCompileTime != Dynamic ? int(RowsAtCompileTime) : int(traits<XprType>::MaxRowsAtCompileTime),
MaxColsAtCompileTime = ColsAtCompileTime != Dynamic ? int(ColsAtCompileTime) : int(traits<XprType>::MaxColsAtCompileTime),
diff --git a/test/indexed_view.cpp b/test/indexed_view.cpp
index 0be5e434c..5d8ce16ee 100644
--- a/test/indexed_view.cpp
+++ b/test/indexed_view.cpp
@@ -11,6 +11,10 @@
#include <vector>
#include "main.h"
+#if EIGEN_HAS_CXX11
+#include <array>
+#endif
+
typedef std::pair<Index,Index> IndexPair;
int encode(Index i, Index j) {
@@ -108,6 +112,13 @@ void check_indexed_view()
VERIFY( (B(all,1)).ColsAtCompileTime == 1);
VERIFY( (B(all,1)).RowsAtCompileTime == 4);
+ VERIFY( (A(all, eii)).ColsAtCompileTime == eii.SizeAtCompileTime);
+#if EIGEN_HAS_CXX11
+ VERIFY( (A(all, std::array<int,4>{{1,3,2,4}})).ColsAtCompileTime == 4);
+
+ VERIFY_IS_APPROX( (A(std::array<int,3>{{1,3,5}}, std::array<int,4>{{9,6,3,0}})), A(span(1,3,2), span(9,4,-3)) );
+#endif
+
}
void test_indexed_view()