22 #ifndef _BLAZE_MATH_EXPRESSIONS_SVECSCALARMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_SVECSCALARMULTEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
86 class SVecScalarMultExpr :
public SparseVector< SVecScalarMultExpr<VT,ST,TF>, TF >
92 typedef typename VT::ResultType
RT;
93 typedef typename VT::ReturnType
RN;
94 typedef typename VT::CompositeType
CT;
122 template<
typename VT2 >
124 enum { value = useAssign };
160 typedef typename boost::remove_reference<LeftOperand>::type::ConstIterator
IteratorType;
367 template<
typename T >
369 return vector_.canAlias( alias );
379 template<
typename T >
381 return vector_.isAliased( alias );
405 template<
typename VT2 >
413 assign( ~lhs, rhs.vector_ );
415 const size_t size( rhs.size() );
416 for(
size_t i=0UL; i<
size; ++i )
417 (~lhs)[i] *= rhs.scalar_;
436 template<
typename VT2 >
444 assign( ~lhs, rhs.vector_ );
446 typename VT2::Iterator
begin( (~lhs).
begin() );
447 const typename VT2::Iterator
end( (~lhs).
end() );
469 template<
typename VT2 >
470 friend inline typename EnableIf< UseAssign<VT2> >::Type
505 template<
typename VT2 >
506 friend inline typename EnableIf< UseAssign<VT2> >::Type
541 template<
typename VT2 >
542 friend inline typename EnableIf< UseAssign<VT2> >::Type
600 template<
typename VT
602 inline const SVecScalarMultExpr<VT,typename BaseElementType<VT>::Type,TF>
642 template<
typename T1
645 inline const typename EnableIf< IsNumeric<T2>,
typename MultExprTrait<T1,T2>::Type >::Type
651 return Type( ~vec, scalar );
677 template<
typename T1
680 inline const typename EnableIf< IsNumeric<T1>,
typename MultExprTrait<T1,T2>::Type >::Type
686 return Type( ~vec, scalar );
711 template<
typename VT
714 inline const SVecScalarMultExpr<VT,ST,TF>
715 operator-(
const SVecScalarMultExpr<VT,ST,TF>& sv )
719 return SVecScalarMultExpr<VT,ST,TF>( sv.leftOperand(), -sv.rightOperand() );
746 template<
typename VT
750 inline const typename EnableIf< IsNumeric<ST2>
751 ,
typename MultExprTrait< SVecScalarMultExpr<VT,ST1,TF>, ST2 >::Type >::Type
752 operator*(
const SVecScalarMultExpr<VT,ST1,TF>& vec, ST2 scalar )
756 return vec.leftOperand() * ( vec.rightOperand() * scalar );
775 template<
typename ST1
779 inline const typename EnableIf< IsNumeric<ST1>
780 ,
typename MultExprTrait< ST1, SVecScalarMultExpr<VT,ST2,TF> >::Type >::Type
781 operator*( ST1 scalar,
const SVecScalarMultExpr<VT,ST2,TF>& vec )
785 return vec.leftOperand() * ( scalar * vec.rightOperand() );
804 template<
typename VT
808 inline const typename EnableIf< IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>
809 ,
typename DivExprTrait< SVecScalarMultExpr<VT,ST1,TF>, ST2 >::Type >::Type
810 operator/(
const SVecScalarMultExpr<VT,ST1,TF>& vec, ST2 scalar )
814 return vec.leftOperand() * ( vec.rightOperand() / scalar );
834 template<
typename VT1
838 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST,TF>, VT2 >::Type
839 operator*(
const SVecScalarMultExpr<VT1,ST,TF>& lhs,
const DenseVector<VT2,TF>& rhs )
843 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
863 template<
typename VT1
867 inline const typename MultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,TF> >::Type
868 operator*(
const DenseVector<VT1,TF>& lhs,
const SVecScalarMultExpr<VT2,ST,TF>& rhs )
872 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
892 template<
typename VT1
895 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST,false>, VT2 >::Type
896 operator*(
const SVecScalarMultExpr<VT1,ST,false>& lhs,
const DenseVector<VT2,true>& rhs )
900 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
920 template<
typename VT1
923 inline const typename MultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,true> >::Type
924 operator*(
const DenseVector<VT1,false>& lhs,
const SVecScalarMultExpr<VT2,ST,true>& rhs )
928 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
948 template<
typename VT1
952 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST,TF>, VT2 >::Type
953 operator*(
const SVecScalarMultExpr<VT1,ST,TF>& lhs,
const SparseVector<VT2,TF>& rhs )
957 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
977 template<
typename VT1
981 inline const typename MultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,TF> >::Type
982 operator*(
const SparseVector<VT1,TF>& lhs,
const SVecScalarMultExpr<VT2,ST,TF>& rhs )
986 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1006 template<
typename VT1
1011 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST1,TF>, SVecScalarMultExpr<VT2,ST2,TF> >::Type
1012 operator*(
const SVecScalarMultExpr<VT1,ST1,TF>& lhs,
const SVecScalarMultExpr<VT2,ST2,TF>& rhs )
1016 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1036 template<
typename VT1
1039 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST,false>, VT2 >::Type
1040 operator*(
const SVecScalarMultExpr<VT1,ST,false>& lhs,
const SparseVector<VT2,true>& rhs )
1044 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1064 template<
typename VT1
1067 inline const typename MultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,true> >::Type
1068 operator*(
const SparseVector<VT1,false>& lhs,
const SVecScalarMultExpr<VT2,ST,true>& rhs )
1072 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1092 template<
typename VT1
1096 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,true> >::Type
1097 operator*(
const SVecScalarMultExpr<VT1,ST1,false>& lhs,
const SVecScalarMultExpr<VT2,ST2,true>& rhs )
1101 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1121 template<
typename MT
1125 inline const typename MultExprTrait< MT, SVecScalarMultExpr<VT,ST,false> >::Type
1126 operator*(
const DenseMatrix<MT,SO>& mat,
const SVecScalarMultExpr<VT,ST,false>& vec )
1130 return ( (~mat) * vec.leftOperand() ) * vec.rightOperand();
1150 template<
typename VT
1154 inline const typename MultExprTrait< SVecScalarMultExpr<VT,ST,true>, MT >::Type
1155 operator*(
const SVecScalarMultExpr<VT,ST,true>& vec,
const DenseMatrix<MT,SO>& mat )
1159 return ( vec.leftOperand() * (~mat) ) * vec.rightOperand();
1179 template<
typename MT
1183 inline const typename MultExprTrait< MT, SVecScalarMultExpr<VT,ST,false> >::Type
1184 operator*(
const SparseMatrix<MT,SO>& mat,
const SVecScalarMultExpr<VT,ST,false>& vec )
1188 return ( (~mat) * vec.leftOperand() ) * vec.rightOperand();
1208 template<
typename VT
1212 inline const typename MultExprTrait< SVecScalarMultExpr<VT,ST,true>, MT >::Type
1213 operator*(
const SVecScalarMultExpr<VT,ST,true>& vec,
const SparseMatrix<MT,SO>& mat )
1217 return ( vec.leftOperand() * (~mat) ) * vec.rightOperand();
1233 template<
typename VT,
typename ST1,
typename ST2 >
1234 struct SVecScalarMultExprTrait< SVecScalarMultExpr<VT,ST1,false>, ST2 >
1238 typedef typename SelectType< IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1239 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1240 ,
typename SVecScalarMultExprTrait<VT,typename MultTrait<ST1,ST2>::Type>::Type
1241 , INVALID_TYPE >::Type Type;
1258 template<
typename VT,
typename ST1,
typename ST2 >
1259 struct TSVecScalarMultExprTrait< SVecScalarMultExpr<VT,ST1,true>, ST2 >
1263 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1264 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1265 ,
typename TSVecScalarMultExprTrait<VT,typename MultTrait<ST1,ST2>::Type>::Type
1266 , INVALID_TYPE >::Type Type;
1283 template<
typename VT,
typename ST1,
typename ST2 >
1284 struct SVecScalarDivExprTrait< SVecScalarMultExpr<VT,ST1,false>, ST2 >
1288 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1292 typedef typename SVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1293 typedef typename SVecScalarDivExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1298 typedef typename SelectType< IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1299 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1300 ,
typename SelectType<condition,T1,T2>::Type
1301 , INVALID_TYPE >::Type Type;
1318 template<
typename VT,
typename ST1,
typename ST2 >
1319 struct TSVecScalarDivExprTrait< SVecScalarMultExpr<VT,ST1,true>, ST2 >
1323 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1327 typedef typename TSVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1328 typedef typename TSVecScalarDivExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1333 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1334 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1335 ,
typename SelectType<condition,T1,T2>::Type
1336 , INVALID_TYPE >::Type Type;
1353 template<
typename VT1,
typename VT2,
typename ST >
1354 struct DVecSVecMultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,false> >
1358 typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1359 IsSparseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1360 IsNumeric<ST>::value
1361 ,
typename SVecScalarMultExprTrait<typename DVecSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1362 , INVALID_TYPE >::Type Type;
1379 template<
typename VT1,
typename VT2,
typename ST >
1380 struct DVecTSVecMultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,true> >
1384 typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1385 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1386 IsNumeric<ST>::value
1387 ,
typename SMatScalarMultExprTrait<typename DVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1388 , INVALID_TYPE >::Type Type;
1405 template<
typename VT1,
typename VT2,
typename ST >
1406 struct TDVecTSVecMultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,true> >
1410 typedef typename SelectType< IsDenseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1411 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1412 IsNumeric<ST>::value
1413 ,
typename TSVecScalarMultExprTrait<typename TDVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1414 , INVALID_TYPE >::Type Type;
1431 template<
typename VT1,
typename ST,
typename VT2 >
1432 struct SVecDVecMultExprTrait< SVecScalarMultExpr<VT1,ST,false>, VT2 >
1436 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1437 IsDenseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1438 IsNumeric<ST>::value
1439 ,
typename SVecScalarMultExprTrait<typename SVecDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1440 , INVALID_TYPE >::Type Type;
1457 template<
typename VT1,
typename ST,
typename VT2 >
1458 struct SVecTDVecMultExprTrait< SVecScalarMultExpr<VT1,ST,false>, VT2 >
1462 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1463 IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1464 IsNumeric<ST>::value
1465 ,
typename TSMatScalarMultExprTrait<typename SVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1466 , INVALID_TYPE >::Type Type;
1483 template<
typename VT1,
typename ST,
typename VT2 >
1484 struct TSVecTDVecMultExprTrait< SVecScalarMultExpr<VT1,ST,true>, VT2 >
1488 typedef typename SelectType< IsSparseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1489 IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1490 IsNumeric<ST>::value
1491 ,
typename TSVecScalarMultExprTrait<typename TSVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1492 , INVALID_TYPE >::Type Type;
1509 template<
typename VT1,
typename ST,
typename VT2 >
1510 struct SVecSVecMultExprTrait< SVecScalarMultExpr<VT1,ST,false>, VT2 >
1514 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1515 IsSparseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1516 IsNumeric<ST>::value
1517 ,
typename SVecScalarMultExprTrait<typename SVecSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1518 , INVALID_TYPE >::Type Type;
1527 template<
typename VT1,
typename VT2,
typename ST >
1528 struct SVecSVecMultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,false> >
1532 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1533 IsSparseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1534 IsNumeric<ST>::value
1535 ,
typename SVecScalarMultExprTrait<typename SVecSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1536 , INVALID_TYPE >::Type Type;
1545 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1546 struct SVecSVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,false> >
1550 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1551 IsSparseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1552 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1553 ,
typename SVecScalarMultExprTrait<typename SVecSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1554 , INVALID_TYPE >::Type Type;
1571 template<
typename VT1,
typename ST,
typename VT2 >
1572 struct SVecTSVecMultExprTrait< SVecScalarMultExpr<VT1,ST,false>, VT2 >
1576 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1577 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1578 IsNumeric<ST>::value
1579 ,
typename SMatScalarMultExprTrait<typename SVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1580 , INVALID_TYPE >::Type Type;
1589 template<
typename VT1,
typename VT2,
typename ST >
1590 struct SVecTSVecMultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,true> >
1594 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1595 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1596 IsNumeric<ST>::value
1597 ,
typename SMatScalarMultExprTrait<typename SVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1598 , INVALID_TYPE >::Type Type;
1607 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1608 struct SVecTSVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,true> >
1612 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1613 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1614 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1615 ,
typename SMatScalarMultExprTrait<typename SVecTSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1616 , INVALID_TYPE >::Type Type;
1633 template<
typename VT1,
typename ST,
typename VT2 >
1634 struct TSVecTSVecMultExprTrait< SVecScalarMultExpr<VT1,ST,true>, VT2 >
1638 typedef typename SelectType< IsSparseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1639 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1640 IsNumeric<ST>::value
1641 ,
typename TSVecScalarMultExprTrait<typename TSVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1642 , INVALID_TYPE >::Type Type;
1651 template<
typename VT1,
typename VT2,
typename ST >
1652 struct TSVecTSVecMultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,true> >
1656 typedef typename SelectType< IsSparseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1657 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1658 IsNumeric<ST>::value
1659 ,
typename TSVecScalarMultExprTrait<typename TSVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1660 , INVALID_TYPE >::Type Type;
1669 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1670 struct TSVecTSVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,true>, SVecScalarMultExpr<VT2,ST2,true> >
1674 typedef typename SelectType< IsSparseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1675 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1676 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1677 ,
typename TSVecScalarMultExprTrait<typename TSVecTSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1678 , INVALID_TYPE >::Type Type;
1695 template<
typename MT,
typename VT,
typename ST >
1696 struct DMatSVecMultExprTrait< MT, SVecScalarMultExpr<VT,ST,false> >
1700 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1701 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1702 IsNumeric<ST>::value
1703 ,
typename DVecScalarMultExprTrait<typename DMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1704 , INVALID_TYPE >::Type Type;
1721 template<
typename MT,
typename VT,
typename ST >
1722 struct TDMatSVecMultExprTrait< MT, SVecScalarMultExpr<VT,ST,false> >
1726 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1727 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1728 IsNumeric<ST>::value
1729 ,
typename DVecScalarMultExprTrait<typename TDMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1730 , INVALID_TYPE >::Type Type;
1747 template<
typename VT,
typename ST,
typename MT >
1748 struct TSVecDMatMultExprTrait< SVecScalarMultExpr<VT,ST,true>, MT >
1752 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1753 IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1754 IsNumeric<ST>::value
1755 ,
typename TDVecScalarMultExprTrait<typename TSVecDMatMultExprTrait<VT,MT>::Type,ST>::Type
1756 , INVALID_TYPE >::Type Type;
1773 template<
typename VT,
typename ST,
typename MT >
1774 struct TSVecTDMatMultExprTrait< SVecScalarMultExpr<VT,ST,true>, MT >
1778 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1779 IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1780 IsNumeric<ST>::value
1781 ,
typename TDVecScalarMultExprTrait<typename TSVecTDMatMultExprTrait<VT,MT>::Type,ST>::Type
1782 , INVALID_TYPE >::Type Type;
1799 template<
typename MT,
typename VT,
typename ST >
1800 struct SMatSVecMultExprTrait< MT, SVecScalarMultExpr<VT,ST,false> >
1804 typedef typename SelectType< IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1805 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1806 IsNumeric<ST>::value
1807 ,
typename SVecScalarMultExprTrait<typename SMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1808 , INVALID_TYPE >::Type Type;
1825 template<
typename MT,
typename VT,
typename ST >
1826 struct TSMatSVecMultExprTrait< MT, SVecScalarMultExpr<VT,ST,false> >
1830 typedef typename SelectType< IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1831 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1832 IsNumeric<ST>::value
1833 ,
typename SVecScalarMultExprTrait<typename TSMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1834 , INVALID_TYPE >::Type Type;
1851 template<
typename VT,
typename ST,
typename MT >
1852 struct TSVecSMatMultExprTrait< SVecScalarMultExpr<VT,ST,true>, MT >
1856 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1857 IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1858 IsNumeric<ST>::value
1859 ,
typename TSVecScalarMultExprTrait<typename TSVecSMatMultExprTrait<VT,MT>::Type,ST>::Type
1860 , INVALID_TYPE >::Type Type;
1877 template<
typename VT,
typename ST,
typename MT >
1878 struct TSVecTSMatMultExprTrait< SVecScalarMultExpr<VT,ST,true>, MT >
1882 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1883 IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1884 IsNumeric<ST>::value
1885 ,
typename TSVecScalarMultExprTrait<typename TSVecTSMatMultExprTrait<VT,MT>::Type,ST>::Type
1886 , INVALID_TYPE >::Type Type;