26 #ifndef EIGEN_XPRHELPER_H
27 #define EIGEN_XPRHELPER_H
32 #if (defined __GNUG__) && !((__GNUC__==4) && (__GNUC_MINOR__==3))
33 #define EIGEN_EMPTY_STRUCT_CTOR(X) \
34 EIGEN_STRONG_INLINE X() {} \
35 EIGEN_STRONG_INLINE X(const X& ) {}
37 #define EIGEN_EMPTY_STRUCT_CTOR(X)
47 class no_assignment_operator
50 no_assignment_operator& operator=(
const no_assignment_operator&);
54 template<
typename I1,
typename I2>
55 struct promote_index_type
57 typedef typename conditional<(sizeof(I1)<sizeof(I2)), I2, I1>::type type;
64 template<
typename T,
int Value>
class variable_if_dynamic
69 static T value() {
return T(Value); }
73 template<
typename T>
class variable_if_dynamic<T, Dynamic>
76 variable_if_dynamic() { assert(
false); }
78 explicit variable_if_dynamic(T value) : m_value(value) {}
79 T value()
const {
return m_value; }
80 void setValue(T value) { m_value = value; }
83 template<
typename T>
struct functor_traits
92 template<
typename T>
struct packet_traits;
94 template<
typename T>
struct unpacket_traits
100 template<
typename _Scalar,
int _Rows,
int _Cols,
105 int _MaxRows = _Rows,
107 >
class make_proper_matrix_type
110 IsColVector = _Cols==1 && _Rows!=1,
111 IsRowVector = _Rows==1 && _Cols!=1,
120 template<
typename Scalar,
int Rows,
int Cols,
int Options,
int MaxRows,
int MaxCols>
121 class compute_matrix_flags
125 is_dynamic_size_storage = MaxRows==Dynamic || MaxCols==
Dynamic,
131 #if EIGEN_ALIGN_STATICALLY
132 ((!is_dynamic_size_storage) && (((MaxCols*MaxRows*
int(
sizeof(Scalar))) % 16) == 0))
140 is_dynamic_size_storage
147 packet_access_bit = packet_traits<Scalar>::Vectorizable && aligned_bit ?
PacketAccessBit : 0
154 template<
int _Rows,
int _Cols>
struct size_at_compile_time
156 enum { ret = (_Rows==Dynamic || _Cols==
Dynamic) ? Dynamic : _Rows * _Cols };
163 template<typename T, typename StorageKind = typename traits<T>::StorageKind>
struct plain_matrix_type;
164 template<
typename T,
typename BaseClassType>
struct plain_matrix_type_dense;
165 template<
typename T>
struct plain_matrix_type<T,Dense>
167 typedef typename plain_matrix_type_dense<T,typename traits<T>::XprKind>::type type;
170 template<
typename T>
struct plain_matrix_type_dense<T,MatrixXpr>
181 template<
typename T>
struct plain_matrix_type_dense<T,ArrayXpr>
196 template<typename T, typename StorageKind = typename traits<T>::StorageKind>
struct eval;
198 template<
typename T>
struct eval<T,Dense>
200 typedef typename plain_matrix_type<T>::type type;
212 template<
typename _Scalar,
int _Rows,
int _Cols,
int _Options,
int _MaxRows,
int _MaxCols>
213 struct eval<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>, Dense>
218 template<
typename _Scalar,
int _Rows,
int _Cols,
int _Options,
int _MaxRows,
int _MaxCols>
219 struct eval<Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>, Dense>
228 template<
typename T>
struct plain_matrix_type_column_major
246 template<
typename T>
struct plain_matrix_type_row_major
263 template<
typename T>
struct must_nest_by_value {
enum { ret =
false }; };
268 template <
typename T>
271 typedef typename conditional<
279 template<
typename T1,
typename T2>
280 struct transfer_constness
282 typedef typename conditional<
283 bool(internal::is_const<T1>::value),
284 typename internal::add_const_on_value_type<T2>::type,
309 template<typename T, int n=1, typename PlainObject = typename eval<T>::type>
struct nested
317 DynamicAsInteger = 10000,
319 ScalarReadCostAsInteger = ScalarReadCost == Dynamic ? DynamicAsInteger : ScalarReadCost,
321 CoeffReadCostAsInteger = CoeffReadCost == Dynamic ? DynamicAsInteger : CoeffReadCost,
322 NAsInteger = n == Dynamic ?
int(DynamicAsInteger) : n,
323 CostEvalAsInteger = (NAsInteger+1) * ScalarReadCostAsInteger + CoeffReadCostAsInteger,
324 CostNoEvalAsInteger = NAsInteger * CoeffReadCostAsInteger
327 typedef typename conditional<
329 int(CostEvalAsInteger) < int(CostNoEvalAsInteger)
332 typename ref_selector<T>::type
339 return const_cast<T*
>(ptr);
342 template<typename Derived, typename XprKind = typename traits<Derived>::XprKind>
343 struct dense_xpr_base
348 template<
typename Derived>
349 struct dense_xpr_base<Derived, MatrixXpr>
351 typedef MatrixBase<Derived> type;
354 template<
typename Derived>
355 struct dense_xpr_base<Derived, ArrayXpr>
357 typedef ArrayBase<Derived> type;
362 template<
typename Derived,
typename Scalar,
typename OtherScalar,
363 bool EnableIt = !is_same<Scalar,OtherScalar>::value >
371 template<
typename Derived,
typename Scalar,
typename OtherScalar>
372 struct special_scalar_op_base<Derived,Scalar,OtherScalar,true> :
public DenseCoeffsBase<Derived>
374 const CwiseUnaryOp<scalar_multiple2_op<Scalar,OtherScalar>, Derived>
375 operator*(
const OtherScalar& scalar)
const
377 return CwiseUnaryOp<scalar_multiple2_op<Scalar,OtherScalar>, Derived>
378 (*
static_cast<const Derived*
>(
this), scalar_multiple2_op<Scalar,OtherScalar>(scalar));
381 inline friend const CwiseUnaryOp<scalar_multiple2_op<Scalar,OtherScalar>, Derived>
382 operator*(
const OtherScalar& scalar,
const Derived& matrix)
383 {
return static_cast<const special_scalar_op_base&
>(matrix).
operator*(scalar); }
386 template<
typename XprType,
typename CastType>
struct cast_return_type
388 typedef typename XprType::Scalar CurrentScalarType;
389 typedef typename remove_all<CastType>::type _CastType;
390 typedef typename _CastType::Scalar NewScalarType;
391 typedef typename conditional<is_same<CurrentScalarType,NewScalarType>::value,
392 const XprType&,CastType>::type type;
395 template <
typename A,
typename B>
struct promote_storage_type;
397 template <
typename A>
struct promote_storage_type<A,A>
405 template<
typename ExpressionType,
typename Scalar =
typename ExpressionType::Scalar>
406 struct plain_row_type
408 typedef Matrix<Scalar, 1, ExpressionType::ColsAtCompileTime,
409 ExpressionType::PlainObject::Options |
RowMajor, 1, ExpressionType::MaxColsAtCompileTime> MatrixRowType;
410 typedef Array<Scalar, 1, ExpressionType::ColsAtCompileTime,
411 ExpressionType::PlainObject::Options |
RowMajor, 1, ExpressionType::MaxColsAtCompileTime> ArrayRowType;
413 typedef typename conditional<
414 is_same< typename traits<ExpressionType>::XprKind, MatrixXpr >::value,
420 template<
typename ExpressionType,
typename Scalar =
typename ExpressionType::Scalar>
421 struct plain_col_type
423 typedef Matrix<Scalar, ExpressionType::RowsAtCompileTime, 1,
424 ExpressionType::PlainObject::Options & ~
RowMajor, ExpressionType::MaxRowsAtCompileTime, 1> MatrixColType;
425 typedef Array<Scalar, ExpressionType::RowsAtCompileTime, 1,
426 ExpressionType::PlainObject::Options & ~
RowMajor, ExpressionType::MaxRowsAtCompileTime, 1> ArrayColType;
428 typedef typename conditional<
429 is_same< typename traits<ExpressionType>::XprKind, MatrixXpr >::value,
435 template<
typename ExpressionType,
typename Scalar =
typename ExpressionType::Scalar>
436 struct plain_diag_type
441 typedef Matrix<Scalar, diag_size, 1, ExpressionType::PlainObject::Options & ~RowMajor, max_diag_size, 1> MatrixDiagType;
442 typedef Array<Scalar, diag_size, 1, ExpressionType::PlainObject::Options & ~RowMajor, max_diag_size, 1> ArrayDiagType;
444 typedef typename conditional<
445 is_same< typename traits<ExpressionType>::XprKind, MatrixXpr >::value,
451 template<
typename ExpressionType>
454 enum { value = !
bool(is_const<ExpressionType>::value) &&
462 #endif // EIGEN_XPRHELPER_H