Propagate compile-time size with "all" and add c++11 array unit test

This commit is contained in:
Gael Guennebaud 2017-01-06 13:29:33 +01:00
parent 3730e3ca9e
commit fad1fa75b3
3 changed files with 20 additions and 5 deletions

View File

@ -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

View File

@ -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),

View File

@ -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()