22 #ifndef _BLAZE_MATH_EXPRESSIONS_SVECSCALARDIVEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_SVECSCALARDIVEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
130 template<
typename VT
139 typedef typename VT::ResultType
RT;
140 typedef typename VT::ReturnType
RN;
141 typedef typename VT::CompositeType
CT;
169 template<
typename VT2 >
171 enum { value = useAssign };
207 typedef typename boost::remove_reference<LeftOperand>::type::ConstIterator
IteratorType;
414 template<
typename T >
416 return vector_.canAlias( alias );
426 template<
typename T >
428 return vector_.isAliased( alias );
452 template<
typename VT2 >
480 template<
typename VT2 >
508 template<
typename VT2 >
509 friend inline typename EnableIf< UseAssign<VT2> >::Type
544 template<
typename VT2 >
545 friend inline typename EnableIf< UseAssign<VT2> >::Type
580 template<
typename VT2 >
581 friend inline typename EnableIf< UseAssign<VT2> >::Type
647 template<
typename T1
650 inline const typename EnableIf< IsNumeric<T2>,
651 typename SVecScalarDivExprHelper<T1,T2,TF>::Type >::Type
659 typedef typename Helper::ScalarType ScalarType;
661 if( Helper::value ) {
662 return typename Helper::Type( ~vec, ScalarType(1)/ScalarType(scalar) );
665 return typename Helper::Type( ~vec, scalar );
692 template<
typename VT
696 inline const typename EnableIf< IsFloatingPoint< typename DivTrait<ST2,ST1>::Type >
697 ,
typename MultExprTrait< SVecScalarDivExpr<VT,ST1,TF>, ST2 >::Type >::Type
698 operator*(
const SVecScalarDivExpr<VT,ST1,TF>& vec, ST2 scalar )
702 return vec.leftOperand() * ( scalar / vec.rightOperand() );
721 template<
typename ST1
725 inline const typename EnableIf< IsFloatingPoint< typename DivTrait<ST1,ST2>::Type >
726 ,
typename MultExprTrait< ST1, SVecScalarDivExpr<VT,ST2,TF> >::Type >::Type
727 operator*( ST1 scalar,
const SVecScalarDivExpr<VT,ST2,TF>& vec )
731 return vec.leftOperand() * ( scalar / vec.rightOperand() );
750 template<
typename VT
754 inline const typename EnableIf< IsNumeric<ST2>
755 ,
typename SVecScalarDivExprHelper<VT,typename MultTrait<ST1,ST2>::Type,TF>::Type >::Type
756 operator/(
const SVecScalarDivExpr<VT,ST1,TF>& vec, ST2 scalar )
762 typedef typename MultTrait<ST1,ST2>::Type MultType;
763 typedef SVecScalarDivExprHelper<VT,MultType,TF> Helper;
765 if( Helper::value ) {
766 return typename Helper::Type( vec.leftOperand(), MultType(1)/( vec.rightOperand() * scalar ) );
769 return typename Helper::Type( vec.leftOperand(), vec.rightOperand() * scalar );
786 template<
typename VT,
typename ST1,
typename ST2 >
787 struct SVecScalarMultExprTrait< SVecScalarDivExpr<VT,ST1,false>, ST2 >
791 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
795 typedef typename SVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
796 typedef SVecScalarMultExpr< SVecScalarDivExpr<VT,ST1,false>, ST2,
false > T2;
801 typedef typename SelectType< IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
802 IsNumeric<ST1>::value && IsNumeric<ST2>::value
803 ,
typename SelectType<condition,T1,T2>::Type
804 , INVALID_TYPE >::Type Type;
821 template<
typename VT,
typename ST1,
typename ST2 >
822 struct TSVecScalarMultExprTrait< SVecScalarDivExpr<VT,ST1,true>, ST2 >
826 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
830 typedef typename SVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
831 typedef SVecScalarMultExpr< SVecScalarDivExpr<VT,ST1,true>, ST2,
true > T2;
836 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
837 IsNumeric<ST1>::value && IsNumeric<ST2>::value
838 ,
typename SelectType<condition,T1,T2>::Type
839 , INVALID_TYPE >::Type Type;