22 #ifndef _BLAZE_MATH_EXPRESSIONS_TDVECTSMATMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_TDVECTSMATMULTEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
72 class TDVecTSMatMultExpr :
public DenseVector< TDVecTSMatMultExpr<VT,MT>, true >
78 typedef typename VT::ResultType
VRT;
79 typedef typename MT::ResultType
MRT;
80 typedef typename VT::CompositeType
VCT;
81 typedef typename MT::CompositeType
MCT;
98 template<
typename VT2 >
100 enum { value = useAssign };
131 enum { vectorizable = 0 };
154 typedef typename boost::remove_reference<MCT>::type::ConstIterator ConstIterator;
163 const ConstIterator end( A.end(index) );
164 ConstIterator element( A.begin(index) );
167 if( element != end ) {
168 res = x[element->index()] * element->value();
170 for( ; element!=end; ++element )
171 res += x[element->index()] * element->value();
187 return mat_.columns();
217 template<
typename T >
219 return (
vec_.isAliased( alias ) ||
mat_.isAliased( alias ) );
229 template<
typename T >
231 return (
vec_.isAliased( alias ) ||
mat_.isAliased( alias ) );
256 template<
typename VT2 >
264 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
266 if( rhs.mat_.rows() == 0UL ) {
279 for(
size_t j=0UL; j<A.columns(); ++j )
281 const ConstIterator end( A.end(j) );
282 ConstIterator element( A.begin(j) );
284 if( element == end ) {
289 (~lhs)[j] = x[element->index()] * element->value();
291 for( ; element!=end; ++element ) {
292 (~lhs)[j] += x[element->index()] * element->value();
313 template<
typename VT2 >
325 const ResultType tmp( rhs );
345 template<
typename VT2 >
353 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
355 if( rhs.mat_.rows() == 0UL ) {
367 for(
size_t j=0UL; j<A.columns(); ++j ) {
368 const ConstIterator end( A.end(j) );
369 ConstIterator element( A.begin(j) );
371 for( ; element!=end; ++element ) {
372 (~lhs)[j] += x[element->index()] * element->value();
397 template<
typename VT2 >
405 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
407 if( rhs.mat_.rows() == 0UL ) {
419 for(
size_t j=0UL; j<A.columns(); ++j ) {
420 const ConstIterator end( A.end(j) );
421 ConstIterator element( A.begin(j) );
423 for( ; element!=end; ++element ) {
424 (~lhs)[j] -= x[element->index()] * element->value();
449 template<
typename VT2 >
461 const ResultType tmp( rhs );
521 template<
typename T1
523 inline const typename DisableIf< IsMatMatMultExpr<T2>, TDVecTSMatMultExpr<T1,T2> >::Type
528 if( (~vec).
size() != (~mat).
rows() )
529 throw std::invalid_argument(
"Vector and matrix sizes do not match" );