22 #ifndef _BLAZE_MATH_EXPRESSIONS_DMATTDMATADDEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_DMATTDMATADDEXPR_H_
66 template<
typename MT1
74 typedef typename MT1::ResultType
RT1;
75 typedef typename MT2::ResultType
RT2;
76 typedef typename MT1::ReturnType
RN1;
77 typedef typename MT2::ReturnType
RN2;
78 typedef typename MT1::CompositeType
CT1;
79 typedef typename MT2::CompositeType
CT2;
118 enum { vectorizable = 0 };
166 return lhs_.columns();
196 template<
typename T >
209 template<
typename T >
211 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
233 template<
typename MT
246 const size_t m( rhs.
rows() );
247 const size_t n( rhs.
columns() );
248 const size_t block( 16UL );
250 for(
size_t ii=0UL; ii<m; ii+=block ) {
251 const size_t iend( ( m < ii+block )?( m ):( ii+block ) );
252 for(
size_t jj=0UL; jj<n; jj+=block ) {
253 const size_t jend( ( n < jj+block )?( n ):( jj+block ) );
254 for(
size_t i=ii; i<iend; ++i ) {
255 for(
size_t j=jj; j<jend; ++j ) {
256 (~lhs)(i,j) = rhs.
lhs_(i,j) + rhs.
rhs_(i,j);
292 template<
typename MT
310 const TmpType tmp( rhs );
328 template<
typename MT
339 if( !RequiresEvaluation<MT1>::value && !RequiresEvaluation<MT2>::value )
341 const size_t m( rhs.rows() );
342 const size_t n( rhs.columns() );
343 const size_t block( 16UL );
345 for(
size_t ii=0UL; ii<m; ii+=block ) {
346 const size_t iend( ( m < ii+block )?( m ):( ii+block ) );
347 for(
size_t jj=0UL; jj<n; jj+=block ) {
348 const size_t jend( ( n < jj+block )?( n ):( jj+block ) );
349 for(
size_t i=ii; i<iend; ++i ) {
350 for(
size_t j=jj; j<jend; ++j ) {
351 (~lhs)(i,j) += rhs.lhs_(i,j) + rhs.rhs_(i,j);
385 template<
typename MT
396 if( !RequiresEvaluation<MT1>::value && !RequiresEvaluation<MT2>::value )
398 const size_t m( rhs.rows() );
399 const size_t n( rhs.columns() );
400 const size_t block( 16UL );
402 for(
size_t ii=0UL; ii<m; ii+=block ) {
403 const size_t iend( ( m < ii+block )?( m ):( ii+block ) );
404 for(
size_t jj=0UL; jj<n; jj+=block ) {
405 const size_t jend( ( n < jj+block )?( n ):( jj+block ) );
406 for(
size_t i=ii; i<iend; ++i ) {
407 for(
size_t j=jj; j<jend; ++j ) {
408 (~lhs)(i,j) -= rhs.lhs_(i,j) + rhs.rhs_(i,j);
487 template<
typename T1
489 inline const DMatTDMatAddExpr<T1,T2>
495 throw std::invalid_argument(
"Matrix sizes do not match" );
531 template<
typename T1
533 inline const DMatTDMatAddExpr<T2,T1>
539 throw std::invalid_argument(
"Matrix sizes do not match" );
567 template<
typename MT1
569 inline typename RowExprTrait< DMatTDMatAddExpr<MT1,MT2> >::Type
570 row(
const DMatTDMatAddExpr<MT1,MT2>& dm,
size_t index )
574 return row( dm.leftOperand(), index ) +
row( dm.rightOperand(), index );
593 template<
typename MT1
595 inline typename ColumnExprTrait< DMatTDMatAddExpr<MT1,MT2> >::Type
596 column(
const DMatTDMatAddExpr<MT1,MT2>& dm,
size_t index )
600 return column( dm.leftOperand(), index ) +
column( dm.rightOperand(), index );
616 template<
typename MT1,
typename MT2 >
617 struct RowExprTrait< DMatTDMatAddExpr<MT1,MT2> >
621 typedef typename AddExprTrait< typename RowExprTrait<const MT1>::Type
622 ,
typename RowExprTrait<const MT2>::Type >::Type Type;
631 template<
typename MT1,
typename MT2 >
632 struct ColumnExprTrait< DMatTDMatAddExpr<MT1,MT2> >
636 typedef typename AddExprTrait< typename ColumnExprTrait<const MT1>::Type
637 ,
typename ColumnExprTrait<const MT2>::Type >::Type Type;