22 #ifndef _BLAZE_MATH_EXPRESSIONS_DVECTSVECMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_DVECTSVECMULTEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
74 template<
typename VT1
82 typedef typename VT1::ResultType
RT1;
83 typedef typename VT2::ResultType
RT2;
84 typedef typename VT1::ReturnType
RN1;
85 typedef typename VT2::ReturnType
RN2;
86 typedef typename VT1::CompositeType
CT1;
87 typedef typename VT2::CompositeType
CT2;
88 typedef typename VT1::ElementType
ET1;
89 typedef typename VT2::ElementType
ET2;
119 template<
typename MT >
121 enum { value = useAssign };
167 typedef typename boost::remove_reference<RightOperand>::type::ConstIterator
IteratorType;
229 return v_ *
it_->value();
359 return lhs_.size() *
rhs_.nonZeros();
371 return rhs_.nonZeros();
401 template<
typename T >
403 return (
lhs_.canAlias( alias ) ||
rhs_.canAlias( alias ) );
413 template<
typename T >
415 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
440 template<
typename MT >
449 typedef typename boost::remove_reference<RT>::type::ConstIterator
ConstIterator;
459 const ConstIterator
begin( y.begin() );
460 const ConstIterator
end ( y.end() );
462 for(
size_t i=0UL; i<(~lhs).
rows(); ++i ) {
463 for( ConstIterator element=
begin; element!=
end; ++element ) {
464 (~lhs)(i,element->index()) = x[i] * element->
value();
484 template<
typename MT >
492 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
502 const ConstIterator
begin( y.begin() );
503 const ConstIterator
end ( y.end() );
505 for( ConstIterator element=
begin; element!=
end; ++element ) {
506 for(
size_t i=0UL; i<(~lhs).
rows(); ++i ) {
507 (~lhs)(i,element->index()) = x[i] * element->
value();
529 template<
typename MT >
530 friend inline typename EnableIf< UseAssign<MT> >::Type
538 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
548 const ConstIterator
begin( y.begin() );
549 const ConstIterator
end ( y.end() );
551 for(
size_t i=0UL; i<x.size(); ++i ) {
553 (~lhs).reserve( i, y.nonZeros() );
554 for( ConstIterator element=
begin; element!=
end; ++element ) {
555 (~lhs).append( i, element->index(), x[i] * element->value() );
576 template<
typename MT >
584 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
594 const ConstIterator
begin( y.begin() );
595 const ConstIterator
end ( y.end() );
597 for( ConstIterator element=
begin; element!=
end; ++element ) {
599 (~lhs).reserve( element->index(), x.size() );
600 for(
size_t i=0UL; i<(~lhs).
rows(); ++i ) {
601 (~lhs).append( i, element->index(), x[i] * element->value() );
625 template<
typename MT >
626 friend inline typename EnableIf< UseAssign<MT> >::Type
634 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
644 const ConstIterator
begin( y.begin() );
645 const ConstIterator
end ( y.end() );
647 for(
size_t i=0UL; i<(~lhs).
rows(); ++i ) {
648 for( ConstIterator element=
begin; element!=
end; ++element ) {
649 (~lhs)(i,element->index()) += x[i] * element->
value();
669 template<
typename MT >
677 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
687 const ConstIterator
begin( y.begin() );
688 const ConstIterator
end ( y.end() );
690 for( ConstIterator element=
begin; element!=
end; ++element ) {
691 for(
size_t i=0UL; i<(~lhs).
rows(); ++i ) {
692 (~lhs)(i,element->index()) += x[i] * element->
value();
719 template<
typename MT >
720 friend inline typename EnableIf< UseAssign<MT> >::Type
728 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
738 const ConstIterator
begin( y.begin() );
739 const ConstIterator
end ( y.end() );
741 for(
size_t i=0UL; i<(~lhs).
rows(); ++i ) {
742 for( ConstIterator element=
begin; element!=
end; ++element ) {
743 (~lhs)(i,element->index()) -= x[i] * element->
value();
763 template<
typename MT >
771 typedef typename boost::remove_reference<RT>::type::ConstIterator ConstIterator;
781 const ConstIterator
begin( y.begin() );
782 const ConstIterator
end ( y.end() );
784 for( ConstIterator element=
begin; element!=
end; ++element ) {
785 for(
size_t i=0UL; i<(~lhs).
rows(); ++i ) {
786 (~lhs)(i,element->index()) -= x[i] * element->
value();
854 template<
typename T1
856 inline const DVecTSVecMultExpr<T1,T2>
886 template<
typename VT1
888 inline typename RowExprTrait< DVecTSVecMultExpr<VT1,VT2> >::Type
889 row(
const DVecTSVecMultExpr<VT1,VT2>& sm,
size_t index )
893 return sm.leftOperand()[index] * sm.rightOperand();
911 template<
typename VT1
913 inline typename ColumnExprTrait< DVecTSVecMultExpr<VT1,VT2> >::Type
914 column(
const DVecTSVecMultExpr<VT1,VT2>& sm,
size_t index )
918 return sm.leftOperand() * sm.rightOperand()[index];
934 template<
typename VT1,
typename VT2 >
939 typedef typename MultExprTrait< typename VT1::ReturnType, VT2 >::Type Type;
948 template<
typename VT1,
typename VT2 >
953 typedef typename MultExprTrait< VT1, typename VT2::ReturnType >::Type Type;