22 #ifndef _BLAZE_MATH_EXPRESSIONS_SVECTSVECMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_SVECTSVECMULTEXPR_H_
30 #include <boost/type_traits/remove_reference.hpp>
65 template<
typename VT1
73 typedef typename VT1::ResultType
RT1;
74 typedef typename VT2::ResultType
RT2;
75 typedef typename VT1::ReturnType
RN1;
76 typedef typename VT2::ReturnType
RN2;
77 typedef typename VT1::CompositeType
CT1;
78 typedef typename VT2::CompositeType
CT2;
179 return lhs_.nonZeros() *
rhs_.nonZeros();
220 template<
typename T >
245 template<
typename MT >
251 typedef typename boost::remove_reference<LT>::type::ConstIterator LeftIterator;
252 typedef typename boost::remove_reference<RT>::type::ConstIterator RightIterator;
262 const LeftIterator lend( x.end() );
263 const RightIterator rend( y.end() );
265 for( LeftIterator lelem=x.begin(); lelem!=lend; ++lelem ) {
267 for( RightIterator relem=y.begin(); relem!=rend; ++relem ) {
268 (~lhs)(lelem->index(),relem->index()) = lelem->value() * relem->value();
289 template<
typename MT >
295 typedef typename boost::remove_reference<LT>::type::ConstIterator LeftIterator;
296 typedef typename boost::remove_reference<RT>::type::ConstIterator RightIterator;
306 const LeftIterator lend( x.end() );
307 const RightIterator rend( y.end() );
309 for( RightIterator relem=y.begin(); relem!=rend; ++relem ) {
311 for( LeftIterator lelem=x.begin(); lelem!=lend; ++lelem ) {
312 (~lhs)(lelem->index(),relem->index()) = lelem->value() * relem->value();
332 template<
typename MT >
338 typedef typename boost::remove_reference<LT>::type::ConstIterator LeftIterator;
339 typedef typename boost::remove_reference<RT>::type::ConstIterator RightIterator;
349 const LeftIterator lend( x.end() );
350 const RightIterator rend( y.end() );
352 for( LeftIterator lelem=x.begin(); lelem!=lend; ++lelem ) {
354 (~lhs).reserve( lelem->index(), y.nonZeros() );
355 for( RightIterator relem=y.begin(); relem!=rend; ++relem ) {
356 (~lhs).append( lelem->index(), relem->index(), lelem->value() * relem->value() );
377 template<
typename MT >
383 typedef typename boost::remove_reference<LT>::type::ConstIterator LeftIterator;
384 typedef typename boost::remove_reference<RT>::type::ConstIterator RightIterator;
394 const LeftIterator lend( x.end() );
395 const RightIterator rend( y.end() );
397 for( RightIterator relem=y.begin(); relem!=rend; ++relem ) {
399 (~lhs).reserve( relem->index(), x.nonZeros() );
400 for( LeftIterator lelem=x.begin(); lelem!=lend; ++lelem ) {
401 (~lhs).append( lelem->index(), relem->index(), lelem->value() * relem->value() );
422 template<
typename MT >
428 typedef typename boost::remove_reference<LT>::type::ConstIterator LeftIterator;
429 typedef typename boost::remove_reference<RT>::type::ConstIterator RightIterator;
439 const LeftIterator lend( x.end() );
440 const RightIterator rend( y.end() );
442 for( LeftIterator lelem=x.begin(); lelem!=lend; ++lelem ) {
444 for( RightIterator relem=y.begin(); relem!=rend; ++relem ) {
445 (~lhs)(lelem->index(),relem->index()) += lelem->value() * relem->value();
466 template<
typename MT >
472 typedef typename boost::remove_reference<LT>::type::ConstIterator LeftIterator;
473 typedef typename boost::remove_reference<RT>::type::ConstIterator RightIterator;
483 const LeftIterator lend( x.end() );
484 const RightIterator rend( y.end() );
486 for( RightIterator relem=y.begin(); relem!=rend; ++relem ) {
488 for( LeftIterator lelem=x.begin(); lelem!=lend; ++lelem ) {
489 (~lhs)(lelem->index(),relem->index()) += lelem->value() * relem->value();
514 template<
typename MT >
520 typedef typename boost::remove_reference<LT>::type::ConstIterator LeftIterator;
521 typedef typename boost::remove_reference<RT>::type::ConstIterator RightIterator;
531 const LeftIterator lend( x.end() );
532 const RightIterator rend( y.end() );
534 for( LeftIterator lelem=x.begin(); lelem!=lend; ++lelem ) {
536 for( RightIterator relem=y.begin(); relem!=rend; ++relem ) {
537 (~lhs)(lelem->index(),relem->index()) -= lelem->value() * relem->value();
558 template<
typename MT >
564 typedef typename boost::remove_reference<LT>::type::ConstIterator LeftIterator;
565 typedef typename boost::remove_reference<RT>::type::ConstIterator RightIterator;
575 const LeftIterator lend( x.end() );
576 const RightIterator rend( y.end() );
578 for( RightIterator relem=y.begin(); relem!=rend; ++relem ) {
580 for( LeftIterator lelem=x.begin(); lelem!=lend; ++lelem ) {
581 (~lhs)(lelem->index(),relem->index()) -= lelem->value() * relem->value();
648 template<
typename T1