| 68 | */ |
| 69 | template<typename _Left, typename _Right, typename _BinaryFunctor> |
| 70 | class BinaryOp : public CwiseOp<BinaryOp<_Left, _Right, _BinaryFunctor> > |
| 71 | { |
| 72 | public: |
| 73 | typedef CwiseOp<BinaryOp<_Left, _Right, _BinaryFunctor> > Base; |
| 74 | typedef BinaryOp<_Left, _Right, _BinaryFunctor> Type; |
| 75 | CUMAT_PUBLIC_API |
| 76 | |
| 77 | using LeftScalar = typename internal::traits<_Left>::Scalar; |
| 78 | using RightScalar = typename internal::traits<_Right>::Scalar; |
| 79 | enum |
| 80 | { |
| 81 | BroadcastRowsLeft = (internal::traits<_Left>::RowsAtCompileTime == 1), |
| 82 | BroadcastColsLeft = (internal::traits<_Left>::ColsAtCompileTime == 1), |
| 83 | BroadcastBatchesLeft = (internal::traits<_Left>::BatchesAtCompileTime == 1), |
| 84 | |
| 85 | BroadcastRowsRight = (internal::traits<_Right>::RowsAtCompileTime == 1), |
| 86 | BroadcastColsRight = (internal::traits<_Right>::ColsAtCompileTime == 1), |
| 87 | BroadcastBatchesRight = (internal::traits<_Right>::BatchesAtCompileTime == 1), |
| 88 | |
| 89 | FlagsLeft = internal::traits<_Left>::Flags, |
| 90 | RowsLeft = internal::traits<_Left>::RowsAtCompileTime, |
| 91 | ColumnsLeft = internal::traits<_Left>::ColsAtCompileTime, |
| 92 | BatchesLeft = internal::traits<_Left>::BatchesAtCompileTime, |
| 93 | |
| 94 | FlagsRight = internal::traits<_Right>::Flags, |
| 95 | RowsRight = internal::traits<_Right>::RowsAtCompileTime, |
| 96 | ColumnsRight = internal::traits<_Right>::ColsAtCompileTime, |
| 97 | BatchesRight = internal::traits<_Right>::BatchesAtCompileTime, |
| 98 | |
| 99 | //Flags, Rows, Columns, Batches defined in CUMAT_PUBLIC_API |
| 100 | }; |
| 101 | |
| 102 | protected: |
| 103 | typedef typename MatrixReadWrapper<_Left, AccessFlags::ReadCwise>::type left_wrapped_t; |
| 104 | typedef typename MatrixReadWrapper<_Right, AccessFlags::ReadCwise>::type right_wrapped_t; |
| 105 | const left_wrapped_t left_; |
| 106 | const right_wrapped_t right_; |
| 107 | const _BinaryFunctor functor_; |
| 108 | |
| 109 | public: |
| 110 | BinaryOp(const MatrixBase<_Left>& left, const MatrixBase<_Right>& right, |
| 111 | const _BinaryFunctor& functor = _BinaryFunctor()) |
| 112 | : left_(left.derived()), right_(right.derived()), functor_(functor) |
| 113 | { |
| 114 | CUMAT_STATIC_ASSERT((std::is_same<typename internal::traits<_Left>::Scalar, typename internal::traits<_Right>::Scalar>::value), |
| 115 | "No implicit casting is allowed in binary operations."); |
| 116 | |
| 117 | if (RowsLeft == Dynamic && RowsRight == Dynamic) { |
| 118 | CUMAT_ASSERT_ARGUMENT(left.rows() == right.rows()); |
| 119 | } |
| 120 | CUMAT_STATIC_ASSERT(!(RowsLeft > 1 && RowsRight > 1) || (RowsLeft == RowsRight), "matrix sizes don't match"); |
| 121 | |
| 122 | if (ColumnsLeft == Dynamic && ColumnsRight == Dynamic) { |
| 123 | CUMAT_ASSERT_ARGUMENT(left.cols() == right.cols()); |
| 124 | } |
| 125 | CUMAT_STATIC_ASSERT(!(ColumnsLeft > 1 && ColumnsRight > 1) || (ColumnsLeft == ColumnsRight), "matrix sizes don't match"); |
| 126 | |
| 127 | if (BatchesLeft == Dynamic && BatchesRight == Dynamic) { |
nothing calls this directly
no outgoing calls
no test coverage detected