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)
29 template<
typename IndexDest,
typename IndexSrc>
31 inline IndexDest convert_index(
const IndexSrc& idx) {
33 eigen_internal_assert(idx <= NumTraits<IndexDest>::highest() &&
"Index value to big for target type");
34 return IndexDest(idx);
41 #if EIGEN_HAS_TYPE_TRAITS
53 template<
typename RowIndices,
typename ColIndices>
67 template<
typename ExprScalar,
typename T,
bool IsSupported>
70 template<
typename S,
typename T>
77 template<
typename ExprScalar,
typename T,
typename PromotedType,
83 template<
typename S,
typename T>
87 template<
typename S,
typename T,
typename PromotedType>
90 typedef PromotedType type;
95 template<
typename ExprScalar,
typename T,
typename PromotedType>
101 template<
typename S,
typename T,
typename PromotedType,
bool ConvertibleToLiteral>
105 template<
typename S,
typename T>
119 template<
typename I1,
typename I2>
133 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
explicit variable_if_dynamic(T v) { EIGEN_ONLY_USED_FOR_DEBUG(v); eigen_assert(v == T(Value)); }
134 EIGEN_DEVICE_FUNC
static EIGEN_STRONG_INLINE T value() {
return T(Value); }
135 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
operator T()
const {
return T(Value); }
136 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void setValue(T) {}
144 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
explicit variable_if_dynamic(T value) : m_value(value) {}
145 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T value()
const {
return m_value; }
146 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
operator T()
const {
return m_value; }
147 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void setValue(T value) { m_value = value; }
156 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
explicit variable_if_dynamicindex(T v) { EIGEN_ONLY_USED_FOR_DEBUG(v); eigen_assert(v == T(Value)); }
157 EIGEN_DEVICE_FUNC
static EIGEN_STRONG_INLINE T value() {
return T(Value); }
158 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void setValue(T) {}
167 EIGEN_DEVICE_FUNC T EIGEN_STRONG_INLINE value()
const {
return m_value; }
168 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void setValue(T value) { m_value = value; }
176 PacketAccess =
false,
191 vectorizable =
false,
192 masked_load_available=
false,
193 masked_store_available=
false
197 template<
int Size,
typename PacketType,
201 template<
int Size,
typename PacketType>
204 typedef PacketType type;
207 template<
int Size,
typename PacketType>
213 template<
typename T,
int Size>
219 #if EIGEN_MAX_STATIC_ALIGN_BYTES>0
220 template<
int ArrayBytes,
int AlignmentBytes,
221 bool Match = bool((ArrayBytes%AlignmentBytes)==0),
222 bool TryHalf = bool(EIGEN_MIN_ALIGN_BYTES<AlignmentBytes) >
228 template<
int ArrayBytes,
int AlignmentBytes,
bool TryHalf>
229 struct compute_default_alignment_helper<ArrayBytes, AlignmentBytes, true, TryHalf>
231 enum { value = AlignmentBytes };
234 template<
int ArrayBytes,
int AlignmentBytes>
235 struct compute_default_alignment_helper<ArrayBytes, AlignmentBytes, false, true>
238 enum { value = compute_default_alignment_helper<ArrayBytes, AlignmentBytes/2>::value };
243 template<
int ArrayBytes,
int AlignmentBytes>
255 enum { value = EIGEN_MAX_ALIGN_BYTES };
258 template<
typename _Scalar,
int _Rows,
int _Cols,
262 : EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION ),
263 int _MaxRows = _Rows,
268 IsColVector = _Cols==1 && _Rows!=1,
269 IsRowVector = _Rows==1 && _Cols!=1,
278 template<
typename Scalar,
int Rows,
int Cols,
int Options,
int MaxRows,
int MaxCols>
303 template<typename T, typename StorageKind = typename traits<T>::StorageKind>
struct plain_matrix_type;
311 typedef typename T::PlainObject type;
340 template<typename T, typename StorageKind = typename traits<T>::StorageKind>
struct eval;
361 template<
typename _Scalar,
int _Rows,
int _Cols,
int _Options,
int _MaxRows,
int _MaxCols>
367 template<
typename _Scalar,
int _Rows,
int _Cols,
int _Options,
int _MaxRows,
int _MaxCols>
375 template<typename T, typename StorageKind = typename traits<T>::StorageKind>
struct plain_object_eval;
423 template <
typename T>
440 template<
typename T1,
typename T2>
445 typename internal::add_const_on_value_type<T2>::type,
465 template<typename T, int n, typename PlainObject = typename plain_object_eval<T>::type>
struct nested_eval
475 CostEval = (NAsInteger+1) * ScalarReadCost + CoeffReadCost,
476 CostNoEval = NAsInteger * CoeffReadCost,
485 inline T* const_cast_ptr(
const T* ptr)
487 return const_cast<T*
>(ptr);
490 template<typename Derived, typename XprKind = typename traits<Derived>::XprKind>
496 template<
typename Derived>
502 template<
typename Derived>
508 template<typename Derived, typename XprKind = typename traits<Derived>::XprKind,
typename StorageKind =
typename traits<Derived>::StorageKind>
511 template<
typename Derived,
typename XprKind>
519 typedef typename XprType::Scalar CurrentScalarType;
520 typedef typename remove_all<CastType>::type _CastType;
521 typedef typename _CastType::Scalar NewScalarType;
564 enum { value = LhsOrder };
606 template<
typename ExpressionType,
typename Scalar =
typename ExpressionType::Scalar>
609 typedef Matrix<Scalar, 1, ExpressionType::ColsAtCompileTime,
610 ExpressionType::PlainObject::Options |
RowMajor, 1, ExpressionType::MaxColsAtCompileTime>
MatrixRowType;
611 typedef Array<Scalar, 1, ExpressionType::ColsAtCompileTime,
612 ExpressionType::PlainObject::Options |
RowMajor, 1, ExpressionType::MaxColsAtCompileTime>
ArrayRowType;
621 template<
typename ExpressionType,
typename Scalar =
typename ExpressionType::Scalar>
624 typedef Matrix<Scalar, ExpressionType::RowsAtCompileTime, 1,
625 ExpressionType::PlainObject::Options & ~
RowMajor, ExpressionType::MaxRowsAtCompileTime, 1>
MatrixColType;
626 typedef Array<Scalar, ExpressionType::RowsAtCompileTime, 1,
627 ExpressionType::PlainObject::Options & ~
RowMajor, ExpressionType::MaxRowsAtCompileTime, 1>
ArrayColType;
636 template<
typename ExpressionType,
typename Scalar =
typename ExpressionType::Scalar>
639 enum { diag_size = EIGEN_SIZE_MIN_PREFER_DYNAMIC(ExpressionType::RowsAtCompileTime, ExpressionType::ColsAtCompileTime),
640 max_diag_size = EIGEN_SIZE_MIN_PREFER_FIXED(ExpressionType::MaxRowsAtCompileTime, ExpressionType::MaxColsAtCompileTime)
652 template<
typename Expr,
typename Scalar =
typename Expr::Scalar>
666 template<
typename ExpressionType>
674 {
enum { ret =
false }; };
677 {
enum { ret =
true }; };
680 {
enum { ret =
true }; };
683 {
enum { ret =
true }; };
687 {
enum { value =
false }; };
690 {
enum { value =
true }; };
696 template<
typename T1,
typename T2>
701 template<
typename T1,
typename T2>
705 return (mat1.data()==mat2.data()) && (mat1.innerStride()==mat2.innerStride()) && (mat1.outerStride()==mat2.outerStride());
708 template<
typename T1,
typename T2>
710 bool is_same_dense(
const T1 &,
const T2 &,
typename enable_if<!possibly_same_dense<T1,T2>::value>::type * = 0)
717 template<
typename T,
bool Vectorized=false,
typename EnableIf =
void>
722 template<
typename T,
bool Vectorized>
731 template<
bool Vectorized>
733 template<
bool Vectorized>
737 #ifdef EIGEN_DEBUG_ASSIGN
738 std::string demangle_traversal(
int t)
740 if(t==DefaultTraversal)
return "DefaultTraversal";
741 if(t==LinearTraversal)
return "LinearTraversal";
742 if(t==InnerVectorizedTraversal)
return "InnerVectorizedTraversal";
743 if(t==LinearVectorizedTraversal)
return "LinearVectorizedTraversal";
744 if(t==SliceVectorizedTraversal)
return "SliceVectorizedTraversal";
747 std::string demangle_unrolling(
int t)
749 if(t==NoUnrolling)
return "NoUnrolling";
750 if(t==InnerUnrolling)
return "InnerUnrolling";
751 if(t==CompleteUnrolling)
return "CompleteUnrolling";
754 std::string demangle_flags(
int f)
762 if(f&NestByRefBit) res +=
" | NestByRef";
808 template<
typename ScalarA,
typename ScalarB,
typename BinaryOp=
internal::scalar_product_op<ScalarA,ScalarB> >
810 #ifndef EIGEN_PARSED_BY_DOXYGEN
813 #endif // EIGEN_PARSED_BY_DOXYGEN
816 template<
typename T,
typename BinaryOp>
819 typedef T ReturnType;
822 template <
typename T,
typename BinaryOp>
825 typedef T ReturnType;
827 template <
typename T,
typename BinaryOp>
830 typedef T ReturnType;
834 template<
typename T,
typename BinaryOp>
837 typedef T ReturnType;
841 template<
typename T,
typename BinaryOp>
844 typedef T ReturnType;
848 template<
typename BinaryOp>
851 typedef void ReturnType;
858 #define EIGEN_CHECK_BINARY_COMPATIBILIY(BINOP,LHS,RHS) \
859 EIGEN_STATIC_ASSERT((Eigen::internal::has_ReturnType<ScalarBinaryOpTraits<LHS, RHS,BINOP> >::value), \
860 YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
864 #endif // EIGEN_XPRHELPER_H