22 #ifndef _BLAZE_MATH_EXPRESSIONS_SVECSVECADDEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_SVECSVECADDEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
70 template<
typename VT1
73 class SVecSVecAddExpr :
public SparseVector< SVecSVecAddExpr<VT1,VT2,TF>, TF >
79 typedef typename VT1::ResultType
RT1;
80 typedef typename VT2::ResultType
RT2;
81 typedef typename VT1::ReturnType
RN1;
82 typedef typename VT2::ReturnType
RN2;
83 typedef typename VT1::CompositeType
CT1;
84 typedef typename VT2::CompositeType
CT2;
85 typedef typename VT1::TransposeType
TT1;
86 typedef typename VT2::TransposeType
TT2;
191 template<
typename T >
193 return (
lhs_.canAlias( alias ) ||
rhs_.canAlias( alias ) );
203 template<
typename T >
205 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
228 template<
typename VT >
236 typedef typename boost::remove_reference<CT1>::type::ConstIterator LeftIterator;
237 typedef typename boost::remove_reference<CT2>::type::ConstIterator RightIterator;
246 const LeftIterator lend( x.end() );
247 const RightIterator rend( y.end() );
249 for( LeftIterator l=x.begin(); l<lend; ++l ) {
250 (~lhs)[l->index()] = l->value();
253 for( RightIterator r=y.begin(); r<rend; ++r ) {
255 (~lhs)[r->index()] = r->value();
257 (~lhs)[r->index()] += r->value();
276 template<
typename VT >
284 typedef typename boost::remove_reference<CT1>::type::ConstIterator LeftIterator;
285 typedef typename boost::remove_reference<CT2>::type::ConstIterator RightIterator;
294 const LeftIterator lend( x.end() );
295 const RightIterator rend( y.end() );
297 for( LeftIterator l=x.begin(); l<lend; ++l ) {
298 (~lhs)[l->index()] = l->value();
301 for( RightIterator r=y.begin(); r<rend; ++r ) {
302 (~lhs)[r->index()] += r->value();
320 template<
typename VT >
327 typedef typename boost::remove_reference<CT1>::type::ConstIterator LeftIterator;
328 typedef typename boost::remove_reference<CT2>::type::ConstIterator RightIterator;
337 const LeftIterator lend( x.end() );
338 const RightIterator rend( y.end() );
340 LeftIterator l( x.begin() );
341 RightIterator r( y.begin() );
343 while( l != lend && r != rend )
345 if( l->index() < r->index() ) {
346 (~lhs).append( l->index(), l->value() );
349 else if( l->index() > r->index() ) {
350 (~lhs).append( r->index(), r->value() );
354 (~lhs).append( l->index(), l->value() + r->value() );
361 (~lhs).append( l->index(), l->value() );
366 (~lhs).append( r->index(), r->value() );
385 template<
typename VT >
414 template<
typename VT >
443 template<
typename VT >
508 template<
typename T1
511 inline const SVecSVecAddExpr<T1,T2,TF>
516 if( (~lhs).size() != (~rhs).size() )
517 throw std::invalid_argument(
"Vector sizes do not match" );