diff options
-rw-r--r-- | Eigen/src/Core/Matrix.h | 11 | ||||
-rw-r--r-- | Eigen/src/Core/util/Meta.h | 60 |
2 files changed, 43 insertions, 28 deletions
diff --git a/Eigen/src/Core/Matrix.h b/Eigen/src/Core/Matrix.h index 2f65413da..740d6fc9a 100644 --- a/Eigen/src/Core/Matrix.h +++ b/Eigen/src/Core/Matrix.h @@ -81,15 +81,8 @@ struct ei_traits<Matrix<_Scalar, _Rows, _Cols, _Flags, _MaxRows, _MaxCols> > MaxColsAtCompileTime = _MaxCols, Flags = (_Flags & ~VectorizableBit) | ( - ( - ei_packet_traits<Scalar>::size>1 - && _Rows!=Dynamic - && _Cols!=Dynamic - && ( - (_Flags&RowMajorBit && _Cols%ei_packet_traits<Scalar>::size==0) - || (_Rows%ei_packet_traits<Scalar>::size==0) - ) - ) ? VectorizableBit : 0 + ei_is_matrix_vectorizable<Scalar, _Rows, _Cols, _Flags>::ret + ? VectorizableBit : 0 ), CoeffReadCost = NumTraits<Scalar>::ReadCost }; diff --git a/Eigen/src/Core/util/Meta.h b/Eigen/src/Core/util/Meta.h index 4939128eb..8eafec2f5 100644 --- a/Eigen/src/Core/util/Meta.h +++ b/Eigen/src/Core/util/Meta.h @@ -130,12 +130,49 @@ struct ei_result_of<Func(ArgType0,ArgType1)> { typedef typename ei_binary_result_of_select<Func, ArgType0, ArgType1, FunctorType>::type type; }; +template<typename T> struct ei_functor_traits +{ + enum + { + Cost = 10, + IsVectorizable = false + }; +}; + +template<typename T> struct ei_packet_traits +{ + typedef T type; + enum {size=1}; +}; + +template<typename Scalar, int Rows, int Cols, unsigned int Flags> +struct ei_is_matrix_vectorizable +{ + enum { ret = ei_packet_traits<Scalar>::size > 1 + && Rows!=Dynamic + && Cols!=Dynamic + && + ( + (Flags&RowMajorBit && Cols%ei_packet_traits<Scalar>::size==0) + || (Rows%ei_packet_traits<Scalar>::size==0) + ) + }; +}; + template<typename T> struct ei_eval { - typedef Matrix<typename ei_traits<T>::Scalar, - ei_traits<T>::RowsAtCompileTime, - ei_traits<T>::ColsAtCompileTime, - ei_traits<T>::Flags & ~(EvalBeforeNestingBit | EvalBeforeAssigningBit), + typedef typename ei_traits<T>::Scalar _Scalar; + enum { _Rows = ei_traits<T>::RowsAtCompileTime, + _Cols = ei_traits<T>::ColsAtCompileTime, + _Flags = ei_traits<T>::Flags + }; + typedef Matrix<_Scalar, + _Rows, + _Cols, + (_Flags & ~(EvalBeforeNestingBit | EvalBeforeAssigningBit)) + | + (ei_is_matrix_vectorizable<_Scalar, _Rows, _Cols, _Flags>::ret + ? VectorizableBit : 0), ei_traits<T>::MaxRowsAtCompileTime, ei_traits<T>::MaxColsAtCompileTime> type; }; @@ -167,19 +204,4 @@ template<typename T, int n=1> struct ei_nested >::ret type; }; -template<typename T> struct ei_functor_traits -{ - enum - { - Cost = 10, - IsVectorizable = false - }; -}; - -template<typename T> struct ei_packet_traits -{ - typedef T type; - enum {size=1}; -}; - #endif // EIGEN_META_H |