22 #ifndef _BLAZE_MATH_EXPRESSIONS_DMATSCALARDIVEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_DMATSCALARDIVEXPR_H_
129 template<
typename MT
138 typedef typename MT::ResultType
RT;
139 typedef typename MT::ReturnType
RN;
140 typedef typename MT::CompositeType
CT;
168 template<
typename MT2 >
170 enum { value = useAssign };
198 enum { vectorizable = 0 };
273 template<
typename T >
275 return matrix_.canAlias( alias );
285 template<
typename T >
287 return matrix_.isAliased( alias );
311 template<
typename MT2 >
340 template<
typename MT2 >
369 template<
typename MT2 >
370 friend inline typename EnableIf< UseAssign<MT2> >::Type
378 assign( ~lhs, rhs.matrix_ );
380 for(
size_t i=0UL; i<(~lhs).
rows(); ++i )
382 typename MT2::Iterator element( (~lhs).begin(i) );
383 const typename MT2::Iterator end( (~lhs).end(i) );
385 for( ; element!=end; ++element )
386 element->value() /= rhs.scalar_;
406 template<
typename MT2 >
407 friend inline typename EnableIf< UseAssign<MT2> >::Type
415 assign( ~lhs, rhs.matrix_ );
417 for(
size_t j=0UL; j<(~lhs).
columns(); ++j )
419 typename MT2::Iterator element( (~lhs).begin(j) );
420 const typename MT2::Iterator end( (~lhs).end(j) );
422 for( ; element!=end; ++element )
423 element->value() /= rhs.scalar_;
443 template<
typename MT2
445 friend inline typename EnableIf< UseAssign<MT2> >::Type
481 template<
typename MT2
483 friend inline typename EnableIf< UseAssign<MT2> >::Type
557 template<
typename T1
560 inline const typename EnableIf< IsNumeric<T2>
561 ,
typename DMatScalarDivExprHelper<T1,T2,SO>::Type >::Type
569 typedef typename Helper::ScalarType ScalarType;
571 if( Helper::value ) {
572 return typename Helper::Type( ~mat, ScalarType(1)/ScalarType(scalar) );
575 return typename Helper::Type( ~mat, scalar );
602 template<
typename MT
606 inline const typename EnableIf< IsFloatingPoint< typename DivTrait<ST2,ST1>::Type >
607 ,
typename MultExprTrait< DMatScalarDivExpr<MT,ST1,SO>, ST2 >::Type >::Type
608 operator*(
const DMatScalarDivExpr<MT,ST1,SO>& mat, ST2 scalar )
612 return mat.leftOperand() * ( scalar / mat.rightOperand() );
631 template<
typename ST1
635 inline const typename EnableIf< IsFloatingPoint< typename DivTrait<ST1,ST2>::Type >
636 ,
typename MultExprTrait< ST1, DMatScalarDivExpr<MT,ST2,SO> >::Type >::Type
637 operator*( ST1 scalar,
const DMatScalarDivExpr<MT,ST2,SO>& mat )
641 return mat.leftOperand() * ( scalar / mat.rightOperand() );
660 template<
typename MT
664 inline const typename EnableIf< IsNumeric<ST2>
665 ,
typename DMatScalarDivExprHelper<MT,typename MultTrait<ST1,ST2>::Type,SO>::Type >::Type
666 operator/(
const DMatScalarDivExpr<MT,ST1,SO>& mat, ST2 scalar )
672 typedef typename MultTrait<ST1,ST2>::Type MultType;
673 typedef DMatScalarDivExprHelper<MT,MultType,SO> Helper;
675 if( Helper::value ) {
676 return typename Helper::Type( mat.leftOperand(), MultType(1)/( mat.rightOperand() * scalar ) );
679 return typename Helper::Type( mat.leftOperand(), mat.rightOperand() * scalar );
706 template<
typename MT
709 inline typename RowExprTrait< DMatScalarDivExpr<MT,ST,SO> >::Type
710 row(
const DMatScalarDivExpr<MT,ST,SO>& dm,
size_t index )
714 return row( dm.leftOperand(), index ) / dm.rightOperand();
732 template<
typename MT
735 inline typename ColumnExprTrait< DMatScalarDivExpr<MT,ST,SO> >::Type
736 column(
const DMatScalarDivExpr<MT,ST,SO>& dm,
size_t index )
740 return column( dm.leftOperand(), index ) / dm.rightOperand();
756 template<
typename MT,
typename ST1,
typename ST2 >
757 struct DMatScalarMultExprTrait< DMatScalarDivExpr<MT,ST1,false>, ST2 >
761 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
765 typedef typename DMatScalarMultExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T1;
766 typedef DMatScalarMultExpr< DMatScalarDivExpr<MT,ST1,false>, ST2,
false > T2;
771 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
772 IsNumeric<ST1>::value && IsNumeric<ST2>::value
773 ,
typename SelectType<condition,T1,T2>::Type
774 , INVALID_TYPE >::Type Type;
791 template<
typename MT,
typename ST1,
typename ST2 >
792 struct TDMatScalarMultExprTrait< DMatScalarDivExpr<MT,ST1,true>, ST2 >
796 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
800 typedef typename DMatScalarMultExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T1;
801 typedef DMatScalarMultExpr< DMatScalarDivExpr<MT,ST1,true>, ST2,
true > T2;
806 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
807 IsNumeric<ST1>::value && IsNumeric<ST2>::value
808 ,
typename SelectType<condition,T1,T2>::Type
809 , INVALID_TYPE >::Type Type;
826 template<
typename MT,
typename ST,
bool SO >
827 struct RowExprTrait< DMatScalarDivExpr<MT,ST,SO> >
831 typedef typename DivExprTrait< typename RowExprTrait<const MT>::Type, ST >::Type Type;
848 template<
typename MT,
typename ST,
bool SO >
849 struct ColumnExprTrait< DMatScalarDivExpr<MT,ST,SO> >
853 typedef typename DivExprTrait< typename ColumnExprTrait<const MT>::Type, ST >::Type Type;