22 #ifndef _BLAZE_MATH_EXPRESSIONS_SVECSVECMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_SVECSVECMULTEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
67 template<
typename VT1
76 typedef typename VT1::ResultType
RT1;
77 typedef typename VT2::ResultType
RT2;
78 typedef typename VT1::ReturnType
RN1;
79 typedef typename VT2::ReturnType
RN2;
80 typedef typename VT1::CompositeType
CT1;
81 typedef typename VT2::CompositeType
CT2;
82 typedef typename VT1::TransposeType
TT1;
83 typedef typename VT2::TransposeType
TT2;
194 template<
typename T >
221 template<
typename VT >
226 typedef typename boost::remove_reference<CT1>::type::ConstIterator LeftIterator;
227 typedef typename boost::remove_reference<CT2>::type::ConstIterator RightIterator;
236 const LeftIterator lend( x.end() );
237 const RightIterator rend( y.end() );
239 LeftIterator l( x.begin() );
240 RightIterator r( y.begin() );
242 for( ; l!=lend; ++l ) {
243 while( r!=rend && r->index() < l->index() ) ++r;
245 if( l->index() == r->index() ) {
246 (~lhs)[l->index()] = l->value() * r->value();
266 template<
typename VT >
271 typedef typename boost::remove_reference<CT1>::type::ConstIterator LeftIterator;
272 typedef typename boost::remove_reference<CT2>::type::ConstIterator RightIterator;
281 const LeftIterator lend( x.end() );
282 const RightIterator rend( y.end() );
284 LeftIterator l( x.begin() );
285 RightIterator r( y.begin() );
287 for( ; l!=lend; ++l ) {
288 while( r!=rend && r->index() < l->index() ) ++r;
290 if( l->index() == r->index() ) {
291 (~lhs).append( l->index(), l->value() * r->value() );
311 template<
typename VT >
316 typedef typename boost::remove_reference<CT1>::type::ConstIterator LeftIterator;
317 typedef typename boost::remove_reference<CT2>::type::ConstIterator RightIterator;
326 const LeftIterator lend( x.end() );
327 const RightIterator rend( y.end() );
329 LeftIterator l( x.begin() );
330 RightIterator r( y.begin() );
332 for( ; l!=lend; ++l ) {
333 while( r!=rend && r->index() < l->index() ) ++r;
335 if( l->index() == r->index() ) {
336 (~lhs)[l->index()] += l->value() * r->value();
360 template<
typename VT >
365 typedef typename boost::remove_reference<CT1>::type::ConstIterator LeftIterator;
366 typedef typename boost::remove_reference<CT2>::type::ConstIterator RightIterator;
375 const LeftIterator lend( x.end() );
376 const RightIterator rend( y.end() );
378 LeftIterator l( x.begin() );
379 RightIterator r( y.begin() );
381 for( ; l!=lend; ++l ) {
382 while( r!=rend && r->index() < l->index() ) ++r;
384 if( l->index() == r->index() ) {
385 (~lhs)[l->index()] -= l->value() * r->value();
409 template<
typename VT >
414 typedef typename boost::remove_reference<CT1>::type::ConstIterator LeftIterator;
415 typedef typename boost::remove_reference<CT2>::type::ConstIterator RightIterator;
424 const LeftIterator lend( x.end() );
425 const RightIterator rend( y.end() );
427 LeftIterator l( x.begin() );
428 RightIterator r( y.begin() );
432 for( ; l!=lend; ++l ) {
433 while( r!=rend && r->index() < l->index() ) ++r;
435 if( l->index() == r->index() ) {
436 for( ; i<r->index(); ++i )
438 (~lhs)[l->index()] *= l->value() * r->value();
444 for( ; i<rhs.size(); ++i )
462 template<
typename VT >
467 typedef typename VT::ConstIterator Iterator1;
468 typedef typename boost::remove_reference<CT1>::type::ConstIterator Iterator2;
469 typedef typename boost::remove_reference<CT2>::type::ConstIterator Iterator3;
478 VT tmp( rhs.size(), rhs.nonZeros() );
480 const Iterator1 end1( (~lhs).end() );
481 const Iterator2 end2( x.end() );
482 const Iterator3 end3( y.end() );
484 Iterator1 i1( (~lhs).begin() );
485 Iterator2 i2( x.begin() );
486 Iterator3 i3( y.begin() );
488 for( ; i1!=end1; ++i1 ) {
489 while( i2!=end2 && i2->index() < i1->index() ) ++i2;
490 if( i2==end2 )
break;
491 while( i3!=end3 && i3->index() < i1->index() ) ++i3;
492 if( i3==end3 )
break;
493 if( i1->index() == i2->index() && i1->index() == i3->index() ) {
494 tmp.append( i1->index(), i1->value() * i2->value() * i3->value() );
550 template<
typename T1
556 if( (~lhs).size() != (~rhs).size() )
557 throw std::invalid_argument(
"Vector sizes do not match" );