22 #ifndef _BLAZE_MATH_EXPRESSIONS_SVECDVECMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_SVECDVECMULTEXPR_H_
32 #include <boost/type_traits/remove_reference.hpp>
68 template<
typename VT1
71 class SVecDVecMultExpr :
public SparseVector< SVecDVecMultExpr<VT1,VT2,TF>, TF >
77 typedef typename VT1::ResultType
RT1;
78 typedef typename VT2::ResultType
RT2;
79 typedef typename VT1::ReturnType
RN1;
80 typedef typename VT2::ReturnType
RN2;
81 typedef typename VT1::CompositeType
CT1;
82 typedef typename VT2::CompositeType
CT2;
83 typedef typename VT1::TransposeType
TT1;
84 typedef typename VT2::TransposeType
TT2;
112 template<
typename VT >
114 enum { value = useAssign };
150 typedef typename boost::remove_reference<LeftOperand>::type::ConstIterator
IteratorType;
329 return lhs_.nonZeros();
359 template<
typename T >
361 return (
lhs_.canAlias( alias ) ) || (
rhs_.canAlias( alias ) );
371 template<
typename T >
373 return (
lhs_.isAliased( alias ) ) || (
rhs_.isAliased( alias ) );
397 template<
typename VT >
405 typedef typename boost::remove_reference<CT1>::type::ConstIterator
ConstIterator;
414 for( ConstIterator element=x.begin(); element!=x.end(); ++element )
415 (~lhs)[element->index()] = element->value() * y[element->index()];
434 template<
typename VT >
442 typedef typename boost::remove_reference<CT1>::type::ConstIterator ConstIterator;
451 for( ConstIterator element=x.begin(); element!=x.end(); ++element )
452 (~lhs).append( element->index(), element->value() * y[element->index()] );
471 template<
typename VT >
472 friend inline typename EnableIf< UseAssign<VT> >::Type
479 typedef typename boost::remove_reference<CT1>::type::ConstIterator ConstIterator;
488 for( ConstIterator element=x.begin(); element!=x.end(); ++element )
489 (~lhs)[element->index()] += element->value() * y[element->index()];
512 template<
typename VT >
513 friend inline typename EnableIf< UseAssign<VT> >::Type
520 typedef typename boost::remove_reference<CT1>::type::ConstIterator ConstIterator;
529 for( ConstIterator element=x.begin(); element!=x.end(); ++element )
530 (~lhs)[element->index()] -= element->value() * y[element->index()];
553 template<
typename VT >
554 friend inline typename EnableIf< UseAssign<VT> >::Type
561 typedef typename boost::remove_reference<CT1>::type::ConstIterator ConstIterator;
570 const ConstIterator
end( x.end() );
571 ConstIterator
begin( x.begin() );
576 for( ; i<index; ++i )
582 for( ; i<rhs.size(); ++i )
639 template<
typename T1
642 inline const SVecDVecMultExpr<T1,T2,TF>
647 if( (~lhs).
size() != (~rhs).
size() )
648 throw std::invalid_argument(
"Vector sizes do not match" );