35 #ifndef _BLAZE_MATH_EXPRESSIONS_DVECSCALARMULTEXPR_H_
36 #define _BLAZE_MATH_EXPRESSIONS_DVECSCALARMULTEXPR_H_
105 template<
typename VT
144 template<
typename VT2 >
147 enum { value = useAssign };
160 template<
typename VT2 >
161 struct UseSMPAssign {
162 enum { value = ( !VT2::smpAssignable || !VT::smpAssignable ) && useAssign };
219 : iterator_( iterator )
433 enum { vectorizable = VT::vectorizable &&
438 enum { smpAssignable = VT::smpAssignable };
537 template<
typename T >
549 template<
typename T >
551 return vector_.isAliased( alias );
595 template<
typename VT2 >
623 template<
typename VT2 >
651 template<
typename VT2 >
652 friend inline typename EnableIf< UseAssign<VT2> >::Type
687 template<
typename VT2 >
688 friend inline typename EnableIf< UseAssign<VT2> >::Type
723 template<
typename VT2 >
724 friend inline typename EnableIf< UseAssign<VT2> >::Type
759 template<
typename VT2 >
760 friend inline typename EnableIf< UseSMPAssign<VT2> >::Type
787 template<
typename VT2 >
788 friend inline typename EnableIf< UseSMPAssign<VT2> >::Type
796 (~lhs) *= rhs.scalar_;
815 template<
typename VT2 >
816 friend inline typename EnableIf< UseSMPAssign<VT2> >::Type
851 template<
typename VT2 >
852 friend inline typename EnableIf< UseSMPAssign<VT2> >::Type
887 template<
typename VT2 >
888 friend inline typename EnableIf< UseSMPAssign<VT2> >::Type
946 template<
typename VT
948 inline const DVecScalarMultExpr<VT,typename BaseElementType<VT>::Type,TF>
989 template<
typename T1
992 inline const typename EnableIf< IsNumeric<T2>,
typename MultExprTrait<T1,T2>::Type >::Type
998 return Type( ~vec, scalar );
1025 template<
typename T1
1028 inline const typename EnableIf< IsNumeric<T1>,
typename MultExprTrait<T1,T2>::Type >::Type
1034 return Type( ~vec, scalar );
1065 template<
typename VT
1067 inline const DVecScalarMultExpr<VT,typename VT::ElementType,TF>
1074 const ElementType len (
length( ~vec ) );
1102 template<
typename VT
1105 inline const DVecScalarMultExpr<VT,ST,TF>
1106 operator-(
const DVecScalarMultExpr<VT,ST,TF>& dv )
1110 return DVecScalarMultExpr<VT,ST,TF>( dv.leftOperand(), -dv.rightOperand() );
1137 template<
typename VT
1141 inline const typename EnableIf< IsNumeric<ST2>
1142 ,
typename MultExprTrait< DVecScalarMultExpr<VT,ST1,TF>, ST2 >::Type >::Type
1143 operator*(
const DVecScalarMultExpr<VT,ST1,TF>& vec, ST2 scalar )
1147 return vec.leftOperand() * ( vec.rightOperand() * scalar );
1166 template<
typename ST1
1170 inline const typename EnableIf< IsNumeric<ST1>
1171 ,
typename MultExprTrait< ST1, DVecScalarMultExpr<VT,ST2,TF> >::Type >::Type
1172 operator*( ST1 scalar,
const DVecScalarMultExpr<VT,ST2,TF>& vec )
1176 return vec.leftOperand() * ( scalar * vec.rightOperand() );
1195 template<
typename VT
1199 inline const typename EnableIf< IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>
1200 ,
typename DivExprTrait< DVecScalarMultExpr<VT,ST1,TF>, ST2 >::Type >::Type
1201 operator/(
const DVecScalarMultExpr<VT,ST1,TF>& vec, ST2 scalar )
1205 return vec.leftOperand() * ( vec.rightOperand() / scalar );
1225 template<
typename VT1
1229 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST,TF>, VT2 >::Type
1230 operator*(
const DVecScalarMultExpr<VT1,ST,TF>& lhs,
const DenseVector<VT2,TF>& rhs )
1234 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1254 template<
typename VT1
1258 inline const typename MultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,TF> >::Type
1259 operator*(
const DenseVector<VT1,TF>& lhs,
const DVecScalarMultExpr<VT2,ST,TF>& rhs )
1263 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1283 template<
typename VT1
1288 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST1,TF>, DVecScalarMultExpr<VT2,ST2,TF> >::Type
1289 operator*(
const DVecScalarMultExpr<VT1,ST1,TF>& lhs,
const DVecScalarMultExpr<VT2,ST2,TF>& rhs )
1293 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1313 template<
typename VT1
1316 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >::Type
1317 operator*(
const DVecScalarMultExpr<VT1,ST,false>& lhs,
const DenseVector<VT2,true>& rhs )
1321 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1341 template<
typename VT1
1344 inline const typename MultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >::Type
1345 operator*(
const DenseVector<VT1,false>& lhs,
const DVecScalarMultExpr<VT2,ST,true>& rhs )
1349 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1369 template<
typename VT1
1373 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,true> >::Type
1374 operator*(
const DVecScalarMultExpr<VT1,ST1,false>& lhs,
const DVecScalarMultExpr<VT2,ST2,true>& rhs )
1378 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1398 template<
typename VT1
1402 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST,TF>, VT2 >::Type
1403 operator*(
const DVecScalarMultExpr<VT1,ST,TF>& lhs,
const SparseVector<VT2,TF>& rhs )
1407 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1427 template<
typename VT1
1431 inline const typename MultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,TF> >::Type
1432 operator*(
const SparseVector<VT1,TF>& lhs,
const DVecScalarMultExpr<VT2,ST,TF>& rhs )
1436 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1457 template<
typename VT1
1462 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST1,TF>, SVecScalarMultExpr<VT2,ST2,TF> >::Type
1463 operator*(
const DVecScalarMultExpr<VT1,ST1,TF>& lhs,
const SVecScalarMultExpr<VT2,ST2,TF>& rhs )
1467 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1488 template<
typename VT1
1493 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST1,TF>, DVecScalarMultExpr<VT2,ST2,TF> >::Type
1494 operator*(
const SVecScalarMultExpr<VT1,ST1,TF>& lhs,
const DVecScalarMultExpr<VT2,ST2,TF>& rhs )
1498 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1518 template<
typename VT1
1521 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >::Type
1522 operator*(
const DVecScalarMultExpr<VT1,ST,false>& lhs,
const SparseVector<VT2,true>& rhs )
1526 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1546 template<
typename VT1
1549 inline const typename MultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >::Type
1550 operator*(
const SparseVector<VT1,false>& lhs,
const DVecScalarMultExpr<VT2,ST,true>& rhs )
1554 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1575 template<
typename VT1
1579 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,true> >::Type
1580 operator*(
const DVecScalarMultExpr<VT1,ST1,false>& lhs,
const SVecScalarMultExpr<VT2,ST2,true>& rhs )
1584 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1605 template<
typename VT1
1609 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,true> >::Type
1610 operator*(
const SVecScalarMultExpr<VT1,ST1,false>& lhs,
const DVecScalarMultExpr<VT2,ST2,true>& rhs )
1614 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1634 template<
typename MT
1638 inline const typename MultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >::Type
1639 operator*(
const DenseMatrix<MT,SO>& mat,
const DVecScalarMultExpr<VT,ST,false>& vec )
1643 return ( (~mat) * vec.leftOperand() ) * vec.rightOperand();
1663 template<
typename VT
1667 inline const typename MultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >::Type
1668 operator*(
const DVecScalarMultExpr<VT,ST,true>& vec,
const DenseMatrix<MT,SO>& mat )
1672 return ( vec.leftOperand() * (~mat) ) * vec.rightOperand();
1692 template<
typename MT
1696 inline const typename MultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >::Type
1697 operator*(
const SparseMatrix<MT,SO>& mat,
const DVecScalarMultExpr<VT,ST,false>& vec )
1701 return ( (~mat) * vec.leftOperand() ) * vec.rightOperand();
1721 template<
typename VT
1725 inline const typename MultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >::Type
1726 operator*(
const DVecScalarMultExpr<VT,ST,true>& vec,
const SparseMatrix<MT,SO>& mat )
1730 return ( vec.leftOperand() * (~mat) ) * vec.rightOperand();
1746 template<
typename VT,
typename ST,
bool TF >
1764 template<
typename VT,
typename ST1,
typename ST2 >
1769 typedef typename SelectType< IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
1770 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1771 ,
typename DVecScalarMultExprTrait<VT,typename MultTrait<ST1,ST2>::Type>::Type
1772 , INVALID_TYPE >::Type Type;
1789 template<
typename VT,
typename ST1,
typename ST2 >
1794 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
1795 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1796 ,
typename TDVecScalarMultExprTrait<VT,typename MultTrait<ST1,ST2>::Type>::Type
1797 , INVALID_TYPE >::Type Type;
1814 template<
typename VT,
typename ST1,
typename ST2 >
1819 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1823 typedef typename DVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1824 typedef typename DVecScalarDivExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1829 typedef typename SelectType< IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
1830 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1831 ,
typename SelectType<condition,T1,T2>::Type
1832 , INVALID_TYPE >::Type Type;
1849 template<
typename VT,
typename ST1,
typename ST2 >
1854 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1858 typedef typename TDVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1859 typedef typename TDVecScalarDivExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1864 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
1865 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1866 ,
typename SelectType<condition,T1,T2>::Type
1867 , INVALID_TYPE >::Type Type;
1884 template<
typename VT1,
typename ST,
typename VT2 >
1889 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1890 IsDenseVector<VT2>::value && IsColumnVector<VT2>::value &&
1891 IsNumeric<ST>::value
1892 ,
typename DVecScalarMultExprTrait<typename DVecDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1893 , INVALID_TYPE >::Type Type;
1902 template<
typename VT1,
typename VT2,
typename ST >
1907 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1908 IsDenseVector<VT2>::value && IsColumnVector<VT2>::value &&
1909 IsNumeric<ST>::value
1910 ,
typename DVecScalarMultExprTrait<typename DVecDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1911 , INVALID_TYPE >::Type Type;
1920 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1925 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1926 IsDenseVector<VT2>::value && IsColumnVector<VT2>::value &&
1927 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1928 ,
typename DVecScalarMultExprTrait<typename DVecDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1929 , INVALID_TYPE >::Type Type;
1946 template<
typename VT1,
typename ST,
typename VT2 >
1951 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1952 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
1953 IsNumeric<ST>::value
1954 ,
typename DMatScalarMultExprTrait<typename DVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1955 , INVALID_TYPE >::Type Type;
1964 template<
typename VT1,
typename VT2,
typename ST >
1969 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1970 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
1971 IsNumeric<ST>::value
1972 ,
typename DMatScalarMultExprTrait<typename DVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1973 , INVALID_TYPE >::Type Type;
1982 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1987 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1988 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
1989 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1990 ,
typename DMatScalarMultExprTrait<typename DVecTDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1991 , INVALID_TYPE >::Type Type;
2008 template<
typename VT1,
typename ST,
typename VT2 >
2013 typedef typename SelectType< IsDenseVector<VT1>::value && IsRowVector<VT1>::value &&
2014 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
2015 IsNumeric<ST>::value
2016 ,
typename TDVecScalarMultExprTrait<typename TDVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
2017 , INVALID_TYPE >::Type Type;
2026 template<
typename VT1,
typename VT2,
typename ST >
2031 typedef typename SelectType< IsDenseVector<VT1>::value && IsRowVector<VT1>::value &&
2032 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
2033 IsNumeric<ST>::value
2034 ,
typename TDVecScalarMultExprTrait<typename TDVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
2035 , INVALID_TYPE >::Type Type;
2044 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
2049 typedef typename SelectType< IsDenseVector<VT1>::value && IsRowVector<VT1>::value &&
2050 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
2051 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2052 ,
typename TDVecScalarMultExprTrait<typename TDVecTDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2053 , INVALID_TYPE >::Type Type;
2070 template<
typename VT1,
typename VT2,
typename ST >
2075 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
2076 IsSparseVector<VT2>::value && IsColumnVector<VT2>::value &&
2077 IsNumeric<ST>::value
2078 ,
typename SVecScalarMultExprTrait<typename DVecSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
2079 , INVALID_TYPE >::Type Type;
2088 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
2089 struct DVecSVecMultExprTrait<
DVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,false> >
2093 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
2094 IsSparseVector<VT2>::value && IsColumnVector<VT2>::value &&
2095 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2096 ,
typename SVecScalarMultExprTrait<typename DVecSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2097 , INVALID_TYPE >::Type Type;
2114 template<
typename VT1,
typename ST,
typename VT2 >
2119 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
2120 IsSparseVector<VT2>::value && IsRowVector<VT2>::value &&
2121 IsNumeric<ST>::value
2122 ,
typename SMatScalarMultExprTrait<typename DVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
2123 , INVALID_TYPE >::Type Type;
2132 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
2133 struct DVecTSVecMultExprTrait<
DVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,true> >
2137 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
2138 IsSparseVector<VT2>::value && IsRowVector<VT2>::value &&
2139 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2140 ,
typename SMatScalarMultExprTrait<typename DVecTSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2141 , INVALID_TYPE >::Type Type;
2158 template<
typename VT1,
typename ST,
typename VT2 >
2163 typedef typename SelectType< IsDenseVector<VT1>::value && IsRowVector<VT1>::value &&
2164 IsSparseVector<VT2>::value && IsRowVector<VT2>::value &&
2165 IsNumeric<ST>::value
2166 ,
typename TSVecScalarMultExprTrait<typename TDVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
2167 , INVALID_TYPE >::Type Type;
2176 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
2177 struct TDVecTSVecMultExprTrait<
DVecScalarMultExpr<VT1,ST1,true>, SVecScalarMultExpr<VT2,ST2,true> >
2181 typedef typename SelectType< IsDenseVector<VT1>::value && IsRowVector<VT1>::value &&
2182 IsSparseVector<VT2>::value && IsRowVector<VT2>::value &&
2183 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2184 ,
typename TSVecScalarMultExprTrait<typename TDVecTSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2185 , INVALID_TYPE >::Type Type;
2202 template<
typename VT1,
typename VT2,
typename ST >
2207 typedef typename SelectType< IsSparseVector<VT1>::value && IsColumnVector<VT1>::value &&
2208 IsDenseVector<VT2>::value && IsColumnVector<VT2>::value &&
2209 IsNumeric<ST>::value
2210 ,
typename SVecScalarMultExprTrait<typename SVecDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
2211 , INVALID_TYPE >::Type Type;
2220 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
2221 struct SVecDVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,false>,
DVecScalarMultExpr<VT2,ST2,false> >
2225 typedef typename SelectType< IsSparseVector<VT1>::value && IsColumnVector<VT1>::value &&
2226 IsDenseVector<VT2>::value && IsColumnVector<VT2>::value &&
2227 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2228 ,
typename SVecScalarMultExprTrait<typename SVecDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2229 , INVALID_TYPE >::Type Type;
2246 template<
typename VT1,
typename VT2,
typename ST >
2251 typedef typename SelectType< IsSparseVector<VT1>::value && IsColumnVector<VT1>::value &&
2252 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
2253 IsNumeric<ST>::value
2254 ,
typename TSMatScalarMultExprTrait<typename SVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
2255 , INVALID_TYPE >::Type Type;
2264 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
2265 struct SVecTDVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,false>,
DVecScalarMultExpr<VT2,ST2,true> >
2269 typedef typename SelectType< IsSparseVector<VT1>::value && IsColumnVector<VT1>::value &&
2270 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
2271 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2272 ,
typename TSMatScalarMultExprTrait<typename SVecTDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2273 , INVALID_TYPE >::Type Type;
2290 template<
typename VT1,
typename VT2,
typename ST >
2295 typedef typename SelectType< IsSparseVector<VT1>::value && IsRowVector<VT1>::value &&
2296 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
2297 IsNumeric<ST>::value
2298 ,
typename TSVecScalarMultExprTrait<typename TSVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
2299 , INVALID_TYPE >::Type Type;
2308 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
2309 struct TSVecTDVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,true>,
DVecScalarMultExpr<VT2,ST2,true> >
2313 typedef typename SelectType< IsSparseVector<VT1>::value && IsRowVector<VT1>::value &&
2314 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
2315 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2316 ,
typename TSVecScalarMultExprTrait<typename TSVecTDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2317 , INVALID_TYPE >::Type Type;
2334 template<
typename MT,
typename VT,
typename ST >
2339 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
2340 IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
2341 IsNumeric<ST>::value
2342 ,
typename DVecScalarMultExprTrait<typename DMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
2343 , INVALID_TYPE >::Type Type;
2360 template<
typename MT,
typename VT,
typename ST >
2365 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
2366 IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
2367 IsNumeric<ST>::value
2368 ,
typename DVecScalarMultExprTrait<typename TDMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
2369 , INVALID_TYPE >::Type Type;
2386 template<
typename VT,
typename MT,
typename ST >
2391 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
2392 IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
2393 IsNumeric<ST>::value
2394 ,
typename TDVecScalarMultExprTrait<typename TDVecDMatMultExprTrait<VT,MT>::Type,ST>::Type
2395 , INVALID_TYPE >::Type Type;
2412 template<
typename VT,
typename MT,
typename ST >
2417 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
2418 IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
2419 IsNumeric<ST>::value
2420 ,
typename TDVecScalarMultExprTrait<typename TDVecTDMatMultExprTrait<VT,MT>::Type,ST>::Type
2421 , INVALID_TYPE >::Type Type;
2438 template<
typename MT,
typename VT,
typename ST >
2443 typedef typename SelectType< IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
2444 IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
2445 IsNumeric<ST>::value
2446 ,
typename DVecScalarMultExprTrait<typename SMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
2447 , INVALID_TYPE >::Type Type;
2464 template<
typename MT,
typename VT,
typename ST >
2469 typedef typename SelectType< IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
2470 IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
2471 IsNumeric<ST>::value
2472 ,
typename DVecScalarMultExprTrait<typename TSMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
2473 , INVALID_TYPE >::Type Type;
2490 template<
typename VT,
typename MT,
typename ST >
2495 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
2496 IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
2497 IsNumeric<ST>::value
2498 ,
typename TDVecScalarMultExprTrait<typename TDVecSMatMultExprTrait<VT,MT>::Type,ST>::Type
2499 , INVALID_TYPE >::Type Type;
2516 template<
typename VT,
typename MT,
typename ST >
2521 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
2522 IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
2523 IsNumeric<ST>::value
2524 ,
typename TDVecScalarMultExprTrait<typename TDVecTSMatMultExprTrait<VT,MT>::Type,ST>::Type
2525 , INVALID_TYPE >::Type Type;
2542 template<
typename VT,
typename ST,
bool TF,
bool AF >
2547 typedef typename MultExprTrait< typename SubvectorExprTrait<const VT,AF>::Type, ST >::Type Type;
Pointer difference type of the Blaze library.
Compile time check whether the given type is a computational expression template.This type trait clas...
Definition: IsComputation.h:89
Constraint on the data type.
BLAZE_ALWAYS_INLINE void multAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the multiplication assignment of a matrix to a matrix.
Definition: Matrix.h:879
Compile time check whether the given type is a temporary vector or matrix type.This type trait class ...
Definition: IsTemporary.h:87
const DMatDMatMultExpr< T1, T2 > operator*(const DenseMatrix< T1, false > &lhs, const DenseMatrix< T2, false > &rhs)
Multiplication operator for the multiplication of two row-major dense matrices ( ).
Definition: DMatDMatMultExpr.h:4838
const EnableIf< IsNumeric< T2 >, typename DivExprTrait< T1, T2 >::Type >::Type operator/(const DenseMatrix< T1, SO > &mat, T2 scalar)
Division operator for the division of a dense matrix by a scalar value ( ).
Definition: DMatScalarDivExpr.h:936
Header file for the SparseVector base class.
IntrinsicTrait< ElementType >::Type IntrinsicType
Resulting intrinsic element type.
Definition: DVecScalarMultExpr.h:173
ReturnType operator*() const
Direct access to the element at the current iterator position.
Definition: DVecScalarMultExpr.h:295
BLAZE_ALWAYS_INLINE size_t size(const Vector< VT, TF > &vector)
Returns the current size/dimension of the vector.
Definition: Vector.h:258
Header file for the IsSparseMatrix type trait.
ConstIterator end() const
Returns an iterator just past the last non-zero element of the dense vector.
Definition: DVecScalarMultExpr.h:496
Efficient implementation of a compressed matrix.The CompressedMatrix class template is the represent...
Definition: CompressedMatrix.h:205
const ConstIterator operator++(int)
Post-increment operator.
Definition: DVecScalarMultExpr.h:264
Header file for the IsSame and IsStrictlySame type traits.
Header file for the IsColumnMajorMatrix type trait.
const This & CompositeType
Data type for composite expression templates.
Definition: CompressedMatrix.h:2478
Header file for the IsRowVector type trait.
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:257
Header file for the DenseVector base class.
ReturnType operator[](size_t index) const
Subscript operator for the direct access to the vector elements.
Definition: DVecScalarMultExpr.h:459
const DMatSerialExpr< MT, SO > serial(const DenseMatrix< MT, SO > &dm)
Forces the serial evaluation of the given dense matrix expression dm.
Definition: DMatSerialExpr.h:695
Header file for the Computation base class.
Type relationship analysis.This class tests if the two data types A and B are equal. For this type comparison, the cv-qualifiers of both data types are ignored. If A and B are the same data type (ignoring the cv-qualifiers), then the value member enumeration is set to 1, the nested type definition Type is TrueType, and the class derives from TrueType. Otherwise value is set to 0, Type is FalseType, and the class derives from FalseType.
Definition: IsSame.h:158
Header file for the RequiresEvaluation type trait.
MultExprTrait< RN, ST >::Type ExprReturnType
Expression return type for the subscript operator.
Definition: DVecScalarMultExpr.h:130
bool operator!=(const ConstIterator &rhs) const
Inequality comparison between two ConstIterator objects.
Definition: DVecScalarMultExpr.h:327
ConstIterator(IteratorType iterator, RightOperand scalar)
Constructor for the ConstIterator class.
Definition: DVecScalarMultExpr.h:218
Header file for the VecScalarMultExpr base class.
LeftOperand leftOperand() const
Returns the left-hand side dense vector operand.
Definition: DVecScalarMultExpr.h:516
ResultType::ElementType ElementType
Resulting element type.
Definition: DVecScalarMultExpr.h:172
Constraint on the data type.
ValueType value_type
Type of the underlying elements.
Definition: DVecScalarMultExpr.h:203
bool operator<=(const ConstIterator &rhs) const
Less-than comparison between two ConstIterator objects.
Definition: DVecScalarMultExpr.h:360
Header file for the SparseMatrix base class.
Header file for the DivExprTrait class template.
bool isAligned() const
Returns whether the operands of the expression are properly aligned in memory.
Definition: DVecScalarMultExpr.h:560
PointerType pointer
Pointer return type.
Definition: DVecScalarMultExpr.h:204
VT::ConstIterator IteratorType
ConstIterator type of the dense vector expression.
Definition: DVecScalarMultExpr.h:209
IntrinsicType load(size_t index) const
Access to the intrinsic elements of the vector.
Definition: DVecScalarMultExpr.h:471
SelectType< IsExpression< VT >::value, const VT, const VT & >::Type LeftOperand
Composite type of the left-hand side dense vector expression.
Definition: DVecScalarMultExpr.h:182
Header file for the MultExprTrait class template.
Compile time check to query the requirement to evaluate an expression.Via this type trait it is possi...
Definition: RequiresEvaluation.h:90
const This & CompositeType
Data type for composite expression templates.
Definition: CompressedMatrix.h:259
DVecScalarMultExpr(const VT &vector, ST scalar)
Constructor for the DVecScalarMultExpr class.
Definition: DVecScalarMultExpr.h:447
ptrdiff_t DifferenceType
Difference between two iterators.
Definition: DVecScalarMultExpr.h:199
Compile time type selection.The SelectType class template selects one of the two given types T1 and T...
Definition: SelectType.h:59
Header file for the IsTemporary type trait class.
Header file for the multiplication trait.
Header file for the IsFloatingPoint type trait.
const Element * ConstIterator
Iterator over constant elements.
Definition: CompressedMatrix.h:2482
bool canAlias(const T *alias) const
Returns whether the expression can alias with the given address alias.
Definition: DVecScalarMultExpr.h:538
Iterator over the elements of the dense vector.
Definition: DVecScalarMultExpr.h:191
Header file for the DenseMatrix base class.
BLAZE_ALWAYS_INLINE void assign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the assignment of a matrix to a matrix.
Definition: Matrix.h:635
const SelectType< returnExpr, ExprReturnType, ElementType >::Type ReturnType
Return type for expression template evaluations.
Definition: DVecScalarMultExpr.h:176
bool operator>(const ConstIterator &rhs) const
Greater-than comparison between two ConstIterator objects.
Definition: DVecScalarMultExpr.h:349
ResultType::TransposeType TransposeType
Transpose type for expression template evaluations.
Definition: DVecScalarMultExpr.h:171
bool operator>=(const ConstIterator &rhs) const
Greater-than comparison between two ConstIterator objects.
Definition: DVecScalarMultExpr.h:371
ST RightOperand
Composite type of the right-hand side scalar value.
Definition: DVecScalarMultExpr.h:185
VT::ResultType RT
Result type of the dense vector expression.
Definition: DVecScalarMultExpr.h:114
Base class for N-dimensional dense vectors.The DenseVector class is a base class for all arbitrarily ...
Definition: DenseVector.h:70
#define BLAZE_CONSTRAINT_MUST_BE_SAME_TYPE(A, B)
Data type constraint.In case the two types A and B are not the same (ignoring all cv-qualifiers of bo...
Definition: SameType.h:89
Constraint on the data type.
#define BLAZE_CONSTRAINT_MUST_BE_REFERENCE_TYPE(T)
Constraint on the data type.In case the given data type T is not a reference type, a compilation error is created.
Definition: Reference.h:78
std::random_access_iterator_tag IteratorCategory
The iterator category.
Definition: DVecScalarMultExpr.h:195
Constraint on the data type.
DVecScalarMultExpr< VT, ST, TF > This
Type of this DVecScalarMultExpr instance.
Definition: DVecScalarMultExpr.h:169
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:2476
bool operator<(const ConstIterator &rhs) const
Less-than comparison between two ConstIterator objects.
Definition: DVecScalarMultExpr.h:338
Header file for the SelectType class template.
LeftOperand vector_
Left-hand side dense vector of the multiplication expression.
Definition: DVecScalarMultExpr.h:577
Header file for all forward declarations for expression class templates.
CMathTrait< typename VT::ElementType >::Type length(const DenseVector< VT, TF > &dv)
Calculation of the dense vector length .
Definition: DenseVector.h:463
Header file for the IsDenseMatrix type trait.
size_t size() const
Returns the current size/dimension of the vector.
Definition: DVecScalarMultExpr.h:506
Header file for the EnableIf class template.
ReferenceType reference
Reference return type.
Definition: DVecScalarMultExpr.h:205
ConstIterator & operator++()
Pre-increment operator.
Definition: DVecScalarMultExpr.h:253
Header file for the serial shim.
Header file for the BaseElementType type trait.
bool canSMPAssign() const
Returns whether the expression can be used in SMP assignments.
Definition: DVecScalarMultExpr.h:570
friend const ConstIterator operator+(const ConstIterator &it, size_t inc)
Addition between a ConstIterator and an integral value.
Definition: DVecScalarMultExpr.h:394
Header file for the IsNumeric type trait.
RightOperand scalar_
Right-hand side scalar of the multiplication expression.
Definition: DVecScalarMultExpr.h:578
ElementType ValueType
Type of the underlying elements.
Definition: DVecScalarMultExpr.h:196
BLAZE_ALWAYS_INLINE EnableIf< IsIntegral< T >, Set< T, sizeof(T)> >::Type::Type set(T value)
Sets all values in the vector to the given integral value.
Definition: Set.h:211
bool operator==(const ConstIterator &rhs) const
Equality comparison between two ConstIterator objects.
Definition: DVecScalarMultExpr.h:316
Base class for all vector/scalar multiplication expression templates.The VecScalarMultExpr class serv...
Definition: VecScalarMultExpr.h:66
EnableIf< IsDenseMatrix< MT1 > >::Type smpSubAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the SMP subtraction assignment of a matrix to dense matrix.
Definition: DenseMatrix.h:160
Header file for the IsSparseVector type trait.
const Type & ReturnType
Return type for expression template evaluations.
Definition: CompressedMatrix.h:2477
Intrinsic characteristics of data types.The IntrinsicTrait class template provides the intrinsic char...
Definition: IntrinsicTrait.h:749
Header file for run time assertion macros.
EnableIf< IsDenseMatrix< MT1 > >::Type smpAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the SMP assignment of a matrix to a dense matrix.
Definition: DenseMatrix.h:98
Utility type for generic codes.
Base template for the MultTrait class.
Definition: MultTrait.h:142
BLAZE_ALWAYS_INLINE void addAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the addition assignment of a matrix to a matrix.
Definition: Matrix.h:742
Header file for the division trait.
IteratorType iterator_
Iterator to the current element.
Definition: DVecScalarMultExpr.h:425
bool isAliased(const T *alias) const
Returns whether the expression is aliased with the given address alias.
Definition: DVecScalarMultExpr.h:550
const DenseIterator< Type > operator-(const DenseIterator< Type > &it, ptrdiff_t inc)
Subtraction between a DenseIterator and an integral value.
Definition: DenseIterator.h:585
Substitution Failure Is Not An Error (SFINAE) class.The EnableIf class template is an auxiliary tool ...
Definition: EnableIf.h:184
Constraint on the data type.
#define BLAZE_CONSTRAINT_MUST_BE_NUMERIC_TYPE(T)
Constraint on the data type.In case the given data type T is not a numeric (integral or floating poin...
Definition: Numeric.h:79
RightOperand rightOperand() const
Returns the right-hand side scalar operand.
Definition: DVecScalarMultExpr.h:526
VT::ElementType ET
Element type of the dense vector expression.
Definition: DVecScalarMultExpr.h:116
friend const ConstIterator operator+(size_t inc, const ConstIterator &it)
Addition between an integral value and a ConstIterator.
Definition: DVecScalarMultExpr.h:406
ElementType * PointerType
Pointer return type.
Definition: DVecScalarMultExpr.h:197
const size_t SMP_DVECSCALARMULT_THRESHOLD
SMP dense vector/scalar multiplication/division threshold.This threshold specifies when a dense vecto...
Definition: Thresholds.h:299
Evaluation of the base element type of a given data type.Via this type trait it is possible to evalua...
Definition: BaseElementType.h:80
VT::ReturnType RN
Return type of the dense vector expression.
Definition: DVecScalarMultExpr.h:115
Header file for the IsDenseVector type trait.
friend const ConstIterator operator-(const ConstIterator &it, size_t dec)
Subtraction between a ConstIterator and an integral value.
Definition: DVecScalarMultExpr.h:418
Header file for all intrinsic functionality.
#define BLAZE_CONSTRAINT_MUST_BE_DENSE_VECTOR_TYPE(T)
Constraint on the data type.In case the given data type T is not a dense, N-dimensional vector type...
Definition: DenseVector.h:79
ElementType & ReferenceType
Reference return type.
Definition: DVecScalarMultExpr.h:198
ConstIterator begin() const
Returns an iterator to the first non-zero element of the dense vector.
Definition: DVecScalarMultExpr.h:486
IntrinsicType load() const
Access to the intrinsic elements of the vector.
Definition: DVecScalarMultExpr.h:305
Header file for the IsRowMajorMatrix type trait.
Header file for the IsComputation type trait class.
const ConstIterator operator--(int)
Post-decrement operator.
Definition: DVecScalarMultExpr.h:285
Expression object for dense vector-scalar multiplications.The DVecScalarMultExpr class represents the...
Definition: DVecScalarMultExpr.h:108
ConstIterator & operator+=(size_t inc)
Addition assignment operator.
Definition: DVecScalarMultExpr.h:230
Base class for all compute expression templates.The Computation class serves as a tag for all computa...
Definition: Computation.h:59
EnableIf< IsDenseMatrix< MT1 > >::Type smpAddAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the SMP addition assignment of a matrix to a dense matrix.
Definition: DenseMatrix.h:129
Base class for sparse vectors.The SparseVector class is a base class for all arbitrarily sized (N-dim...
Definition: Forward.h:108
#define BLAZE_FUNCTION_TRACE
Function trace macro.This macro can be used to reliably trace function calls. In case function tracin...
Definition: FunctionTrace.h:157
ConstIterator & operator-=(size_t dec)
Subtraction assignment operator.
Definition: DVecScalarMultExpr.h:242
This ResultType
Result type for expression template evaluations.
Definition: CompressedMatrix.h:2473
Header file for basic type definitions.
Header file for the SubvectorExprTrait class template.
SelectType< useAssign, const ResultType, const DVecScalarMultExpr & >::Type CompositeType
Data type for composite expression templates.
Definition: DVecScalarMultExpr.h:179
const DVecScalarMultExpr< VT, typename VT::ElementType, TF > normalize(const DenseVector< VT, TF > &vec)
Normalization of the dense vector ( ).
Definition: DVecScalarMultExpr.h:1068
MultTrait< RT, ST >::Type ResultType
Result type for expression template evaluations.
Definition: DVecScalarMultExpr.h:170
Header file for the IsColumnVector type trait.
IteratorCategory iterator_category
The iterator category.
Definition: DVecScalarMultExpr.h:202
VT::CompositeType CT
Composite type of the dense vector expression.
Definition: DVecScalarMultExpr.h:117
EnableIf< IsDenseVector< VT1 > >::Type smpMultAssign(Vector< VT1, TF1 > &lhs, const Vector< VT2, TF2 > &rhs)
Default implementation of the SMP multiplication assignment of a vector to a dense vector...
Definition: DenseVector.h:189
Header file for the Size type trait.
Evaluation of the resulting expression type of a multiplication.Via this type trait it is possible to...
Definition: MultExprTrait.h:137
RightOperand scalar_
Scalar of the multiplication expression.
Definition: DVecScalarMultExpr.h:426
#define BLAZE_CONSTRAINT_MUST_BE_VECTOR_WITH_TRANSPOSE_FLAG(T, TF)
Constraint on the data type.In case the given data type T is not a dense or sparse vector type and in...
Definition: TransposeFlag.h:238
Header file for the thresholds for matrix/vector and matrix/matrix multiplications.
#define BLAZE_INTERNAL_ASSERT(expr, msg)
Run time assertion macro for internal checks.In case of an invalid run time expression, the program execution is terminated. The BLAZE_INTERNAL_ASSERT macro can be disabled by setting the BLAZE_USER_ASSERTION flag to zero or by defining NDEBUG during the compilation.
Definition: Assert.h:101
#define BLAZE_CONSTRAINT_MUST_BE_FLOATING_POINT_TYPE(T)
Constraint on the data type.In case the given data type T is not a floating point data type...
Definition: FloatingPoint.h:79
Header file for the IsExpression type trait class.
Header file for the FunctionTrace class.
BLAZE_ALWAYS_INLINE void subAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the subtraction assignment of a matrix to matrix.
Definition: Matrix.h:849
DifferenceType difference_type
Difference between two iterators.
Definition: DVecScalarMultExpr.h:206
DifferenceType operator-(const ConstIterator &rhs) const
Calculating the number of elements between two iterators.
Definition: DVecScalarMultExpr.h:382
ConstIterator & operator--()
Pre-decrement operator.
Definition: DVecScalarMultExpr.h:274