22 #ifndef _BLAZE_MATH_EXPRESSIONS_DMATSMATSUBEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_DMATSMATSUBEXPR_H_
71 template<
typename MT1
80 typedef typename MT1::ResultType
RT1;
81 typedef typename MT2::ResultType
RT2;
82 typedef typename MT1::ReturnType
RN1;
83 typedef typename MT2::ReturnType
RN2;
122 enum { vectorizable = 0 };
170 return lhs_.columns();
200 template<
typename T >
203 (
rhs_.canAlias( alias ) );
213 template<
typename T >
215 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
237 template<
typename MT
269 template<
typename MT
287 const TmpType tmp( rhs );
305 template<
typename MT
336 template<
typename MT
411 template<
typename T1
414 inline const DMatSMatSubExpr<T1,T2,SO>
420 throw std::invalid_argument(
"Matrix sizes do not match" );
448 template<
typename T1
453 inline const typename AddExprTrait< DMatSMatSubExpr<T1,T2,SO1>, T3 >::Type
454 operator+(
const DMatSMatSubExpr<T1,T2,SO1>& lhs,
const DenseMatrix<T3,SO2>& rhs )
458 return ( lhs.leftOperand() + (~rhs) ) - lhs.rightOperand();
477 template<
typename T1
482 inline const typename SubExprTrait< DMatSMatSubExpr<T1,T2,SO1>, T3 >::Type
483 operator-(
const DMatSMatSubExpr<T1,T2,SO1>& lhs,
const DenseMatrix<T3,SO2>& rhs )
487 return ( lhs.leftOperand() - (~rhs) ) - lhs.rightOperand();
503 template<
typename MT1,
typename MT2,
typename MT3 >
504 struct DMatDMatAddExprTrait< DMatSMatSubExpr<MT1,MT2,false>, MT3 >
509 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
510 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
511 IsDenseMatrix<MT3>::value && IsRowMajorMatrix<MT3>::value
512 ,
typename DMatSMatSubExprTrait< typename DMatDMatAddExprTrait<MT1,MT3>::Type, MT2 >::Type
513 , INVALID_TYPE >::Type Type;
523 template<
typename MT1,
typename MT2,
typename MT3 >
524 struct DMatTDMatAddExprTrait< DMatSMatSubExpr<MT1,MT2,false>, MT3 >
529 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
530 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
531 IsDenseMatrix<MT3>::value && IsColumnMajorMatrix<MT3>::value
532 ,
typename DMatSMatSubExprTrait< typename DMatTDMatAddExprTrait<MT1,MT3>::Type, MT2 >::Type
533 , INVALID_TYPE >::Type Type;
543 template<
typename MT1,
typename MT2,
typename MT3 >
544 struct TDMatDMatAddExprTrait< DMatSMatSubExpr<MT1,MT2,true>, MT3 >
549 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
550 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
551 IsDenseMatrix<MT3>::value && IsRowMajorMatrix<MT3>::value
552 ,
typename DMatTSMatSubExprTrait< typename TDMatDMatAddExprTrait<MT1,MT3>::Type, MT2 >::Type
553 , INVALID_TYPE >::Type Type;
563 template<
typename MT1,
typename MT2,
typename MT3 >
564 struct TDMatTDMatAddExprTrait< DMatSMatSubExpr<MT1,MT2,true>, MT3 >
569 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
570 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
571 IsDenseMatrix<MT3>::value && IsColumnMajorMatrix<MT3>::value
572 ,
typename TDMatTSMatSubExprTrait< typename TDMatTDMatAddExprTrait<MT1,MT3>::Type, MT2 >::Type
573 , INVALID_TYPE >::Type Type;
583 template<
typename MT1,
typename MT2,
typename MT3 >
584 struct DMatDMatSubExprTrait< DMatSMatSubExpr<MT1,MT2,false>, MT3 >
589 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
590 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
591 IsDenseMatrix<MT3>::value && IsRowMajorMatrix<MT3>::value
592 ,
typename DMatSMatSubExprTrait< typename DMatDMatSubExprTrait<MT1,MT3>::Type, MT2 >::Type
593 , INVALID_TYPE >::Type Type;
603 template<
typename MT1,
typename MT2,
typename MT3 >
604 struct DMatTDMatSubExprTrait< DMatSMatSubExpr<MT1,MT2,false>, MT3 >
609 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
610 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
611 IsDenseMatrix<MT3>::value && IsColumnMajorMatrix<MT3>::value
612 ,
typename DMatSMatSubExprTrait< typename DMatTDMatSubExprTrait<MT1,MT3>::Type, MT2 >::Type
613 , INVALID_TYPE >::Type Type;
623 template<
typename MT1,
typename MT2,
typename MT3 >
624 struct TDMatDMatSubExprTrait< DMatSMatSubExpr<MT1,MT2,true>, MT3 >
629 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
630 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
631 IsDenseMatrix<MT3>::value && IsRowMajorMatrix<MT3>::value
632 ,
typename DMatTSMatSubExprTrait< typename TDMatDMatSubExprTrait<MT1,MT3>::Type, MT2 >::Type
633 , INVALID_TYPE >::Type Type;
643 template<
typename MT1,
typename MT2,
typename MT3 >
644 struct TDMatTDMatSubExprTrait< DMatSMatSubExpr<MT1,MT2,true>, MT3 >
649 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
650 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
651 IsDenseMatrix<MT3>::value && IsColumnMajorMatrix<MT3>::value
652 ,
typename TDMatTSMatSubExprTrait< typename TDMatTDMatSubExprTrait<MT1,MT3>::Type, MT2 >::Type
653 , INVALID_TYPE >::Type Type;
663 template<
typename MT1,
typename MT2,
bool SO >
664 struct RowExprTrait< DMatSMatSubExpr<MT1,MT2,SO> >
668 typedef typename SubExprTrait< typename RowExprTrait<const MT1>::Type
669 ,
typename RowExprTrait<const MT2>::Type >::Type Type;
678 template<
typename MT1,
typename MT2,
bool SO >
679 struct ColumnExprTrait< DMatSMatSubExpr<MT1,MT2,SO> >
683 typedef typename SubExprTrait< typename ColumnExprTrait<const MT1>::Type
684 ,
typename ColumnExprTrait<const MT2>::Type >::Type Type;