11 #ifndef EIGEN_CWISE_BINARY_OP_H
12 #define EIGEN_CWISE_BINARY_OP_H
37 template<
typename BinaryOp,
typename Lhs,
typename Rhs>
38 struct traits<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >
42 typedef typename remove_all<Lhs>::type Ancestor;
43 typedef typename traits<Ancestor>::XprKind XprKind;
45 RowsAtCompileTime = traits<Ancestor>::RowsAtCompileTime,
46 ColsAtCompileTime = traits<Ancestor>::ColsAtCompileTime,
47 MaxRowsAtCompileTime = traits<Ancestor>::MaxRowsAtCompileTime,
48 MaxColsAtCompileTime = traits<Ancestor>::MaxColsAtCompileTime
53 typedef typename result_of<
59 typedef typename promote_storage_type<typename traits<Lhs>::StorageKind,
60 typename traits<Rhs>::StorageKind>::ret StorageKind;
61 typedef typename promote_index_type<typename traits<Lhs>::Index,
62 typename traits<Rhs>::Index>::type Index;
63 typedef typename Lhs::Nested LhsNested;
64 typedef typename Rhs::Nested RhsNested;
65 typedef typename remove_reference<LhsNested>::type _LhsNested;
66 typedef typename remove_reference<RhsNested>::type _RhsNested;
68 LhsCoeffReadCost = _LhsNested::CoeffReadCost,
69 RhsCoeffReadCost = _RhsNested::CoeffReadCost,
70 LhsFlags = _LhsNested::Flags,
71 RhsFlags = _RhsNested::Flags,
72 SameType = is_same<typename _LhsNested::Scalar,typename _RhsNested::Scalar>::value,
74 Flags0 = (
int(LhsFlags) | int(RhsFlags)) & (
76 | (
int(LhsFlags) &
int(RhsFlags) &
79 | (functor_traits<BinaryOp>::PacketAccess && StorageOrdersAgree && SameType ?
PacketAccessBit : 0)
84 Cost0 = EIGEN_ADD_COST(LhsCoeffReadCost,RhsCoeffReadCost),
85 CoeffReadCost = EIGEN_ADD_COST(Cost0,functor_traits<BinaryOp>::Cost)
97 #define EIGEN_CHECK_BINARY_COMPATIBILIY(BINOP,LHS,RHS) \
98 EIGEN_STATIC_ASSERT((internal::functor_is_product_like<BINOP>::ret \
99 ? int(internal::scalar_product_traits<LHS, RHS>::Defined) \
100 : int(internal::is_same<LHS, RHS>::value)), \
101 YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
103 template<
typename BinaryOp,
typename Lhs,
typename Rhs,
typename StorageKind>
104 class CwiseBinaryOpImpl;
106 template<
typename BinaryOp,
typename Lhs,
typename Rhs>
108 public CwiseBinaryOpImpl<
110 typename internal::promote_storage_type<typename internal::traits<Lhs>::StorageKind,
111 typename internal::traits<Rhs>::StorageKind>::ret>
115 typedef typename CwiseBinaryOpImpl<
117 typename internal::promote_storage_type<typename internal::traits<Lhs>::StorageKind,
118 typename internal::traits<Rhs>::StorageKind>::ret>::Base Base;
121 typedef typename internal::nested<Lhs>::type LhsNested;
122 typedef typename internal::nested<Rhs>::type RhsNested;
123 typedef typename internal::remove_reference<LhsNested>::type _LhsNested;
124 typedef typename internal::remove_reference<RhsNested>::type _RhsNested;
126 EIGEN_STRONG_INLINE
CwiseBinaryOp(
const Lhs& aLhs,
const Rhs& aRhs,
const BinaryOp& func = BinaryOp())
127 : m_lhs(aLhs), m_rhs(aRhs), m_functor(func)
129 EIGEN_CHECK_BINARY_COMPATIBILIY(BinaryOp,
typename Lhs::Scalar,
typename Rhs::Scalar);
131 EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Lhs, Rhs)
132 eigen_assert(aLhs.rows() == aRhs.rows() && aLhs.cols() == aRhs.cols());
135 EIGEN_STRONG_INLINE Index rows()
const {
137 if (internal::traits<
typename internal::remove_all<LhsNested>::type>::RowsAtCompileTime==
Dynamic)
142 EIGEN_STRONG_INLINE Index cols()
const {
144 if (internal::traits<
typename internal::remove_all<LhsNested>::type>::ColsAtCompileTime==
Dynamic)
151 const _LhsNested&
lhs()
const {
return m_lhs; }
153 const _RhsNested&
rhs()
const {
return m_rhs; }
155 const BinaryOp&
functor()
const {
return m_functor; }
160 const BinaryOp m_functor;
163 template<
typename BinaryOp,
typename Lhs,
typename Rhs>
164 class CwiseBinaryOpImpl<BinaryOp, Lhs, Rhs, Dense>
165 :
public internal::dense_xpr_base<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >::type
167 typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> Derived;
170 typedef typename internal::dense_xpr_base<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >::type Base;
171 EIGEN_DENSE_PUBLIC_INTERFACE( Derived )
173 EIGEN_STRONG_INLINE const Scalar coeff(Index rowId, Index colId)
const
175 return derived().functor()(derived().lhs().coeff(rowId, colId),
176 derived().rhs().coeff(rowId, colId));
179 template<
int LoadMode>
180 EIGEN_STRONG_INLINE PacketScalar packet(Index rowId, Index colId)
const
182 return derived().functor().packetOp(derived().lhs().
template packet<LoadMode>(rowId, colId),
183 derived().rhs().
template packet<LoadMode>(rowId, colId));
186 EIGEN_STRONG_INLINE
const Scalar coeff(Index index)
const
188 return derived().functor()(derived().lhs().coeff(index),
189 derived().rhs().coeff(index));
192 template<
int LoadMode>
193 EIGEN_STRONG_INLINE PacketScalar packet(Index index)
const
195 return derived().functor().packetOp(derived().lhs().
template packet<LoadMode>(index),
196 derived().rhs().
template packet<LoadMode>(index));
204 template<
typename Derived>
205 template<
typename OtherDerived>
206 EIGEN_STRONG_INLINE Derived &
209 SelfCwiseBinaryOp<internal::scalar_difference_op<Scalar>, Derived, OtherDerived> tmp(derived());
210 tmp = other.derived();
218 template<
typename Derived>
219 template<
typename OtherDerived>
220 EIGEN_STRONG_INLINE Derived &
223 SelfCwiseBinaryOp<internal::scalar_sum_op<Scalar>, Derived, OtherDerived> tmp(derived());
224 tmp = other.derived();
230 #endif // EIGEN_CWISE_BINARY_OP_H
const _LhsNested & lhs() const
Definition: CwiseBinaryOp.h:151
const int Dynamic
Definition: Constants.h:21
const unsigned int PacketAccessBit
Definition: Constants.h:81
Generic expression where a coefficient-wise binary operator is applied to two expressions.
Definition: CwiseBinaryOp.h:107
const unsigned int LinearAccessBit
Definition: Constants.h:117
Derived & operator+=(const MatrixBase< OtherDerived > &other)
Definition: CwiseBinaryOp.h:221
const _RhsNested & rhs() const
Definition: CwiseBinaryOp.h:153
const BinaryOp & functor() const
Definition: CwiseBinaryOp.h:155
const unsigned int RowMajorBit
Definition: Constants.h:53
Derived & operator-=(const MatrixBase< OtherDerived > &other)
Definition: CwiseBinaryOp.h:207
const unsigned int AlignedBit
Definition: Constants.h:147
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:48