22 #ifndef _BLAZE_MATH_EXPRESSIONS_DVECSVECSUBEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_DVECSVECSUBEXPR_H_
69 template<
typename VT1
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 >
191 (
rhs_.canAlias( alias ) );
201 template<
typename T >
203 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
225 template<
typename VT >
255 template<
typename VT >
284 template<
typename VT >
313 template<
typename VT >
342 template<
typename VT >
409 template<
typename T1
412 inline const DVecSVecSubExpr<T1,T2,TF>
417 if( (~lhs).size() != (~rhs).size() )
418 throw std::invalid_argument(
"Vector sizes do not match" );
446 template<
typename T1
450 inline const typename AddExprTrait< DVecSVecSubExpr<T1,T2,TF>, T3 >::Type
451 operator+(
const DVecSVecSubExpr<T1,T2,TF>& lhs,
const DenseVector<T3,TF>& rhs )
455 return ( lhs.leftOperand() + (~rhs) ) - lhs.rightOperand();
474 template<
typename T1
478 inline const typename SubExprTrait< DVecSVecSubExpr<T1,T2,TF>, T3 >::Type
479 operator-(
const DVecSVecSubExpr<T1,T2,TF>& lhs,
const DenseVector<T3,TF>& rhs )
483 return ( lhs.leftOperand() - (~rhs) ) - lhs.rightOperand();
499 template<
typename VT1,
typename VT2,
typename VT3 >
500 struct DVecDVecAddExprTrait< DVecSVecSubExpr<VT1,VT2,false>, VT3 >
505 typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
506 IsSparseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
507 IsDenseVector<VT3>::value && !IsTransposeVector<VT3>::value
508 ,
typename DVecSVecSubExprTrait< typename DVecDVecAddExprTrait<VT1,VT3>::Type, VT2 >::Type
509 , INVALID_TYPE >::Type Type;
519 template<
typename VT1,
typename VT2,
typename VT3 >
520 struct TDVecTDVecAddExprTrait< DVecSVecSubExpr<VT1,VT2,true>, VT3 >
525 typedef typename SelectType< IsDenseVector<VT1>::value && IsTransposeVector<VT1>::value &&
526 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
527 IsDenseVector<VT3>::value && IsTransposeVector<VT3>::value
528 ,
typename TDVecTSVecSubExprTrait< typename TDVecTDVecAddExprTrait<VT1,VT3>::Type, VT2 >::Type
529 , INVALID_TYPE >::Type Type;
539 template<
typename VT1,
typename VT2,
typename VT3 >
540 struct DVecDVecSubExprTrait< DVecSVecSubExpr<VT1,VT2,false>, VT3 >
545 typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
546 IsSparseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
547 IsDenseVector<VT3>::value && !IsTransposeVector<VT3>::value
548 ,
typename DVecSVecSubExprTrait< typename DVecDVecSubExprTrait<VT1,VT3>::Type, VT2 >::Type
549 , INVALID_TYPE >::Type Type;
559 template<
typename VT1,
typename VT2,
typename VT3 >
560 struct TDVecTDVecSubExprTrait< DVecSVecSubExpr<VT1,VT2,true>, VT3 >
565 typedef typename SelectType< IsDenseVector<VT1>::value && IsTransposeVector<VT1>::value &&
566 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
567 IsDenseVector<VT3>::value && IsTransposeVector<VT3>::value
568 ,
typename TDVecTSVecSubExprTrait< typename TDVecTDVecSubExprTrait<VT1,VT3>::Type, VT2 >::Type
569 , INVALID_TYPE >::Type Type;