22 #ifndef _BLAZE_MATH_EXPRESSIONS_SVECSVECSUBEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_SVECSVECSUBEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
70 template<
typename VT1
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;
167 return lhs_.nonZeros() +
rhs_.nonZeros();
197 template<
typename T >
225 template<
typename VT >
231 typedef typename boost::remove_reference<CT1>::type::ConstIterator LeftIterator;
232 typedef typename boost::remove_reference<CT2>::type::ConstIterator RightIterator;
241 const LeftIterator lend( x.end() );
242 const RightIterator rend( y.end() );
244 for( LeftIterator l=x.begin(); l<lend; ++l ) {
245 (~lhs)[l->index()] = l->value();
248 for( RightIterator r=y.begin(); r<rend; ++r ) {
250 (~lhs)[r->index()] = -r->value();
252 (~lhs)[r->index()] -= r->value();
271 template<
typename VT >
277 typedef typename boost::remove_reference<CT1>::type::ConstIterator LeftIterator;
278 typedef typename boost::remove_reference<CT2>::type::ConstIterator RightIterator;
287 const LeftIterator lend( x.end() );
288 const RightIterator rend( y.end() );
290 for( LeftIterator l=x.begin(); l<lend; ++l ) {
291 (~lhs)[l->index()] = l->value();
294 for( RightIterator r=y.begin(); r<rend; ++r ) {
295 (~lhs)[r->index()] -= r->value();
313 template<
typename VT >
318 typedef typename boost::remove_reference<CT1>::type::ConstIterator LeftIterator;
319 typedef typename boost::remove_reference<CT2>::type::ConstIterator RightIterator;
328 const LeftIterator lend( x.end() );
329 const RightIterator rend( y.end() );
331 LeftIterator l( x.begin() );
332 RightIterator r( y.begin() );
334 while( l != lend && r != rend )
336 if( l->index() < r->index() ) {
337 (~lhs).append( l->index(), l->value() );
340 else if( l->index() > r->index() ) {
341 (~lhs).append( r->index(), -r->value() );
345 (~lhs).append( l->index(), l->value() - r->value() );
352 (~lhs).append( l->index(), l->value() );
357 (~lhs).append( r->index(), -r->value() );
376 template<
typename VT >
403 template<
typename VT >
430 template<
typename VT >
493 template<
typename T1
499 if( (~lhs).size() != (~rhs).size() )
500 throw std::invalid_argument(
"Vector sizes do not match" );