11#ifndef EIGEN_XPRHELPER_H
12#define EIGEN_XPRHELPER_H
15#include "../InternalHeaderCheck.h"
22template <
typename IndexType>
23EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
typename make_unsigned<IndexType>::type returnUnsignedIndexValue(
24 const IndexType& idx) {
25 EIGEN_STATIC_ASSERT((NumTraits<IndexType>::IsInteger), THIS FUNCTION IS FOR INTEGER TYPES)
26 eigen_internal_assert(idx >= 0 &&
"Index value is negative and target type is unsigned");
27 using UnsignedType =
typename make_unsigned<IndexType>::type;
28 return static_cast<UnsignedType
>(idx);
31template <typename IndexDest, typename IndexSrc, bool IndexDestIsInteger = NumTraits<IndexDest>::IsInteger,
32 bool IndexDestIsSigned = NumTraits<IndexDest>::IsSigned,
33 bool IndexSrcIsInteger = NumTraits<IndexSrc>::IsInteger,
34 bool IndexSrcIsSigned = NumTraits<IndexSrc>::IsSigned>
35struct convert_index_impl {
36 static inline EIGEN_DEVICE_FUNC IndexDest run(
const IndexSrc& idx) {
37 eigen_internal_assert(idx <= NumTraits<IndexDest>::highest() &&
"Index value is too big for target type");
38 return static_cast<IndexDest
>(idx);
41template <
typename IndexDest,
typename IndexSrc>
42struct convert_index_impl<IndexDest, IndexSrc, true, true, true, false> {
45 static inline EIGEN_DEVICE_FUNC IndexDest run(
const IndexSrc& idx) {
46 eigen_internal_assert(idx <= returnUnsignedIndexValue(NumTraits<IndexDest>::highest()) &&
47 "Index value is too big for target type");
48 return static_cast<IndexDest
>(idx);
51template <
typename IndexDest,
typename IndexSrc>
52struct convert_index_impl<IndexDest, IndexSrc, true, false, true, true> {
55 static inline EIGEN_DEVICE_FUNC IndexDest run(
const IndexSrc& idx) {
56 eigen_internal_assert(returnUnsignedIndexValue(idx) <= NumTraits<IndexDest>::highest() &&
57 "Index value is too big for target type");
58 return static_cast<IndexDest
>(idx);
62template <
typename IndexDest,
typename IndexSrc>
63EIGEN_DEVICE_FUNC
inline IndexDest convert_index(
const IndexSrc& idx) {
64 return convert_index_impl<IndexDest, IndexSrc>::run(idx);
69struct is_valid_index_type {
70 enum { value = internal::is_integral<T>::value || std::is_enum<T>::value };
74template <
typename RowIndices,
typename ColIndices>
75struct valid_indexed_view_overload {
77 value = !(internal::is_valid_index_type<RowIndices>::value && internal::is_valid_index_type<ColIndices>::value)
95template <
typename ExprScalar,
typename T,
bool IsSupported>
96struct promote_scalar_arg;
98template <
typename S,
typename T>
99struct promote_scalar_arg<S, T, true> {
104template <
typename ExprScalar,
typename T,
typename PromotedType,
105 bool ConvertibleToLiteral = internal::is_convertible<T, PromotedType>::value,
106 bool IsSafe = NumTraits<T>::IsInteger || !NumTraits<PromotedType>::IsInteger>
107struct promote_scalar_arg_unsupported;
110template <
typename S,
typename T>
111struct promote_scalar_arg<S, T, false> : promote_scalar_arg_unsupported<S, T, typename NumTraits<S>::Literal> {};
114template <
typename S,
typename T,
typename PromotedType>
115struct promote_scalar_arg_unsupported<S, T, PromotedType, true, true> {
116 typedef PromotedType type;
121template <
typename ExprScalar,
typename T,
typename PromotedType>
122struct promote_scalar_arg_unsupported<ExprScalar, T, PromotedType, false, true>
123 : promote_scalar_arg_unsupported<ExprScalar, T, ExprScalar> {};
126template <
typename S,
typename T,
typename PromotedType,
bool ConvertibleToLiteral>
127struct promote_scalar_arg_unsupported<S, T, PromotedType, ConvertibleToLiteral, false> {};
130template <
typename S,
typename T>
131struct promote_scalar_arg_unsupported<S, T, S, false, true> {};
134class no_assignment_operator {
136 no_assignment_operator& operator=(
const no_assignment_operator&);
139 EIGEN_DEFAULT_COPY_CONSTRUCTOR(no_assignment_operator)
140 EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(no_assignment_operator)
144template <
typename I1,
typename I2>
145struct promote_index_type {
146 typedef std::conditional_t<(
sizeof(I1) <
sizeof(I2)), I2, I1> type;
153template <
typename T,
int Value>
154class variable_if_dynamic {
156 EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(variable_if_dynamic)
157 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
explicit variable_if_dynamic(T v) {
158 EIGEN_ONLY_USED_FOR_DEBUG(v);
159 eigen_assert(v == T(Value));
161 EIGEN_DEVICE_FUNC
static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR T value() {
return T(Value); }
162 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
operator T()
const {
return T(Value); }
163 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void setValue(T v)
const {
164 EIGEN_ONLY_USED_FOR_DEBUG(v);
165 eigen_assert(v == T(Value));
170class variable_if_dynamic<T,
Dynamic> {
174 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
explicit variable_if_dynamic(T value = 0) EIGEN_NO_THROW : m_value(value) {}
175 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T value()
const {
return m_value; }
176 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
operator T()
const {
return m_value; }
177 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void setValue(T value) { m_value = value; }
182template <
typename T,
int Value>
183class variable_if_dynamicindex {
185 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
explicit variable_if_dynamicindex(T v) {
186 EIGEN_ONLY_USED_FOR_DEBUG(v);
187 eigen_assert(v == T(Value));
189 EIGEN_DEVICE_FUNC
static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR T value() {
return T(Value); }
190 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void setValue(T) {}
196 EIGEN_DEVICE_FUNC variable_if_dynamicindex() { eigen_assert(
false); }
199 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
explicit variable_if_dynamicindex(T value) : m_value(value) {}
200 EIGEN_DEVICE_FUNC T EIGEN_STRONG_INLINE value()
const {
return m_value; }
201 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void setValue(T value) { m_value = value; }
205struct functor_traits {
206 enum { Cost = 10, PacketAccess =
false, IsRepeatable =
false };
210template <
typename Xpr>
211struct nested_functor_cost {
212 static constexpr Index Cost =
static_cast<Index
>(functor_traits<Xpr>::Cost);
215template <
typename Scalar,
int Rows,
int Cols,
int Options,
int MaxRows,
int MaxCols>
216struct nested_functor_cost<Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols>> {
217 static constexpr Index Cost = 1;
220template <
typename Scalar,
int Rows,
int Cols,
int Options,
int MaxRows,
int MaxCols>
221struct nested_functor_cost<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols>> {
222 static constexpr Index Cost = 1;
226template <
typename PlainObjectType,
int MapOptions,
typename Str
ideType>
227struct nested_functor_cost<Map<PlainObjectType, MapOptions, StrideType>> : nested_functor_cost<PlainObjectType> {};
229template <
typename Func,
typename Xpr>
230struct nested_functor_cost<CwiseUnaryOp<Func, Xpr>> {
231 using XprCleaned = remove_all_t<Xpr>;
232 using FuncCleaned = remove_all_t<Func>;
233 static constexpr Index Cost = nested_functor_cost<FuncCleaned>::Cost + nested_functor_cost<XprCleaned>::Cost;
236template <
typename Func,
typename Xpr>
237struct nested_functor_cost<CwiseNullaryOp<Func, Xpr>> {
238 using XprCleaned = remove_all_t<Xpr>;
239 using FuncCleaned = remove_all_t<Func>;
240 static constexpr Index Cost = nested_functor_cost<FuncCleaned>::Cost + nested_functor_cost<XprCleaned>::Cost;
243template <
typename Func,
typename LhsXpr,
typename RhsXpr>
244struct nested_functor_cost<CwiseBinaryOp<Func, LhsXpr, RhsXpr>> {
245 using LhsXprCleaned = remove_all_t<LhsXpr>;
246 using RhsXprCleaned = remove_all_t<RhsXpr>;
247 using FuncCleaned = remove_all_t<Func>;
248 static constexpr Index Cost = nested_functor_cost<FuncCleaned>::Cost + nested_functor_cost<LhsXprCleaned>::Cost +
249 nested_functor_cost<RhsXprCleaned>::Cost;
252template <
typename Func,
typename LhsXpr,
typename M
idXpr,
typename RhsXpr>
253struct nested_functor_cost<CwiseTernaryOp<Func, LhsXpr, MidXpr, RhsXpr>> {
254 using LhsXprCleaned = remove_all_t<LhsXpr>;
255 using MidXprCleaned = remove_all_t<MidXpr>;
256 using RhsXprCleaned = remove_all_t<RhsXpr>;
257 using FuncCleaned = remove_all_t<Func>;
258 static constexpr Index Cost = nested_functor_cost<FuncCleaned>::Cost + nested_functor_cost<LhsXprCleaned>::Cost +
259 nested_functor_cost<MidXprCleaned>::Cost + nested_functor_cost<RhsXprCleaned>::Cost;
262template <
typename Xpr>
264 static constexpr Index Cost = plain_enum_max(nested_functor_cost<Xpr>::Cost, 1);
271struct unpacket_traits;
273template <
int Size,
typename PacketType,
274 bool Stop = Size ==
Dynamic || (Size % unpacket_traits<PacketType>::size) == 0 ||
275 is_same<PacketType,
typename unpacket_traits<PacketType>::half>::value>
276struct find_best_packet_helper;
278template <
int Size,
typename PacketType>
279struct find_best_packet_helper<Size, PacketType, true> {
280 typedef PacketType type;
283template <
int Size,
typename PacketType>
284struct find_best_packet_helper<Size, PacketType, false> {
285 typedef typename find_best_packet_helper<Size, typename unpacket_traits<PacketType>::half>::type type;
288template <
typename T,
int Size>
289struct find_best_packet {
290 typedef typename find_best_packet_helper<Size, typename packet_traits<T>::type>::type type;
293template <
int Size,
typename PacketType,
294 bool Stop = (Size == unpacket_traits<PacketType>::size) ||
295 is_same<PacketType,
typename unpacket_traits<PacketType>::half>::value>
296struct find_packet_by_size_helper;
297template <
int Size,
typename PacketType>
298struct find_packet_by_size_helper<Size, PacketType, true> {
299 using type = PacketType;
301template <
int Size,
typename PacketType>
302struct find_packet_by_size_helper<Size, PacketType, false> {
303 using type =
typename find_packet_by_size_helper<Size, typename unpacket_traits<PacketType>::half>::type;
306template <
typename T,
int Size>
307struct find_packet_by_size {
308 using type =
typename find_packet_by_size_helper<Size, typename packet_traits<T>::type>::type;
309 static constexpr bool value = (Size == unpacket_traits<type>::size);
312struct find_packet_by_size<T, 1> {
313 using type =
typename unpacket_traits<T>::type;
314 static constexpr bool value = (unpacket_traits<type>::size == 1);
317#if EIGEN_MAX_STATIC_ALIGN_BYTES > 0
318constexpr inline int compute_default_alignment_helper(
int ArrayBytes,
int AlignmentBytes) {
319 if ((ArrayBytes % AlignmentBytes) == 0) {
320 return AlignmentBytes;
321 }
else if (EIGEN_MIN_ALIGN_BYTES < AlignmentBytes) {
322 return compute_default_alignment_helper(ArrayBytes, AlignmentBytes / 2);
330constexpr inline int compute_default_alignment_helper(
int ArrayBytes,
int AlignmentBytes) {
331 EIGEN_UNUSED_VARIABLE(ArrayBytes);
332 EIGEN_UNUSED_VARIABLE(AlignmentBytes);
337template <
typename T,
int Size>
338struct compute_default_alignment {
339 enum { value = compute_default_alignment_helper(Size *
sizeof(T), EIGEN_MAX_STATIC_ALIGN_BYTES) };
343struct compute_default_alignment<T,
Dynamic> {
344 enum { value = EIGEN_MAX_ALIGN_BYTES };
347template <
typename Scalar_,
int Rows_,
int Cols_,
349 : (Cols_ == 1 && Rows_ != 1) ?
ColMajor
350 : EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION),
351 int MaxRows_ = Rows_, int MaxCols_ = Cols_>
352class make_proper_matrix_type {
354 IsColVector = Cols_ == 1 && Rows_ != 1,
355 IsRowVector = Rows_ == 1 && Cols_ != 1,
362 typedef Matrix<Scalar_, Rows_, Cols_, Options, MaxRows_, MaxCols_> type;
365constexpr inline unsigned compute_matrix_flags(
int Options) {
373constexpr inline int size_at_compile_time(
int rows,
int cols) {
374 if (rows == 0 || cols == 0)
return 0;
375 if (rows == Dynamic || cols == Dynamic)
return Dynamic;
379template <
typename XprType>
380struct size_of_xpr_at_compile_time {
381 enum { ret = size_at_compile_time(traits<XprType>::RowsAtCompileTime, traits<XprType>::ColsAtCompileTime) };
388template <typename T, typename StorageKind = typename traits<T>::StorageKind>
389struct plain_matrix_type;
390template <
typename T,
typename BaseClassType,
int Flags>
391struct plain_matrix_type_dense;
393struct plain_matrix_type<T, Dense> {
394 typedef typename plain_matrix_type_dense<T, typename traits<T>::XprKind, traits<T>::Flags>::type type;
397struct plain_matrix_type<T, DiagonalShape> {
398 typedef typename T::PlainObject type;
402struct plain_matrix_type<T, SkewSymmetricShape> {
403 typedef typename T::PlainObject type;
406template <
typename T,
int Flags>
407struct plain_matrix_type_dense<T, MatrixXpr, Flags> {
408 typedef Matrix<typename traits<T>::Scalar, traits<T>::RowsAtCompileTime, traits<T>::ColsAtCompileTime,
410 traits<T>::MaxColsAtCompileTime>
414template <
typename T,
int Flags>
415struct plain_matrix_type_dense<T, ArrayXpr, Flags> {
416 typedef Array<typename traits<T>::Scalar, traits<T>::RowsAtCompileTime, traits<T>::ColsAtCompileTime,
418 traits<T>::MaxColsAtCompileTime>
426template <typename T, typename StorageKind = typename traits<T>::StorageKind>
430struct eval<T, Dense> {
431 typedef typename plain_matrix_type<T>::type type;
443struct eval<T, DiagonalShape> {
444 typedef typename plain_matrix_type<T>::type type;
448struct eval<T, SkewSymmetricShape> {
449 typedef typename plain_matrix_type<T>::type type;
453template <
typename Scalar_,
int Rows_,
int Cols_,
int Options_,
int MaxRows_,
int MaxCols_>
454struct eval<Matrix<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_>, Dense> {
455 typedef const Matrix<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_>& type;
458template <
typename Scalar_,
int Rows_,
int Cols_,
int Options_,
int MaxRows_,
int MaxCols_>
459struct eval<Array<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_>, Dense> {
460 typedef const Array<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_>& type;
464template <typename T, typename StorageKind = typename traits<T>::StorageKind>
465struct plain_object_eval;
468struct plain_object_eval<T, Dense> {
469 typedef typename plain_matrix_type_dense<T, typename traits<T>::XprKind, evaluator<T>::Flags>::type type;
475struct plain_matrix_type_column_major {
477 Rows = traits<T>::RowsAtCompileTime,
478 Cols = traits<T>::ColsAtCompileTime,
479 MaxRows = traits<T>::MaxRowsAtCompileTime,
480 MaxCols = traits<T>::MaxColsAtCompileTime
482 typedef Matrix<typename traits<T>::Scalar, Rows, Cols, (MaxRows == 1 && MaxCols != 1) ? RowMajor :
ColMajor, MaxRows,
490struct plain_matrix_type_row_major {
492 Rows = traits<T>::RowsAtCompileTime,
493 Cols = traits<T>::ColsAtCompileTime,
494 MaxRows = traits<T>::MaxRowsAtCompileTime,
495 MaxCols = traits<T>::MaxColsAtCompileTime
497 typedef Matrix<typename traits<T>::Scalar, Rows, Cols, (MaxCols == 1 && MaxRows != 1) ? ColMajor :
RowMajor, MaxRows,
507 typedef std::conditional_t<bool(traits<T>::Flags& NestByRefBit), T
const&,
const T> type;
509 typedef std::conditional_t<bool(traits<T>::Flags& NestByRefBit), T&, T> non_const_type;
513template <
typename T1,
typename T2>
514struct transfer_constness {
515 typedef std::conditional_t<bool(internal::is_const<T1>::value), add_const_on_value_type_t<T2>, T2> type;
532template <typename T, int n, typename PlainObject = typename plain_object_eval<T>::type>
535 ScalarReadCost = NumTraits<typename traits<T>::Scalar>::ReadCost,
537 evaluator<T>::CoeffReadCost,
544 CostEval = (NAsInteger + 1) * ScalarReadCost + CoeffReadCost,
545 CostNoEval =
int(NAsInteger) * int(CoeffReadCost),
546 Evaluate = (int(evaluator<T>::Flags) &
EvalBeforeNestingBit) || (
int(CostEval) < int(CostNoEval))
549 typedef std::conditional_t<Evaluate, PlainObject, typename ref_selector<T>::type> type;
553EIGEN_DEVICE_FUNC
inline T* const_cast_ptr(
const T* ptr) {
554 return const_cast<T*
>(ptr);
557template <typename Derived, typename XprKind = typename traits<Derived>::XprKind>
558struct dense_xpr_base {
563template <
typename Derived>
564struct dense_xpr_base<Derived, MatrixXpr> {
565 typedef MatrixBase<Derived> type;
568template <
typename Derived>
569struct dense_xpr_base<Derived, ArrayXpr> {
570 typedef ArrayBase<Derived> type;
573template <typename Derived, typename XprKind = typename traits<Derived>::XprKind,
574 typename StorageKind =
typename traits<Derived>::StorageKind>
575struct generic_xpr_base;
577template <
typename Derived,
typename XprKind>
578struct generic_xpr_base<Derived, XprKind, Dense> {
579 typedef typename dense_xpr_base<Derived, XprKind>::type type;
582template <
typename XprType,
typename CastType>
583struct cast_return_type {
584 typedef typename XprType::Scalar CurrentScalarType;
585 typedef remove_all_t<CastType> CastType_;
586 typedef typename CastType_::Scalar NewScalarType;
587 typedef std::conditional_t<is_same<CurrentScalarType, NewScalarType>::value,
const XprType&, CastType> type;
590template <
typename A,
typename B>
591struct promote_storage_type;
594struct promote_storage_type<A, A> {
598struct promote_storage_type<A, const A> {
602struct promote_storage_type<const A, A> {
619template <
typename A,
typename B,
typename Functor>
620struct cwise_promote_storage_type;
622template <
typename A,
typename Functor>
623struct cwise_promote_storage_type<A, A, Functor> {
626template <
typename Functor>
627struct cwise_promote_storage_type<Dense, Dense, Functor> {
630template <
typename A,
typename Functor>
631struct cwise_promote_storage_type<A, Dense, Functor> {
634template <
typename B,
typename Functor>
635struct cwise_promote_storage_type<Dense, B, Functor> {
638template <
typename Functor>
639struct cwise_promote_storage_type<Sparse, Dense, Functor> {
642template <
typename Functor>
643struct cwise_promote_storage_type<Dense, Sparse, Functor> {
647template <
typename LhsKind,
typename RhsKind,
int LhsOrder,
int RhsOrder>
648struct cwise_promote_storage_order {
649 enum { value = LhsOrder };
652template <
typename LhsKind,
int LhsOrder,
int RhsOrder>
653struct cwise_promote_storage_order<LhsKind, Sparse, LhsOrder, RhsOrder> {
654 enum { value = RhsOrder };
656template <
typename RhsKind,
int LhsOrder,
int RhsOrder>
657struct cwise_promote_storage_order<Sparse, RhsKind, LhsOrder, RhsOrder> {
658 enum { value = LhsOrder };
661struct cwise_promote_storage_order<Sparse, Sparse, Order, Order> {
662 enum { value = Order };
679template <
typename A,
typename B,
int ProductTag>
680struct product_promote_storage_type;
682template <
typename A,
int ProductTag>
683struct product_promote_storage_type<A, A, ProductTag> {
686template <
int ProductTag>
687struct product_promote_storage_type<Dense, Dense, ProductTag> {
690template <
typename A,
int ProductTag>
691struct product_promote_storage_type<A, Dense, ProductTag> {
694template <
typename B,
int ProductTag>
695struct product_promote_storage_type<Dense, B, ProductTag> {
699template <
typename A,
int ProductTag>
700struct product_promote_storage_type<A, DiagonalShape, ProductTag> {
703template <
typename B,
int ProductTag>
704struct product_promote_storage_type<DiagonalShape, B, ProductTag> {
707template <
int ProductTag>
708struct product_promote_storage_type<Dense, DiagonalShape, ProductTag> {
711template <
int ProductTag>
712struct product_promote_storage_type<DiagonalShape, Dense, ProductTag> {
716template <
typename A,
int ProductTag>
717struct product_promote_storage_type<A, SkewSymmetricShape, ProductTag> {
720template <
typename B,
int ProductTag>
721struct product_promote_storage_type<SkewSymmetricShape, B, ProductTag> {
724template <
int ProductTag>
725struct product_promote_storage_type<Dense, SkewSymmetricShape, ProductTag> {
728template <
int ProductTag>
729struct product_promote_storage_type<SkewSymmetricShape, Dense, ProductTag> {
732template <
int ProductTag>
733struct product_promote_storage_type<SkewSymmetricShape, SkewSymmetricShape, ProductTag> {
737template <
typename A,
int ProductTag>
738struct product_promote_storage_type<A, PermutationStorage, ProductTag> {
741template <
typename B,
int ProductTag>
742struct product_promote_storage_type<PermutationStorage, B, ProductTag> {
745template <
int ProductTag>
746struct product_promote_storage_type<Dense, PermutationStorage, ProductTag> {
749template <
int ProductTag>
750struct product_promote_storage_type<PermutationStorage, Dense, ProductTag> {
757template <
typename ExpressionType,
typename Scalar =
typename ExpressionType::Scalar>
758struct plain_row_type {
759 typedef Matrix<Scalar, 1, ExpressionType::ColsAtCompileTime,
760 int(ExpressionType::PlainObject::Options) | int(RowMajor), 1, ExpressionType::MaxColsAtCompileTime>
762 typedef Array<Scalar, 1, ExpressionType::ColsAtCompileTime, int(ExpressionType::PlainObject::Options) | int(RowMajor),
763 1, ExpressionType::MaxColsAtCompileTime>
766 typedef std::conditional_t<is_same<typename traits<ExpressionType>::XprKind, MatrixXpr>::value, MatrixRowType,
771template <
typename ExpressionType,
typename Scalar =
typename ExpressionType::Scalar>
772struct plain_col_type {
773 typedef Matrix<Scalar, ExpressionType::RowsAtCompileTime, 1, ExpressionType::PlainObject::Options & ~RowMajor,
774 ExpressionType::MaxRowsAtCompileTime, 1>
776 typedef Array<Scalar, ExpressionType::RowsAtCompileTime, 1, ExpressionType::PlainObject::Options & ~RowMajor,
777 ExpressionType::MaxRowsAtCompileTime, 1>
780 typedef std::conditional_t<is_same<typename traits<ExpressionType>::XprKind, MatrixXpr>::value, MatrixColType,
785template <
typename ExpressionType,
typename Scalar =
typename ExpressionType::Scalar>
786struct plain_diag_type {
788 diag_size = internal::min_size_prefer_dynamic(ExpressionType::RowsAtCompileTime, ExpressionType::ColsAtCompileTime),
789 max_diag_size = min_size_prefer_fixed(ExpressionType::MaxRowsAtCompileTime, ExpressionType::MaxColsAtCompileTime)
791 typedef Matrix<Scalar, diag_size, 1, ExpressionType::PlainObject::Options & ~RowMajor, max_diag_size, 1>
793 typedef Array<Scalar, diag_size, 1, ExpressionType::PlainObject::Options & ~RowMajor, max_diag_size, 1> ArrayDiagType;
795 typedef std::conditional_t<is_same<typename traits<ExpressionType>::XprKind, MatrixXpr>::value, MatrixDiagType,
800template <
typename Expr,
typename Scalar =
typename Expr::Scalar>
801struct plain_constant_type {
802 enum { Options = (traits<Expr>::Flags &
RowMajorBit) ? RowMajor : 0 };
804 typedef Array<Scalar, traits<Expr>::RowsAtCompileTime, traits<Expr>::ColsAtCompileTime, Options,
805 traits<Expr>::MaxRowsAtCompileTime, traits<Expr>::MaxColsAtCompileTime>
808 typedef Matrix<Scalar, traits<Expr>::RowsAtCompileTime, traits<Expr>::ColsAtCompileTime, Options,
809 traits<Expr>::MaxRowsAtCompileTime, traits<Expr>::MaxColsAtCompileTime>
812 typedef CwiseNullaryOp<
813 scalar_constant_op<Scalar>,
814 const std::conditional_t<is_same<typename traits<Expr>::XprKind, MatrixXpr>::value, matrix_type, array_type>>
818template <
typename ExpressionType>
820 enum { value = (!bool(is_const<ExpressionType>::value)) &&
bool(traits<ExpressionType>::Flags & LvalueBit) };
825 enum { ret =
false };
829struct is_diagonal<DiagonalBase<T>> {
834struct is_diagonal<DiagonalWrapper<T>> {
838template <
typename T,
int S>
839struct is_diagonal<DiagonalMatrix<T, S>> {
845 enum { value =
false };
849struct is_identity<CwiseNullaryOp<internal::scalar_identity_op<typename T::Scalar>, T>> {
850 enum { value =
true };
853template <
typename S1,
typename S2>
856struct glue_shapes<DenseShape, TriangularShape> {
857 typedef TriangularShape type;
860template <
typename T1,
typename T2>
861struct possibly_same_dense {
863 value = has_direct_access<T1>::ret && has_direct_access<T2>::ret &&
864 is_same<typename T1::Scalar, typename T2::Scalar>::value
868template <
typename T1,
typename T2>
869EIGEN_DEVICE_FUNC
bool is_same_dense(
const T1& mat1,
const T2& mat2,
870 std::enable_if_t<possibly_same_dense<T1, T2>::value>* = 0) {
871 return (mat1.data() == mat2.data()) && (mat1.innerStride() == mat2.innerStride()) &&
872 (mat1.outerStride() == mat2.outerStride());
875template <
typename T1,
typename T2>
876EIGEN_DEVICE_FUNC
bool is_same_dense(
const T1&,
const T2&, std::enable_if_t<!possibly_same_dense<T1, T2>::value>* = 0) {
882template <
typename T,
bool Vectorized = false,
typename EnableIf =
void>
883struct scalar_div_cost {
884 enum { value = 8 * NumTraits<T>::MulCost };
887template <
typename T,
bool Vectorized>
888struct scalar_div_cost<std::complex<T>, Vectorized> {
889 enum { value = 2 * scalar_div_cost<T>::value + 6 * NumTraits<T>::MulCost + 3 * NumTraits<T>::AddCost };
892template <
bool Vectorized>
893struct scalar_div_cost<signed long, Vectorized, std::conditional_t<sizeof(long) == 8, void, false_type>> {
896template <
bool Vectorized>
897struct scalar_div_cost<unsigned long, Vectorized, std::conditional_t<sizeof(long) == 8, void, false_type>> {
901#ifdef EIGEN_DEBUG_ASSIGN
902std::string demangle_traversal(
int t) {
903 if (t == DefaultTraversal)
return "DefaultTraversal";
904 if (t == LinearTraversal)
return "LinearTraversal";
905 if (t == InnerVectorizedTraversal)
return "InnerVectorizedTraversal";
906 if (t == LinearVectorizedTraversal)
return "LinearVectorizedTraversal";
907 if (t == SliceVectorizedTraversal)
return "SliceVectorizedTraversal";
910std::string demangle_unrolling(
int t) {
911 if (t == NoUnrolling)
return "NoUnrolling";
912 if (t == InnerUnrolling)
return "InnerUnrolling";
913 if (t == CompleteUnrolling)
return "CompleteUnrolling";
916std::string demangle_flags(
int f) {
918 if (f & RowMajorBit) res +=
" | RowMajor";
919 if (f & PacketAccessBit) res +=
" | Packet";
920 if (f & LinearAccessBit) res +=
" | Linear";
921 if (f & LvalueBit) res +=
" | Lvalue";
922 if (f & DirectAccessBit) res +=
" | Direct";
923 if (f & NestByRefBit) res +=
" | NestByRef";
924 if (f & NoPreferredStorageOrderBit) res +=
" | NoPreferredStorageOrderBit";
930template <
typename XprType>
931struct is_block_xpr : std::false_type {};
933template <
typename XprType,
int BlockRows,
int BlockCols,
bool InnerPanel>
934struct is_block_xpr<Block<XprType, BlockRows, BlockCols, InnerPanel>> : std::true_type {};
936template <
typename XprType,
int BlockRows,
int BlockCols,
bool InnerPanel>
937struct is_block_xpr<const Block<XprType, BlockRows, BlockCols, InnerPanel>> : std::true_type {};
940template <
typename XprType>
941struct block_xpr_helper {
942 using BaseType = XprType;
946 static constexpr bool is_inner_panel(
bool inner_panel) {
return inner_panel; }
949 template <typename T = XprType, typename EnableIf = std::enable_if_t<!std::is_const<T>::value>>
950 static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BaseType& base(XprType& xpr) {
953 static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
const BaseType& base(
const XprType& xpr) {
return xpr; }
954 static constexpr EIGEN_ALWAYS_INLINE Index row(
const XprType& , Index r) {
return r; }
955 static constexpr EIGEN_ALWAYS_INLINE Index col(
const XprType& , Index c) {
return c; }
958template <
typename XprType,
int BlockRows,
int BlockCols,
bool InnerPanel>
959struct block_xpr_helper<Block<XprType, BlockRows, BlockCols, InnerPanel>> {
960 using BlockXprType = Block<XprType, BlockRows, BlockCols, InnerPanel>;
962 using NestedXprHelper = block_xpr_helper<XprType>;
963 using BaseType =
typename NestedXprHelper::BaseType;
967 static constexpr bool is_inner_panel(
bool inner_panel) {
return InnerPanel && inner_panel; }
970 template <typename T = XprType, typename EnableIf = std::enable_if_t<!std::is_const<T>::value>>
971 static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BaseType& base(BlockXprType& xpr) {
972 return NestedXprHelper::base(xpr.nestedExpression());
974 static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
const BaseType& base(
const BlockXprType& xpr) {
975 return NestedXprHelper::base(xpr.nestedExpression());
977 static constexpr EIGEN_ALWAYS_INLINE Index row(
const BlockXprType& xpr, Index r) {
978 return xpr.startRow() + NestedXprHelper::row(xpr.nestedExpression(), r);
980 static constexpr EIGEN_ALWAYS_INLINE Index col(
const BlockXprType& xpr, Index c) {
981 return xpr.startCol() + NestedXprHelper::col(xpr.nestedExpression(), c);
985template <
typename XprType,
int BlockRows,
int BlockCols,
bool InnerPanel>
986struct block_xpr_helper<const Block<XprType, BlockRows, BlockCols, InnerPanel>>
987 : block_xpr_helper<Block<XprType, BlockRows, BlockCols, InnerPanel>> {};
989template <
typename XprType>
990struct is_matrix_base_xpr : std::is_base_of<MatrixBase<remove_all_t<XprType>>, remove_all_t<XprType>> {};
992template <
typename XprType>
993struct is_permutation_base_xpr : std::is_base_of<PermutationBase<remove_all_t<XprType>>, remove_all_t<XprType>> {};
1037template <
typename ScalarA,
typename ScalarB,
typename BinaryOp =
internal::scalar_product_op<ScalarA, ScalarB>>
1039#ifndef EIGEN_PARSED_BY_DOXYGEN
1041 : internal::scalar_product_traits<ScalarA, ScalarB>
1046template <
typename T,
typename BinaryOp>
1048 typedef T ReturnType;
1051template <
typename T,
typename BinaryOp>
1052struct ScalarBinaryOpTraits<T, typename NumTraits<std::enable_if_t<NumTraits<T>::IsComplex, T>>::Real, BinaryOp> {
1053 typedef T ReturnType;
1055template <
typename T,
typename BinaryOp>
1056struct ScalarBinaryOpTraits<typename NumTraits<std::enable_if_t<NumTraits<T>::IsComplex, T>>::Real, T, BinaryOp> {
1057 typedef T ReturnType;
1061template <
typename T,
typename BinaryOp>
1062struct ScalarBinaryOpTraits<T, void, BinaryOp> {
1063 typedef T ReturnType;
1067template <
typename T,
typename BinaryOp>
1068struct ScalarBinaryOpTraits<void, T, BinaryOp> {
1069 typedef T ReturnType;
1073template <
typename BinaryOp>
1074struct ScalarBinaryOpTraits<void, void, BinaryOp> {
1075 typedef void ReturnType;
1082#define EIGEN_CHECK_BINARY_COMPATIBILIY(BINOP, LHS, RHS) \
1083 EIGEN_STATIC_ASSERT( \
1084 (Eigen::internal::has_ReturnType<ScalarBinaryOpTraits<LHS, RHS, BINOP>>::value), \
1085 YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
@ ColMajor
Definition Constants.h:318
@ RowMajor
Definition Constants.h:320
@ AutoAlign
Definition Constants.h:322
const unsigned int EvalBeforeNestingBit
Definition Constants.h:74
const unsigned int DirectAccessBit
Definition Constants.h:159
const unsigned int LvalueBit
Definition Constants.h:148
const unsigned int RowMajorBit
Definition Constants.h:70
Namespace containing all symbols from the Eigen library.
Definition Core:137
const int HugeCost
Definition Constants.h:48
const int DynamicIndex
Definition Constants.h:30
const int Dynamic
Definition Constants.h:25
Determines whether the given binary operation of two numeric types is allowed and what the scalar ret...
Definition XprHelper.h:1043