22 #ifndef _BLAZE_MATH_EXPRESSIONS_SVECSCALARMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_SVECSCALARMULTEXPR_H_
87 class SVecScalarMultExpr :
public SparseVector< SVecScalarMultExpr<VT,ST,TF>, TF >
88 ,
private VecScalarMultExpr
93 typedef typename VT::ResultType
RT;
94 typedef typename VT::ReturnType
RN;
95 typedef typename VT::CompositeType
CT;
123 template<
typename VT2 >
125 enum { value = useAssign };
368 template<
typename T >
370 return vector_.canAlias( alias );
380 template<
typename T >
382 return vector_.isAliased( alias );
406 template<
typename VT2 >
414 assign( ~lhs, rhs.vector_ );
416 const size_t size( rhs.size() );
417 for(
size_t i=0UL; i<
size; ++i )
418 (~lhs)[i] *= rhs.scalar_;
437 template<
typename VT2 >
445 assign( ~lhs, rhs.vector_ );
447 typename VT2::Iterator
begin( (~lhs).
begin() );
448 const typename VT2::Iterator
end( (~lhs).
end() );
470 template<
typename VT2 >
471 friend inline typename EnableIf< UseAssign<VT2> >::Type
506 template<
typename VT2 >
507 friend inline typename EnableIf< UseAssign<VT2> >::Type
542 template<
typename VT2 >
543 friend inline typename EnableIf< UseAssign<VT2> >::Type
601 template<
typename VT
603 inline const SVecScalarMultExpr<VT,typename BaseElementType<VT>::Type,TF>
643 template<
typename T1
646 inline const typename EnableIf< IsNumeric<T2>,
typename MultExprTrait<T1,T2>::Type >::Type
652 return Type( ~vec, scalar );
678 template<
typename T1
681 inline const typename EnableIf< IsNumeric<T1>,
typename MultExprTrait<T1,T2>::Type >::Type
687 return Type( ~vec, scalar );
718 template<
typename VT
720 inline const SVecScalarMultExpr<VT,typename VT::ElementType,TF>
723 typedef typename VT::ElementType ElementType;
727 const ElementType len (
length( ~vec ) );
728 const ElementType ilen( ( len != ElementType(0) )?( ElementType(1) / len ):( 0 ) );
755 template<
typename VT
758 inline const SVecScalarMultExpr<VT,ST,TF>
759 operator-(
const SVecScalarMultExpr<VT,ST,TF>& sv )
763 return SVecScalarMultExpr<VT,ST,TF>( sv.leftOperand(), -sv.rightOperand() );
790 template<
typename VT
794 inline const typename EnableIf< IsNumeric<ST2>
795 ,
typename MultExprTrait< SVecScalarMultExpr<VT,ST1,TF>, ST2 >::Type >::Type
796 operator*(
const SVecScalarMultExpr<VT,ST1,TF>& vec, ST2 scalar )
800 return vec.leftOperand() * ( vec.rightOperand() * scalar );
819 template<
typename ST1
823 inline const typename EnableIf< IsNumeric<ST1>
824 ,
typename MultExprTrait< ST1, SVecScalarMultExpr<VT,ST2,TF> >::Type >::Type
825 operator*( ST1 scalar,
const SVecScalarMultExpr<VT,ST2,TF>& vec )
829 return vec.leftOperand() * ( scalar * vec.rightOperand() );
848 template<
typename VT
852 inline const typename EnableIf< IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>
853 ,
typename DivExprTrait< SVecScalarMultExpr<VT,ST1,TF>, ST2 >::Type >::Type
854 operator/(
const SVecScalarMultExpr<VT,ST1,TF>& vec, ST2 scalar )
858 return vec.leftOperand() * ( vec.rightOperand() / scalar );
878 template<
typename VT1
882 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST,TF>, VT2 >::Type
883 operator*(
const SVecScalarMultExpr<VT1,ST,TF>& lhs,
const DenseVector<VT2,TF>& rhs )
887 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
907 template<
typename VT1
911 inline const typename MultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,TF> >::Type
912 operator*(
const DenseVector<VT1,TF>& lhs,
const SVecScalarMultExpr<VT2,ST,TF>& rhs )
916 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
936 template<
typename VT1
939 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST,false>, VT2 >::Type
940 operator*(
const SVecScalarMultExpr<VT1,ST,false>& lhs,
const DenseVector<VT2,true>& rhs )
944 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
964 template<
typename VT1
967 inline const typename MultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,true> >::Type
968 operator*(
const DenseVector<VT1,false>& lhs,
const SVecScalarMultExpr<VT2,ST,true>& rhs )
972 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
992 template<
typename VT1
996 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST,TF>, VT2 >::Type
997 operator*(
const SVecScalarMultExpr<VT1,ST,TF>& lhs,
const SparseVector<VT2,TF>& rhs )
1001 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1021 template<
typename VT1
1025 inline const typename MultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,TF> >::Type
1026 operator*(
const SparseVector<VT1,TF>& lhs,
const SVecScalarMultExpr<VT2,ST,TF>& rhs )
1030 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1050 template<
typename VT1
1055 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST1,TF>, SVecScalarMultExpr<VT2,ST2,TF> >::Type
1056 operator*(
const SVecScalarMultExpr<VT1,ST1,TF>& lhs,
const SVecScalarMultExpr<VT2,ST2,TF>& rhs )
1060 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1080 template<
typename VT1
1083 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST,false>, VT2 >::Type
1084 operator*(
const SVecScalarMultExpr<VT1,ST,false>& lhs,
const SparseVector<VT2,true>& rhs )
1088 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1108 template<
typename VT1
1111 inline const typename MultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,true> >::Type
1112 operator*(
const SparseVector<VT1,false>& lhs,
const SVecScalarMultExpr<VT2,ST,true>& rhs )
1116 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1136 template<
typename VT1
1140 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,true> >::Type
1141 operator*(
const SVecScalarMultExpr<VT1,ST1,false>& lhs,
const SVecScalarMultExpr<VT2,ST2,true>& rhs )
1145 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1165 template<
typename MT
1169 inline const typename MultExprTrait< MT, SVecScalarMultExpr<VT,ST,false> >::Type
1170 operator*(
const DenseMatrix<MT,SO>& mat,
const SVecScalarMultExpr<VT,ST,false>& vec )
1174 return ( (~mat) * vec.leftOperand() ) * vec.rightOperand();
1194 template<
typename VT
1198 inline const typename MultExprTrait< SVecScalarMultExpr<VT,ST,true>, MT >::Type
1199 operator*(
const SVecScalarMultExpr<VT,ST,true>& vec,
const DenseMatrix<MT,SO>& mat )
1203 return ( vec.leftOperand() * (~mat) ) * vec.rightOperand();
1223 template<
typename MT
1227 inline const typename MultExprTrait< MT, SVecScalarMultExpr<VT,ST,false> >::Type
1228 operator*(
const SparseMatrix<MT,SO>& mat,
const SVecScalarMultExpr<VT,ST,false>& vec )
1232 return ( (~mat) * vec.leftOperand() ) * vec.rightOperand();
1252 template<
typename VT
1256 inline const typename MultExprTrait< SVecScalarMultExpr<VT,ST,true>, MT >::Type
1257 operator*(
const SVecScalarMultExpr<VT,ST,true>& vec,
const SparseMatrix<MT,SO>& mat )
1261 return ( vec.leftOperand() * (~mat) ) * vec.rightOperand();
1277 template<
typename VT,
typename ST1,
typename ST2 >
1278 struct SVecScalarMultExprTrait< SVecScalarMultExpr<VT,ST1,false>, ST2 >
1282 typedef typename SelectType< IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1283 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1284 ,
typename SVecScalarMultExprTrait<VT,typename MultTrait<ST1,ST2>::Type>::Type
1285 , INVALID_TYPE >::Type Type;
1302 template<
typename VT,
typename ST1,
typename ST2 >
1303 struct TSVecScalarMultExprTrait< SVecScalarMultExpr<VT,ST1,true>, ST2 >
1307 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1308 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1309 ,
typename TSVecScalarMultExprTrait<VT,typename MultTrait<ST1,ST2>::Type>::Type
1310 , INVALID_TYPE >::Type Type;
1327 template<
typename VT,
typename ST1,
typename ST2 >
1328 struct SVecScalarDivExprTrait< SVecScalarMultExpr<VT,ST1,false>, ST2 >
1332 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1336 typedef typename SVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1337 typedef typename SVecScalarDivExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1342 typedef typename SelectType< IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1343 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1344 ,
typename SelectType<condition,T1,T2>::Type
1345 , INVALID_TYPE >::Type Type;
1362 template<
typename VT,
typename ST1,
typename ST2 >
1363 struct TSVecScalarDivExprTrait< SVecScalarMultExpr<VT,ST1,true>, ST2 >
1367 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1371 typedef typename TSVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1372 typedef typename TSVecScalarDivExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1377 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1378 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1379 ,
typename SelectType<condition,T1,T2>::Type
1380 , INVALID_TYPE >::Type Type;
1397 template<
typename VT1,
typename VT2,
typename ST >
1398 struct DVecSVecMultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,false> >
1402 typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1403 IsSparseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1404 IsNumeric<ST>::value
1405 ,
typename SVecScalarMultExprTrait<typename DVecSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1406 , INVALID_TYPE >::Type Type;
1423 template<
typename VT1,
typename VT2,
typename ST >
1424 struct DVecTSVecMultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,true> >
1428 typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1429 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1430 IsNumeric<ST>::value
1431 ,
typename SMatScalarMultExprTrait<typename DVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1432 , INVALID_TYPE >::Type Type;
1449 template<
typename VT1,
typename VT2,
typename ST >
1450 struct TDVecTSVecMultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,true> >
1454 typedef typename SelectType< IsDenseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1455 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1456 IsNumeric<ST>::value
1457 ,
typename TSVecScalarMultExprTrait<typename TDVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1458 , INVALID_TYPE >::Type Type;
1475 template<
typename VT1,
typename ST,
typename VT2 >
1476 struct SVecDVecMultExprTrait< SVecScalarMultExpr<VT1,ST,false>, VT2 >
1480 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1481 IsDenseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1482 IsNumeric<ST>::value
1483 ,
typename SVecScalarMultExprTrait<typename SVecDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1484 , INVALID_TYPE >::Type Type;
1501 template<
typename VT1,
typename ST,
typename VT2 >
1502 struct SVecTDVecMultExprTrait< SVecScalarMultExpr<VT1,ST,false>, VT2 >
1506 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1507 IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1508 IsNumeric<ST>::value
1509 ,
typename TSMatScalarMultExprTrait<typename SVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1510 , INVALID_TYPE >::Type Type;
1527 template<
typename VT1,
typename ST,
typename VT2 >
1528 struct TSVecTDVecMultExprTrait< SVecScalarMultExpr<VT1,ST,true>, VT2 >
1532 typedef typename SelectType< IsSparseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1533 IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1534 IsNumeric<ST>::value
1535 ,
typename TSVecScalarMultExprTrait<typename TSVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1536 , INVALID_TYPE >::Type Type;
1553 template<
typename VT1,
typename ST,
typename VT2 >
1554 struct SVecSVecMultExprTrait< SVecScalarMultExpr<VT1,ST,false>, VT2 >
1558 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1559 IsSparseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1560 IsNumeric<ST>::value
1561 ,
typename SVecScalarMultExprTrait<typename SVecSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1562 , INVALID_TYPE >::Type Type;
1571 template<
typename VT1,
typename VT2,
typename ST >
1572 struct SVecSVecMultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,false> >
1576 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1577 IsSparseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1578 IsNumeric<ST>::value
1579 ,
typename SVecScalarMultExprTrait<typename SVecSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1580 , INVALID_TYPE >::Type Type;
1589 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1590 struct SVecSVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,false> >
1594 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1595 IsSparseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1596 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1597 ,
typename SVecScalarMultExprTrait<typename SVecSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1598 , INVALID_TYPE >::Type Type;
1615 template<
typename VT1,
typename ST,
typename VT2 >
1616 struct SVecTSVecMultExprTrait< SVecScalarMultExpr<VT1,ST,false>, VT2 >
1620 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1621 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1622 IsNumeric<ST>::value
1623 ,
typename SMatScalarMultExprTrait<typename SVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1624 , INVALID_TYPE >::Type Type;
1633 template<
typename VT1,
typename VT2,
typename ST >
1634 struct SVecTSVecMultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,true> >
1638 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1639 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1640 IsNumeric<ST>::value
1641 ,
typename SMatScalarMultExprTrait<typename SVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1642 , INVALID_TYPE >::Type Type;
1651 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1652 struct SVecTSVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,true> >
1656 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1657 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1658 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1659 ,
typename SMatScalarMultExprTrait<typename SVecTSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1660 , INVALID_TYPE >::Type Type;
1677 template<
typename VT1,
typename ST,
typename VT2 >
1678 struct TSVecTSVecMultExprTrait< SVecScalarMultExpr<VT1,ST,true>, VT2 >
1682 typedef typename SelectType< IsSparseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1683 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1684 IsNumeric<ST>::value
1685 ,
typename TSVecScalarMultExprTrait<typename TSVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1686 , INVALID_TYPE >::Type Type;
1695 template<
typename VT1,
typename VT2,
typename ST >
1696 struct TSVecTSVecMultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,true> >
1700 typedef typename SelectType< IsSparseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1701 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1702 IsNumeric<ST>::value
1703 ,
typename TSVecScalarMultExprTrait<typename TSVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1704 , INVALID_TYPE >::Type Type;
1713 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1714 struct TSVecTSVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,true>, SVecScalarMultExpr<VT2,ST2,true> >
1718 typedef typename SelectType< IsSparseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1719 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1720 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1721 ,
typename TSVecScalarMultExprTrait<typename TSVecTSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1722 , INVALID_TYPE >::Type Type;
1739 template<
typename MT,
typename VT,
typename ST >
1740 struct DMatSVecMultExprTrait< MT, SVecScalarMultExpr<VT,ST,false> >
1744 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1745 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1746 IsNumeric<ST>::value
1747 ,
typename DVecScalarMultExprTrait<typename DMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1748 , INVALID_TYPE >::Type Type;
1765 template<
typename MT,
typename VT,
typename ST >
1766 struct TDMatSVecMultExprTrait< MT, SVecScalarMultExpr<VT,ST,false> >
1770 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1771 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1772 IsNumeric<ST>::value
1773 ,
typename DVecScalarMultExprTrait<typename TDMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1774 , INVALID_TYPE >::Type Type;
1791 template<
typename VT,
typename ST,
typename MT >
1792 struct TSVecDMatMultExprTrait< SVecScalarMultExpr<VT,ST,true>, MT >
1796 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1797 IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1798 IsNumeric<ST>::value
1799 ,
typename TDVecScalarMultExprTrait<typename TSVecDMatMultExprTrait<VT,MT>::Type,ST>::Type
1800 , INVALID_TYPE >::Type Type;
1817 template<
typename VT,
typename ST,
typename MT >
1818 struct TSVecTDMatMultExprTrait< SVecScalarMultExpr<VT,ST,true>, MT >
1822 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1823 IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1824 IsNumeric<ST>::value
1825 ,
typename TDVecScalarMultExprTrait<typename TSVecTDMatMultExprTrait<VT,MT>::Type,ST>::Type
1826 , INVALID_TYPE >::Type Type;
1843 template<
typename MT,
typename VT,
typename ST >
1844 struct SMatSVecMultExprTrait< MT, SVecScalarMultExpr<VT,ST,false> >
1848 typedef typename SelectType< IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1849 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1850 IsNumeric<ST>::value
1851 ,
typename SVecScalarMultExprTrait<typename SMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1852 , INVALID_TYPE >::Type Type;
1869 template<
typename MT,
typename VT,
typename ST >
1870 struct TSMatSVecMultExprTrait< MT, SVecScalarMultExpr<VT,ST,false> >
1874 typedef typename SelectType< IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1875 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1876 IsNumeric<ST>::value
1877 ,
typename SVecScalarMultExprTrait<typename TSMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1878 , INVALID_TYPE >::Type Type;
1895 template<
typename VT,
typename ST,
typename MT >
1896 struct TSVecSMatMultExprTrait< SVecScalarMultExpr<VT,ST,true>, MT >
1900 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1901 IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1902 IsNumeric<ST>::value
1903 ,
typename TSVecScalarMultExprTrait<typename TSVecSMatMultExprTrait<VT,MT>::Type,ST>::Type
1904 , INVALID_TYPE >::Type Type;
1921 template<
typename VT,
typename ST,
typename MT >
1922 struct TSVecTSMatMultExprTrait< SVecScalarMultExpr<VT,ST,true>, MT >
1926 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1927 IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1928 IsNumeric<ST>::value
1929 ,
typename TSVecScalarMultExprTrait<typename TSVecTSMatMultExprTrait<VT,MT>::Type,ST>::Type
1930 , INVALID_TYPE >::Type Type;