11 #ifndef EIGEN_XPRHELPER_H
12 #define EIGEN_XPRHELPER_H
14 #include "../InternalHeaderCheck.h"
20 template<
typename IndexDest,
typename IndexSrc>
22 inline IndexDest convert_index(
const IndexSrc& idx) {
24 eigen_internal_assert(idx <= NumTraits<IndexDest>::highest() &&
"Index value to big for target type");
25 return IndexDest(idx);
29 template<
typename T>
struct is_valid_index_type
31 enum { value = internal::is_integral<T>::value || std::is_enum<T>::value
36 template<
typename RowIndices,
typename ColIndices>
37 struct valid_indexed_view_overload {
38 enum { value = !(internal::is_valid_index_type<RowIndices>::value && internal::is_valid_index_type<ColIndices>::value) };
50 template<
typename ExprScalar,
typename T,
bool IsSupported>
51 struct promote_scalar_arg;
53 template<
typename S,
typename T>
54 struct promote_scalar_arg<S,T,true>
60 template<
typename ExprScalar,
typename T,
typename PromotedType,
61 bool ConvertibleToLiteral = internal::is_convertible<T,PromotedType>::value,
62 bool IsSafe = NumTraits<T>::IsInteger || !NumTraits<PromotedType>::IsInteger>
63 struct promote_scalar_arg_unsupported;
66 template<
typename S,
typename T>
67 struct promote_scalar_arg<S,T,false> : promote_scalar_arg_unsupported<S,T,typename NumTraits<S>::Literal> {};
70 template<
typename S,
typename T,
typename PromotedType>
71 struct promote_scalar_arg_unsupported<S,T,PromotedType,true,true>
73 typedef PromotedType type;
78 template<
typename ExprScalar,
typename T,
typename PromotedType>
79 struct promote_scalar_arg_unsupported<ExprScalar,T,PromotedType,false,true>
80 : promote_scalar_arg_unsupported<ExprScalar,T,ExprScalar>
84 template<
typename S,
typename T,
typename PromotedType,
bool ConvertibleToLiteral>
85 struct promote_scalar_arg_unsupported<S,T,PromotedType,ConvertibleToLiteral,false> {};
88 template<
typename S,
typename T>
89 struct promote_scalar_arg_unsupported<S,T,S,false,true> {};
92 class no_assignment_operator
95 no_assignment_operator& operator=(
const no_assignment_operator&);
97 EIGEN_DEFAULT_COPY_CONSTRUCTOR(no_assignment_operator)
98 EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(no_assignment_operator)
102 template<
typename I1,
typename I2>
103 struct promote_index_type
105 typedef std::conditional_t<(
sizeof(I1)<
sizeof(I2)), I2, I1> type;
112 template<
typename T,
int Value>
class variable_if_dynamic
115 EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(variable_if_dynamic)
116 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
explicit variable_if_dynamic(T v) { EIGEN_ONLY_USED_FOR_DEBUG(v); eigen_assert(v == T(Value)); }
117 EIGEN_DEVICE_FUNC
static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
118 T value() {
return T(Value); }
119 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
120 operator T()
const {
return T(Value); }
121 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
122 void setValue(T v)
const { EIGEN_ONLY_USED_FOR_DEBUG(v); eigen_assert(v == T(Value)); }
125 template<
typename T>
class variable_if_dynamic<T,
Dynamic>
129 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
explicit variable_if_dynamic(T value = 0) EIGEN_NO_THROW : m_value(value) {}
130 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T value()
const {
return m_value; }
131 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
operator T()
const {
return m_value; }
132 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void setValue(T value) { m_value = value; }
137 template<
typename T,
int Value>
class variable_if_dynamicindex
140 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
explicit variable_if_dynamicindex(T v) { EIGEN_ONLY_USED_FOR_DEBUG(v); eigen_assert(v == T(Value)); }
141 EIGEN_DEVICE_FUNC
static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
142 T value() {
return T(Value); }
143 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
147 template<
typename T>
class variable_if_dynamicindex<T,
DynamicIndex>
150 EIGEN_DEVICE_FUNC variable_if_dynamicindex() { eigen_assert(
false); }
152 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
explicit variable_if_dynamicindex(T value) : m_value(value) {}
153 EIGEN_DEVICE_FUNC T EIGEN_STRONG_INLINE value()
const {
return m_value; }
154 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void setValue(T value) { m_value = value; }
157 template<
typename T>
struct functor_traits
162 PacketAccess =
false,
167 template<
typename T>
struct packet_traits;
169 template<
typename T>
struct unpacket_traits;
171 template<
int Size,
typename PacketType,
172 bool Stop = Size==
Dynamic || (Size%unpacket_traits<PacketType>::size)==0 || is_same<PacketType,
typename unpacket_traits<PacketType>::half>::value>
173 struct find_best_packet_helper;
175 template<
int Size,
typename PacketType>
176 struct find_best_packet_helper<Size,PacketType,true>
178 typedef PacketType type;
181 template<
int Size,
typename PacketType>
182 struct find_best_packet_helper<Size,PacketType,false>
184 typedef typename find_best_packet_helper<Size,typename unpacket_traits<PacketType>::half>::type type;
187 template<
typename T,
int Size>
188 struct find_best_packet
190 typedef typename find_best_packet_helper<Size,typename packet_traits<T>::type>::type type;
193 #if EIGEN_MAX_STATIC_ALIGN_BYTES>0
194 constexpr
inline int compute_default_alignment_helper(
int ArrayBytes,
int AlignmentBytes) {
195 if((ArrayBytes % AlignmentBytes) == 0) {
196 return AlignmentBytes;
197 }
else if (EIGEN_MIN_ALIGN_BYTES<AlignmentBytes) {
198 return compute_default_alignment_helper(ArrayBytes, AlignmentBytes/2);
206 constexpr
inline int compute_default_alignment_helper(
int ArrayBytes,
int AlignmentBytes) {
207 EIGEN_UNUSED_VARIABLE(ArrayBytes);
208 EIGEN_UNUSED_VARIABLE(AlignmentBytes);
213 template<
typename T,
int Size>
struct compute_default_alignment {
214 enum { value = compute_default_alignment_helper(Size*
sizeof(T), EIGEN_MAX_STATIC_ALIGN_BYTES) };
217 template<
typename T>
struct compute_default_alignment<T,
Dynamic> {
218 enum { value = EIGEN_MAX_ALIGN_BYTES };
221 template<
typename Scalar_,
int Rows_,
int Cols_,
225 : EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION ),
226 int MaxRows_ = Rows_,
228 >
class make_proper_matrix_type
231 IsColVector = Cols_==1 && Rows_!=1,
232 IsRowVector = Rows_==1 && Cols_!=1,
238 typedef Matrix<Scalar_, Rows_, Cols_, Options, MaxRows_, MaxCols_> type;
241 constexpr
inline unsigned compute_matrix_flags(
int Options) {
249 constexpr
inline int size_at_compile_time(
int rows,
int cols) {
253 template<
typename XprType>
struct size_of_xpr_at_compile_time
255 enum { ret = size_at_compile_time(traits<XprType>::RowsAtCompileTime, traits<XprType>::ColsAtCompileTime) };
262 template<typename T, typename StorageKind = typename traits<T>::StorageKind>
struct plain_matrix_type;
263 template<
typename T,
typename BaseClassType,
int Flags>
struct plain_matrix_type_dense;
264 template<
typename T>
struct plain_matrix_type<T,Dense>
266 typedef typename plain_matrix_type_dense<T,typename traits<T>::XprKind, traits<T>::Flags>::type type;
268 template<
typename T>
struct plain_matrix_type<T,DiagonalShape>
270 typedef typename T::PlainObject type;
273 template<
typename T,
int Flags>
struct plain_matrix_type_dense<T,MatrixXpr,Flags>
275 typedef Matrix<typename traits<T>::Scalar,
276 traits<T>::RowsAtCompileTime,
277 traits<T>::ColsAtCompileTime,
279 traits<T>::MaxRowsAtCompileTime,
280 traits<T>::MaxColsAtCompileTime
284 template<
typename T,
int Flags>
struct plain_matrix_type_dense<T,ArrayXpr,Flags>
286 typedef Array<typename traits<T>::Scalar,
287 traits<T>::RowsAtCompileTime,
288 traits<T>::ColsAtCompileTime,
290 traits<T>::MaxRowsAtCompileTime,
291 traits<T>::MaxColsAtCompileTime
299 template<typename T, typename StorageKind = typename traits<T>::StorageKind>
struct eval;
301 template<
typename T>
struct eval<T,Dense>
303 typedef typename plain_matrix_type<T>::type type;
314 template<
typename T>
struct eval<T,DiagonalShape>
316 typedef typename plain_matrix_type<T>::type type;
320 template<
typename Scalar_,
int Rows_,
int Cols_,
int Options_,
int MaxRows_,
int MaxCols_>
321 struct eval<Matrix<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_>, Dense>
323 typedef const Matrix<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_>& type;
326 template<
typename Scalar_,
int Rows_,
int Cols_,
int Options_,
int MaxRows_,
int MaxCols_>
327 struct eval<Array<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_>, Dense>
329 typedef const Array<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_>& type;
334 template<typename T, typename StorageKind = typename traits<T>::StorageKind>
struct plain_object_eval;
337 struct plain_object_eval<T,Dense>
339 typedef typename plain_matrix_type_dense<T,typename traits<T>::XprKind, evaluator<T>::Flags>::type type;
345 template<
typename T>
struct plain_matrix_type_column_major
347 enum { Rows = traits<T>::RowsAtCompileTime,
348 Cols = traits<T>::ColsAtCompileTime,
349 MaxRows = traits<T>::MaxRowsAtCompileTime,
350 MaxCols = traits<T>::MaxColsAtCompileTime
352 typedef Matrix<typename traits<T>::Scalar,
363 template<
typename T>
struct plain_matrix_type_row_major
365 enum { Rows = traits<T>::RowsAtCompileTime,
366 Cols = traits<T>::ColsAtCompileTime,
367 MaxRows = traits<T>::MaxRowsAtCompileTime,
368 MaxCols = traits<T>::MaxColsAtCompileTime
370 typedef Matrix<typename traits<T>::Scalar,
382 template <
typename T>
385 typedef std::conditional_t<
386 bool(traits<T>::Flags & NestByRefBit),
391 typedef std::conditional_t<
392 bool(traits<T>::Flags & NestByRefBit),
399 template<
typename T1,
typename T2>
400 struct transfer_constness
402 typedef std::conditional_t<
403 bool(internal::is_const<T1>::value),
404 add_const_on_value_type_t<T2>,
424 template<typename T, int n, typename PlainObject = typename plain_object_eval<T>::type>
struct nested_eval
427 ScalarReadCost = NumTraits<typename traits<T>::Scalar>::ReadCost,
428 CoeffReadCost = evaluator<T>::CoeffReadCost,
434 CostEval = (NAsInteger+1) * ScalarReadCost + CoeffReadCost,
435 CostNoEval = NAsInteger * CoeffReadCost,
436 Evaluate = (
int(evaluator<T>::Flags) &
EvalBeforeNestingBit) || (
int(CostEval) < int(CostNoEval))
439 typedef std::conditional_t<Evaluate, PlainObject, typename ref_selector<T>::type> type;
444 inline T* const_cast_ptr(
const T* ptr)
446 return const_cast<T*
>(ptr);
449 template<typename Derived, typename XprKind = typename traits<Derived>::XprKind>
450 struct dense_xpr_base
455 template<
typename Derived>
456 struct dense_xpr_base<Derived, MatrixXpr>
458 typedef MatrixBase<Derived> type;
461 template<
typename Derived>
462 struct dense_xpr_base<Derived, ArrayXpr>
464 typedef ArrayBase<Derived> type;
467 template<typename Derived, typename XprKind = typename traits<Derived>::XprKind,
typename StorageKind =
typename traits<Derived>::StorageKind>
468 struct generic_xpr_base;
470 template<
typename Derived,
typename XprKind>
471 struct generic_xpr_base<Derived, XprKind, Dense>
473 typedef typename dense_xpr_base<Derived,XprKind>::type type;
476 template<
typename XprType,
typename CastType>
struct cast_return_type
478 typedef typename XprType::Scalar CurrentScalarType;
479 typedef remove_all_t<CastType> CastType_;
480 typedef typename CastType_::Scalar NewScalarType;
481 typedef std::conditional_t<is_same<CurrentScalarType,NewScalarType>::value,
482 const XprType&,CastType> type;
485 template <
typename A,
typename B>
struct promote_storage_type;
487 template <
typename A>
struct promote_storage_type<A,A>
491 template <
typename A>
struct promote_storage_type<A, const A>
495 template <
typename A>
struct promote_storage_type<const A, A>
513 template <
typename A,
typename B,
typename Functor>
struct cwise_promote_storage_type;
515 template <
typename A,
typename Functor>
struct cwise_promote_storage_type<A,A,Functor> {
typedef A ret; };
516 template <
typename Functor>
struct cwise_promote_storage_type<Dense,Dense,Functor> {
typedef Dense ret; };
517 template <
typename A,
typename Functor>
struct cwise_promote_storage_type<A,Dense,Functor> {
typedef Dense ret; };
518 template <
typename B,
typename Functor>
struct cwise_promote_storage_type<Dense,B,Functor> {
typedef Dense ret; };
519 template <
typename Functor>
struct cwise_promote_storage_type<Sparse,Dense,Functor> {
typedef Sparse ret; };
520 template <
typename Functor>
struct cwise_promote_storage_type<Dense,Sparse,Functor> {
typedef Sparse ret; };
522 template <
typename LhsKind,
typename RhsKind,
int LhsOrder,
int RhsOrder>
struct cwise_promote_storage_order {
523 enum { value = LhsOrder };
526 template <
typename LhsKind,
int LhsOrder,
int RhsOrder>
struct cwise_promote_storage_order<LhsKind,Sparse,LhsOrder,RhsOrder> {
enum { value = RhsOrder }; };
527 template <
typename RhsKind,
int LhsOrder,
int RhsOrder>
struct cwise_promote_storage_order<Sparse,RhsKind,LhsOrder,RhsOrder> {
enum { value = LhsOrder }; };
528 template <
int Order>
struct cwise_promote_storage_order<Sparse,Sparse,Order,Order> {
enum { value = Order }; };
545 template <
typename A,
typename B,
int ProductTag>
struct product_promote_storage_type;
547 template <
typename A,
int ProductTag>
struct product_promote_storage_type<A, A, ProductTag> {
typedef A ret;};
548 template <
int ProductTag>
struct product_promote_storage_type<Dense, Dense, ProductTag> {
typedef Dense ret;};
549 template <
typename A,
int ProductTag>
struct product_promote_storage_type<A, Dense, ProductTag> {
typedef Dense ret; };
550 template <
typename B,
int ProductTag>
struct product_promote_storage_type<Dense, B, ProductTag> {
typedef Dense ret; };
552 template <
typename A,
int ProductTag>
struct product_promote_storage_type<A, DiagonalShape, ProductTag> {
typedef A ret; };
553 template <
typename B,
int ProductTag>
struct product_promote_storage_type<DiagonalShape, B, ProductTag> {
typedef B ret; };
554 template <
int ProductTag>
struct product_promote_storage_type<Dense, DiagonalShape, ProductTag> {
typedef Dense ret; };
555 template <
int ProductTag>
struct product_promote_storage_type<DiagonalShape, Dense, ProductTag> {
typedef Dense ret; };
557 template <
typename A,
int ProductTag>
struct product_promote_storage_type<A, PermutationStorage, ProductTag> {
typedef A ret; };
558 template <
typename B,
int ProductTag>
struct product_promote_storage_type<PermutationStorage, B, ProductTag> {
typedef B ret; };
559 template <
int ProductTag>
struct product_promote_storage_type<Dense, PermutationStorage, ProductTag> {
typedef Dense ret; };
560 template <
int ProductTag>
struct product_promote_storage_type<PermutationStorage, Dense, ProductTag> {
typedef Dense ret; };
565 template<
typename ExpressionType,
typename Scalar =
typename ExpressionType::Scalar>
566 struct plain_row_type
568 typedef Matrix<Scalar, 1, ExpressionType::ColsAtCompileTime,
569 int(ExpressionType::PlainObject::Options) | int(
RowMajor), 1, ExpressionType::MaxColsAtCompileTime> MatrixRowType;
570 typedef Array<Scalar, 1, ExpressionType::ColsAtCompileTime,
571 int(ExpressionType::PlainObject::Options) | int(
RowMajor), 1, ExpressionType::MaxColsAtCompileTime> ArrayRowType;
573 typedef std::conditional_t<
574 is_same< typename traits<ExpressionType>::XprKind, MatrixXpr >::value,
580 template<
typename ExpressionType,
typename Scalar =
typename ExpressionType::Scalar>
581 struct plain_col_type
583 typedef Matrix<Scalar, ExpressionType::RowsAtCompileTime, 1,
584 ExpressionType::PlainObject::Options & ~
RowMajor, ExpressionType::MaxRowsAtCompileTime, 1> MatrixColType;
585 typedef Array<Scalar, ExpressionType::RowsAtCompileTime, 1,
586 ExpressionType::PlainObject::Options & ~
RowMajor, ExpressionType::MaxRowsAtCompileTime, 1> ArrayColType;
588 typedef std::conditional_t<
589 is_same< typename traits<ExpressionType>::XprKind, MatrixXpr >::value,
595 template<
typename ExpressionType,
typename Scalar =
typename ExpressionType::Scalar>
596 struct plain_diag_type
598 enum { diag_size = internal::min_size_prefer_dynamic(ExpressionType::RowsAtCompileTime, ExpressionType::ColsAtCompileTime),
599 max_diag_size = min_size_prefer_fixed(ExpressionType::MaxRowsAtCompileTime,
600 ExpressionType::MaxColsAtCompileTime)
602 typedef Matrix<Scalar, diag_size, 1, ExpressionType::PlainObject::Options & ~RowMajor, max_diag_size, 1> MatrixDiagType;
603 typedef Array<Scalar, diag_size, 1, ExpressionType::PlainObject::Options & ~RowMajor, max_diag_size, 1> ArrayDiagType;
605 typedef std::conditional_t<
606 is_same< typename traits<ExpressionType>::XprKind, MatrixXpr >::value,
612 template<
typename Expr,
typename Scalar =
typename Expr::Scalar>
613 struct plain_constant_type
618 Options, traits<Expr>::MaxRowsAtCompileTime,traits<Expr>::MaxColsAtCompileTime> array_type;
621 Options, traits<Expr>::MaxRowsAtCompileTime,traits<Expr>::MaxColsAtCompileTime> matrix_type;
623 typedef CwiseNullaryOp<scalar_constant_op<Scalar>,
const std::conditional_t<is_same< typename traits<Expr>::XprKind, MatrixXpr >::value, matrix_type, array_type> > type;
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 }; };
646 template<
typename T>
struct is_identity
647 {
enum { value =
false }; };
649 template<
typename T>
struct is_identity<CwiseNullaryOp<internal::scalar_identity_op<typename T::Scalar>, T> >
650 {
enum { value =
true }; };
653 template<
typename S1,
typename S2>
struct glue_shapes;
654 template<>
struct glue_shapes<DenseShape,TriangularShape> {
typedef TriangularShape type; };
656 template<
typename T1,
typename T2>
657 struct possibly_same_dense {
658 enum { value = has_direct_access<T1>::ret && has_direct_access<T2>::ret && is_same<typename T1::Scalar,typename T2::Scalar>::value };
661 template<
typename T1,
typename T2>
663 bool is_same_dense(
const T1 &mat1,
const T2 &mat2, std::enable_if_t<possibly_same_dense<T1,T2>::value> * = 0)
665 return (mat1.data()==mat2.data()) && (mat1.innerStride()==mat2.innerStride()) && (mat1.outerStride()==mat2.outerStride());
668 template<
typename T1,
typename T2>
670 bool is_same_dense(
const T1 &,
const T2 &, std::enable_if_t<!possibly_same_dense<T1,T2>::value> * = 0)
677 template<
typename T,
bool Vectorized=false,
typename EnableIf =
void>
678 struct scalar_div_cost {
679 enum { value = 8*NumTraits<T>::MulCost };
682 template<
typename T,
bool Vectorized>
683 struct scalar_div_cost<std::complex<T>, Vectorized> {
684 enum { value = 2*scalar_div_cost<T>::value
685 + 6*NumTraits<T>::MulCost
686 + 3*NumTraits<T>::AddCost
691 template<
bool Vectorized>
692 struct scalar_div_cost<signed long,Vectorized, std::conditional_t<sizeof(long)==8,void,false_type>> {
enum { value = 24 }; };
693 template<
bool Vectorized>
694 struct scalar_div_cost<unsigned long,Vectorized, std::conditional_t<sizeof(long)==8,void,false_type>> {
enum { value = 21 }; };
697 #ifdef EIGEN_DEBUG_ASSIGN
698 std::string demangle_traversal(
int t)
700 if(t==DefaultTraversal)
return "DefaultTraversal";
701 if(t==LinearTraversal)
return "LinearTraversal";
702 if(t==InnerVectorizedTraversal)
return "InnerVectorizedTraversal";
703 if(t==LinearVectorizedTraversal)
return "LinearVectorizedTraversal";
704 if(t==SliceVectorizedTraversal)
return "SliceVectorizedTraversal";
707 std::string demangle_unrolling(
int t)
709 if(t==NoUnrolling)
return "NoUnrolling";
710 if(t==InnerUnrolling)
return "InnerUnrolling";
711 if(t==CompleteUnrolling)
return "CompleteUnrolling";
714 std::string demangle_flags(
int f)
722 if(f&NestByRefBit) res +=
" | NestByRef";
768 template<
typename ScalarA,
typename ScalarB,
typename BinaryOp=
internal::scalar_product_op<ScalarA,ScalarB> >
770 #ifndef EIGEN_PARSED_BY_DOXYGEN
772 : internal::scalar_product_traits<ScalarA,ScalarB>
776 template<
typename T,
typename BinaryOp>
779 typedef T ReturnType;
782 template <
typename T,
typename BinaryOp>
783 struct ScalarBinaryOpTraits<T, typename NumTraits<std::enable_if_t<NumTraits<T>::IsComplex,T>>::Real, BinaryOp>
785 typedef T ReturnType;
787 template <
typename T,
typename BinaryOp>
788 struct ScalarBinaryOpTraits<typename NumTraits<std::enable_if_t<NumTraits<T>::IsComplex,T>>::Real, T, BinaryOp>
790 typedef T ReturnType;
794 template<
typename T,
typename BinaryOp>
795 struct ScalarBinaryOpTraits<T,void,BinaryOp>
797 typedef T ReturnType;
801 template<
typename T,
typename BinaryOp>
802 struct ScalarBinaryOpTraits<void,T,BinaryOp>
804 typedef T ReturnType;
808 template<
typename BinaryOp>
809 struct ScalarBinaryOpTraits<void,void,BinaryOp>
811 typedef void ReturnType;
818 #define EIGEN_CHECK_BINARY_COMPATIBILIY(BINOP,LHS,RHS) \
819 EIGEN_STATIC_ASSERT((Eigen::internal::has_ReturnType<ScalarBinaryOpTraits<LHS, RHS,BINOP> >::value), \
820 YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
@ RowsAtCompileTime
Definition: DenseBase.h:95
@ ColMajor
Definition: Constants.h:321
@ RowMajor
Definition: Constants.h:323
@ AutoAlign
Definition: Constants.h:325
const unsigned int PacketAccessBit
Definition: Constants.h:96
const unsigned int NoPreferredStorageOrderBit
Definition: Constants.h:180
const unsigned int LinearAccessBit
Definition: Constants.h:132
const unsigned int EvalBeforeNestingBit
Definition: Constants.h:72
const unsigned int DirectAccessBit
Definition: Constants.h:157
const unsigned int LvalueBit
Definition: Constants.h:146
const unsigned int RowMajorBit
Definition: Constants.h:68
Namespace containing all symbols from the Eigen library.
Definition: Core:139
const int HugeCost
Definition: Constants.h:46
const int DynamicIndex
Definition: Constants.h:29
const int Dynamic
Definition: Constants.h:24
Determines whether the given binary operation of two numeric types is allowed and what the scalar ret...
Definition: XprHelper.h:774