22 #ifndef _BLAZE_MATH_EXPRESSIONS_SVECSCALARMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_SVECSCALARMULTEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
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 };
165 typedef typename boost::remove_reference<LeftOperand>::type::ConstIterator
IteratorType;
372 template<
typename T >
399 template<
typename VT2 >
408 for(
size_t i=0UL; i<
size; ++i )
428 template<
typename VT2 >
436 typename VT2::Iterator
begin( (~lhs).
begin() );
437 const typename VT2::Iterator
end( (~lhs).
end() );
459 template<
typename VT2 >
460 friend inline typename EnableIf< UseAssign<VT2> >::Type
493 template<
typename VT2 >
494 friend inline typename EnableIf< UseAssign<VT2> >::Type
527 template<
typename VT2 >
528 friend inline typename EnableIf< UseAssign<VT2> >::Type
584 template<
typename VT
624 template<
typename T1
627 inline const typename EnableIf< IsNumeric<T2>,
typename MultExprTrait<T1,T2>::Type >::Type
631 return Type( ~vec, scalar );
657 template<
typename T1
660 inline const typename EnableIf< IsNumeric<T1>,
typename MultExprTrait<T1,T2>::Type >::Type
664 return Type( ~vec, scalar );
689 template<
typename VT
722 template<
typename VT
726 inline const typename EnableIf< IsNumeric<ST2>
727 ,
typename MultExprTrait< SVecScalarMultExpr<VT,ST1,TF>, ST2 >::Type >::Type
730 return vec.leftOperand() * ( vec.rightOperand() * scalar );
749 template<
typename ST1
753 inline const typename EnableIf< IsNumeric<ST1>
754 ,
typename MultExprTrait< ST1, SVecScalarMultExpr<VT,ST2,TF> >::Type >::Type
757 return vec.leftOperand() * ( scalar * vec.rightOperand() );
776 template<
typename VT
780 inline const typename EnableIf< IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>
781 ,
typename DivExprTrait< SVecScalarMultExpr<VT,ST1,TF>, ST2 >::Type >::Type
784 return vec.leftOperand() * ( vec.rightOperand() / scalar );
804 template<
typename VT1
808 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST,TF>, VT2 >::Type
811 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
831 template<
typename VT1
835 inline const typename MultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,TF> >::Type
838 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
858 template<
typename VT1
861 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST,false>, VT2 >::Type
864 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
884 template<
typename VT1
887 inline const typename MultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,true> >::Type
890 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
910 template<
typename VT1
914 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST,TF>, VT2 >::Type
917 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
937 template<
typename VT1
941 inline const typename MultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,TF> >::Type
944 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
964 template<
typename VT1
972 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
992 template<
typename VT1
995 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST,false>, VT2 >::Type
998 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1018 template<
typename VT1
1021 inline const typename MultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,true> >::Type
1024 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1044 template<
typename VT1
1051 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1071 template<
typename MT
1075 inline const typename MultExprTrait< MT, SVecScalarMultExpr<VT,ST,false> >::Type
1078 return ( (~mat) * vec.leftOperand() ) * vec.rightOperand();
1098 template<
typename VT
1102 inline const typename MultExprTrait< SVecScalarMultExpr<VT,ST,true>, MT >::Type
1105 return ( vec.leftOperand() * (~mat) ) * vec.rightOperand();
1125 template<
typename MT
1129 inline const typename MultExprTrait< MT, SVecScalarMultExpr<VT,ST,false> >::Type
1132 return ( (~mat) * vec.leftOperand() ) * vec.rightOperand();
1152 template<
typename VT
1156 inline const typename MultExprTrait< SVecScalarMultExpr<VT,ST,true>, MT >::Type
1159 return ( vec.leftOperand() * (~mat) ) * vec.rightOperand();
1175 template<
typename VT,
typename ST1,
typename ST2 >
1180 typedef typename SelectType< IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1181 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1182 ,
typename SVecScalarMultExprTrait<VT,typename MultTrait<ST1,ST2>::Type>::Type
1183 , INVALID_TYPE >::Type Type;
1200 template<
typename VT,
typename ST1,
typename ST2 >
1205 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1206 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1207 ,
typename TSVecScalarMultExprTrait<VT,typename MultTrait<ST1,ST2>::Type>::Type
1208 , INVALID_TYPE >::Type Type;
1225 template<
typename VT,
typename ST1,
typename ST2 >
1230 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1234 typedef typename SVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1235 typedef typename SVecScalarDivExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1240 typedef typename SelectType< IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1241 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1242 ,
typename SelectType<condition,T1,T2>::Type
1243 , INVALID_TYPE >::Type Type;
1260 template<
typename VT,
typename ST1,
typename ST2 >
1265 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1269 typedef typename TSVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1270 typedef typename TSVecScalarDivExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1275 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1276 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1277 ,
typename SelectType<condition,T1,T2>::Type
1278 , INVALID_TYPE >::Type Type;
1295 template<
typename VT1,
typename VT2,
typename ST >
1300 typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1301 IsSparseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1302 IsNumeric<ST>::value
1303 ,
typename SVecScalarMultExprTrait<typename DVecSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1304 , INVALID_TYPE >::Type Type;
1321 template<
typename VT1,
typename VT2,
typename ST >
1326 typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1327 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1328 IsNumeric<ST>::value
1329 ,
typename SMatScalarMultExprTrait<typename DVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1330 , INVALID_TYPE >::Type Type;
1347 template<
typename VT1,
typename VT2,
typename ST >
1352 typedef typename SelectType< IsDenseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1353 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1354 IsNumeric<ST>::value
1355 ,
typename TSVecScalarMultExprTrait<typename TDVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1356 , INVALID_TYPE >::Type Type;
1373 template<
typename VT1,
typename ST,
typename VT2 >
1378 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1379 IsDenseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1380 IsNumeric<ST>::value
1381 ,
typename SVecScalarMultExprTrait<typename SVecDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1382 , INVALID_TYPE >::Type Type;
1399 template<
typename VT1,
typename ST,
typename VT2 >
1404 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1405 IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1406 IsNumeric<ST>::value
1407 ,
typename TSMatScalarMultExprTrait<typename SVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1408 , INVALID_TYPE >::Type Type;
1425 template<
typename VT1,
typename ST,
typename VT2 >
1430 typedef typename SelectType< IsSparseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1431 IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1432 IsNumeric<ST>::value
1433 ,
typename TSVecScalarMultExprTrait<typename TSVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1434 , INVALID_TYPE >::Type Type;
1451 template<
typename VT1,
typename ST,
typename VT2 >
1456 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1457 IsSparseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1458 IsNumeric<ST>::value
1459 ,
typename SVecScalarMultExprTrait<typename SVecSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1460 , INVALID_TYPE >::Type Type;
1469 template<
typename VT1,
typename VT2,
typename ST >
1474 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1475 IsSparseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1476 IsNumeric<ST>::value
1477 ,
typename SVecScalarMultExprTrait<typename SVecSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1478 , INVALID_TYPE >::Type Type;
1487 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1492 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1493 IsSparseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1494 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1495 ,
typename SVecScalarMultExprTrait<typename SVecSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1496 , INVALID_TYPE >::Type Type;
1513 template<
typename VT1,
typename ST,
typename VT2 >
1518 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1519 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1520 IsNumeric<ST>::value
1521 ,
typename SMatScalarMultExprTrait<typename SVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1522 , INVALID_TYPE >::Type Type;
1531 template<
typename VT1,
typename VT2,
typename ST >
1536 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1537 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1538 IsNumeric<ST>::value
1539 ,
typename SMatScalarMultExprTrait<typename SVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1540 , INVALID_TYPE >::Type Type;
1549 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1554 typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1555 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1556 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1557 ,
typename SMatScalarMultExprTrait<typename SVecTSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1558 , INVALID_TYPE >::Type Type;
1575 template<
typename VT1,
typename ST,
typename VT2 >
1580 typedef typename SelectType< IsSparseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1581 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1582 IsNumeric<ST>::value
1583 ,
typename TSVecScalarMultExprTrait<typename TSVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1584 , INVALID_TYPE >::Type Type;
1593 template<
typename VT1,
typename VT2,
typename ST >
1598 typedef typename SelectType< IsSparseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1599 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1600 IsNumeric<ST>::value
1601 ,
typename TSVecScalarMultExprTrait<typename TSVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1602 , INVALID_TYPE >::Type Type;
1611 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1616 typedef typename SelectType< IsSparseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1617 IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1618 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1619 ,
typename TSVecScalarMultExprTrait<typename TSVecTSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1620 , INVALID_TYPE >::Type Type;
1637 template<
typename MT,
typename VT,
typename ST >
1642 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1643 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1644 IsNumeric<ST>::value
1645 ,
typename DVecScalarMultExprTrait<typename DMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1646 , INVALID_TYPE >::Type Type;
1663 template<
typename MT,
typename VT,
typename ST >
1668 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1669 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1670 IsNumeric<ST>::value
1671 ,
typename DVecScalarMultExprTrait<typename TDMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1672 , INVALID_TYPE >::Type Type;
1689 template<
typename VT,
typename ST,
typename MT >
1694 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1695 IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1696 IsNumeric<ST>::value
1697 ,
typename TDVecScalarMultExprTrait<typename TSVecDMatMultExprTrait<VT,MT>::Type,ST>::Type
1698 , INVALID_TYPE >::Type Type;
1715 template<
typename VT,
typename ST,
typename MT >
1720 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1721 IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1722 IsNumeric<ST>::value
1723 ,
typename TDVecScalarMultExprTrait<typename TSVecTDMatMultExprTrait<VT,MT>::Type,ST>::Type
1724 , INVALID_TYPE >::Type Type;
1741 template<
typename MT,
typename VT,
typename ST >
1746 typedef typename SelectType< IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1747 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1748 IsNumeric<ST>::value
1749 ,
typename SVecScalarMultExprTrait<typename SMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1750 , INVALID_TYPE >::Type Type;
1767 template<
typename MT,
typename VT,
typename ST >
1772 typedef typename SelectType< IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1773 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1774 IsNumeric<ST>::value
1775 ,
typename SVecScalarMultExprTrait<typename TSMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1776 , INVALID_TYPE >::Type Type;
1793 template<
typename VT,
typename ST,
typename MT >
1798 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1799 IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1800 IsNumeric<ST>::value
1801 ,
typename TSVecScalarMultExprTrait<typename TSVecSMatMultExprTrait<VT,MT>::Type,ST>::Type
1802 , INVALID_TYPE >::Type Type;
1819 template<
typename VT,
typename ST,
typename MT >
1824 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1825 IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1826 IsNumeric<ST>::value
1827 ,
typename TSVecScalarMultExprTrait<typename TSVecTSMatMultExprTrait<VT,MT>::Type,ST>::Type
1828 , INVALID_TYPE >::Type Type;