22 #ifndef _BLAZE_MATH_EXPRESSIONS_DVECTSVECMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_DVECTSVECMULTEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
70 template<
typename VT1
78 typedef typename VT1::ResultType
RT1;
79 typedef typename VT2::ResultType
RT2;
80 typedef typename VT1::ReturnType
RN1;
81 typedef typename VT2::ReturnType
RN2;
82 typedef typename VT1::CompositeType
CT1;
83 typedef typename VT2::CompositeType
CT2;
84 typedef typename VT1::ElementType
ET1;
85 typedef typename VT2::ElementType
ET2;
115 template<
typename MT >
117 enum { value = useAssign };
168 typedef typename boost::remove_reference<RightOperand>::type::ConstIterator
IteratorType;
230 return v_ *
it_->value();
360 return lhs_.size() *
rhs_.nonZeros();
371 return rhs_.nonZeros();
401 template<
typename T >
429 template<
typename MT >
436 typedef typename boost::remove_reference<RT>::type::ConstIterator
ConstIterator;
446 const ConstIterator
begin( y.begin() );
447 const ConstIterator
end ( y.end() );
449 for(
size_t i=0UL; i<(~lhs).
rows(); ++i ) {
450 for( ConstIterator element=
begin; element!=
end; ++element ) {
451 (~lhs)(i,element->index()) = x[i] * element->
value();
471 template<
typename MT >
477 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
487 const ConstIterator
begin( y.begin() );
488 const ConstIterator
end ( y.end() );
490 for( ConstIterator element=
begin; element!=
end; ++element ) {
491 for(
size_t i=0UL; i<(~lhs).
rows(); ++i ) {
492 (~lhs)(i,element->index()) = x[i] * element->
value();
514 template<
typename MT >
515 friend inline typename EnableIf< UseAssign<MT> >::Type
521 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
531 const ConstIterator
begin( y.begin() );
532 const ConstIterator
end ( y.end() );
534 for(
size_t i=0UL; i<x.size(); ++i ) {
536 (~lhs).reserve( i, y.nonZeros() );
537 for( ConstIterator element=
begin; element!=
end; ++element ) {
538 (~lhs).append( i, element->index(), x[i] * element->value() );
559 template<
typename MT >
565 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
575 const ConstIterator
begin( y.begin() );
576 const ConstIterator
end ( y.end() );
578 for( ConstIterator element=
begin; element!=
end; ++element ) {
580 (~lhs).reserve( element->index(), x.size() );
581 for(
size_t i=0UL; i<(~lhs).
rows(); ++i ) {
582 (~lhs).append( i, element->index(), x[i] * element->value() );
606 template<
typename MT >
607 friend inline typename EnableIf< UseAssign<MT> >::Type
613 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
623 const ConstIterator
begin( y.begin() );
624 const ConstIterator
end ( y.end() );
626 for(
size_t i=0UL; i<(~lhs).
rows(); ++i ) {
627 for( ConstIterator element=
begin; element!=
end; ++element ) {
628 (~lhs)(i,element->index()) += x[i] * element->
value();
648 template<
typename MT >
654 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
664 const ConstIterator
begin( y.begin() );
665 const ConstIterator
end ( y.end() );
667 for( ConstIterator element=
begin; element!=
end; ++element ) {
668 for(
size_t i=0UL; i<(~lhs).
rows(); ++i ) {
669 (~lhs)(i,element->index()) += x[i] * element->
value();
696 template<
typename MT >
697 friend inline typename EnableIf< UseAssign<MT> >::Type
703 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
713 const ConstIterator
begin( y.begin() );
714 const ConstIterator
end ( y.end() );
716 for(
size_t i=0UL; i<(~lhs).
rows(); ++i ) {
717 for( ConstIterator element=
begin; element!=
end; ++element ) {
718 (~lhs)(i,element->index()) -= x[i] * element->
value();
738 template<
typename MT >
744 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
754 const ConstIterator
begin( y.begin() );
755 const ConstIterator
end ( y.end() );
757 for( ConstIterator element=
begin; element!=
end; ++element ) {
758 for(
size_t i=0UL; i<(~lhs).
rows(); ++i ) {
759 (~lhs)(i,element->index()) -= x[i] * element->
value();
827 template<
typename T1
829 inline const DVecTSVecMultExpr<T1,T2>