22 #ifndef _BLAZE_MATH_EXPRESSIONS_DMATSCALARDIVEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_DMATSCALARDIVEXPR_H_
88 typedef typename MT::ResultType
RT;
89 typedef typename MT::ReturnType
RN;
90 typedef typename MT::CompositeType
CT;
118 template<
typename MT2 >
120 enum { value = useAssign };
148 enum { vectorizable = 0 };
223 template<
typename T >
225 return matrix_.canAlias( alias );
235 template<
typename T >
237 return matrix_.isAliased( alias );
261 template<
typename MT2 >
290 template<
typename MT2 >
319 template<
typename MT2 >
320 friend inline typename EnableIf< UseAssign<MT2> >::Type
328 assign( ~lhs, rhs.matrix_ );
330 for(
size_t i=0UL; i<(~lhs).
rows(); ++i )
332 typename MT2::Iterator element( (~lhs).begin(i) );
333 const typename MT2::Iterator end( (~lhs).end(i) );
335 for( ; element!=end; ++element )
336 element->value() /= rhs.scalar_;
356 template<
typename MT2 >
357 friend inline typename EnableIf< UseAssign<MT2> >::Type
365 assign( ~lhs, rhs.matrix_ );
367 for(
size_t j=0UL; j<(~lhs).
columns(); ++j )
369 typename MT2::Iterator element( (~lhs).begin(j) );
370 const typename MT2::Iterator end( (~lhs).end(j) );
372 for( ; element!=end; ++element )
373 element->value() /= rhs.scalar_;
393 template<
typename MT2
395 friend inline typename EnableIf< UseAssign<MT2> >::Type
431 template<
typename MT2
433 friend inline typename EnableIf< UseAssign<MT2> >::Type
507 template<
typename T1
510 inline const typename EnableIf< IsNumeric<T2>,
typename DivExprTrait<T1,T2>::Type >::Type
518 typedef typename ReturnType::RightOperand ScalarType;
521 return ReturnType( ~mat, ScalarType(1)/ScalarType(scalar) );
524 return ReturnType( ~mat, scalar );
551 template<
typename MT
555 inline const typename EnableIf< IsFloatingPoint< typename DivTrait<ST2,ST1>::Type >
556 ,
typename MultExprTrait< DMatScalarDivExpr<MT,ST1,SO>, ST2 >::Type >::Type
557 operator*(
const DMatScalarDivExpr<MT,ST1,SO>& mat, ST2 scalar )
561 return mat.leftOperand() * ( scalar / mat.rightOperand() );
580 template<
typename ST1
584 inline const typename EnableIf< IsFloatingPoint< typename DivTrait<ST1,ST2>::Type >
585 ,
typename MultExprTrait< ST1, DMatScalarDivExpr<MT,ST2,SO> >::Type >::Type
586 operator*( ST1 scalar,
const DMatScalarDivExpr<MT,ST2,SO>& mat )
590 return mat.leftOperand() * ( scalar / mat.rightOperand() );
609 template<
typename MT
613 inline const typename EnableIf< IsNumeric<ST2>
614 ,
typename DivExprTrait<MT,typename MultTrait<ST1,ST2>::Type>::Type >::Type
615 operator/(
const DMatScalarDivExpr<MT,ST1,SO>& mat, ST2 scalar )
621 typedef typename MultTrait<ST1,ST2>::Type MultType;
622 typedef typename DivExprTrait<MT,MultType>::Type ReturnType;
623 typedef typename ReturnType::RightOperand ScalarType;
625 if( IsMultExpr<ReturnType>::value ) {
626 return ReturnType( mat.leftOperand(), ScalarType(1)/( mat.rightOperand() * scalar ) );
629 return ReturnType( mat.leftOperand(), mat.rightOperand() * scalar );
646 template<
typename MT,
typename ST1,
typename ST2 >
647 struct DMatScalarMultExprTrait< DMatScalarDivExpr<MT,ST1,false>, ST2 >
651 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
655 typedef typename DMatScalarMultExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T1;
656 typedef DMatScalarMultExpr< DMatScalarDivExpr<MT,ST1,false>, ST2,
false > T2;
661 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
662 IsNumeric<ST1>::value && IsNumeric<ST2>::value
663 ,
typename SelectType<condition,T1,T2>::Type
664 , INVALID_TYPE >::Type Type;
681 template<
typename MT,
typename ST1,
typename ST2 >
682 struct TDMatScalarMultExprTrait< DMatScalarDivExpr<MT,ST1,true>, ST2 >
686 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
690 typedef typename DMatScalarMultExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T1;
691 typedef DMatScalarMultExpr< DMatScalarDivExpr<MT,ST1,true>, ST2,
true > T2;
696 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
697 IsNumeric<ST1>::value && IsNumeric<ST2>::value
698 ,
typename SelectType<condition,T1,T2>::Type
699 , INVALID_TYPE >::Type Type;
716 template<
typename MT,
typename ST,
bool SO >
717 struct RowExprTrait< DMatScalarDivExpr<MT,ST,SO> >
721 typedef typename DivExprTrait< typename RowExprTrait<const MT>::Type, ST >::Type Type;
738 template<
typename MT,
typename ST,
bool SO >
739 struct ColumnExprTrait< DMatScalarDivExpr<MT,ST,SO> >
743 typedef typename DivExprTrait< typename ColumnExprTrait<const MT>::Type, ST >::Type Type;