22 #ifndef _BLAZE_MATH_EXPRESSIONS_SVECSCALARDIVEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_SVECSCALARDIVEXPR_H_
83 class SVecScalarDivExpr :
public SparseVector< SVecScalarDivExpr<VT,ST,TF>, TF >
84 ,
private VecScalarDivExpr
89 typedef typename VT::ResultType
RT;
90 typedef typename VT::ReturnType
RN;
91 typedef typename VT::CompositeType
CT;
119 template<
typename VT2 >
121 enum { value = useAssign };
364 template<
typename T >
366 return vector_.canAlias( alias );
376 template<
typename T >
378 return vector_.isAliased( alias );
402 template<
typename VT2 >
410 assign( ~lhs, rhs.vector_ );
411 (~lhs) /= rhs.scalar_;
430 template<
typename VT2 >
438 assign( ~lhs, rhs.vector_ );
439 (~lhs) /= rhs.scalar_;
458 template<
typename VT2 >
459 friend inline typename EnableIf< UseAssign<VT2> >::Type
494 template<
typename VT2 >
495 friend inline typename EnableIf< UseAssign<VT2> >::Type
530 template<
typename VT2 >
531 friend inline typename EnableIf< UseAssign<VT2> >::Type
597 template<
typename T1
600 inline const typename EnableIf< IsNumeric<T2>,
typename DivExprTrait<T1,T2>::Type >::Type
608 typedef typename ReturnType::RightOperand ScalarType;
611 return ReturnType( ~vec, ScalarType(1)/ScalarType(scalar) );
614 return ReturnType( ~vec, scalar );
641 template<
typename VT
645 inline const typename EnableIf< IsFloatingPoint< typename DivTrait<ST2,ST1>::Type >
646 ,
typename MultExprTrait< SVecScalarDivExpr<VT,ST1,TF>, ST2 >::Type >::Type
647 operator*(
const SVecScalarDivExpr<VT,ST1,TF>& vec, ST2 scalar )
651 return vec.leftOperand() * ( scalar / vec.rightOperand() );
670 template<
typename ST1
674 inline const typename EnableIf< IsFloatingPoint< typename DivTrait<ST1,ST2>::Type >
675 ,
typename MultExprTrait< ST1, SVecScalarDivExpr<VT,ST2,TF> >::Type >::Type
676 operator*( ST1 scalar,
const SVecScalarDivExpr<VT,ST2,TF>& vec )
680 return vec.leftOperand() * ( scalar / vec.rightOperand() );
699 template<
typename VT
703 inline const typename EnableIf< IsNumeric<ST2>
704 ,
typename DivExprTrait<VT,typename MultTrait<ST1,ST2>::Type>::Type >::Type
705 operator/(
const SVecScalarDivExpr<VT,ST1,TF>& vec, ST2 scalar )
711 typedef typename MultTrait<ST1,ST2>::Type MultType;
712 typedef typename DivExprTrait<VT,MultType>::Type ReturnType;
713 typedef typename ReturnType::RightOperand ScalarType;
715 if( IsMultExpr<ReturnType>::value ) {
716 return ReturnType( vec.leftOperand(), ScalarType(1)/( vec.rightOperand() * scalar ) );
719 return ReturnType( vec.leftOperand(), vec.rightOperand() * scalar );
736 template<
typename VT,
typename ST1,
typename ST2 >
737 struct SVecScalarMultExprTrait< SVecScalarDivExpr<VT,ST1,false>, ST2 >
741 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
745 typedef typename SVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
746 typedef SVecScalarMultExpr< SVecScalarDivExpr<VT,ST1,false>, ST2,
false > T2;
751 typedef typename SelectType< IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
752 IsNumeric<ST1>::value && IsNumeric<ST2>::value
753 ,
typename SelectType<condition,T1,T2>::Type
754 , INVALID_TYPE >::Type Type;
771 template<
typename VT,
typename ST1,
typename ST2 >
772 struct TSVecScalarMultExprTrait< SVecScalarDivExpr<VT,ST1,true>, ST2 >
776 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
780 typedef typename SVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
781 typedef SVecScalarMultExpr< SVecScalarDivExpr<VT,ST1,true>, ST2,
true > T2;
786 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
787 IsNumeric<ST1>::value && IsNumeric<ST2>::value
788 ,
typename SelectType<condition,T1,T2>::Type
789 , INVALID_TYPE >::Type Type;