22 #ifndef _BLAZE_MATH_EXPRESSIONS_DVECSCALARDIVEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_DVECSCALARDIVEXPR_H_
85 typedef typename VT::ResultType
RT;
86 typedef typename VT::ReturnType
RN;
87 typedef typename VT::CompositeType
CT;
115 template<
typename VT2 >
117 enum { value = useAssign };
145 enum { vectorizable = 0 };
208 template<
typename T >
210 return vector_.canAlias( alias );
220 template<
typename T >
222 return vector_.isAliased( alias );
246 template<
typename VT2 >
274 template<
typename VT2 >
302 template<
typename VT2 >
303 friend inline typename EnableIf< UseAssign<VT2> >::Type
338 template<
typename VT2 >
339 friend inline typename EnableIf< UseAssign<VT2> >::Type
374 template<
typename VT2 >
375 friend inline typename EnableIf< UseAssign<VT2> >::Type
446 template<
typename T1
449 inline const typename EnableIf< IsNumeric<T2>,
typename DivExprTrait<T1,T2>::Type >::Type
457 typedef typename ReturnType::RightOperand ScalarType;
460 return ReturnType( ~vec, ScalarType(1)/ScalarType(scalar) );
463 return ReturnType( ~vec, scalar );
490 template<
typename VT
494 inline const typename EnableIf< IsFloatingPoint< typename DivTrait<ST2,ST1>::Type >
495 ,
typename MultExprTrait< DVecScalarDivExpr<VT,ST1,TF>, ST2 >::Type >::Type
496 operator*(
const DVecScalarDivExpr<VT,ST1,TF>& vec, ST2 scalar )
500 return vec.leftOperand() * ( scalar / vec.rightOperand() );
519 template<
typename ST1
523 inline const typename EnableIf< IsFloatingPoint< typename DivTrait<ST1,ST2>::Type >
524 ,
typename MultExprTrait< ST1, DVecScalarDivExpr<VT,ST2,TF> >::Type >::Type
525 operator*( ST1 scalar,
const DVecScalarDivExpr<VT,ST2,TF>& vec )
529 return vec.leftOperand() * ( scalar / vec.rightOperand() );
548 template<
typename VT
552 inline const typename EnableIf< IsNumeric<ST2>
553 ,
typename DivExprTrait<VT,typename MultTrait<ST1,ST2>::Type>::Type >::Type
554 operator/(
const DVecScalarDivExpr<VT,ST1,TF>& vec, ST2 scalar )
560 typedef typename MultTrait<ST1,ST2>::Type MultType;
561 typedef typename DivExprTrait<VT,MultType>::Type ReturnType;
562 typedef typename ReturnType::RightOperand ScalarType;
564 if( IsMultExpr<ReturnType>::value ) {
565 return ReturnType( vec.leftOperand(), ScalarType(1)/( vec.rightOperand() * scalar ) );
568 return ReturnType( vec.leftOperand(), vec.rightOperand() * scalar );
585 template<
typename VT,
typename ST1,
typename ST2 >
586 struct DVecScalarMultExprTrait< DVecScalarDivExpr<VT,ST1,false>, ST2 >
590 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
594 typedef typename DVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
595 typedef DVecScalarMultExpr< DVecScalarDivExpr<VT,ST1,false>, ST2,
false > T2;
600 typedef typename SelectType< IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
601 IsNumeric<ST1>::value && IsNumeric<ST2>::value
602 ,
typename SelectType<condition,T1,T2>::Type
603 , INVALID_TYPE >::Type Type;
620 template<
typename VT,
typename ST1,
typename ST2 >
621 struct TDVecScalarMultExprTrait< DVecScalarDivExpr<VT,ST1,true>, ST2 >
625 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
629 typedef typename DVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
630 typedef DVecScalarMultExpr< DVecScalarDivExpr<VT,ST1,true>, ST2,
true > T2;
635 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
636 IsNumeric<ST1>::value && IsNumeric<ST2>::value
637 ,
typename SelectType<condition,T1,T2>::Type
638 , INVALID_TYPE >::Type Type;