22 #ifndef _BLAZE_MATH_EXPRESSIONS_DVECSCALARDIVEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_DVECSCALARDIVEXPR_H_
126 template<
typename VT
135 typedef typename VT::ResultType
RT;
136 typedef typename VT::ReturnType
RN;
137 typedef typename VT::CompositeType
CT;
165 template<
typename VT2 >
167 enum { value = useAssign };
195 enum { vectorizable = 0 };
258 template<
typename T >
260 return vector_.canAlias( alias );
270 template<
typename T >
272 return vector_.isAliased( alias );
296 template<
typename VT2 >
324 template<
typename VT2 >
352 template<
typename VT2 >
353 friend inline typename EnableIf< UseAssign<VT2> >::Type
388 template<
typename VT2 >
389 friend inline typename EnableIf< UseAssign<VT2> >::Type
424 template<
typename VT2 >
425 friend inline typename EnableIf< UseAssign<VT2> >::Type
496 template<
typename T1
499 inline const typename EnableIf< IsNumeric<T2>,
500 typename DVecScalarDivExprHelper<T1,T2,TF>::Type >::Type
508 typedef typename Helper::ScalarType ScalarType;
510 if( Helper::value ) {
511 return typename Helper::Type( ~vec, ScalarType(1)/ScalarType(scalar) );
514 return typename Helper::Type( ~vec, scalar );
541 template<
typename VT
545 inline const typename EnableIf< IsFloatingPoint< typename DivTrait<ST2,ST1>::Type >
546 ,
typename MultExprTrait< DVecScalarDivExpr<VT,ST1,TF>, ST2 >::Type >::Type
547 operator*(
const DVecScalarDivExpr<VT,ST1,TF>& vec, ST2 scalar )
551 return vec.leftOperand() * ( scalar / vec.rightOperand() );
570 template<
typename ST1
574 inline const typename EnableIf< IsFloatingPoint< typename DivTrait<ST1,ST2>::Type >
575 ,
typename MultExprTrait< ST1, DVecScalarDivExpr<VT,ST2,TF> >::Type >::Type
576 operator*( ST1 scalar,
const DVecScalarDivExpr<VT,ST2,TF>& vec )
580 return vec.leftOperand() * ( scalar / vec.rightOperand() );
599 template<
typename VT
603 inline const typename EnableIf< IsNumeric<ST2>
604 ,
typename DVecScalarDivExprHelper<VT,typename MultTrait<ST1,ST2>::Type,TF>::Type >::Type
605 operator/(
const DVecScalarDivExpr<VT,ST1,TF>& vec, ST2 scalar )
611 typedef typename MultTrait<ST1,ST2>::Type MultType;
612 typedef DVecScalarDivExprHelper<VT,MultType,TF> Helper;
614 if( Helper::value ) {
615 return typename Helper::Type( vec.leftOperand(), MultType(1)/( vec.rightOperand() * scalar ) );
618 return typename Helper::Type( vec.leftOperand(), vec.rightOperand() * scalar );
635 template<
typename VT,
typename ST1,
typename ST2 >
636 struct DVecScalarMultExprTrait< DVecScalarDivExpr<VT,ST1,false>, ST2 >
640 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
644 typedef typename DVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
645 typedef DVecScalarMultExpr< DVecScalarDivExpr<VT,ST1,false>, ST2,
false > T2;
650 typedef typename SelectType< IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
651 IsNumeric<ST1>::value && IsNumeric<ST2>::value
652 ,
typename SelectType<condition,T1,T2>::Type
653 , INVALID_TYPE >::Type Type;
670 template<
typename VT,
typename ST1,
typename ST2 >
671 struct TDVecScalarMultExprTrait< DVecScalarDivExpr<VT,ST1,true>, ST2 >
675 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
679 typedef typename DVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
680 typedef DVecScalarMultExpr< DVecScalarDivExpr<VT,ST1,true>, ST2,
true > T2;
685 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
686 IsNumeric<ST1>::value && IsNumeric<ST2>::value
687 ,
typename SelectType<condition,T1,T2>::Type
688 , INVALID_TYPE >::Type Type;