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();
513 template<
typename MT1
516 inline typename RowExprTrait< DMatSMatSubExpr<MT1,MT2,SO> >::Type
517 row(
const DMatSMatSubExpr<MT1,MT2,SO>& dm,
size_t index )
521 return row( dm.leftOperand(), index ) -
row( dm.rightOperand(), index );
539 template<
typename MT1
542 inline typename ColumnExprTrait< DMatSMatSubExpr<MT1,MT2,SO> >::Type
543 column(
const DMatSMatSubExpr<MT1,MT2,SO>& dm,
size_t index )
547 return column( dm.leftOperand(), index ) -
column( dm.rightOperand(), index );
563 template<
typename MT1,
typename MT2,
typename MT3 >
564 struct DMatDMatAddExprTrait< DMatSMatSubExpr<MT1,MT2,false>, MT3 >
569 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
570 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
571 IsDenseMatrix<MT3>::value && IsRowMajorMatrix<MT3>::value
572 ,
typename DMatSMatSubExprTrait< typename DMatDMatAddExprTrait<MT1,MT3>::Type, MT2 >::Type
573 , INVALID_TYPE >::Type Type;
583 template<
typename MT1,
typename MT2,
typename MT3 >
584 struct DMatTDMatAddExprTrait< 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 && IsColumnMajorMatrix<MT3>::value
592 ,
typename DMatSMatSubExprTrait< typename DMatTDMatAddExprTrait<MT1,MT3>::Type, MT2 >::Type
593 , INVALID_TYPE >::Type Type;
603 template<
typename MT1,
typename MT2,
typename MT3 >
604 struct TDMatDMatAddExprTrait< DMatSMatSubExpr<MT1,MT2,true>, MT3 >
609 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
610 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
611 IsDenseMatrix<MT3>::value && IsRowMajorMatrix<MT3>::value
612 ,
typename DMatTSMatSubExprTrait< typename TDMatDMatAddExprTrait<MT1,MT3>::Type, MT2 >::Type
613 , INVALID_TYPE >::Type Type;
623 template<
typename MT1,
typename MT2,
typename MT3 >
624 struct TDMatTDMatAddExprTrait< 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 && IsColumnMajorMatrix<MT3>::value
632 ,
typename TDMatTSMatSubExprTrait< typename TDMatTDMatAddExprTrait<MT1,MT3>::Type, MT2 >::Type
633 , INVALID_TYPE >::Type Type;
643 template<
typename MT1,
typename MT2,
typename MT3 >
644 struct DMatDMatSubExprTrait< DMatSMatSubExpr<MT1,MT2,false>, MT3 >
649 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
650 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
651 IsDenseMatrix<MT3>::value && IsRowMajorMatrix<MT3>::value
652 ,
typename DMatSMatSubExprTrait< typename DMatDMatSubExprTrait<MT1,MT3>::Type, MT2 >::Type
653 , INVALID_TYPE >::Type Type;
663 template<
typename MT1,
typename MT2,
typename MT3 >
664 struct DMatTDMatSubExprTrait< DMatSMatSubExpr<MT1,MT2,false>, MT3 >
669 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
670 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
671 IsDenseMatrix<MT3>::value && IsColumnMajorMatrix<MT3>::value
672 ,
typename DMatSMatSubExprTrait< typename DMatTDMatSubExprTrait<MT1,MT3>::Type, MT2 >::Type
673 , INVALID_TYPE >::Type Type;
683 template<
typename MT1,
typename MT2,
typename MT3 >
684 struct TDMatDMatSubExprTrait< DMatSMatSubExpr<MT1,MT2,true>, MT3 >
689 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
690 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
691 IsDenseMatrix<MT3>::value && IsRowMajorMatrix<MT3>::value
692 ,
typename DMatTSMatSubExprTrait< typename TDMatDMatSubExprTrait<MT1,MT3>::Type, MT2 >::Type
693 , INVALID_TYPE >::Type Type;
703 template<
typename MT1,
typename MT2,
typename MT3 >
704 struct TDMatTDMatSubExprTrait< DMatSMatSubExpr<MT1,MT2,true>, MT3 >
709 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
710 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
711 IsDenseMatrix<MT3>::value && IsColumnMajorMatrix<MT3>::value
712 ,
typename TDMatTSMatSubExprTrait< typename TDMatTDMatSubExprTrait<MT1,MT3>::Type, MT2 >::Type
713 , INVALID_TYPE >::Type Type;
723 template<
typename MT1,
typename MT2,
bool SO >
724 struct RowExprTrait< DMatSMatSubExpr<MT1,MT2,SO> >
728 typedef typename SubExprTrait< typename RowExprTrait<const MT1>::Type
729 ,
typename RowExprTrait<const MT2>::Type >::Type Type;
738 template<
typename MT1,
typename MT2,
bool SO >
739 struct ColumnExprTrait< DMatSMatSubExpr<MT1,MT2,SO> >
743 typedef typename SubExprTrait< typename ColumnExprTrait<const MT1>::Type
744 ,
typename ColumnExprTrait<const MT2>::Type >::Type Type;