aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--Eigen/src/Core/Matrix.h11
-rw-r--r--Eigen/src/Core/util/Meta.h60
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