22 #ifndef _BLAZE_MATH_EXPRESSIONS_DVECTDVECMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_DVECTDVECMULTEXPR_H_
69 template<
typename VT1
77 typedef typename VT1::ResultType
RT1;
78 typedef typename VT2::ResultType
RT2;
79 typedef typename VT1::ReturnType
RN1;
80 typedef typename VT2::ReturnType
RN2;
81 typedef typename VT1::CompositeType
CT1;
82 typedef typename VT2::CompositeType
CT2;
110 template<
typename VT >
112 enum { value = useAssign };
146 enum { vectorizable = 0 };
222 template<
typename T >
224 return (
lhs_.canAlias( alias ) ||
rhs_.canAlias( alias ) );
234 template<
typename T >
236 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
260 template<
typename MT >
277 const size_t m( (~lhs).
rows() );
278 const size_t n( (~lhs).
columns() );
281 const size_t jend( n &
size_t(-2) );
283 for(
size_t i=0UL; i<m; ++i ) {
284 for(
size_t j=0UL; j<jend; j+=2UL ) {
285 (~lhs)(i,j ) = x[i] * y[j ];
286 (~lhs)(i,j+1UL) = x[i] * y[j+1];
289 (~lhs)(i,jend) = x[i] * y[jend];
308 template<
typename MT >
324 const size_t m( (~lhs).
rows() );
325 const size_t n( (~lhs).
columns() );
328 const size_t iend( m &
size_t(-2) );
330 for(
size_t j=0UL; j<n; ++j ) {
331 for(
size_t i=0UL; i<iend; i+=2UL ) {
332 (~lhs)(i ,j) = x[i ] * y[j];
333 (~lhs)(i+1UL,j) = x[i+1] * y[j];
336 (~lhs)(iend,j) = x[iend] * y[j];
355 template<
typename MT
361 typedef typename SelectType< SO, OppositeType, ResultType >::Type TmpType;
373 const TmpType tmp( rhs );
394 template<
typename MT >
395 friend inline typename EnableIf< UseAssign<MT> >::Type
411 const size_t m( (~lhs).
rows() );
412 const size_t n( (~lhs).
columns() );
415 const size_t jend( n &
size_t(-2) );
417 for(
size_t i=0UL; i<m; ++i ) {
418 for(
size_t j=0UL; j<jend; j+=2UL ) {
419 (~lhs)(i,j ) += x[i] * y[j ];
420 (~lhs)(i,j+1UL) += x[i] * y[j+1UL];
423 (~lhs)(i,jend) += x[i] * y[jend];
443 template<
typename MT >
459 const size_t m( (~lhs).
rows() );
460 const size_t n( (~lhs).
columns() );
463 const size_t iend( m &
size_t(-2) );
465 for(
size_t j=0UL; j<n; ++j ) {
466 for(
size_t i=0UL; i<iend; i+=2UL ) {
467 (~lhs)(i ,j) += x[i ] * y[j];
468 (~lhs)(i+1UL,j) += x[i+1UL] * y[j];
471 (~lhs)(iend,j) += x[iend] * y[j];
497 template<
typename MT >
498 friend inline typename EnableIf< UseAssign<MT> >::Type
514 const size_t m( (~lhs).
rows() );
515 const size_t n( (~lhs).
columns() );
518 const size_t jend( n &
size_t(-2) );
520 for(
size_t i=0UL; i<m; ++i ) {
521 for(
size_t j=0UL; j<jend; j+=2UL ) {
522 (~lhs)(i,j ) -= x[i] * y[j ];
523 (~lhs)(i,j+1UL) -= x[i] * y[j+1UL];
526 (~lhs)(i,jend) -= x[i] * y[jend];
546 template<
typename MT >
562 const size_t m( (~lhs).
rows() );
563 const size_t n( (~lhs).
columns() );
566 const size_t iend( m &
size_t(-2) );
568 for(
size_t j=0UL; j<n; ++j ) {
569 for(
size_t i=0UL; i<iend; i+=2UL ) {
570 (~lhs)(i ,j) -= x[i ] * y[j];
571 (~lhs)(i+1UL,j) -= x[i+1UL] * y[j];
574 (~lhs)(iend,j) -= x[iend] * y[j];
640 template<
typename T1
642 inline const DVecTDVecMultExpr<T1,T2>
672 template<
typename VT1
674 inline typename RowExprTrait< DVecTDVecMultExpr<VT1,VT2> >::Type
675 row(
const DVecTDVecMultExpr<VT1,VT2>& dm,
size_t index )
679 return dm.leftOperand()[index] * dm.rightOperand();
697 template<
typename VT1
699 inline typename ColumnExprTrait< DVecTDVecMultExpr<VT1,VT2> >::Type
700 column(
const DVecTDVecMultExpr<VT1,VT2>& dm,
size_t index )
704 return dm.leftOperand() * dm.rightOperand()[index];
720 template<
typename VT1,
typename VT2 >
725 typedef typename MultExprTrait< typename VT1::ReturnType, VT2 >::Type Type;
734 template<
typename VT1,
typename VT2 >
739 typedef typename MultExprTrait< VT1, typename VT2::ReturnType >::Type Type;