diff options
-rw-r--r-- | Eigen/src/Core/ArithmeticSequence.h | 10 | ||||
-rw-r--r-- | Eigen/src/Core/IndexedView.h | 4 | ||||
-rw-r--r-- | test/indexed_view.cpp | 11 |
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() |