22 #ifndef _BLAZE_MATH_EXPRESSIONS_SVECTDVECMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_SVECTDVECMULTEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
73 template<
typename VT1
75 class SVecTDVecMultExpr :
public SparseMatrix< SVecTDVecMultExpr<VT1,VT2>, true >
81 typedef typename VT1::ResultType
RT1;
82 typedef typename VT2::ResultType
RT2;
83 typedef typename VT1::ReturnType
RN1;
84 typedef typename VT2::ReturnType
RN2;
85 typedef typename VT1::CompositeType
CT1;
86 typedef typename VT2::CompositeType
CT2;
87 typedef typename VT1::ElementType
ET1;
88 typedef typename VT2::ElementType
ET2;
117 template<
typename MT >
119 enum { value = useAssign };
162 typedef typename boost::remove_reference<LeftOperand>::type::ConstIterator
IteratorType;
227 return it_->value() *
v_;
357 return lhs_.nonZeros() *
rhs_.size();
369 return lhs_.nonZeros();
399 template<
typename T >
401 return (
lhs_.canAlias( alias ) ||
rhs_.canAlias( alias ) );
411 template<
typename T >
413 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
435 template<
typename MT >
443 typedef typename boost::remove_reference<LT>::type::ConstIterator
ConstIterator;
453 const ConstIterator
end( x.end() );
455 for( ConstIterator element=x.begin(); element!=
end; ++element ) {
457 for(
size_t i=0UL; i<y.size(); ++i ) {
458 (~lhs)(element->index(),i) = element->
value() * y[i];
482 template<
typename MT >
491 typedef typename boost::remove_reference<LT>::type::ConstIterator ConstIterator;
501 const ConstIterator
end( x.end() );
503 for(
size_t i=0UL; i<y.size(); ++i ) {
505 for( ConstIterator element=x.begin(); element!=
end; ++element ) {
506 (~lhs)(element->index(),i) = element->
value() * y[i];
526 template<
typename MT >
534 typedef typename boost::remove_reference<LT>::type::ConstIterator ConstIterator;
544 const ConstIterator
end( x.end() );
546 for( ConstIterator element=x.begin(); element!=
end; ++element ) {
548 (~lhs).reserve( element->index(), y.size() );
549 for(
size_t i=0UL; i<y.size(); ++i ) {
550 (~lhs).append( element->index(), i, element->value() * y[i] );
574 template<
typename MT >
575 friend inline typename EnableIf< UseAssign<MT> >::Type
583 typedef typename boost::remove_reference<LT>::type::ConstIterator ConstIterator;
593 const ConstIterator
end( x.end() );
595 for(
size_t i=0UL; i<y.size(); ++i ) {
597 (~lhs).reserve( i, x.nonZeros() );
598 for( ConstIterator element=x.begin(); element!=
end; ++element ) {
599 (~lhs).append( element->index(), i, element->value() * y[i] );
620 template<
typename MT >
628 typedef typename boost::remove_reference<LT>::type::ConstIterator ConstIterator;
638 const ConstIterator
end( x.end() );
640 for( ConstIterator element=x.begin(); element!=
end; ++element ) {
642 for(
size_t i=0UL; i<y.size(); ++i ) {
643 (~lhs)(element->index(),i) += element->
value() * y[i];
667 template<
typename MT >
668 friend inline typename EnableIf< UseAssign<MT> >::Type
676 typedef typename boost::remove_reference<LT>::type::ConstIterator ConstIterator;
686 const ConstIterator
end( x.end() );
688 for(
size_t i=0UL; i<y.size(); ++i ) {
690 for( ConstIterator element=x.begin(); element!=
end; ++element ) {
691 (~lhs)(element->index(),i) += element->
value() * y[i];
716 template<
typename MT >
724 typedef typename boost::remove_reference<LT>::type::ConstIterator ConstIterator;
734 const ConstIterator
end( x.end() );
736 for( ConstIterator element=x.begin(); element!=
end; ++element ) {
738 for(
size_t i=0UL; i<y.size(); ++i ) {
739 (~lhs)(element->index(),i) -= element->
value() * y[i];
763 template<
typename MT >
764 friend inline typename EnableIf< UseAssign<MT> >::Type
772 typedef typename boost::remove_reference<LT>::type::ConstIterator ConstIterator;
782 const ConstIterator
end( x.end() );
784 for(
size_t i=0UL; i<y.size(); ++i ) {
786 for( ConstIterator element=x.begin(); element!=
end; ++element ) {
787 (~lhs)(element->index(),i) -= element->
value() * y[i];
856 template<
typename T1
858 inline const SVecTDVecMultExpr<T1,T2>
888 template<
typename VT1
890 inline typename RowExprTrait< SVecTDVecMultExpr<VT1,VT2> >::Type
891 row(
const SVecTDVecMultExpr<VT1,VT2>& sm,
size_t index )
895 return sm.leftOperand()[index] * sm.rightOperand();
913 template<
typename VT1
915 inline typename ColumnExprTrait< SVecTDVecMultExpr<VT1,VT2> >::Type
916 column(
const SVecTDVecMultExpr<VT1,VT2>& sm,
size_t index )
920 return sm.leftOperand() * sm.rightOperand()[index];
936 template<
typename VT1,
typename VT2 >
941 typedef typename MultExprTrait< typename VT1::ReturnType, VT2 >::Type Type;
950 template<
typename VT1,
typename VT2 >
955 typedef typename MultExprTrait< VT1, typename VT2::ReturnType >::Type Type;