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,
int Flags>
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, traits<T>::Flags>::type type;
241 template<
typename T>
struct plain_matrix_type<T,DiagonalShape>
243 typedef typename T::PlainObject type;
246 template<
typename T,
int Flags>
struct plain_matrix_type_dense<T,MatrixXpr,Flags>
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,
int Flags>
struct plain_matrix_type_dense<T,ArrayXpr,Flags>
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;
307 template<typename T, typename StorageKind = typename traits<T>::StorageKind>
struct plain_object_eval;
310 struct plain_object_eval<T,Dense>
312 typedef typename plain_matrix_type_dense<T,typename traits<T>::XprKind, evaluator<T>::Flags>::type type;
318 template<
typename T>
struct plain_matrix_type_column_major
320 enum { Rows = traits<T>::RowsAtCompileTime,
321 Cols = traits<T>::ColsAtCompileTime,
322 MaxRows = traits<T>::MaxRowsAtCompileTime,
323 MaxCols = traits<T>::MaxColsAtCompileTime
325 typedef Matrix<typename traits<T>::Scalar,
336 template<
typename T>
struct plain_matrix_type_row_major
338 enum { Rows = traits<T>::RowsAtCompileTime,
339 Cols = traits<T>::ColsAtCompileTime,
340 MaxRows = traits<T>::MaxRowsAtCompileTime,
341 MaxCols = traits<T>::MaxColsAtCompileTime
343 typedef Matrix<typename traits<T>::Scalar,
355 template <
typename T>
358 typedef typename conditional<
359 bool(traits<T>::Flags & NestByRefBit),
364 typedef typename conditional<
365 bool(traits<T>::Flags & NestByRefBit),
368 >::type non_const_type;
372 template<
typename T1,
typename T2>
373 struct transfer_constness
375 typedef typename conditional<
376 bool(internal::is_const<T1>::value),
377 typename internal::add_const_on_value_type<T2>::type,
397 template<typename T, int n, typename PlainObject = typename plain_object_eval<T>::type>
struct nested_eval
400 ScalarReadCost = NumTraits<typename traits<T>::Scalar>::ReadCost,
401 CoeffReadCost = evaluator<T>::CoeffReadCost,
406 NAsInteger = n == Dynamic ? HugeCost : n,
407 CostEval = (NAsInteger+1) * ScalarReadCost + CoeffReadCost,
408 CostNoEval = NAsInteger * CoeffReadCost
411 typedef typename conditional<
413 (
int(CostEval) < int(CostNoEval)) ),
415 typename ref_selector<T>::type
421 inline T* const_cast_ptr(
const T* ptr)
423 return const_cast<T*
>(ptr);
426 template<typename Derived, typename XprKind = typename traits<Derived>::XprKind>
427 struct dense_xpr_base
432 template<
typename Derived>
433 struct dense_xpr_base<Derived, MatrixXpr>
435 typedef MatrixBase<Derived> type;
438 template<
typename Derived>
439 struct dense_xpr_base<Derived, ArrayXpr>
441 typedef ArrayBase<Derived> type;
444 template<typename Derived, typename XprKind = typename traits<Derived>::XprKind,
typename StorageKind =
typename traits<Derived>::StorageKind>
445 struct generic_xpr_base;
447 template<
typename Derived,
typename XprKind>
448 struct generic_xpr_base<Derived, XprKind, Dense>
450 typedef typename dense_xpr_base<Derived,XprKind>::type type;
455 template<
typename Derived,
typename Scalar,
typename OtherScalar,
typename BaseType,
456 bool EnableIt = !is_same<Scalar,OtherScalar>::value >
457 struct special_scalar_op_base :
public BaseType
462 void operator*(dummy)
const;
463 void operator/(dummy)
const;
466 template<
typename Derived,
typename Scalar,
typename OtherScalar,
typename BaseType>
467 struct special_scalar_op_base<Derived,Scalar,OtherScalar,BaseType,true> :
public BaseType
469 const CwiseUnaryOp<scalar_multiple2_op<Scalar,OtherScalar>, Derived>
470 operator*(
const OtherScalar& scalar)
const
472 #ifdef EIGEN_SPECIAL_SCALAR_MULTIPLE_PLUGIN
473 EIGEN_SPECIAL_SCALAR_MULTIPLE_PLUGIN
475 return CwiseUnaryOp<scalar_multiple2_op<Scalar,OtherScalar>, Derived>
476 (*
static_cast<const Derived*
>(
this), scalar_multiple2_op<Scalar,OtherScalar>(scalar));
479 inline friend const CwiseUnaryOp<scalar_multiple2_op<Scalar,OtherScalar>, Derived>
480 operator*(
const OtherScalar& scalar,
const Derived& matrix)
482 #ifdef EIGEN_SPECIAL_SCALAR_MULTIPLE_PLUGIN
483 EIGEN_SPECIAL_SCALAR_MULTIPLE_PLUGIN
485 return static_cast<const special_scalar_op_base&
>(matrix).
operator*(scalar);
488 const CwiseUnaryOp<scalar_quotient2_op<Scalar,OtherScalar>, Derived>
489 operator/(
const OtherScalar& scalar)
const
491 #ifdef EIGEN_SPECIAL_SCALAR_MULTIPLE_PLUGIN
492 EIGEN_SPECIAL_SCALAR_MULTIPLE_PLUGIN
494 return CwiseUnaryOp<scalar_quotient2_op<Scalar,OtherScalar>, Derived>
495 (*
static_cast<const Derived*
>(
this), scalar_quotient2_op<Scalar,OtherScalar>(scalar));
499 template<
typename XprType,
typename CastType>
struct cast_return_type
501 typedef typename XprType::Scalar CurrentScalarType;
502 typedef typename remove_all<CastType>::type _CastType;
503 typedef typename _CastType::Scalar NewScalarType;
504 typedef typename conditional<is_same<CurrentScalarType,NewScalarType>::value,
505 const XprType&,CastType>::type type;
508 template <
typename A,
typename B>
struct promote_storage_type;
510 template <
typename A>
struct promote_storage_type<A,A>
514 template <
typename A>
struct promote_storage_type<A, const A>
518 template <
typename A>
struct promote_storage_type<const A, A>
536 template <
typename A,
typename B,
typename Functor>
struct cwise_promote_storage_type;
538 template <
typename A,
typename Functor>
struct cwise_promote_storage_type<A,A,Functor> {
typedef A ret; };
539 template <
typename Functor>
struct cwise_promote_storage_type<Dense,Dense,Functor> {
typedef Dense ret; };
540 template <
typename ScalarA,
typename ScalarB>
struct cwise_promote_storage_type<Dense,Dense,scalar_product_op<ScalarA,ScalarB> > {
typedef Dense ret; };
541 template <
typename A,
typename Functor>
struct cwise_promote_storage_type<A,Dense,Functor> {
typedef Dense ret; };
542 template <
typename B,
typename Functor>
struct cwise_promote_storage_type<Dense,B,Functor> {
typedef Dense ret; };
543 template <
typename A,
typename ScalarA,
typename ScalarB>
struct cwise_promote_storage_type<A,Dense,scalar_product_op<ScalarA,ScalarB> > {
typedef A ret; };
544 template <
typename B,
typename ScalarA,
typename ScalarB>
struct cwise_promote_storage_type<Dense,B,scalar_product_op<ScalarA,ScalarB> > {
typedef B ret; };
560 template <
typename A,
typename B,
int ProductTag>
struct product_promote_storage_type;
562 template <
typename A,
int ProductTag>
struct product_promote_storage_type<A, A, ProductTag> {
typedef A ret;};
563 template <
int ProductTag>
struct product_promote_storage_type<Dense, Dense, ProductTag> {
typedef Dense ret;};
564 template <
typename A,
int ProductTag>
struct product_promote_storage_type<A, Dense, ProductTag> {
typedef Dense ret; };
565 template <
typename B,
int ProductTag>
struct product_promote_storage_type<Dense, B, ProductTag> {
typedef Dense ret; };
567 template <
typename A,
int ProductTag>
struct product_promote_storage_type<A, DiagonalShape, ProductTag> {
typedef A ret; };
568 template <
typename B,
int ProductTag>
struct product_promote_storage_type<DiagonalShape, B, ProductTag> {
typedef B ret; };
569 template <
int ProductTag>
struct product_promote_storage_type<Dense, DiagonalShape, ProductTag> {
typedef Dense ret; };
570 template <
int ProductTag>
struct product_promote_storage_type<DiagonalShape, Dense, ProductTag> {
typedef Dense ret; };
572 template <
typename A,
int ProductTag>
struct product_promote_storage_type<A, PermutationStorage, ProductTag> {
typedef A ret; };
573 template <
typename B,
int ProductTag>
struct product_promote_storage_type<PermutationStorage, B, ProductTag> {
typedef B ret; };
574 template <
int ProductTag>
struct product_promote_storage_type<Dense, PermutationStorage, ProductTag> {
typedef Dense ret; };
575 template <
int ProductTag>
struct product_promote_storage_type<PermutationStorage, Dense, ProductTag> {
typedef Dense ret; };
580 template<
typename ExpressionType,
typename Scalar =
typename ExpressionType::Scalar>
581 struct plain_row_type
583 typedef Matrix<Scalar, 1, ExpressionType::ColsAtCompileTime,
584 ExpressionType::PlainObject::Options |
RowMajor, 1, ExpressionType::MaxColsAtCompileTime> MatrixRowType;
585 typedef Array<Scalar, 1, ExpressionType::ColsAtCompileTime,
586 ExpressionType::PlainObject::Options |
RowMajor, 1, ExpressionType::MaxColsAtCompileTime> ArrayRowType;
588 typedef typename conditional<
589 is_same< typename traits<ExpressionType>::XprKind, MatrixXpr >::value,
595 template<
typename ExpressionType,
typename Scalar =
typename ExpressionType::Scalar>
596 struct plain_col_type
598 typedef Matrix<Scalar, ExpressionType::RowsAtCompileTime, 1,
599 ExpressionType::PlainObject::Options & ~
RowMajor, ExpressionType::MaxRowsAtCompileTime, 1> MatrixColType;
600 typedef Array<Scalar, ExpressionType::RowsAtCompileTime, 1,
601 ExpressionType::PlainObject::Options & ~
RowMajor, ExpressionType::MaxRowsAtCompileTime, 1> ArrayColType;
603 typedef typename conditional<
604 is_same< typename traits<ExpressionType>::XprKind, MatrixXpr >::value,
610 template<
typename ExpressionType,
typename Scalar =
typename ExpressionType::Scalar>
611 struct plain_diag_type
613 enum { diag_size = EIGEN_SIZE_MIN_PREFER_DYNAMIC(ExpressionType::RowsAtCompileTime, ExpressionType::ColsAtCompileTime),
614 max_diag_size = EIGEN_SIZE_MIN_PREFER_FIXED(ExpressionType::MaxRowsAtCompileTime, ExpressionType::MaxColsAtCompileTime)
616 typedef Matrix<Scalar, diag_size, 1, ExpressionType::PlainObject::Options & ~RowMajor, max_diag_size, 1> MatrixDiagType;
617 typedef Array<Scalar, diag_size, 1, ExpressionType::PlainObject::Options & ~RowMajor, max_diag_size, 1> ArrayDiagType;
619 typedef typename conditional<
620 is_same< typename traits<ExpressionType>::XprKind, MatrixXpr >::value,
626 template<
typename ExpressionType>
629 enum { value = !bool(is_const<ExpressionType>::value) &&
630 bool(traits<ExpressionType>::Flags &
LvalueBit) };
633 template<
typename T>
struct is_diagonal
634 {
enum { ret =
false }; };
636 template<
typename T>
struct is_diagonal<DiagonalBase<T> >
637 {
enum { ret =
true }; };
639 template<
typename T>
struct is_diagonal<DiagonalWrapper<T> >
640 {
enum { ret =
true }; };
642 template<
typename T,
int S>
struct is_diagonal<DiagonalMatrix<T,S> >
643 {
enum { ret =
true }; };
645 template<
typename S1,
typename S2>
struct glue_shapes;
646 template<>
struct glue_shapes<DenseShape,TriangularShape> {
typedef TriangularShape type; };
648 template<
typename T1,
typename T2>
649 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)
651 return (mat1.data()==mat2.data()) && (mat1.innerStride()==mat2.innerStride()) && (mat1.outerStride()==mat2.outerStride());
654 template<
typename T1,
typename T2>
655 bool is_same_dense(
const T1 &,
const T2 &,
typename enable_if<!(has_direct_access<T1>::ret&&has_direct_access<T2>::ret), T1>::type * = 0)
660 template<
typename T,
typename U>
struct is_same_or_void {
enum { value = is_same<T,U>::value }; };
661 template<
typename T>
struct is_same_or_void<void,T> {
enum { value = 1 }; };
662 template<
typename T>
struct is_same_or_void<T,void> {
enum { value = 1 }; };
663 template<>
struct is_same_or_void<void,void> {
enum { value = 1 }; };
665 #ifdef EIGEN_DEBUG_ASSIGN
666 std::string demangle_traversal(
int t)
668 if(t==DefaultTraversal)
return "DefaultTraversal";
669 if(t==LinearTraversal)
return "LinearTraversal";
670 if(t==InnerVectorizedTraversal)
return "InnerVectorizedTraversal";
671 if(t==LinearVectorizedTraversal)
return "LinearVectorizedTraversal";
672 if(t==SliceVectorizedTraversal)
return "SliceVectorizedTraversal";
675 std::string demangle_unrolling(
int t)
677 if(t==NoUnrolling)
return "NoUnrolling";
678 if(t==InnerUnrolling)
return "InnerUnrolling";
679 if(t==CompleteUnrolling)
return "CompleteUnrolling";
682 std::string demangle_flags(
int f)
690 if(f&NestByRefBit) res +=
" | NestByRef";
706 #define EIGEN_CHECK_BINARY_COMPATIBILIY(BINOP,LHS,RHS) \
707 EIGEN_STATIC_ASSERT((internal::functor_is_product_like<BINOP>::ret \
708 ? int(internal::scalar_product_traits<LHS, RHS>::Defined) \
709 : int(internal::is_same_or_void<LHS, RHS>::value)), \
710 YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
714 #endif // EIGEN_XPRHELPER_H
const unsigned int DirectAccessBit
Definition: Constants.h:149
const unsigned int LvalueBit
Definition: Constants.h:138
const unsigned int RowMajorBit
Definition: Constants.h:61
const unsigned int PacketAccessBit
Definition: Constants.h:88
Definition: Constants.h:320
Definition: Constants.h:322
Definition: Eigen_Colamd.h:54
Definition: Constants.h:324
const unsigned int EvalBeforeNestingBit
Definition: Constants.h:65
const unsigned int LinearAccessBit
Definition: Constants.h:124
const unsigned int NoPreferredStorageOrderBit
Definition: Constants.h:172