22 #ifndef _BLAZE_MATH_EXPRESSIONS_SMATSCALARDIVEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_SMATSCALARDIVEXPR_H_
86 class SMatScalarDivExpr :
public SparseMatrix< SMatScalarDivExpr<MT,ST,SO>, SO >
87 ,
private MatScalarDivExpr
92 typedef typename MT::ResultType
RT;
93 typedef typename MT::ReturnType
RN;
94 typedef typename MT::CompositeType
CT;
122 template<
typename MT2 >
124 enum { value = useAssign };
393 template<
typename T >
395 return matrix_.canAlias( alias );
405 template<
typename T >
407 return matrix_.isAliased( alias );
431 template<
typename MT2
441 assign( ~lhs, rhs.matrix_ );
442 (~lhs) /= rhs.scalar_;
461 template<
typename MT2
471 assign( ~lhs, rhs.matrix_ );
472 (~lhs) /= rhs.scalar_;
491 template<
typename MT2
493 friend inline typename EnableIf< UseAssign<MT2> >::Type
528 template<
typename MT2
530 friend inline typename EnableIf< UseAssign<MT2> >::Type
603 template<
typename T1
606 inline const typename EnableIf< IsNumeric<T2>,
typename DivExprTrait<T1,T2>::Type >::Type
614 typedef typename ReturnType::RightOperand ScalarType;
617 return ReturnType( ~mat, ScalarType(1)/ScalarType(scalar) );
620 return ReturnType( ~mat, scalar );
647 template<
typename MT
651 inline const typename EnableIf< IsFloatingPoint< typename DivTrait<ST2,ST1>::Type >
652 ,
typename MultExprTrait< SMatScalarDivExpr<MT,ST1,SO>, ST2 >::Type >::Type
653 operator*(
const SMatScalarDivExpr<MT,ST1,SO>& mat, ST2 scalar )
657 return mat.leftOperand() * ( scalar / mat.rightOperand() );
676 template<
typename ST1
680 inline const typename EnableIf< IsFloatingPoint< typename DivTrait<ST1,ST2>::Type >
681 ,
typename MultExprTrait< ST1, SMatScalarDivExpr<MT,ST2,SO> >::Type >::Type
682 operator*( ST1 scalar,
const SMatScalarDivExpr<MT,ST2,SO>& mat )
686 return mat.leftOperand() * ( scalar / mat.rightOperand() );
705 template<
typename MT
709 inline const typename EnableIf< IsNumeric<ST2>
710 ,
typename DivExprTrait<MT,typename MultTrait<ST1,ST2>::Type>::Type >::Type
711 operator/(
const SMatScalarDivExpr<MT,ST1,SO>& mat, ST2 scalar )
717 typedef typename MultTrait<ST1,ST2>::Type MultType;
718 typedef typename DivExprTrait<MT,MultType>::Type ReturnType;
719 typedef typename ReturnType::RightOperand ScalarType;
721 if( IsMultExpr<ReturnType>::value ) {
722 return ReturnType( mat.leftOperand(), ScalarType(1)/( mat.rightOperand() * scalar ) );
725 return ReturnType( mat.leftOperand(), mat.rightOperand() * scalar );
742 template<
typename MT,
typename ST1,
typename ST2 >
743 struct SMatScalarMultExprTrait< SMatScalarDivExpr<MT,ST1,false>, ST2 >
747 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
751 typedef typename SMatScalarMultExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T1;
752 typedef SMatScalarMultExpr< SMatScalarDivExpr<MT,ST1,false>, ST2,
false > T2;
757 typedef typename SelectType< IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
758 IsNumeric<ST1>::value && IsNumeric<ST2>::value
759 ,
typename SelectType<condition,T1,T2>::Type
760 , INVALID_TYPE >::Type Type;
777 template<
typename MT,
typename ST1,
typename ST2 >
778 struct TSMatScalarMultExprTrait< SMatScalarDivExpr<MT,ST1,true>, ST2 >
782 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
786 typedef typename SMatScalarMultExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T1;
787 typedef SMatScalarMultExpr< SMatScalarDivExpr<MT,ST1,true>, ST2,
true > T2;
792 typedef typename SelectType< IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
793 IsNumeric<ST1>::value && IsNumeric<ST2>::value
794 ,
typename SelectType<condition,T1,T2>::Type
795 , INVALID_TYPE >::Type Type;
812 template<
typename MT,
typename ST,
bool SO >
813 struct RowExprTrait< SMatScalarDivExpr<MT,ST,SO> >
817 typedef typename DivExprTrait< typename RowExprTrait<const MT>::Type, ST >::Type Type;
834 template<
typename MT,
typename ST,
bool SO >
835 struct ColumnExprTrait< SMatScalarDivExpr<MT,ST,SO> >
839 typedef typename DivExprTrait< typename ColumnExprTrait<const MT>::Type, ST >::Type Type;