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 };
261 template<
typename T >
287 template<
typename VT2 >
313 template<
typename VT2 >
339 template<
typename VT2 >
340 friend inline typename EnableIf< UseAssign<VT2> >::Type
373 template<
typename VT2 >
374 friend inline typename EnableIf< UseAssign<VT2> >::Type
407 template<
typename VT2 >
408 friend inline typename EnableIf< UseAssign<VT2> >::Type
477 template<
typename T1
480 inline const typename EnableIf< IsNumeric<T2>,
481 typename DVecScalarDivExprHelper<T1,T2,TF>::Type >::Type
487 typedef typename Helper::ScalarType ScalarType;
489 if( Helper::value ) {
490 return typename Helper::Type( ~vec, ScalarType(1)/ScalarType(scalar) );
493 return typename Helper::Type( ~vec, scalar );
520 template<
typename VT
524 inline const typename EnableIf< IsFloatingPoint< typename DivTrait<ST2,ST1>::Type >
525 ,
typename MultExprTrait< DVecScalarDivExpr<VT,ST1,TF>, ST2 >::Type >::Type
526 operator*(
const DVecScalarDivExpr<VT,ST1,TF>& vec, ST2 scalar )
528 return vec.leftOperand() * ( scalar / vec.rightOperand() );
547 template<
typename ST1
551 inline const typename EnableIf< IsFloatingPoint< typename DivTrait<ST1,ST2>::Type >
552 ,
typename MultExprTrait< ST1, DVecScalarDivExpr<VT,ST2,TF> >::Type >::Type
553 operator*( ST1 scalar,
const DVecScalarDivExpr<VT,ST2,TF>& vec )
555 return vec.leftOperand() * ( scalar / vec.rightOperand() );
574 template<
typename VT
578 inline const typename EnableIf< IsNumeric<ST2>
579 ,
typename DVecScalarDivExprHelper<VT,typename MultTrait<ST1,ST2>::Type,TF>::Type >::Type
580 operator/(
const DVecScalarDivExpr<VT,ST1,TF>& vec, ST2 scalar )
584 typedef typename MultTrait<ST1,ST2>::Type MultType;
585 typedef DVecScalarDivExprHelper<VT,MultType,TF> Helper;
587 if( Helper::value ) {
588 return typename Helper::Type( vec.leftOperand(), MultType(1)/( vec.rightOperand() * scalar ) );
591 return typename Helper::Type( vec.leftOperand(), vec.rightOperand() * scalar );
608 template<
typename VT,
typename ST1,
typename ST2 >
609 struct DVecScalarMultExprTrait< DVecScalarDivExpr<VT,ST1,false>, ST2 >
613 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
617 typedef typename DVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
618 typedef DVecScalarMultExpr< DVecScalarDivExpr<VT,ST1,false>, ST2,
false > T2;
623 typedef typename SelectType< IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
624 IsNumeric<ST1>::value && IsNumeric<ST2>::value
625 ,
typename SelectType<condition,T1,T2>::Type
626 , INVALID_TYPE >::Type Type;
643 template<
typename VT,
typename ST1,
typename ST2 >
644 struct TDVecScalarMultExprTrait< DVecScalarDivExpr<VT,ST1,true>, ST2 >
648 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
652 typedef typename DVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
653 typedef DVecScalarMultExpr< DVecScalarDivExpr<VT,ST1,true>, ST2,
true > T2;
658 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
659 IsNumeric<ST1>::value && IsNumeric<ST2>::value
660 ,
typename SelectType<condition,T1,T2>::Type
661 , INVALID_TYPE >::Type Type;