22 #ifndef _BLAZE_MATH_EXPRESSIONS_SVECSVECSUBEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_SVECSVECSUBEXPR_H_
70 template<
typename VT1
73 class SVecSVecSubExpr :
public SparseVector< SVecSVecSubExpr<VT1,VT2,TF>, TF >
74 ,
private VecVecSubExpr
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 >
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 >
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 RemoveReference<CT1>::Type::ConstIterator LeftIterator;
328 typedef typename RemoveReference<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 SVecSVecSubExpr<T1,T2,TF>
516 if( (~lhs).size() != (~rhs).size() )
517 throw std::invalid_argument(
"Vector sizes do not match" );