22 #ifndef _BLAZE_MATH_EXPRESSIONS_DVECSCALARMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_DVECSCALARMULTEXPR_H_
94 typedef typename VT::ResultType
RT;
95 typedef typename VT::ReturnType
RN;
96 typedef typename VT::ElementType
ET;
97 typedef typename VT::CompositeType
CT;
125 template<
typename VT2 >
127 enum { value = useAssign };
155 enum { vectorizable = VT::vectorizable &&
236 template<
typename T >
238 return vector_.canAlias( alias );
248 template<
typename T >
250 return vector_.isAliased( alias );
274 template<
typename VT2 >
285 for(
size_t i=0UL; i<
size; ++i )
305 template<
typename VT2 >
315 typename VT2::Iterator begin( (~lhs).begin() );
316 const typename VT2::Iterator end( (~lhs).end() );
318 for( ; begin!=end; ++begin )
338 template<
typename VT2 >
339 friend inline typename EnableIf< UseAssign<VT2> >::Type
374 template<
typename VT2 >
375 friend inline typename EnableIf< UseAssign<VT2> >::Type
410 template<
typename VT2 >
411 friend inline typename EnableIf< UseAssign<VT2> >::Type
469 template<
typename VT
471 inline const DVecScalarMultExpr<VT,typename BaseElementType<VT>::Type,TF>
512 template<
typename T1
515 inline const typename EnableIf< IsNumeric<T2>,
typename MultExprTrait<T1,T2>::Type >::Type
521 return Type( ~vec, scalar );
548 template<
typename T1
551 inline const typename EnableIf< IsNumeric<T1>,
typename MultExprTrait<T1,T2>::Type >::Type
557 return Type( ~vec, scalar );
588 template<
typename VT
590 inline const DVecScalarMultExpr<VT,typename VT::ElementType,TF>
593 typedef typename VT::ElementType ElementType;
597 const ElementType len (
length( ~vec ) );
598 const ElementType ilen( ( len != ElementType(0) )?( ElementType(1) / len ):( 0 ) );
625 template<
typename VT
628 inline const DVecScalarMultExpr<VT,ST,TF>
629 operator-(
const DVecScalarMultExpr<VT,ST,TF>& dv )
633 return DVecScalarMultExpr<VT,ST,TF>( dv.leftOperand(), -dv.rightOperand() );
660 template<
typename VT
664 inline const typename EnableIf< IsNumeric<ST2>
665 ,
typename MultExprTrait< DVecScalarMultExpr<VT,ST1,TF>, ST2 >::Type >::Type
666 operator*(
const DVecScalarMultExpr<VT,ST1,TF>& vec, ST2 scalar )
670 return vec.leftOperand() * ( vec.rightOperand() * scalar );
689 template<
typename ST1
693 inline const typename EnableIf< IsNumeric<ST1>
694 ,
typename MultExprTrait< ST1, DVecScalarMultExpr<VT,ST2,TF> >::Type >::Type
695 operator*( ST1 scalar,
const DVecScalarMultExpr<VT,ST2,TF>& vec )
699 return vec.leftOperand() * ( scalar * vec.rightOperand() );
718 template<
typename VT
722 inline const typename EnableIf< IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>
723 ,
typename DivExprTrait< DVecScalarMultExpr<VT,ST1,TF>, ST2 >::Type >::Type
724 operator/(
const DVecScalarMultExpr<VT,ST1,TF>& vec, ST2 scalar )
728 return vec.leftOperand() * ( vec.rightOperand() / scalar );
748 template<
typename VT1
752 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST,TF>, VT2 >::Type
753 operator*(
const DVecScalarMultExpr<VT1,ST,TF>& lhs,
const DenseVector<VT2,TF>& rhs )
757 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
777 template<
typename VT1
781 inline const typename MultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,TF> >::Type
782 operator*(
const DenseVector<VT1,TF>& lhs,
const DVecScalarMultExpr<VT2,ST,TF>& rhs )
786 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
806 template<
typename VT1
811 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST1,TF>, DVecScalarMultExpr<VT2,ST2,TF> >::Type
812 operator*(
const DVecScalarMultExpr<VT1,ST1,TF>& lhs,
const DVecScalarMultExpr<VT2,ST2,TF>& rhs )
816 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
836 template<
typename VT1
839 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >::Type
840 operator*(
const DVecScalarMultExpr<VT1,ST,false>& lhs,
const DenseVector<VT2,true>& rhs )
844 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
864 template<
typename VT1
867 inline const typename MultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >::Type
868 operator*(
const DenseVector<VT1,false>& lhs,
const DVecScalarMultExpr<VT2,ST,true>& rhs )
872 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
892 template<
typename VT1
896 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,true> >::Type
897 operator*(
const DVecScalarMultExpr<VT1,ST1,false>& lhs,
const DVecScalarMultExpr<VT2,ST2,true>& rhs )
901 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
921 template<
typename VT1
925 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST,TF>, VT2 >::Type
926 operator*(
const DVecScalarMultExpr<VT1,ST,TF>& lhs,
const SparseVector<VT2,TF>& rhs )
930 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
950 template<
typename VT1
954 inline const typename MultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,TF> >::Type
955 operator*(
const SparseVector<VT1,TF>& lhs,
const DVecScalarMultExpr<VT2,ST,TF>& rhs )
959 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
980 template<
typename VT1
985 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST1,TF>, SVecScalarMultExpr<VT2,ST2,TF> >::Type
986 operator*(
const DVecScalarMultExpr<VT1,ST1,TF>& lhs,
const SVecScalarMultExpr<VT2,ST2,TF>& rhs )
990 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1011 template<
typename VT1
1016 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST1,TF>, DVecScalarMultExpr<VT2,ST2,TF> >::Type
1017 operator*(
const SVecScalarMultExpr<VT1,ST1,TF>& lhs,
const DVecScalarMultExpr<VT2,ST2,TF>& rhs )
1021 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1041 template<
typename VT1
1044 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >::Type
1045 operator*(
const DVecScalarMultExpr<VT1,ST,false>& lhs,
const SparseVector<VT2,true>& rhs )
1049 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1069 template<
typename VT1
1072 inline const typename MultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >::Type
1073 operator*(
const SparseVector<VT1,false>& lhs,
const DVecScalarMultExpr<VT2,ST,true>& rhs )
1077 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1098 template<
typename VT1
1102 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,true> >::Type
1103 operator*(
const DVecScalarMultExpr<VT1,ST1,false>& lhs,
const SVecScalarMultExpr<VT2,ST2,true>& rhs )
1107 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1128 template<
typename VT1
1132 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,true> >::Type
1133 operator*(
const SVecScalarMultExpr<VT1,ST1,false>& lhs,
const DVecScalarMultExpr<VT2,ST2,true>& rhs )
1137 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1157 template<
typename MT
1161 inline const typename MultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >::Type
1162 operator*(
const DenseMatrix<MT,SO>& mat,
const DVecScalarMultExpr<VT,ST,false>& vec )
1166 return ( (~mat) * vec.leftOperand() ) * vec.rightOperand();
1186 template<
typename VT
1190 inline const typename MultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >::Type
1191 operator*(
const DVecScalarMultExpr<VT,ST,true>& vec,
const DenseMatrix<MT,SO>& mat )
1195 return ( vec.leftOperand() * (~mat) ) * vec.rightOperand();
1215 template<
typename MT
1219 inline const typename MultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >::Type
1220 operator*(
const SparseMatrix<MT,SO>& mat,
const DVecScalarMultExpr<VT,ST,false>& vec )
1224 return ( (~mat) * vec.leftOperand() ) * vec.rightOperand();
1244 template<
typename VT
1248 inline const typename MultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >::Type
1249 operator*(
const DVecScalarMultExpr<VT,ST,true>& vec,
const SparseMatrix<MT,SO>& mat )
1253 return ( vec.leftOperand() * (~mat) ) * vec.rightOperand();
1269 template<
typename VT,
typename ST1,
typename ST2 >
1270 struct DVecScalarMultExprTrait< DVecScalarMultExpr<VT,ST1,false>, ST2 >
1274 typedef typename SelectType< IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1275 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1276 ,
typename DVecScalarMultExprTrait<VT,typename MultTrait<ST1,ST2>::Type>::Type
1277 , INVALID_TYPE >::Type Type;
1294 template<
typename VT,
typename ST1,
typename ST2 >
1295 struct TDVecScalarMultExprTrait< DVecScalarMultExpr<VT,ST1,true>, ST2 >
1299 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1300 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1301 ,
typename TDVecScalarMultExprTrait<VT,typename MultTrait<ST1,ST2>::Type>::Type
1302 , INVALID_TYPE >::Type Type;
1319 template<
typename VT,
typename ST1,
typename ST2 >
1320 struct DVecScalarDivExprTrait< DVecScalarMultExpr<VT,ST1,false>, ST2 >
1324 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1328 typedef typename DVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1329 typedef typename DVecScalarDivExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1334 typedef typename SelectType< IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1335 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1336 ,
typename SelectType<condition,T1,T2>::Type
1337 , INVALID_TYPE >::Type Type;
1354 template<
typename VT,
typename ST1,
typename ST2 >
1355 struct TDVecScalarDivExprTrait< DVecScalarMultExpr<VT,ST1,true>, ST2 >
1359 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1363 typedef typename TDVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1364 typedef typename TDVecScalarDivExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1369 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1370 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1371 ,
typename SelectType<condition,T1,T2>::Type
1372 , INVALID_TYPE >::Type Type;
1389 template<
typename VT1,
typename ST,
typename VT2 >
1390 struct DVecDVecMultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >
1394 typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1395 IsDenseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1396 IsNumeric<ST>::value
1397 ,
typename DVecScalarMultExprTrait<typename DVecDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1398 , INVALID_TYPE >::Type Type;
1407 template<
typename VT1,
typename VT2,
typename ST >
1408 struct DVecDVecMultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,false> >
1412 typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1413 IsDenseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1414 IsNumeric<ST>::value
1415 ,
typename DVecScalarMultExprTrait<typename DVecDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1416 , INVALID_TYPE >::Type Type;
1425 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1426 struct DVecDVecMultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,false> >
1430 typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1431 IsDenseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1432 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1433 ,
typename DVecScalarMultExprTrait<typename DVecDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1434 , INVALID_TYPE >::Type Type;
1451 template<
typename VT1,
typename ST,
typename VT2 >
1452 struct DVecTDVecMultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >
1456 typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1457 IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1458 IsNumeric<ST>::value
1459 ,
typename DMatScalarMultExprTrait<typename DVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1460 , INVALID_TYPE >::Type Type;
1469 template<
typename VT1,
typename VT2,
typename ST >
1470 struct DVecTDVecMultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >
1474 typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1475 IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1476 IsNumeric<ST>::value
1477 ,
typename DMatScalarMultExprTrait<typename DVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1478 , INVALID_TYPE >::Type Type;
1487 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1488 struct DVecTDVecMultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,true> >
1492 typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1493 IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1494 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1495 ,
typename DMatScalarMultExprTrait<typename DVecTDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1496 , INVALID_TYPE >::Type Type;
1513 template<
typename VT1,
typename ST,
typename VT2 >
1514 struct TDVecTDVecMultExprTrait< DVecScalarMultExpr<VT1,ST,true>, VT2 >
1518 typedef typename SelectType< IsDenseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1519 IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1520 IsNumeric<ST>::value
1521 ,
typename TDVecScalarMultExprTrait<typename TDVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1522 , INVALID_TYPE >::Type Type;
1531 template<
typename VT1,
typename VT2,
typename ST >
1532 struct TDVecTDVecMultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >
1536 typedef typename SelectType< IsDenseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1537 IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1538 IsNumeric<ST>::value
1539 ,
typename TDVecScalarMultExprTrait<typename TDVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1540 , INVALID_TYPE >::Type Type;
1549 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1550 struct TDVecTDVecMultExprTrait< DVecScalarMultExpr<VT1,ST1,true>, DVecScalarMultExpr<VT2,ST2,true> >
1554 typedef typename SelectType< IsDenseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1555 IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1556 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1557 ,
typename TDVecScalarMultExprTrait<typename TDVecTDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1558 , INVALID_TYPE >::Type Type;
1575 template<
typename VT1,
typename VT2,
typename ST >
1576 struct DVecSVecMultExprTrait< 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 SVecScalarMultExprTrait<typename DVecSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1584 , INVALID_TYPE >::Type Type;
1593 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1594 struct DVecSVecMultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,false> >
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 SVecScalarMultExprTrait<typename DVecSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1602 , INVALID_TYPE >::Type Type;
1619 template<
typename VT1,
typename ST,
typename VT2 >
1620 struct DVecTSVecMultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >
1624 typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1625 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1626 IsNumeric<ST>::value
1627 ,
typename SMatScalarMultExprTrait<typename DVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1628 , INVALID_TYPE >::Type Type;
1637 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1638 struct DVecTSVecMultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, 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 SMatScalarMultExprTrait<typename DVecTSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1646 , INVALID_TYPE >::Type Type;
1663 template<
typename VT1,
typename ST,
typename VT2 >
1664 struct TDVecTSVecMultExprTrait< DVecScalarMultExpr<VT1,ST,true>, VT2 >
1668 typedef typename SelectType< IsDenseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1669 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1670 IsNumeric<ST>::value
1671 ,
typename TSVecScalarMultExprTrait<typename TDVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1672 , INVALID_TYPE >::Type Type;
1681 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1682 struct TDVecTSVecMultExprTrait< DVecScalarMultExpr<VT1,ST1,true>, SVecScalarMultExpr<VT2,ST2,true> >
1686 typedef typename SelectType< IsDenseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1687 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1688 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1689 ,
typename TSVecScalarMultExprTrait<typename TDVecTSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1690 , INVALID_TYPE >::Type Type;
1707 template<
typename VT1,
typename VT2,
typename ST >
1708 struct SVecDVecMultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,false> >
1712 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1713 IsDenseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1714 IsNumeric<ST>::value
1715 ,
typename SVecScalarMultExprTrait<typename SVecDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1716 , INVALID_TYPE >::Type Type;
1725 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1726 struct SVecDVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,false> >
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 SVecScalarMultExprTrait<typename SVecDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1734 , INVALID_TYPE >::Type Type;
1751 template<
typename VT1,
typename VT2,
typename ST >
1752 struct SVecTDVecMultExprTrait< 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 TSMatScalarMultExprTrait<typename SVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1760 , INVALID_TYPE >::Type Type;
1769 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1770 struct SVecTDVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,false>, 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 TSMatScalarMultExprTrait<typename SVecTDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1778 , INVALID_TYPE >::Type Type;
1795 template<
typename VT1,
typename VT2,
typename ST >
1796 struct TSVecTDVecMultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >
1800 typedef typename SelectType< IsSparseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1801 IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1802 IsNumeric<ST>::value
1803 ,
typename TSVecScalarMultExprTrait<typename TSVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1804 , INVALID_TYPE >::Type Type;
1813 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1814 struct TSVecTDVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,true>, DVecScalarMultExpr<VT2,ST2,true> >
1818 typedef typename SelectType< IsSparseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1819 IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1820 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1821 ,
typename TSVecScalarMultExprTrait<typename TSVecTDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1822 , INVALID_TYPE >::Type Type;
1839 template<
typename MT,
typename VT,
typename ST >
1840 struct DMatDVecMultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >
1844 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1845 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1846 IsNumeric<ST>::value
1847 ,
typename DVecScalarMultExprTrait<typename DMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
1848 , INVALID_TYPE >::Type Type;
1865 template<
typename MT,
typename VT,
typename ST >
1866 struct TDMatDVecMultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >
1870 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1871 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1872 IsNumeric<ST>::value
1873 ,
typename DVecScalarMultExprTrait<typename TDMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
1874 , INVALID_TYPE >::Type Type;
1891 template<
typename VT,
typename MT,
typename ST >
1892 struct TDVecDMatMultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >
1896 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1897 IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1898 IsNumeric<ST>::value
1899 ,
typename TDVecScalarMultExprTrait<typename TDVecDMatMultExprTrait<VT,MT>::Type,ST>::Type
1900 , INVALID_TYPE >::Type Type;
1917 template<
typename VT,
typename MT,
typename ST >
1918 struct TDVecTDMatMultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >
1922 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1923 IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1924 IsNumeric<ST>::value
1925 ,
typename TDVecScalarMultExprTrait<typename TDVecTDMatMultExprTrait<VT,MT>::Type,ST>::Type
1926 , INVALID_TYPE >::Type Type;
1943 template<
typename MT,
typename VT,
typename ST >
1944 struct SMatDVecMultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >
1948 typedef typename SelectType< IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1949 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1950 IsNumeric<ST>::value
1951 ,
typename DVecScalarMultExprTrait<typename SMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
1952 , INVALID_TYPE >::Type Type;
1969 template<
typename MT,
typename VT,
typename ST >
1970 struct TSMatDVecMultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >
1974 typedef typename SelectType< IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1975 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1976 IsNumeric<ST>::value
1977 ,
typename DVecScalarMultExprTrait<typename TSMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
1978 , INVALID_TYPE >::Type Type;
1995 template<
typename VT,
typename MT,
typename ST >
1996 struct TDVecSMatMultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >
2000 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
2001 IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
2002 IsNumeric<ST>::value
2003 ,
typename TDVecScalarMultExprTrait<typename TDVecSMatMultExprTrait<VT,MT>::Type,ST>::Type
2004 , INVALID_TYPE >::Type Type;
2021 template<
typename VT,
typename MT,
typename ST >
2022 struct TDVecTSMatMultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >
2026 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
2027 IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
2028 IsNumeric<ST>::value
2029 ,
typename TDVecScalarMultExprTrait<typename TDVecTSMatMultExprTrait<VT,MT>::Type,ST>::Type
2030 , INVALID_TYPE >::Type Type;