22 #ifndef _BLAZE_MATH_EXPRESSIONS_SVECDVECSUBEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_SVECDVECSUBEXPR_H_
69 template<
typename VT1
72 class SVecDVecSubExpr :
public DenseVector< SVecDVecSubExpr<VT1,VT2,TF>, TF >
73 ,
private VecVecSubExpr
78 typedef typename VT1::ResultType
RT1;
79 typedef typename VT2::ResultType
RT2;
80 typedef typename VT1::ReturnType
RN1;
81 typedef typename VT2::ReturnType
RN2;
82 typedef typename VT1::CompositeType
CT1;
83 typedef typename VT2::CompositeType
CT2;
84 typedef typename VT1::TransposeType
TT1;
85 typedef typename VT2::TransposeType
TT2;
123 enum { vectorizable = 0 };
188 template<
typename T >
190 return (
lhs_.canAlias( alias ) ||
rhs_.canAlias( alias ) );
200 template<
typename T >
202 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
224 template<
typename VT >
231 assign ( ~lhs, -rhs.rhs_ );
249 template<
typename VT >
278 template<
typename VT >
307 template<
typename VT >
336 template<
typename VT >
403 template<
typename T1
406 inline const SVecDVecSubExpr<T1,T2,TF>
411 if( (~lhs).size() != (~rhs).size() )
412 throw std::invalid_argument(
"Vector sizes do not match" );
440 template<
typename T1
444 inline const typename AddExprTrait< SVecDVecSubExpr<T1,T2,TF>, T3 >::Type
445 operator+(
const SVecDVecSubExpr<T1,T2,TF>& lhs,
const DenseVector<T3,TF>& rhs )
449 return ( (~rhs) - lhs.rightOperand() ) + lhs.leftOperand();
468 template<
typename T1
472 inline const typename SubExprTrait< SVecDVecSubExpr<T1,T2,TF>, T3 >::Type
473 operator-(
const SVecDVecSubExpr<T1,T2,TF>& lhs,
const DenseVector<T3,TF>& rhs )
477 return lhs.leftOperand() - ( lhs.rightOperand() + (~rhs) );
493 template<
typename VT1,
typename VT2,
typename VT3 >
494 struct DVecDVecAddExprTrait< SVecDVecSubExpr<VT1,VT2,false>, VT3 >
499 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
500 IsDenseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
501 IsDenseVector<VT3>::value && !IsTransposeVector<VT3>::value
502 ,
typename DVecSVecAddExprTrait< typename DVecDVecSubExprTrait<VT3,VT2>::Type, VT1 >::Type
503 , INVALID_TYPE >::Type Type;
513 template<
typename VT1,
typename VT2,
typename VT3 >
514 struct TDVecTDVecAddExprTrait< SVecDVecSubExpr<VT1,VT2,true>, VT3 >
519 typedef typename SelectType< IsSparseVector<VT1>::value && IsTransposeVector<VT1>::value &&
520 IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
521 IsDenseVector<VT3>::value && IsTransposeVector<VT3>::value
522 ,
typename TDVecTSVecAddExprTrait< typename TDVecTDVecSubExprTrait<VT3,VT2>::Type, VT1 >::Type
523 , INVALID_TYPE >::Type Type;
533 template<
typename VT1,
typename VT2,
typename VT3 >
534 struct DVecDVecSubExprTrait< SVecDVecSubExpr<VT1,VT2,false>, VT3 >
539 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
540 IsDenseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
541 IsDenseVector<VT3>::value && !IsTransposeVector<VT3>::value
542 ,
typename SVecDVecSubExprTrait< VT1, typename DVecDVecAddExprTrait<VT2,VT3>::Type >::Type
543 , INVALID_TYPE >::Type Type;
553 template<
typename VT1,
typename VT2,
typename VT3 >
554 struct TDVecTDVecSubExprTrait< SVecDVecSubExpr<VT1,VT2,true>, VT3 >
559 typedef typename SelectType< IsSparseVector<VT1>::value && IsTransposeVector<VT1>::value &&
560 IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
561 IsDenseVector<VT3>::value && IsTransposeVector<VT3>::value
562 ,
typename TSVecTDVecSubExprTrait< VT1, typename TDVecTDVecAddExprTrait<VT2,VT3>::Type >::Type
563 , INVALID_TYPE >::Type Type;