22 #ifndef _BLAZE_MATH_EXPRESSIONS_SMATDMATSUBEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_SMATDMATSUBEXPR_H_
71 template<
typename MT1
74 class SMatDMatSubExpr :
public DenseMatrix< SMatDMatSubExpr<MT1,MT2,SO>, SO >
75 ,
private MatMatSubExpr
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 >
202 return (
lhs_.canAlias( alias ) ) ||
213 template<
typename T >
215 return lhs_.isAliased( alias ) ||
rhs_.isAliased( alias );
237 template<
typename MT
246 assign ( ~lhs, -rhs.rhs_ );
264 template<
typename MT
282 const TmpType tmp( rhs );
300 template<
typename MT
331 template<
typename MT
406 template<
typename T1
409 inline const SMatDMatSubExpr<T1,T2,SO>
415 throw std::invalid_argument(
"Matrix sizes do not match" );
443 template<
typename T1
448 inline const typename AddExprTrait< SMatDMatSubExpr<T1,T2,SO1>, T3 >::Type
449 operator+(
const SMatDMatSubExpr<T1,T2,SO1>& lhs,
const DenseMatrix<T3,SO2>& rhs )
453 return ( (~rhs) - lhs.rightOperand() ) + lhs.leftOperand();
472 template<
typename T1
477 inline const typename SubExprTrait< SMatDMatSubExpr<T1,T2,SO1>, T3 >::Type
478 operator-(
const SMatDMatSubExpr<T1,T2,SO1>& lhs,
const DenseMatrix<T3,SO2>& rhs )
482 return lhs.leftOperand() - ( lhs.rightOperand() + (~rhs) );
498 template<
typename MT1,
typename MT2,
typename MT3 >
499 struct DMatDMatAddExprTrait< SMatDMatSubExpr<MT1,MT2,false>, MT3 >
504 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
505 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
506 IsDenseMatrix<MT3>::value && IsRowMajorMatrix<MT3>::value
507 ,
typename DMatSMatAddExprTrait< typename DMatDMatSubExprTrait<MT3,MT2>::Type, MT1 >::Type
508 , INVALID_TYPE >::Type Type;
518 template<
typename MT1,
typename MT2,
typename MT3 >
519 struct DMatTDMatAddExprTrait< SMatDMatSubExpr<MT1,MT2,false>, MT3 >
524 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
525 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
526 IsDenseMatrix<MT3>::value && IsColumnMajorMatrix<MT3>::value
527 ,
typename DMatSMatAddExprTrait< typename TDMatDMatSubExprTrait<MT3,MT2>::Type, MT1 >::Type
528 , INVALID_TYPE >::Type Type;
538 template<
typename MT1,
typename MT2,
typename MT3 >
539 struct TDMatDMatAddExprTrait< SMatDMatSubExpr<MT1,MT2,true>, MT3 >
544 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
545 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
546 IsDenseMatrix<MT3>::value && IsRowMajorMatrix<MT3>::value
547 ,
typename DMatTSMatAddExprTrait< typename DMatTDMatSubExprTrait<MT3,MT2>::Type, MT1 >::Type
548 , INVALID_TYPE >::Type Type;
558 template<
typename MT1,
typename MT2,
typename MT3 >
559 struct TDMatTDMatAddExprTrait< SMatDMatSubExpr<MT1,MT2,true>, MT3 >
564 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
565 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
566 IsDenseMatrix<MT3>::value && IsColumnMajorMatrix<MT3>::value
567 ,
typename TDMatTSMatAddExprTrait< typename TDMatTDMatSubExprTrait<MT3,MT2>::Type, MT1 >::Type
568 , INVALID_TYPE >::Type Type;
578 template<
typename MT1,
typename MT2,
typename MT3 >
579 struct DMatDMatSubExprTrait< SMatDMatSubExpr<MT1,MT2,false>, MT3 >
584 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
585 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
586 IsDenseMatrix<MT3>::value && IsRowMajorMatrix<MT3>::value
587 ,
typename SMatDMatSubExprTrait< MT1, typename DMatDMatAddExprTrait<MT2,MT3>::Type >::Type
588 , INVALID_TYPE >::Type Type;
598 template<
typename MT1,
typename MT2,
typename MT3 >
599 struct DMatTDMatSubExprTrait< SMatDMatSubExpr<MT1,MT2,false>, MT3 >
604 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
605 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
606 IsDenseMatrix<MT3>::value && IsColumnMajorMatrix<MT3>::value
607 ,
typename SMatDMatSubExprTrait< MT1, typename DMatTDMatAddExprTrait<MT2,MT3>::Type >::Type
608 , INVALID_TYPE >::Type Type;
618 template<
typename MT1,
typename MT2,
typename MT3 >
619 struct TDMatDMatSubExprTrait< SMatDMatSubExpr<MT1,MT2,true>, MT3 >
624 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
625 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
626 IsDenseMatrix<MT3>::value && IsRowMajorMatrix<MT3>::value
627 ,
typename TSMatDMatSubExprTrait< MT1, typename TDMatDMatAddExprTrait<MT2,MT3>::Type >::Type
628 , INVALID_TYPE >::Type Type;
638 template<
typename MT1,
typename MT2,
typename MT3 >
639 struct TDMatTDMatSubExprTrait< SMatDMatSubExpr<MT1,MT2,true>, MT3 >
644 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
645 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
646 IsDenseMatrix<MT3>::value && IsColumnMajorMatrix<MT3>::value
647 ,
typename TSMatTDMatSubExprTrait< MT1, typename TDMatTDMatAddExprTrait<MT2,MT3>::Type >::Type
648 , INVALID_TYPE >::Type Type;
658 template<
typename MT1,
typename MT2,
bool SO >
659 struct RowExprTrait< SMatDMatSubExpr<MT1,MT2,SO> >
663 typedef typename SubExprTrait< typename RowExprTrait<const MT1>::Type
664 ,
typename RowExprTrait<const MT2>::Type >::Type Type;
673 template<
typename MT1,
typename MT2,
bool SO >
674 struct ColumnExprTrait< SMatDMatSubExpr<MT1,MT2,SO> >
678 typedef typename SubExprTrait< typename ColumnExprTrait<const MT1>::Type
679 ,
typename ColumnExprTrait<const MT2>::Type >::Type Type;