22 #ifndef _BLAZE_MATH_EXPRESSIONS_DMATSCALARDIVEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_DMATSCALARDIVEXPR_H_
127 template<
typename MT
136 typedef typename MT::ResultType
RT;
137 typedef typename MT::ReturnType
RN;
138 typedef typename MT::CompositeType
CT;
166 template<
typename MT2 >
168 enum { value = useAssign };
196 enum { vectorizable = 0 };
274 template<
typename T >
300 template<
typename MT2 >
327 template<
typename MT2 >
354 template<
typename MT2 >
355 friend inline typename EnableIf< UseAssign<MT2> >::Type
361 assign( ~lhs, rhs.matrix_ );
363 for(
size_t i=0UL; i<(~lhs).
rows(); ++i )
365 typename MT2::Iterator element( (~lhs).begin(i) );
366 const typename MT2::Iterator end( (~lhs).end(i) );
368 for( ; element!=end; ++element )
369 element->value() /= rhs.scalar_;
389 template<
typename MT2 >
390 friend inline typename EnableIf< UseAssign<MT2> >::Type
396 assign( ~lhs, rhs.matrix_ );
398 for(
size_t j=0UL; j<(~lhs).
columns(); ++j )
400 typename MT2::Iterator element( (~lhs).begin(j) );
401 const typename MT2::Iterator end( (~lhs).end(j) );
403 for( ; element!=end; ++element )
404 element->value() /= rhs.scalar_;
424 template<
typename MT2
426 friend inline typename EnableIf< UseAssign<MT2> >::Type
460 template<
typename MT2
462 friend inline typename EnableIf< UseAssign<MT2> >::Type
534 template<
typename T1
537 inline const typename EnableIf< IsNumeric<T2>
538 ,
typename DMatScalarDivExprHelper<T1,T2,SO>::Type >::Type
544 typedef typename Helper::ScalarType ScalarType;
546 if( Helper::value ) {
547 return typename Helper::Type( ~mat, ScalarType(1)/ScalarType(scalar) );
550 return typename Helper::Type( ~mat, scalar );
577 template<
typename MT
581 inline const typename EnableIf< IsFloatingPoint< typename DivTrait<ST2,ST1>::Type >
582 ,
typename MultExprTrait< DMatScalarDivExpr<MT,ST1,SO>, ST2 >::Type >::Type
583 operator*(
const DMatScalarDivExpr<MT,ST1,SO>& mat, ST2 scalar )
585 return mat.leftOperand() * ( scalar / mat.rightOperand() );
604 template<
typename ST1
608 inline const typename EnableIf< IsFloatingPoint< typename DivTrait<ST1,ST2>::Type >
609 ,
typename MultExprTrait< ST1, DMatScalarDivExpr<MT,ST2,SO> >::Type >::Type
610 operator*( ST1 scalar,
const DMatScalarDivExpr<MT,ST2,SO>& mat )
612 return mat.leftOperand() * ( scalar / mat.rightOperand() );
631 template<
typename MT
635 inline const typename EnableIf< IsNumeric<ST2>
636 ,
typename DMatScalarDivExprHelper<MT,typename MultTrait<ST1,ST2>::Type,SO>::Type >::Type
637 operator/(
const DMatScalarDivExpr<MT,ST1,SO>& mat, ST2 scalar )
641 typedef typename MultTrait<ST1,ST2>::Type MultType;
642 typedef DMatScalarDivExprHelper<MT,MultType,SO> Helper;
644 if( Helper::value ) {
645 return typename Helper::Type( mat.leftOperand(), MultType(1)/( mat.rightOperand() * scalar ) );
648 return typename Helper::Type( mat.leftOperand(), mat.rightOperand() * scalar );
665 template<
typename MT,
typename ST1,
typename ST2 >
666 struct DMatScalarMultExprTrait< DMatScalarDivExpr<MT,ST1,false>, ST2 >
670 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
674 typedef typename DMatScalarMultExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T1;
675 typedef DMatScalarMultExpr< DMatScalarDivExpr<MT,ST1,false>, ST2,
false > T2;
680 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
681 IsNumeric<ST1>::value && IsNumeric<ST2>::value
682 ,
typename SelectType<condition,T1,T2>::Type
683 , INVALID_TYPE >::Type Type;
700 template<
typename MT,
typename ST1,
typename ST2 >
701 struct TDMatScalarMultExprTrait< DMatScalarDivExpr<MT,ST1,true>, ST2 >
705 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
709 typedef typename DMatScalarMultExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T1;
710 typedef DMatScalarMultExpr< DMatScalarDivExpr<MT,ST1,true>, ST2,
true > T2;
715 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
716 IsNumeric<ST1>::value && IsNumeric<ST2>::value
717 ,
typename SelectType<condition,T1,T2>::Type
718 , INVALID_TYPE >::Type Type;