22 #ifndef _BLAZE_MATH_EXPRESSIONS_DVECSCALARMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_DVECSCALARMULTEXPR_H_
93 typedef typename VT::ResultType
RT;
94 typedef typename VT::ReturnType
RN;
95 typedef typename VT::ElementType
ET;
96 typedef typename VT::CompositeType
CT;
124 template<
typename VT2 >
126 enum { value = useAssign };
154 enum { vectorizable = VT::vectorizable &&
235 template<
typename T >
237 return vector_.canAlias( alias );
247 template<
typename T >
249 return vector_.isAliased( alias );
273 template<
typename VT2 >
284 for(
size_t i=0UL; i<
size; ++i )
304 template<
typename VT2 >
314 typename VT2::Iterator begin( (~lhs).begin() );
315 const typename VT2::Iterator end( (~lhs).end() );
317 for( ; begin!=end; ++begin )
337 template<
typename VT2 >
338 friend inline typename EnableIf< UseAssign<VT2> >::Type
373 template<
typename VT2 >
374 friend inline typename EnableIf< UseAssign<VT2> >::Type
409 template<
typename VT2 >
410 friend inline typename EnableIf< UseAssign<VT2> >::Type
468 template<
typename VT
470 inline const DVecScalarMultExpr<VT,typename BaseElementType<VT>::Type,TF>
511 template<
typename T1
514 inline const typename EnableIf< IsNumeric<T2>,
typename MultExprTrait<T1,T2>::Type >::Type
520 return Type( ~vec, scalar );
547 template<
typename T1
550 inline const typename EnableIf< IsNumeric<T1>,
typename MultExprTrait<T1,T2>::Type >::Type
556 return Type( ~vec, scalar );
581 template<
typename VT
584 inline const DVecScalarMultExpr<VT,ST,TF>
585 operator-(
const DVecScalarMultExpr<VT,ST,TF>& dv )
589 return DVecScalarMultExpr<VT,ST,TF>( dv.leftOperand(), -dv.rightOperand() );
616 template<
typename VT
620 inline const typename EnableIf< IsNumeric<ST2>
621 ,
typename MultExprTrait< DVecScalarMultExpr<VT,ST1,TF>, ST2 >::Type >::Type
622 operator*(
const DVecScalarMultExpr<VT,ST1,TF>& vec, ST2 scalar )
626 return vec.leftOperand() * ( vec.rightOperand() * scalar );
645 template<
typename ST1
649 inline const typename EnableIf< IsNumeric<ST1>
650 ,
typename MultExprTrait< ST1, DVecScalarMultExpr<VT,ST2,TF> >::Type >::Type
651 operator*( ST1 scalar,
const DVecScalarMultExpr<VT,ST2,TF>& vec )
655 return vec.leftOperand() * ( scalar * vec.rightOperand() );
674 template<
typename VT
678 inline const typename EnableIf< IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>
679 ,
typename DivExprTrait< DVecScalarMultExpr<VT,ST1,TF>, ST2 >::Type >::Type
680 operator/(
const DVecScalarMultExpr<VT,ST1,TF>& vec, ST2 scalar )
684 return vec.leftOperand() * ( vec.rightOperand() / scalar );
704 template<
typename VT1
708 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST,TF>, VT2 >::Type
709 operator*(
const DVecScalarMultExpr<VT1,ST,TF>& lhs,
const DenseVector<VT2,TF>& rhs )
713 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
733 template<
typename VT1
737 inline const typename MultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,TF> >::Type
738 operator*(
const DenseVector<VT1,TF>& lhs,
const DVecScalarMultExpr<VT2,ST,TF>& rhs )
742 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
762 template<
typename VT1
767 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST1,TF>, DVecScalarMultExpr<VT2,ST2,TF> >::Type
768 operator*(
const DVecScalarMultExpr<VT1,ST1,TF>& lhs,
const DVecScalarMultExpr<VT2,ST2,TF>& rhs )
772 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
792 template<
typename VT1
795 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >::Type
796 operator*(
const DVecScalarMultExpr<VT1,ST,false>& lhs,
const DenseVector<VT2,true>& rhs )
800 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
820 template<
typename VT1
823 inline const typename MultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >::Type
824 operator*(
const DenseVector<VT1,false>& lhs,
const DVecScalarMultExpr<VT2,ST,true>& rhs )
828 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
848 template<
typename VT1
852 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,true> >::Type
853 operator*(
const DVecScalarMultExpr<VT1,ST1,false>& lhs,
const DVecScalarMultExpr<VT2,ST2,true>& rhs )
857 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
877 template<
typename VT1
881 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST,TF>, VT2 >::Type
882 operator*(
const DVecScalarMultExpr<VT1,ST,TF>& lhs,
const SparseVector<VT2,TF>& rhs )
886 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
906 template<
typename VT1
910 inline const typename MultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,TF> >::Type
911 operator*(
const SparseVector<VT1,TF>& lhs,
const DVecScalarMultExpr<VT2,ST,TF>& rhs )
915 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
936 template<
typename VT1
941 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST1,TF>, SVecScalarMultExpr<VT2,ST2,TF> >::Type
942 operator*(
const DVecScalarMultExpr<VT1,ST1,TF>& lhs,
const SVecScalarMultExpr<VT2,ST2,TF>& rhs )
946 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
967 template<
typename VT1
972 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST1,TF>, DVecScalarMultExpr<VT2,ST2,TF> >::Type
973 operator*(
const SVecScalarMultExpr<VT1,ST1,TF>& lhs,
const DVecScalarMultExpr<VT2,ST2,TF>& rhs )
977 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
997 template<
typename VT1
1000 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >::Type
1001 operator*(
const DVecScalarMultExpr<VT1,ST,false>& lhs,
const SparseVector<VT2,true>& rhs )
1005 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1025 template<
typename VT1
1028 inline const typename MultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >::Type
1029 operator*(
const SparseVector<VT1,false>& lhs,
const DVecScalarMultExpr<VT2,ST,true>& rhs )
1033 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1054 template<
typename VT1
1058 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,true> >::Type
1059 operator*(
const DVecScalarMultExpr<VT1,ST1,false>& lhs,
const SVecScalarMultExpr<VT2,ST2,true>& rhs )
1063 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1084 template<
typename VT1
1088 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,true> >::Type
1089 operator*(
const SVecScalarMultExpr<VT1,ST1,false>& lhs,
const DVecScalarMultExpr<VT2,ST2,true>& rhs )
1093 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1113 template<
typename MT
1117 inline const typename MultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >::Type
1118 operator*(
const DenseMatrix<MT,SO>& mat,
const DVecScalarMultExpr<VT,ST,false>& vec )
1122 return ( (~mat) * vec.leftOperand() ) * vec.rightOperand();
1142 template<
typename VT
1146 inline const typename MultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >::Type
1147 operator*(
const DVecScalarMultExpr<VT,ST,true>& vec,
const DenseMatrix<MT,SO>& mat )
1151 return ( vec.leftOperand() * (~mat) ) * vec.rightOperand();
1171 template<
typename MT
1175 inline const typename MultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >::Type
1176 operator*(
const SparseMatrix<MT,SO>& mat,
const DVecScalarMultExpr<VT,ST,false>& vec )
1180 return ( (~mat) * vec.leftOperand() ) * vec.rightOperand();
1200 template<
typename VT
1204 inline const typename MultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >::Type
1205 operator*(
const DVecScalarMultExpr<VT,ST,true>& vec,
const SparseMatrix<MT,SO>& mat )
1209 return ( vec.leftOperand() * (~mat) ) * vec.rightOperand();
1225 template<
typename VT,
typename ST1,
typename ST2 >
1226 struct DVecScalarMultExprTrait< DVecScalarMultExpr<VT,ST1,false>, ST2 >
1230 typedef typename SelectType< IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1231 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1232 ,
typename DVecScalarMultExprTrait<VT,typename MultTrait<ST1,ST2>::Type>::Type
1233 , INVALID_TYPE >::Type Type;
1250 template<
typename VT,
typename ST1,
typename ST2 >
1251 struct TDVecScalarMultExprTrait< DVecScalarMultExpr<VT,ST1,true>, ST2 >
1255 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1256 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1257 ,
typename TDVecScalarMultExprTrait<VT,typename MultTrait<ST1,ST2>::Type>::Type
1258 , INVALID_TYPE >::Type Type;
1275 template<
typename VT,
typename ST1,
typename ST2 >
1276 struct DVecScalarDivExprTrait< DVecScalarMultExpr<VT,ST1,false>, ST2 >
1280 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1284 typedef typename DVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1285 typedef typename DVecScalarDivExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1290 typedef typename SelectType< IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1291 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1292 ,
typename SelectType<condition,T1,T2>::Type
1293 , INVALID_TYPE >::Type Type;
1310 template<
typename VT,
typename ST1,
typename ST2 >
1311 struct TDVecScalarDivExprTrait< DVecScalarMultExpr<VT,ST1,true>, ST2 >
1315 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1319 typedef typename TDVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1320 typedef typename TDVecScalarDivExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1325 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1326 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1327 ,
typename SelectType<condition,T1,T2>::Type
1328 , INVALID_TYPE >::Type Type;
1345 template<
typename VT1,
typename ST,
typename VT2 >
1346 struct DVecDVecMultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >
1350 typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1351 IsDenseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1352 IsNumeric<ST>::value
1353 ,
typename DVecScalarMultExprTrait<typename DVecDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1354 , INVALID_TYPE >::Type Type;
1363 template<
typename VT1,
typename VT2,
typename ST >
1364 struct DVecDVecMultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,false> >
1368 typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1369 IsDenseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1370 IsNumeric<ST>::value
1371 ,
typename DVecScalarMultExprTrait<typename DVecDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1372 , INVALID_TYPE >::Type Type;
1381 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1382 struct DVecDVecMultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,false> >
1386 typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1387 IsDenseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1388 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1389 ,
typename DVecScalarMultExprTrait<typename DVecDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1390 , INVALID_TYPE >::Type Type;
1407 template<
typename VT1,
typename ST,
typename VT2 >
1408 struct DVecTDVecMultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >
1412 typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1413 IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1414 IsNumeric<ST>::value
1415 ,
typename DMatScalarMultExprTrait<typename DVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1416 , INVALID_TYPE >::Type Type;
1425 template<
typename VT1,
typename VT2,
typename ST >
1426 struct DVecTDVecMultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >
1430 typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1431 IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1432 IsNumeric<ST>::value
1433 ,
typename DMatScalarMultExprTrait<typename DVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1434 , INVALID_TYPE >::Type Type;
1443 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1444 struct DVecTDVecMultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,true> >
1448 typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1449 IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1450 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1451 ,
typename DMatScalarMultExprTrait<typename DVecTDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1452 , INVALID_TYPE >::Type Type;
1469 template<
typename VT1,
typename ST,
typename VT2 >
1470 struct TDVecTDVecMultExprTrait< DVecScalarMultExpr<VT1,ST,true>, VT2 >
1474 typedef typename SelectType< IsDenseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1475 IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1476 IsNumeric<ST>::value
1477 ,
typename TDVecScalarMultExprTrait<typename TDVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1478 , INVALID_TYPE >::Type Type;
1487 template<
typename VT1,
typename VT2,
typename ST >
1488 struct TDVecTDVecMultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >
1492 typedef typename SelectType< IsDenseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1493 IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1494 IsNumeric<ST>::value
1495 ,
typename TDVecScalarMultExprTrait<typename TDVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1496 , INVALID_TYPE >::Type Type;
1505 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1506 struct TDVecTDVecMultExprTrait< DVecScalarMultExpr<VT1,ST1,true>, DVecScalarMultExpr<VT2,ST2,true> >
1510 typedef typename SelectType< IsDenseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1511 IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1512 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1513 ,
typename TDVecScalarMultExprTrait<typename TDVecTDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1514 , INVALID_TYPE >::Type Type;
1531 template<
typename VT1,
typename VT2,
typename ST >
1532 struct DVecSVecMultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >
1536 typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1537 IsSparseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1538 IsNumeric<ST>::value
1539 ,
typename SVecScalarMultExprTrait<typename DVecSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1540 , INVALID_TYPE >::Type Type;
1549 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1550 struct DVecSVecMultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,false> >
1554 typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1555 IsSparseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1556 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1557 ,
typename SVecScalarMultExprTrait<typename DVecSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1558 , INVALID_TYPE >::Type Type;
1575 template<
typename VT1,
typename ST,
typename VT2 >
1576 struct DVecTSVecMultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >
1580 typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1581 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1582 IsNumeric<ST>::value
1583 ,
typename SMatScalarMultExprTrait<typename DVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1584 , INVALID_TYPE >::Type Type;
1593 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1594 struct DVecTSVecMultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,true> >
1598 typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1599 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1600 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1601 ,
typename SMatScalarMultExprTrait<typename DVecTSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1602 , INVALID_TYPE >::Type Type;
1619 template<
typename VT1,
typename ST,
typename VT2 >
1620 struct TDVecTSVecMultExprTrait< DVecScalarMultExpr<VT1,ST,true>, VT2 >
1624 typedef typename SelectType< IsDenseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1625 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1626 IsNumeric<ST>::value
1627 ,
typename TSVecScalarMultExprTrait<typename TDVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1628 , INVALID_TYPE >::Type Type;
1637 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1638 struct TDVecTSVecMultExprTrait< DVecScalarMultExpr<VT1,ST1,true>, SVecScalarMultExpr<VT2,ST2,true> >
1642 typedef typename SelectType< IsDenseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1643 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1644 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1645 ,
typename TSVecScalarMultExprTrait<typename TDVecTSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1646 , INVALID_TYPE >::Type Type;
1663 template<
typename VT1,
typename VT2,
typename ST >
1664 struct SVecDVecMultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,false> >
1668 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1669 IsDenseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1670 IsNumeric<ST>::value
1671 ,
typename SVecScalarMultExprTrait<typename SVecDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1672 , INVALID_TYPE >::Type Type;
1681 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1682 struct SVecDVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,false> >
1686 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1687 IsDenseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1688 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1689 ,
typename SVecScalarMultExprTrait<typename SVecDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1690 , INVALID_TYPE >::Type Type;
1707 template<
typename VT1,
typename VT2,
typename ST >
1708 struct SVecTDVecMultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >
1712 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1713 IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1714 IsNumeric<ST>::value
1715 ,
typename TSMatScalarMultExprTrait<typename SVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1716 , INVALID_TYPE >::Type Type;
1725 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1726 struct SVecTDVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,true> >
1730 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1731 IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1732 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1733 ,
typename TSMatScalarMultExprTrait<typename SVecTDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1734 , INVALID_TYPE >::Type Type;
1751 template<
typename VT1,
typename VT2,
typename ST >
1752 struct TSVecTDVecMultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >
1756 typedef typename SelectType< IsSparseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1757 IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1758 IsNumeric<ST>::value
1759 ,
typename TSVecScalarMultExprTrait<typename TSVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1760 , INVALID_TYPE >::Type Type;
1769 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1770 struct TSVecTDVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,true>, DVecScalarMultExpr<VT2,ST2,true> >
1774 typedef typename SelectType< IsSparseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1775 IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1776 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1777 ,
typename TSVecScalarMultExprTrait<typename TSVecTDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1778 , INVALID_TYPE >::Type Type;
1795 template<
typename MT,
typename VT,
typename ST >
1796 struct DMatDVecMultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >
1800 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1801 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1802 IsNumeric<ST>::value
1803 ,
typename DVecScalarMultExprTrait<typename DMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
1804 , INVALID_TYPE >::Type Type;
1821 template<
typename MT,
typename VT,
typename ST >
1822 struct TDMatDVecMultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >
1826 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1827 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1828 IsNumeric<ST>::value
1829 ,
typename DVecScalarMultExprTrait<typename TDMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
1830 , INVALID_TYPE >::Type Type;
1847 template<
typename VT,
typename MT,
typename ST >
1848 struct TDVecDMatMultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >
1852 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1853 IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1854 IsNumeric<ST>::value
1855 ,
typename TDVecScalarMultExprTrait<typename TDVecDMatMultExprTrait<VT,MT>::Type,ST>::Type
1856 , INVALID_TYPE >::Type Type;
1873 template<
typename VT,
typename MT,
typename ST >
1874 struct TDVecTDMatMultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >
1878 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1879 IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1880 IsNumeric<ST>::value
1881 ,
typename TDVecScalarMultExprTrait<typename TDVecTDMatMultExprTrait<VT,MT>::Type,ST>::Type
1882 , INVALID_TYPE >::Type Type;
1899 template<
typename MT,
typename VT,
typename ST >
1900 struct SMatDVecMultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >
1904 typedef typename SelectType< IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1905 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1906 IsNumeric<ST>::value
1907 ,
typename DVecScalarMultExprTrait<typename SMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
1908 , INVALID_TYPE >::Type Type;
1925 template<
typename MT,
typename VT,
typename ST >
1926 struct TSMatDVecMultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >
1930 typedef typename SelectType< IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1931 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1932 IsNumeric<ST>::value
1933 ,
typename DVecScalarMultExprTrait<typename TSMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
1934 , INVALID_TYPE >::Type Type;
1951 template<
typename VT,
typename MT,
typename ST >
1952 struct TDVecSMatMultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >
1956 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1957 IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1958 IsNumeric<ST>::value
1959 ,
typename TDVecScalarMultExprTrait<typename TDVecSMatMultExprTrait<VT,MT>::Type,ST>::Type
1960 , INVALID_TYPE >::Type Type;
1977 template<
typename VT,
typename MT,
typename ST >
1978 struct TDVecTSMatMultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >
1982 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1983 IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1984 IsNumeric<ST>::value
1985 ,
typename TDVecScalarMultExprTrait<typename TDVecTSMatMultExprTrait<VT,MT>::Type,ST>::Type
1986 , INVALID_TYPE >::Type Type;