22 #ifndef _BLAZE_MATH_EXPRESSIONS_TSVECSVECMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_TSVECSVECMULTEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
77 inline const typename MultTrait<typename T1::ElementType,typename T2::ElementType>::Type
80 using boost::remove_reference;
82 typedef typename T1::CompositeType Lhs;
83 typedef typename T2::CompositeType Rhs;
84 typedef typename remove_reference<Lhs>::type X1;
85 typedef typename remove_reference<Rhs>::type X2;
86 typedef typename X1::ElementType E1;
87 typedef typename X2::ElementType E2;
89 typedef typename X1::ConstIterator LeftIterator;
90 typedef typename X2::ConstIterator RightIterator;
97 if( (~lhs).size() != (~rhs).size() )
98 throw std::invalid_argument(
"Vector sizes do not match" );
100 if( (~lhs).nonZeros() == 0UL || (~rhs).nonZeros() == 0UL )
return MultType();
104 const LeftIterator lend( left.end() );
105 const RightIterator rend( right.end() );
106 LeftIterator l( left.begin() );
107 RightIterator r( right.begin() );
108 MultType sp = MultType();
110 for( ; l!=lend && r!=rend; ++l ) {
111 while( r->index() < l->index() && ++r != rend ) {}
112 if( r!=rend && l->index() == r->index() ) {
113 sp = l->value() * r->value();
119 for( ; l!=lend && r!=rend; ++l ) {
120 while( r->index() < l->index() && ++r != rend ) {}
121 if( r!=rend && l->index() == r->index() ) {
122 sp += l->value() * r->value();