11#ifndef BEMBEL_SRC_H2MATRIX_EIGENHELPER_H2CWISEBINARYOP_HPP_
12#define BEMBEL_SRC_H2MATRIX_EIGENHELPER_H2CWISEBINARYOP_HPP_
18template <
typename BinaryOp,
typename Lhs,
typename Rhs>
19class CwiseBinaryOpImpl<BinaryOp, Lhs, Rhs,
H2>
20 :
public H2MatrixBase<CwiseBinaryOp<BinaryOp, Lhs, Rhs>> {
22 typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> Derived;
24 EIGEN_GENERIC_PUBLIC_INTERFACE(Derived)
28 typename internal::traits<Lhs>::StorageKind,
29 typename internal::traits<Rhs>::StorageKind>::value) ||
30 ((internal::evaluator<Lhs>::Flags & RowMajorBit) ==
31 (internal::evaluator<Rhs>::Flags & RowMajorBit))),
32 THE_STORAGE_ORDER_OF_BOTH_SIDES_MUST_MATCH);
39template <
typename BinaryOp,
typename Lhs,
typename Rhs>
40struct is_ref_compatible<CwiseBinaryOp<BinaryOp, Lhs, Rhs>> {
41 enum { value =
false };
43template <
typename BinaryOp,
typename Lhs,
typename Rhs>
44struct is_ref_compatible<const CwiseBinaryOp<BinaryOp, Lhs, Rhs>>
45 : is_ref_compatible<CwiseBinaryOp<BinaryOp, Lhs, Rhs>> {};
48template <
typename BinaryOp,
typename Lhs,
typename Rhs>
49struct binary_evaluator<CwiseBinaryOp<BinaryOp, Lhs, Rhs>,
H2,
H2>
50 : evaluator_base<CwiseBinaryOp<BinaryOp, Lhs, Rhs>> {
52 typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> XprType;
53 typedef typename traits<XprType>::Scalar Scalar;
54 typedef typename XprType::StorageIndex StorageIndex;
58 CoeffReadCost = HugeCost,
59 Flags = (XprType::Flags & ~RowMajorBit) | (
int(Rhs::Flags) & RowMajorBit)
62 explicit binary_evaluator(
const XprType& xpr)
63 : m_functor(xpr.functor()),
67 EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
71 const BinaryOp m_functor;
72 evaluator<Lhs> m_lhsImpl;
73 evaluator<Rhs> m_rhsImpl;
74 const XprType& m_expr;
77template <
typename BinaryOp,
typename Lhs,
typename Rhs>
78struct binary_evaluator<CwiseBinaryOp<BinaryOp, Lhs, Rhs>, IndexBased,
H2>
79 : binary_evaluator<CwiseBinaryOp<BinaryOp, Lhs, Rhs>, H2, H2> {};
80template <
typename BinaryOp,
typename Lhs,
typename Rhs>
81struct binary_evaluator<CwiseBinaryOp<BinaryOp, Lhs, Rhs>,
H2, IndexBased>
82 : binary_evaluator<CwiseBinaryOp<BinaryOp, Lhs, Rhs>, H2, H2> {};
84template <
typename BinaryOp,
typename Lhs,
typename Rhs>
85struct binary_evaluator<CwiseBinaryOp<BinaryOp, Lhs, Rhs>, IteratorBased,
H2>
86 : binary_evaluator<CwiseBinaryOp<BinaryOp, Lhs, Rhs>, H2, H2> {};
87template <
typename BinaryOp,
typename Lhs,
typename Rhs>
88struct binary_evaluator<CwiseBinaryOp<BinaryOp, Lhs, Rhs>,
H2, IteratorBased>
89 : binary_evaluator<CwiseBinaryOp<BinaryOp, Lhs, Rhs>, H2, H2> {};
97template <
typename DenseDerived,
typename H2Derived>
98EIGEN_STRONG_INLINE
const
99 CwiseBinaryOp<internal::scalar_sum_op<
typename DenseDerived::Scalar,
100 typename H2Derived::Scalar>,
101 const DenseDerived,
const H2Derived>
102 operator+(
const MatrixBase<DenseDerived>& a,
104 return CwiseBinaryOp<internal::scalar_sum_op<
typename DenseDerived::Scalar,
105 typename H2Derived::Scalar>,
106 const DenseDerived,
const H2Derived>(a.derived(),
110template <
typename H2Derived,
typename DenseDerived>
111EIGEN_STRONG_INLINE
const
112 CwiseBinaryOp<internal::scalar_sum_op<
typename H2Derived::Scalar,
113 typename DenseDerived::Scalar>,
114 const H2Derived,
const DenseDerived>
115 operator+(
const H2MatrixBase<H2Derived>& a,
116 const MatrixBase<DenseDerived>& b) {
117 return CwiseBinaryOp<internal::scalar_sum_op<
typename H2Derived::Scalar,
118 typename DenseDerived::Scalar>,
119 const H2Derived,
const DenseDerived>(a.derived(),
123template <
typename SparseDerived,
typename H2Derived>
124EIGEN_STRONG_INLINE
const
125 CwiseBinaryOp<internal::scalar_sum_op<
typename SparseDerived::Scalar,
126 typename H2Derived::Scalar>,
127 const SparseDerived,
const H2Derived>
128 operator+(
const SparseMatrixBase<SparseDerived>& a,
129 const H2MatrixBase<H2Derived>& b) {
130 return CwiseBinaryOp<internal::scalar_sum_op<
typename SparseDerived::Scalar,
131 typename H2Derived::Scalar>,
132 const SparseDerived,
const H2Derived>(a.derived(),
136template <
typename H2Derived,
typename SparseDerived>
137EIGEN_STRONG_INLINE
const
138 CwiseBinaryOp<internal::scalar_sum_op<
typename H2Derived::Scalar,
139 typename SparseDerived::Scalar>,
140 const H2Derived,
const SparseDerived>
141 operator+(
const H2MatrixBase<H2Derived>& a,
142 const SparseMatrixBase<SparseDerived>& b) {
143 return CwiseBinaryOp<internal::scalar_sum_op<
typename H2Derived::Scalar,
144 typename SparseDerived::Scalar>,
145 const H2Derived,
const SparseDerived>(a.derived(),
149template <
typename DenseDerived,
typename H2Derived>
150EIGEN_STRONG_INLINE
const
151 CwiseBinaryOp<internal::scalar_difference_op<
typename DenseDerived::Scalar,
152 typename H2Derived::Scalar>,
153 const DenseDerived,
const H2Derived>
154 operator-(
const MatrixBase<DenseDerived>& a,
155 const H2MatrixBase<H2Derived>& b) {
156 return CwiseBinaryOp<
157 internal::scalar_difference_op<
typename DenseDerived::Scalar,
158 typename H2Derived::Scalar>,
159 const DenseDerived,
const H2Derived>(a.derived(), b.derived());
162template <
typename H2Derived,
typename DenseDerived>
163EIGEN_STRONG_INLINE
const
164 CwiseBinaryOp<internal::scalar_difference_op<
typename H2Derived::Scalar,
165 typename DenseDerived::Scalar>,
166 const H2Derived,
const DenseDerived>
167 operator-(
const H2MatrixBase<H2Derived>& a,
168 const MatrixBase<DenseDerived>& b) {
169 return CwiseBinaryOp<
170 internal::scalar_difference_op<
typename H2Derived::Scalar,
171 typename DenseDerived::Scalar>,
172 const H2Derived,
const DenseDerived>(a.derived(), b.derived());
175template <
typename SparseDerived,
typename H2Derived>
176EIGEN_STRONG_INLINE
const
177 CwiseBinaryOp<internal::scalar_difference_op<
typename SparseDerived::Scalar,
178 typename H2Derived::Scalar>,
179 const SparseDerived,
const H2Derived>
180 operator-(
const SparseMatrixBase<SparseDerived>& a,
181 const H2MatrixBase<H2Derived>& b) {
182 return CwiseBinaryOp<
183 internal::scalar_difference_op<
typename SparseDerived::Scalar,
184 typename H2Derived::Scalar>,
185 const SparseDerived,
const H2Derived>(a.derived(), b.derived());
188template <
typename H2Derived,
typename SparseDerived>
189EIGEN_STRONG_INLINE
const CwiseBinaryOp<
190 internal::scalar_difference_op<
typename H2Derived::Scalar,
191 typename SparseDerived::Scalar>,
192 const H2Derived,
const SparseDerived>
193operator-(
const H2MatrixBase<H2Derived>& a,
194 const SparseMatrixBase<SparseDerived>& b) {
195 return CwiseBinaryOp<
196 internal::scalar_difference_op<
typename H2Derived::Scalar,
197 typename SparseDerived::Scalar>,
198 const H2Derived,
const SparseDerived>(a.derived(), b.derived());