22 #ifndef _BLAZE_MATH_EXPRESSIONS_TSVECSVECMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_TSVECSVECMULTEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
78 inline const typename MultTrait<typename T1::ElementType,typename T2::ElementType>::Type
83 using boost::remove_reference;
85 typedef typename T1::CompositeType Lhs;
86 typedef typename T2::CompositeType Rhs;
87 typedef typename remove_reference<Lhs>::type X1;
88 typedef typename remove_reference<Rhs>::type X2;
89 typedef typename X1::ElementType E1;
90 typedef typename X2::ElementType E2;
92 typedef typename X1::ConstIterator LeftIterator;
93 typedef typename X2::ConstIterator RightIterator;
100 if( (~lhs).size() != (~rhs).size() )
101 throw std::invalid_argument(
"Vector sizes do not match" );
103 if( (~lhs).nonZeros() == 0UL || (~rhs).nonZeros() == 0UL )
return MultType();
107 const LeftIterator lend( left.end() );
108 const RightIterator rend( right.end() );
109 LeftIterator l( left.begin() );
110 RightIterator r( right.begin() );
111 MultType sp = MultType();
113 for( ; l!=lend && r!=rend; ++l ) {
114 while( r->index() < l->index() && ++r != rend ) {}
115 if( r!=rend && l->index() == r->index() ) {
116 sp = l->value() * r->value();
122 for( ; l!=lend && r!=rend; ++l ) {
123 while( r->index() < l->index() && ++r != rend ) {}
124 if( r!=rend && l->index() == r->index() ) {
125 sp += l->value() * r->value();