11 #ifndef EIGEN_XPRHELPER_H
12 #define EIGEN_XPRHELPER_H
17 #if EIGEN_COMP_GNUC && !EIGEN_GNUC_AT(4,3)
18 #define EIGEN_EMPTY_STRUCT_CTOR(X) \
19 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE X() {} \
20 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE X(const X& ) {}
22 #define EIGEN_EMPTY_STRUCT_CTOR(X)
27 typedef EIGEN_DEFAULT_DENSE_INDEX_TYPE DenseIndex;
35 typedef EIGEN_DEFAULT_DENSE_INDEX_TYPE Index;
39 template<
typename IndexDest,
typename IndexSrc>
41 inline IndexDest convert_index(
const IndexSrc& idx) {
43 eigen_internal_assert(idx <= NumTraits<IndexDest>::highest() &&
"Index value to big for target type");
44 return IndexDest(idx);
49 class no_assignment_operator
52 no_assignment_operator& operator=(
const no_assignment_operator&);
56 template<
typename I1,
typename I2>
57 struct promote_index_type
59 typedef typename conditional<(sizeof(I1)<sizeof(I2)), I2, I1>::type type;
66 template<
typename T,
int Value>
class variable_if_dynamic
69 EIGEN_EMPTY_STRUCT_CTOR(variable_if_dynamic)
70 EIGEN_DEVICE_FUNC explicit variable_if_dynamic(T v) { EIGEN_ONLY_USED_FOR_DEBUG(v); eigen_assert(v == T(Value)); }
71 EIGEN_DEVICE_FUNC
static T value() {
return T(Value); }
72 EIGEN_DEVICE_FUNC
void setValue(T) {}
75 template<
typename T>
class variable_if_dynamic<T, Dynamic>
78 EIGEN_DEVICE_FUNC variable_if_dynamic() { eigen_assert(
false); }
80 EIGEN_DEVICE_FUNC
explicit variable_if_dynamic(T value) : m_value(value) {}
81 EIGEN_DEVICE_FUNC T value()
const {
return m_value; }
82 EIGEN_DEVICE_FUNC
void setValue(T value) { m_value = value; }
87 template<
typename T,
int Value>
class variable_if_dynamicindex
90 EIGEN_EMPTY_STRUCT_CTOR(variable_if_dynamicindex)
91 EIGEN_DEVICE_FUNC explicit variable_if_dynamicindex(T v) { EIGEN_ONLY_USED_FOR_DEBUG(v); eigen_assert(v == T(Value)); }
92 EIGEN_DEVICE_FUNC
static T value() {
return T(Value); }
93 EIGEN_DEVICE_FUNC
void setValue(T) {}
96 template<
typename T>
class variable_if_dynamicindex<T, DynamicIndex>
99 EIGEN_DEVICE_FUNC variable_if_dynamicindex() { eigen_assert(
false); }
101 EIGEN_DEVICE_FUNC
explicit variable_if_dynamicindex(T value) : m_value(value) {}
102 EIGEN_DEVICE_FUNC T value()
const {
return m_value; }
103 EIGEN_DEVICE_FUNC
void setValue(T value) { m_value = value; }
106 template<
typename T>
struct functor_traits
111 PacketAccess =
false,
116 template<
typename T>
struct packet_traits;
118 template<
typename T>
struct unpacket_traits
129 template<
int Size,
typename PacketType,
130 bool Stop = Size==Dynamic || (Size%unpacket_traits<PacketType>::size)==0 || is_same<PacketType,
typename unpacket_traits<PacketType>::half>::value>
131 struct find_best_packet_helper;
133 template<
int Size,
typename PacketType>
134 struct find_best_packet_helper<Size,PacketType,true>
136 typedef PacketType type;
139 template<
int Size,
typename PacketType>
140 struct find_best_packet_helper<Size,PacketType,false>
142 typedef typename find_best_packet_helper<Size,typename unpacket_traits<PacketType>::half>::type type;
145 template<
typename T,
int Size>
146 struct find_best_packet
148 typedef typename find_best_packet_helper<Size,typename packet_traits<T>::type>::type type;
151 #if EIGEN_MAX_STATIC_ALIGN_BYTES>0
152 template<
int ArrayBytes,
int AlignmentBytes,
153 bool Match = bool((ArrayBytes%AlignmentBytes)==0),
154 bool TryHalf = bool(AlignmentBytes>EIGEN_MIN_ALIGN_BYTES) >
155 struct compute_default_alignment_helper
160 template<
int ArrayBytes,
int AlignmentBytes,
bool TryHalf>
161 struct compute_default_alignment_helper<ArrayBytes, AlignmentBytes, true, TryHalf>
163 enum { value = AlignmentBytes };
166 template<
int ArrayBytes,
int AlignmentBytes>
167 struct compute_default_alignment_helper<ArrayBytes, AlignmentBytes, false, true>
170 enum { value = compute_default_alignment_helper<ArrayBytes, AlignmentBytes/2>::value };
175 template<
int ArrayBytes,
int AlignmentBytes>
176 struct compute_default_alignment_helper
182 template<
typename T,
int Size>
struct compute_default_alignment {
183 enum { value = compute_default_alignment_helper<Size*sizeof(T),EIGEN_MAX_STATIC_ALIGN_BYTES>::value };
186 template<
typename T>
struct compute_default_alignment<T,Dynamic> {
187 enum { value = EIGEN_MAX_ALIGN_BYTES };
190 template<
typename _Scalar,
int _Rows,
int _Cols,
194 : EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION ),
195 int _MaxRows = _Rows,
197 >
class make_proper_matrix_type
200 IsColVector = _Cols==1 && _Rows!=1,
201 IsRowVector = _Rows==1 && _Cols!=1,
207 typedef Matrix<_Scalar, _Rows, _Cols, Options, _MaxRows, _MaxCols> type;
210 template<
typename Scalar,
int Rows,
int Cols,
int Options,
int MaxRows,
int MaxCols>
211 class compute_matrix_flags
221 template<
int _Rows,
int _Cols>
struct size_at_compile_time
223 enum { ret = (_Rows==Dynamic || _Cols==Dynamic) ? Dynamic : _Rows * _Cols };
226 template<
typename XprType>
struct size_of_xpr_at_compile_time
228 enum { ret = size_at_compile_time<traits<XprType>::RowsAtCompileTime,traits<XprType>::ColsAtCompileTime>::ret };
235 template<typename T, typename StorageKind = typename traits<T>::StorageKind>
struct plain_matrix_type;
236 template<
typename T,
typename BaseClassType>
struct plain_matrix_type_dense;
237 template<
typename T>
struct plain_matrix_type<T,Dense>
239 typedef typename plain_matrix_type_dense<T,typename traits<T>::XprKind>::type type;
241 template<
typename T>
struct plain_matrix_type<T,DiagonalShape>
243 typedef typename T::PlainObject type;
246 template<
typename T>
struct plain_matrix_type_dense<T,MatrixXpr>
248 typedef Matrix<typename traits<T>::Scalar,
249 traits<T>::RowsAtCompileTime,
250 traits<T>::ColsAtCompileTime,
252 traits<T>::MaxRowsAtCompileTime,
253 traits<T>::MaxColsAtCompileTime
257 template<
typename T>
struct plain_matrix_type_dense<T,ArrayXpr>
259 typedef Array<typename traits<T>::Scalar,
260 traits<T>::RowsAtCompileTime,
261 traits<T>::ColsAtCompileTime,
263 traits<T>::MaxRowsAtCompileTime,
264 traits<T>::MaxColsAtCompileTime
272 template<typename T, typename StorageKind = typename traits<T>::StorageKind>
struct eval;
274 template<
typename T>
struct eval<T,Dense>
276 typedef typename plain_matrix_type<T>::type type;
287 template<
typename T>
struct eval<T,DiagonalShape>
289 typedef typename plain_matrix_type<T>::type type;
293 template<
typename _Scalar,
int _Rows,
int _Cols,
int _Options,
int _MaxRows,
int _MaxCols>
294 struct eval<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>, Dense>
296 typedef const Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>& type;
299 template<
typename _Scalar,
int _Rows,
int _Cols,
int _Options,
int _MaxRows,
int _MaxCols>
300 struct eval<Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>, Dense>
302 typedef const Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>& type;
309 template<
typename T>
struct plain_matrix_type_column_major
311 enum { Rows = traits<T>::RowsAtCompileTime,
312 Cols = traits<T>::ColsAtCompileTime,
313 MaxRows = traits<T>::MaxRowsAtCompileTime,
314 MaxCols = traits<T>::MaxColsAtCompileTime
316 typedef Matrix<typename traits<T>::Scalar,
327 template<
typename T>
struct plain_matrix_type_row_major
329 enum { Rows = traits<T>::RowsAtCompileTime,
330 Cols = traits<T>::ColsAtCompileTime,
331 MaxRows = traits<T>::MaxRowsAtCompileTime,
332 MaxCols = traits<T>::MaxColsAtCompileTime
334 typedef Matrix<typename traits<T>::Scalar,
346 template <
typename T>
349 typedef typename conditional<
350 bool(traits<T>::Flags & NestByRefBit),
355 typedef typename conditional<
356 bool(traits<T>::Flags & NestByRefBit),
359 >::type non_const_type;
363 template<
typename T1,
typename T2>
364 struct transfer_constness
366 typedef typename conditional<
367 bool(internal::is_const<T1>::value),
368 typename internal::add_const_on_value_type<T2>::type,
388 template<typename T, int n, typename PlainObject = typename eval<T>::type>
struct nested_eval
396 DynamicAsInteger = 10000,
397 ScalarReadCost = NumTraits<typename traits<T>::Scalar>::ReadCost,
398 ScalarReadCostAsInteger = ScalarReadCost == Dynamic ? int(DynamicAsInteger) : int(ScalarReadCost),
399 CoeffReadCost = evaluator<T>::CoeffReadCost,
402 CoeffReadCostAsInteger = CoeffReadCost == Dynamic ? int(DynamicAsInteger) : int(CoeffReadCost),
403 NAsInteger = n == Dynamic ? int(DynamicAsInteger) : n,
404 CostEvalAsInteger = (NAsInteger+1) * ScalarReadCostAsInteger + CoeffReadCostAsInteger,
405 CostNoEvalAsInteger = NAsInteger * CoeffReadCostAsInteger
408 typedef typename conditional<
410 (
int(CostEvalAsInteger) < int(CostNoEvalAsInteger)) ),
412 typename ref_selector<T>::type
418 inline T* const_cast_ptr(
const T* ptr)
420 return const_cast<T*
>(ptr);
423 template<typename Derived, typename XprKind = typename traits<Derived>::XprKind>
424 struct dense_xpr_base
429 template<
typename Derived>
430 struct dense_xpr_base<Derived, MatrixXpr>
432 typedef MatrixBase<Derived> type;
435 template<
typename Derived>
436 struct dense_xpr_base<Derived, ArrayXpr>
438 typedef ArrayBase<Derived> type;
441 template<typename Derived, typename XprKind = typename traits<Derived>::XprKind,
typename StorageKind =
typename traits<Derived>::StorageKind>
442 struct generic_xpr_base;
444 template<
typename Derived,
typename XprKind>
445 struct generic_xpr_base<Derived, XprKind, Dense>
447 typedef typename dense_xpr_base<Derived,XprKind>::type type;
452 template<
typename Derived,
typename Scalar,
typename OtherScalar,
453 bool EnableIt = !is_same<Scalar,OtherScalar>::value >
454 struct special_scalar_op_base :
public DenseCoeffsBase<Derived>
459 void operator*(dummy)
const;
460 void operator/(dummy)
const;
463 template<
typename Derived,
typename Scalar,
typename OtherScalar>
464 struct special_scalar_op_base<Derived,Scalar,OtherScalar,true> :
public DenseCoeffsBase<Derived>
466 const CwiseUnaryOp<scalar_multiple2_op<Scalar,OtherScalar>, Derived>
467 operator*(
const OtherScalar& scalar)
const
469 #ifdef EIGEN_SPECIAL_SCALAR_MULTIPLE_PLUGIN
470 EIGEN_SPECIAL_SCALAR_MULTIPLE_PLUGIN
472 return CwiseUnaryOp<scalar_multiple2_op<Scalar,OtherScalar>, Derived>
473 (*
static_cast<const Derived*
>(
this), scalar_multiple2_op<Scalar,OtherScalar>(scalar));
476 inline friend const CwiseUnaryOp<scalar_multiple2_op<Scalar,OtherScalar>, Derived>
477 operator*(
const OtherScalar& scalar,
const Derived& matrix)
479 #ifdef EIGEN_SPECIAL_SCALAR_MULTIPLE_PLUGIN
480 EIGEN_SPECIAL_SCALAR_MULTIPLE_PLUGIN
482 return static_cast<const special_scalar_op_base&
>(matrix).
operator*(scalar);
485 const CwiseUnaryOp<scalar_quotient2_op<Scalar,OtherScalar>, Derived>
486 operator/(
const OtherScalar& scalar)
const
488 #ifdef EIGEN_SPECIAL_SCALAR_MULTIPLE_PLUGIN
489 EIGEN_SPECIAL_SCALAR_MULTIPLE_PLUGIN
491 return CwiseUnaryOp<scalar_quotient2_op<Scalar,OtherScalar>, Derived>
492 (*
static_cast<const Derived*
>(
this), scalar_quotient2_op<Scalar,OtherScalar>(scalar));
496 template<
typename XprType,
typename CastType>
struct cast_return_type
498 typedef typename XprType::Scalar CurrentScalarType;
499 typedef typename remove_all<CastType>::type _CastType;
500 typedef typename _CastType::Scalar NewScalarType;
501 typedef typename conditional<is_same<CurrentScalarType,NewScalarType>::value,
502 const XprType&,CastType>::type type;
505 template <
typename A,
typename B>
struct promote_storage_type;
507 template <
typename A>
struct promote_storage_type<A,A>
511 template <
typename A>
struct promote_storage_type<A, const A>
515 template <
typename A>
struct promote_storage_type<const A, A>
533 template <
typename A,
typename B,
typename Functor>
struct cwise_promote_storage_type;
535 template <
typename A,
typename Functor>
struct cwise_promote_storage_type<A,A,Functor> {
typedef A ret; };
536 template <
typename Functor>
struct cwise_promote_storage_type<Dense,Dense,Functor> {
typedef Dense ret; };
537 template <
typename ScalarA,
typename ScalarB>
struct cwise_promote_storage_type<Dense,Dense,scalar_product_op<ScalarA,ScalarB> > {
typedef Dense ret; };
538 template <
typename A,
typename Functor>
struct cwise_promote_storage_type<A,Dense,Functor> {
typedef Dense ret; };
539 template <
typename B,
typename Functor>
struct cwise_promote_storage_type<Dense,B,Functor> {
typedef Dense ret; };
540 template <
typename A,
typename ScalarA,
typename ScalarB>
struct cwise_promote_storage_type<A,Dense,scalar_product_op<ScalarA,ScalarB> > {
typedef A ret; };
541 template <
typename B,
typename ScalarA,
typename ScalarB>
struct cwise_promote_storage_type<Dense,B,scalar_product_op<ScalarA,ScalarB> > {
typedef B ret; };
557 template <
typename A,
typename B,
int ProductTag>
struct product_promote_storage_type;
559 template <
typename A,
int ProductTag>
struct product_promote_storage_type<A, A, ProductTag> {
typedef A ret;};
560 template <
int ProductTag>
struct product_promote_storage_type<Dense, Dense, ProductTag> {
typedef Dense ret;};
561 template <
typename A,
int ProductTag>
struct product_promote_storage_type<A, Dense, ProductTag> {
typedef Dense ret; };
562 template <
typename B,
int ProductTag>
struct product_promote_storage_type<Dense, B, ProductTag> {
typedef Dense ret; };
564 template <
typename A,
int ProductTag>
struct product_promote_storage_type<A, DiagonalShape, ProductTag> {
typedef A ret; };
565 template <
typename B,
int ProductTag>
struct product_promote_storage_type<DiagonalShape, B, ProductTag> {
typedef B ret; };
566 template <
int ProductTag>
struct product_promote_storage_type<Dense, DiagonalShape, ProductTag> {
typedef Dense ret; };
567 template <
int ProductTag>
struct product_promote_storage_type<DiagonalShape, Dense, ProductTag> {
typedef Dense ret; };
569 template <
typename A,
int ProductTag>
struct product_promote_storage_type<A, PermutationStorage, ProductTag> {
typedef A ret; };
570 template <
typename B,
int ProductTag>
struct product_promote_storage_type<PermutationStorage, B, ProductTag> {
typedef B ret; };
571 template <
int ProductTag>
struct product_promote_storage_type<Dense, PermutationStorage, ProductTag> {
typedef Dense ret; };
572 template <
int ProductTag>
struct product_promote_storage_type<PermutationStorage, Dense, ProductTag> {
typedef Dense ret; };
577 template<
typename ExpressionType,
typename Scalar =
typename ExpressionType::Scalar>
578 struct plain_row_type
580 typedef Matrix<Scalar, 1, ExpressionType::ColsAtCompileTime,
581 ExpressionType::PlainObject::Options |
RowMajor, 1, ExpressionType::MaxColsAtCompileTime> MatrixRowType;
582 typedef Array<Scalar, 1, ExpressionType::ColsAtCompileTime,
583 ExpressionType::PlainObject::Options |
RowMajor, 1, ExpressionType::MaxColsAtCompileTime> ArrayRowType;
585 typedef typename conditional<
586 is_same< typename traits<ExpressionType>::XprKind, MatrixXpr >::value,
592 template<
typename ExpressionType,
typename Scalar =
typename ExpressionType::Scalar>
593 struct plain_col_type
595 typedef Matrix<Scalar, ExpressionType::RowsAtCompileTime, 1,
596 ExpressionType::PlainObject::Options & ~
RowMajor, ExpressionType::MaxRowsAtCompileTime, 1> MatrixColType;
597 typedef Array<Scalar, ExpressionType::RowsAtCompileTime, 1,
598 ExpressionType::PlainObject::Options & ~
RowMajor, ExpressionType::MaxRowsAtCompileTime, 1> ArrayColType;
600 typedef typename conditional<
601 is_same< typename traits<ExpressionType>::XprKind, MatrixXpr >::value,
607 template<
typename ExpressionType,
typename Scalar =
typename ExpressionType::Scalar>
608 struct plain_diag_type
610 enum { diag_size = EIGEN_SIZE_MIN_PREFER_DYNAMIC(ExpressionType::RowsAtCompileTime, ExpressionType::ColsAtCompileTime),
611 max_diag_size = EIGEN_SIZE_MIN_PREFER_FIXED(ExpressionType::MaxRowsAtCompileTime, ExpressionType::MaxColsAtCompileTime)
613 typedef Matrix<Scalar, diag_size, 1, ExpressionType::PlainObject::Options & ~RowMajor, max_diag_size, 1> MatrixDiagType;
614 typedef Array<Scalar, diag_size, 1, ExpressionType::PlainObject::Options & ~RowMajor, max_diag_size, 1> ArrayDiagType;
616 typedef typename conditional<
617 is_same< typename traits<ExpressionType>::XprKind, MatrixXpr >::value,
623 template<
typename ExpressionType>
626 enum { value = !bool(is_const<ExpressionType>::value) &&
627 bool(traits<ExpressionType>::Flags &
LvalueBit) };
630 template<
typename T>
struct is_diagonal
631 {
enum { ret =
false }; };
633 template<
typename T>
struct is_diagonal<DiagonalBase<T> >
634 {
enum { ret =
true }; };
636 template<
typename T>
struct is_diagonal<DiagonalWrapper<T> >
637 {
enum { ret =
true }; };
639 template<
typename T,
int S>
struct is_diagonal<DiagonalMatrix<T,S> >
640 {
enum { ret =
true }; };
642 template<
typename S1,
typename S2>
struct glue_shapes;
643 template<>
struct glue_shapes<DenseShape,TriangularShape> {
typedef TriangularShape type; };
645 template<
typename T1,
typename T2>
646 bool is_same_dense(
const T1 &mat1,
const T2 &mat2,
typename enable_if<has_direct_access<T1>::ret&&has_direct_access<T2>::ret, T1>::type * = 0)
648 return (mat1.data()==mat2.data()) && (mat1.innerStride()==mat2.innerStride()) && (mat1.outerStride()==mat2.outerStride());
651 template<
typename T1,
typename T2>
652 bool is_same_dense(
const T1 &,
const T2 &,
typename enable_if<!(has_direct_access<T1>::ret&&has_direct_access<T2>::ret), T1>::type * = 0)
666 #define EIGEN_CHECK_BINARY_COMPATIBILIY(BINOP,LHS,RHS) \
667 EIGEN_STATIC_ASSERT((internal::functor_is_product_like<BINOP>::ret \
668 ? int(internal::scalar_product_traits<LHS, RHS>::Defined) \
669 : int(internal::is_same<LHS, RHS>::value)), \
670 YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
674 #endif // EIGEN_XPRHELPER_H
Definition: Constants.h:314
const unsigned int DirectAccessBit
Definition: Constants.h:141
const unsigned int LvalueBit
Definition: Constants.h:130
const unsigned int RowMajorBit
Definition: Constants.h:53
Definition: Eigen_Colamd.h:54
Definition: Constants.h:316
Definition: Constants.h:312
const unsigned int EvalBeforeNestingBit
Definition: Constants.h:57