22 #ifndef _BLAZE_MATH_VIEWS_SPARSEROW_H_
23 #define _BLAZE_MATH_VIEWS_SPARSEROW_H_
330 template<
typename MT
331 ,
bool SO = IsRowMajorMatrix<MT>::value >
332 class SparseRow :
public SparseVector< SparseRow<MT,SO>, true >
344 enum { useConst = IsConst<MT>::value };
372 explicit inline SparseRow( MT& matrix,
size_t index );
405 template<
typename Other >
407 operator*=( Other rhs );
409 template<
typename Other >
411 operator/=( Other rhs );
418 inline size_t size()
const;
423 inline void erase (
size_t index );
427 inline void reserve(
size_t n );
428 template<
typename Other >
inline SparseRow& scale ( Other scalar );
442 template<
typename Other >
inline bool canAlias (
const Other* alias )
const;
443 template<
typename Other >
inline bool isAliased(
const Other* alias )
const;
495 template<
typename MT
502 throw std::invalid_argument(
"Invalid row access index" );
521 template<
typename MT
526 return matrix_(row_,index);
537 template<
typename MT
542 return const_cast<const MT&
>( matrix_ )(row_,index);
554 template<
typename MT
558 return matrix_.begin( row_ );
570 template<
typename MT
574 return matrix_.begin( row_ );
586 template<
typename MT
590 return matrix_.begin( row_ );
602 template<
typename MT
606 return matrix_.end( row_ );
618 template<
typename MT
622 return matrix_.end( row_ );
634 template<
typename MT
638 return matrix_.end( row_ );
661 template<
typename MT
667 if(
this == &rhs || ( &matrix_ == &rhs.matrix_ && row_ == rhs.row_ ) )
670 if( size() != rhs.size() )
671 throw std::invalid_argument(
"Row sizes do not match" );
673 if( rhs.canAlias( &matrix_ ) ) {
675 matrix_.reset ( row_ );
676 matrix_.reserve( row_, tmp.nonZeros() );
680 matrix_.reset ( row_ );
681 matrix_.reserve( row_, rhs.nonZeros() );
700 template<
typename MT
702 template<
typename VT >
707 if( size() != (~rhs).size() )
708 throw std::invalid_argument(
"Vector sizes do not match" );
710 if( (~rhs).canAlias( &matrix_ ) ) {
711 const typename VT::ResultType tmp( ~rhs );
712 matrix_.reset( row_ );
716 matrix_.reset( row_ );
735 template<
typename MT
737 template<
typename VT >
742 if( size() != (~rhs).size() )
743 throw std::invalid_argument(
"Vector sizes do not match" );
745 if( (~rhs).canAlias( &matrix_ ) ) {
746 const typename VT::ResultType tmp( ~rhs );
747 matrix_.reset ( row_ );
748 matrix_.reserve( row_, tmp.nonZeros() );
752 matrix_.reset ( row_ );
753 matrix_.reserve( row_, (~rhs).nonZeros() );
772 template<
typename MT
774 template<
typename VT >
779 if( (~rhs).size() != size() )
780 throw std::invalid_argument(
"Vector sizes do not match" );
799 template<
typename MT
801 template<
typename VT >
806 if( (~rhs).size() != size() )
807 throw std::invalid_argument(
"Vector sizes do not match" );
827 template<
typename MT
829 template<
typename VT >
832 if( (~rhs).size() != size() )
833 throw std::invalid_argument(
"Vector sizes do not match" );
840 const MultType tmp( *
this * (~rhs) );
841 matrix_.reset( row_ );
860 template<
typename MT
862 template<
typename Other >
866 for(
Iterator element=begin(); element!=end(); ++element )
867 element->value() *= rhs;
885 template<
typename MT
887 template<
typename Other >
899 const Tmp tmp( Tmp(1)/static_cast<Tmp>( rhs ) );
900 for(
Iterator element=begin(); element!=end(); ++element )
901 element->value() *= tmp;
904 for(
Iterator element=begin(); element!=end(); ++element )
905 element->value() /= rhs;
926 template<
typename MT
930 return matrix_.columns();
940 template<
typename MT
944 return matrix_.capacity( row_ );
957 template<
typename MT
961 return matrix_.nonZeros( row_ );
971 template<
typename MT
975 matrix_.reset( row_ );
992 template<
typename MT
997 return matrix_.insert( row_, index, value )->value();
1010 template<
typename MT
1014 matrix_.erase( row_, index );
1027 template<
typename MT
1031 return matrix_.erase( row_, pos );
1049 template<
typename MT
1053 return matrix_.find( row_, index );
1071 template<
typename MT
1075 return matrix_.find( row_, index );
1089 template<
typename MT
1093 matrix_.reserve( row_, n );
1104 template<
typename MT
1106 template<
typename Other >
1109 for(
Iterator element=begin(); element!=end(); ++element )
1110 element->value() *= scalar;
1124 template<
typename MT
1131 size_t nonzeros( 2UL*capacity()+1UL );
1132 nonzeros =
max( nonzeros, 7UL );
1133 nonzeros =
min( nonzeros, size() );
1174 template<
typename MT
1178 matrix_.append( row_, index, value, check );
1201 template<
typename MT
1203 template<
typename Other >
1206 return static_cast<const void*
>( &matrix_ ) == static_cast<const void*>( alias );
1221 template<
typename MT
1223 template<
typename Other >
1226 return static_cast<const void*
>( &matrix_ ) == static_cast<const void*>( alias );
1242 template<
typename MT
1244 template<
typename VT >
1249 size_t nonzeros( 0UL );
1251 for(
size_t j=0UL; j<size(); ++j )
1253 if( matrix_.nonZeros( row_ ) == matrix_.capacity( row_ ) )
1254 matrix_.reserve( row_, extendCapacity() );
1256 matrix_.append( row_, j, (~rhs)[j],
true );
1273 template<
typename MT
1275 template<
typename VT >
1280 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element ) {
1281 matrix_.append( row_, element->index(), element->value() );
1298 template<
typename MT
1300 template<
typename VT >
1311 const AddType tmp( *
this + (~rhs) );
1312 matrix_.reset( row_ );
1329 template<
typename MT
1331 template<
typename VT >
1342 const AddType tmp( *
this + (~rhs) );
1343 matrix_.reset ( row_ );
1344 matrix_.reserve( row_, tmp.nonZeros() );
1361 template<
typename MT
1363 template<
typename VT >
1374 const SubType tmp( *
this - (~rhs) );
1375 matrix_.reset ( row_ );
1392 template<
typename MT
1394 template<
typename VT >
1405 const SubType tmp( *
this - (~rhs) );
1406 matrix_.reset ( row_ );
1407 matrix_.reserve( row_, tmp.nonZeros() );
1433 template<
typename MT >
1451 typedef SparseRow<MT,false>
This;
1452 typedef typename RowTrait<MT>::Type
ResultType;
1462 typedef typename SelectType< useConst, ConstReference, typename MT::Reference >::Type
Reference;
1468 template<
typename MatrixType
1469 ,
typename IteratorType >
1480 enum { returnConst = IsConst<MatrixType>::value };
1485 typedef typename SelectType< returnConst, const ElementType&, ElementType& >::Type ReferenceType;
1494 inline RowElement( IteratorType pos,
size_t column )
1506 template<
typename T >
inline RowElement&
operator=(
const T& v ) {
1518 template<
typename T >
inline RowElement& operator+=(
const T& v ) {
1530 template<
typename T >
inline RowElement& operator-=(
const T& v ) {
1542 template<
typename T >
inline RowElement& operator*=(
const T& v ) {
1554 template<
typename T >
inline RowElement& operator/=(
const T& v ) {
1565 inline const RowElement* operator->()
const {
1575 inline ReferenceType value()
const {
1576 return pos_->value();
1585 inline size_t index()
const {
1601 template<
typename MatrixType
1602 ,
typename IteratorType >
1613 enum { returnConst = IsConst<MatrixType>::value };
1618 typedef std::forward_iterator_tag IteratorCategory;
1619 typedef RowElement<MatrixType,IteratorType> ValueType;
1620 typedef ValueType PointerType;
1621 typedef ValueType ReferenceType;
1622 typedef ptrdiff_t DifferenceType;
1625 typedef IteratorCategory iterator_category;
1626 typedef ValueType value_type;
1627 typedef PointerType pointer;
1628 typedef ReferenceType reference;
1629 typedef DifferenceType difference_type;
1632 typedef typename SelectType< returnConst, ReturnType, ElementType& >::Type Value;
1642 inline RowIterator( MatrixType& matrix,
size_t row,
size_t column )
1648 for( ; column_<
matrix_.columns(); ++column_ ) {
1650 if( pos_ !=
matrix_.end( column_ ) )
break;
1663 inline RowIterator( MatrixType& matrix,
size_t row,
size_t column, IteratorType pos )
1678 template<
typename MatrixType2,
typename IteratorType2 >
1679 inline RowIterator(
const RowIterator<MatrixType2,IteratorType2>& it )
1682 , column_( it.column_ )
1692 inline RowIterator& operator++() {
1694 for( ; column_<
matrix_.columns(); ++column_ ) {
1696 if( pos_ !=
matrix_.end( column_ ) )
break;
1708 inline const RowIterator operator++(
int ) {
1709 const RowIterator tmp( *
this );
1720 inline ReferenceType
operator*()
const {
1721 return ReferenceType( pos_, column_ );
1730 inline PointerType operator->()
const {
1731 return PointerType( pos_, column_ );
1741 template<
typename MatrixType2,
typename IteratorType2 >
1742 inline bool operator==(
const RowIterator<MatrixType2,IteratorType2>& rhs )
const {
1743 return ( &
matrix_ == &rhs.matrix_ ) && (
row_ == rhs.row_ ) && ( column_ == rhs.column_ );
1753 template<
typename MatrixType2,
typename IteratorType2 >
1754 inline bool operator!=(
const RowIterator<MatrixType2,IteratorType2>& rhs )
const {
1755 return !( *
this == rhs );
1765 inline DifferenceType
operator-(
const RowIterator& rhs )
const {
1766 size_t counter( 0UL );
1767 for(
size_t j=rhs.column_; j<column_; ++j ) {
1785 template<
typename MatrixType2,
typename IteratorType2 >
friend class RowIterator;
1786 template<
typename MT2,
bool SO2 >
friend class SparseRow;
1794 typedef RowIterator<const MT,typename MT::ConstIterator>
ConstIterator;
1797 typedef typename SelectType< useConst, ConstIterator, RowIterator<MT,typename MT::Iterator> >::Type
Iterator;
1803 explicit inline SparseRow( MT& matrix,
size_t index );
1831 template<
typename VT >
inline SparseRow& operator+=(
const Vector<VT,true>& rhs );
1832 template<
typename VT >
inline SparseRow& operator-=(
const Vector<VT,true>& rhs );
1833 template<
typename VT >
inline SparseRow& operator*=(
const Vector<VT,true>& rhs );
1835 template<
typename Other >
1836 inline typename EnableIf< IsNumeric<Other>,
SparseRow >::Type&
1837 operator*=( Other rhs );
1839 template<
typename Other >
1840 inline typename EnableIf< IsNumeric<Other>,
SparseRow >::Type&
1841 operator/=( Other rhs );
1848 inline size_t size()
const;
1851 inline void reset();
1853 inline void erase (
size_t index );
1857 inline void reserve(
size_t n );
1858 template<
typename Other >
inline SparseRow& scale ( Other scalar );
1872 template<
typename Other >
inline bool canAlias (
const Other* alias )
const;
1873 template<
typename Other >
inline bool isAliased(
const Other* alias )
const;
1874 template<
typename VT >
inline void assign (
const DenseVector <VT,true>& rhs );
1875 template<
typename VT >
inline void assign (
const SparseVector<VT,true>& rhs );
1876 template<
typename VT >
inline void addAssign(
const Vector<VT,true>& rhs );
1877 template<
typename VT >
inline void subAssign(
const Vector<VT,true>& rhs );
1918 template<
typename MT >
1924 throw std::invalid_argument(
"Invalid row access index" );
1945 template<
typename MT >
1949 return matrix_(row_,index);
1962 template<
typename MT >
1966 return const_cast<const MT&
>( matrix_ )(row_,index);
1980 template<
typename MT >
1983 return Iterator( matrix_, row_, 0UL );
1997 template<
typename MT >
2000 return ConstIterator( matrix_, row_, 0UL );
2014 template<
typename MT >
2017 return ConstIterator( matrix_, row_, 0UL );
2031 template<
typename MT >
2034 return Iterator( matrix_, row_, size() );
2048 template<
typename MT >
2051 return ConstIterator( matrix_, row_, size() );
2065 template<
typename MT >
2068 return ConstIterator( matrix_, row_, size() );
2093 template<
typename MT >
2098 if(
this == &rhs || ( &matrix_ == &rhs.matrix_ && row_ == rhs.row_ ) )
2101 if( size() != rhs.size() )
2102 throw std::invalid_argument(
"Row sizes do not match" );
2104 if( rhs.canAlias( &matrix_ ) ) {
2105 const ResultType tmp( rhs );
2129 template<
typename MT >
2130 template<
typename VT >
2135 if( size() != (~rhs).size() )
2136 throw std::invalid_argument(
"Vector sizes do not match" );
2138 const typename VT::CompositeType tmp( ~rhs );
2158 template<
typename MT >
2159 template<
typename VT >
2160 inline SparseRow<MT,false>& SparseRow<MT,false>::operator+=(
const Vector<VT,true>& rhs )
2164 if( (~rhs).size() != size() )
2165 throw std::invalid_argument(
"Vector sizes do not match" );
2186 template<
typename MT >
2187 template<
typename VT >
2188 inline SparseRow<MT,false>& SparseRow<MT,false>::operator-=(
const Vector<VT,true>& rhs )
2192 if( (~rhs).size() != size() )
2193 throw std::invalid_argument(
"Vector sizes do not match" );
2215 template<
typename MT >
2216 template<
typename VT >
2217 inline SparseRow<MT,false>& SparseRow<MT,false>::operator*=(
const Vector<VT,true>& rhs )
2219 if( (~rhs).size() != size() )
2220 throw std::invalid_argument(
"Vector sizes do not match" );
2222 typedef typename MultTrait<This,typename VT::ResultType>::Type MultType;
2227 const MultType tmp( *
this * (~rhs) );
2248 template<
typename MT >
2249 template<
typename Other >
2250 inline typename EnableIf< IsNumeric<Other>, SparseRow<MT,false> >::Type&
2251 SparseRow<MT,false>::operator*=( Other rhs )
2253 for( Iterator element=begin(); element!=end(); ++element )
2254 element->value() *= rhs;
2274 template<
typename MT >
2275 template<
typename Other >
2276 inline typename EnableIf< IsNumeric<Other>, SparseRow<MT,false> >::Type&
2277 SparseRow<MT,false>::operator/=( Other rhs )
2281 typedef typename DivTrait<ElementType,Other>::Type DT;
2282 typedef typename If< IsNumeric<DT>, DT, Other >::Type Tmp;
2286 if( IsNumeric<DT>::value && IsFloatingPoint<DT>::value ) {
2287 const Tmp tmp( Tmp(1)/static_cast<Tmp>( rhs ) );
2288 for( Iterator element=begin(); element!=end(); ++element )
2289 element->value() *= tmp;
2292 for( Iterator element=begin(); element!=end(); ++element )
2293 element->value() /= rhs;
2316 template<
typename MT >
2319 return matrix_.columns();
2331 template<
typename MT >
2334 return matrix_.columns();
2349 template<
typename MT >
2352 size_t counter( 0UL );
2353 for( ConstIterator element=begin(); element!=end(); ++element ) {
2368 template<
typename MT >
2371 for(
size_t j=0UL; j<size(); ++j ) {
2372 matrix_.erase( row_, j );
2392 template<
typename MT >
2393 inline typename SparseRow<MT,false>::ElementType&
2396 return matrix_.insert( row_, index, value )->value();
2411 template<
typename MT >
2414 matrix_.erase( row_, index );
2429 template<
typename MT >
2432 const size_t column( pos.column_ );
2434 if( column == size() )
2437 matrix_.erase( column, pos.pos_ );
2438 return Iterator( matrix_, row_, column+1UL );
2458 template<
typename MT >
2461 const typename MT::Iterator pos( matrix_.find( row_, index ) );
2463 if( pos != matrix_.end( index ) )
2464 return Iterator( matrix_, row_, index, pos );
2486 template<
typename MT >
2489 const typename MT::ConstIterator pos( matrix_.find( row_, index ) );
2491 if( pos != matrix_.end( index ) )
2492 return ConstIterator( matrix_, row_, index, pos );
2510 template<
typename MT >
2526 template<
typename MT >
2527 template<
typename Other >
2528 inline SparseRow<MT,false>& SparseRow<MT,false>::scale( Other scalar )
2530 for( Iterator element=begin(); element!=end(); ++element )
2531 element->value() *= scalar;
2571 template<
typename MT >
2574 matrix_.insert( row_, index, value );
2599 template<
typename MT >
2600 template<
typename Other >
2603 return static_cast<const void*
>( &matrix_ ) == static_cast<const void*>( alias );
2616 template<
typename MT >
2617 template<
typename Other >
2620 return static_cast<const void*
>( &matrix_ ) == static_cast<const void*>( alias );
2638 template<
typename MT >
2639 template<
typename VT >
2644 for(
size_t j=0UL; j<(~rhs).size(); ++j ) {
2645 matrix_(row_,j) = (~rhs)[j];
2664 template<
typename MT >
2665 template<
typename VT >
2672 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element ) {
2673 for( ; j<element->index(); ++j )
2674 matrix_.erase( row_, j );
2675 matrix_(row_,j++) = element->value();
2677 for( ; j<size(); ++j ) {
2678 matrix_.erase( row_, j );
2697 template<
typename MT >
2698 template<
typename VT >
2701 typedef typename AddTrait<This,typename VT::ResultType>::Type AddType;
2708 const AddType tmp( *
this + (~rhs) );
2727 template<
typename MT >
2728 template<
typename VT >
2731 typedef typename SubTrait<This,typename VT::ResultType>::Type SubType;
2738 const SubType tmp( *
this - (~rhs) );
2760 template<
typename MT,
bool SO >
2761 inline void reset( SparseRow<MT,SO>& row );
2763 template<
typename MT,
bool SO >
2764 inline void clear( SparseRow<MT,SO>& row );
2766 template<
typename MT,
bool SO >
2767 inline bool isnan(
const SparseRow<MT,SO>& row );
2769 template<
typename MT,
bool SO >
2770 inline bool isDefault(
const SparseRow<MT,SO>& row );
2782 template<
typename MT
2798 template<
typename MT
2823 template<
typename MT
2829 const ConstIterator end( row.end() );
2830 for( ConstIterator element=row.begin(); element!=end; ++element ) {
2831 if(
isnan( element->value() ) )
return true;
2856 template<
typename MT
2862 const ConstIterator end( row.end() );
2863 for( ConstIterator element=row.begin(); element!=end; ++element )
2864 if( !
isDefault( element->value() ) )
return false;
2897 template<
typename MT
2899 inline typename DisableIf< IsExpression<MT>, SparseRow<MT> >::Type
2928 template<
typename MT
2930 inline typename DisableIf< IsExpression<MT>, SparseRow<const MT> >::Type
2960 template<
typename MT
2962 inline typename EnableIf< IsMatMatAddExpr<MT>,
typename RowExprTrait<MT>::Type >::Type
2963 row(
const SparseMatrix<MT,SO>& dm,
size_t index )
2967 return row( (~dm).leftOperand(), index ) +
row( (~dm).rightOperand(), index );
2985 template<
typename MT
2987 inline typename EnableIf< IsMatMatSubExpr<MT>,
typename RowExprTrait<MT>::Type >::Type
2988 row(
const SparseMatrix<MT,SO>& dm,
size_t index )
2992 return row( (~dm).leftOperand(), index ) -
row( (~dm).rightOperand(), index );
3010 template<
typename MT
3012 inline typename EnableIf< IsMatMatMultExpr<MT>,
typename RowExprTrait<MT>::Type >::Type
3013 row(
const SparseMatrix<MT,SO>& dm,
size_t index )
3017 return row( (~dm).leftOperand(), index ) * (~dm).rightOperand();
3034 template<
typename MT
3036 inline typename EnableIf< IsVecTVecMultExpr<MT>,
typename RowExprTrait<MT>::Type >::Type
3037 row(
const SparseMatrix<MT,SO>& dm,
size_t index )
3041 return (~dm).leftOperand()[index] * (~dm).rightOperand();
3059 template<
typename MT
3061 inline typename EnableIf< IsMatScalarMultExpr<MT>,
typename RowExprTrait<MT>::Type >::Type
3062 row(
const SparseMatrix<MT,SO>& dm,
size_t index )
3066 return row( (~dm).leftOperand(), index ) * (~dm).rightOperand();
3084 template<
typename MT
3086 inline typename EnableIf< IsMatScalarDivExpr<MT>,
typename RowExprTrait<MT>::Type >::Type
3087 row(
const SparseMatrix<MT,SO>& dm,
size_t index )
3091 return row( (~dm).leftOperand(), index ) / (~dm).rightOperand();
3109 template<
typename MT
3111 inline typename EnableIf< IsMatAbsExpr<MT>,
typename RowExprTrait<MT>::Type >::Type
3112 row(
const SparseMatrix<MT,SO>& dm,
size_t index )
3116 return abs(
row( (~dm).operand(), index ) );
3134 template<
typename MT
3136 inline typename EnableIf< IsMatEvalExpr<MT>,
typename RowExprTrait<MT>::Type >::Type
3137 row(
const SparseMatrix<MT,SO>& dm,
size_t index )
3141 return eval(
row( (~dm).operand(), index ) );
3159 template<
typename MT
3161 inline typename EnableIf< IsMatTransExpr<MT>,
typename RowExprTrait<MT>::Type >::Type
3162 row(
const SparseMatrix<MT,SO>& dm,
size_t index )
3182 template<
typename T1,
bool SO,
typename T2,
size_t N >
3183 struct AddTrait< SparseRow<T1,SO>, StaticVector<T2,N,true> >
3185 typedef typename AddTrait< typename SparseRow<T1,SO>::ResultType,
3186 StaticVector<T2,N,true> >::Type Type;
3189 template<
typename T1,
size_t N,
typename T2,
bool SO >
3190 struct AddTrait< StaticVector<T1,N,true>, SparseRow<T2,SO> >
3192 typedef typename AddTrait< StaticVector<T1,N,true>,
3193 typename SparseRow<T2,SO>::ResultType >::Type Type;
3196 template<
typename T1,
bool SO,
typename T2 >
3197 struct AddTrait< SparseRow<T1,SO>, DynamicVector<T2,true> >
3199 typedef typename AddTrait< typename SparseRow<T1,SO>::ResultType,
3200 DynamicVector<T2,true> >::Type Type;
3203 template<
typename T1,
typename T2,
bool SO >
3204 struct AddTrait< DynamicVector<T1,true>, SparseRow<T2,SO> >
3206 typedef typename AddTrait< DynamicVector<T1,true>,
3207 typename SparseRow<T2,SO>::ResultType >::Type Type;
3210 template<
typename T1,
bool SO1,
typename T2,
bool SO2 >
3211 struct AddTrait< SparseRow<T1,SO1>, DenseRow<T2,SO2> >
3213 typedef typename AddTrait< typename SparseRow<T1,SO1>::ResultType,
3214 typename DenseRow <T2,SO2>::ResultType >::Type Type;
3217 template<
typename T1,
bool SO1,
typename T2,
bool SO2 >
3218 struct AddTrait< DenseRow<T1,SO1>, SparseRow<T2,SO2> >
3220 typedef typename AddTrait< typename DenseRow <T1,SO1>::ResultType,
3221 typename SparseRow<T2,SO2>::ResultType >::Type Type;
3224 template<
typename T1,
bool SO,
typename T2 >
3225 struct AddTrait< SparseRow<T1,SO>, CompressedVector<T2,true> >
3227 typedef typename AddTrait< typename SparseRow<T1,SO>::ResultType,
3228 CompressedVector<T2,true> >::Type Type;
3231 template<
typename T1,
typename T2,
bool SO >
3232 struct AddTrait< CompressedVector<T1,true>, SparseRow<T2,SO> >
3234 typedef typename AddTrait< CompressedVector<T1,true>,
3235 typename SparseRow<T2,SO>::ResultType >::Type Type;
3238 template<
typename T1,
bool SO1,
typename T2,
bool SO2 >
3239 struct AddTrait< SparseRow<T1,SO1>, SparseRow<T2,SO2> >
3241 typedef typename AddTrait< typename SparseRow<T1,SO1>::ResultType,
3242 typename SparseRow<T2,SO2>::ResultType >::Type Type;
3258 template<
typename T1,
bool SO,
typename T2,
size_t N >
3259 struct SubTrait< SparseRow<T1,SO>, StaticVector<T2,N,true> >
3261 typedef typename SubTrait< typename SparseRow<T1,SO>::ResultType,
3262 StaticVector<T2,N,true> >::Type Type;
3265 template<
typename T1,
size_t N,
typename T2,
bool SO >
3266 struct SubTrait< StaticVector<T1,N,true>, SparseRow<T2,SO> >
3268 typedef typename SubTrait< StaticVector<T1,N,true>,
3269 typename SparseRow<T2,SO>::ResultType >::Type Type;
3272 template<
typename T1,
bool SO,
typename T2 >
3273 struct SubTrait< SparseRow<T1,SO>, DynamicVector<T2,true> >
3275 typedef typename SubTrait< typename SparseRow<T1,SO>::ResultType,
3276 DynamicVector<T2,true> >::Type Type;
3279 template<
typename T1,
typename T2,
bool SO >
3280 struct SubTrait< DynamicVector<T1,true>, SparseRow<T2,SO> >
3282 typedef typename SubTrait< DynamicVector<T1,true>,
3283 typename SparseRow<T2,SO>::ResultType >::Type Type;
3286 template<
typename T1,
bool SO1,
typename T2,
bool SO2 >
3287 struct SubTrait< SparseRow<T1,SO1>, DenseRow<T2,SO2> >
3289 typedef typename SubTrait< typename SparseRow<T1,SO1>::ResultType,
3290 typename DenseRow <T2,SO2>::ResultType >::Type Type;
3293 template<
typename T1,
bool SO1,
typename T2,
bool SO2 >
3294 struct SubTrait< DenseRow<T1,SO1>, SparseRow<T2,SO2> >
3296 typedef typename SubTrait< typename DenseRow <T1,SO1>::ResultType,
3297 typename SparseRow<T2,SO2>::ResultType >::Type Type;
3300 template<
typename T1,
bool SO,
typename T2 >
3301 struct SubTrait< SparseRow<T1,SO>, CompressedVector<T2,true> >
3303 typedef typename SubTrait< typename SparseRow<T1,SO>::ResultType,
3304 CompressedVector<T2,true> >::Type Type;
3307 template<
typename T1,
typename T2,
bool SO >
3308 struct SubTrait< CompressedVector<T1,true>, SparseRow<T2,SO> >
3310 typedef typename SubTrait< CompressedVector<T1,true>,
3311 typename SparseRow<T2,SO>::ResultType >::Type Type;
3314 template<
typename T1,
bool SO1,
typename T2,
bool SO2 >
3315 struct SubTrait< SparseRow<T1,SO1>, SparseRow<T2,SO2> >
3317 typedef typename SubTrait< typename SparseRow<T1,SO1>::ResultType,
3318 typename SparseRow<T2,SO2>::ResultType >::Type Type;
3334 template<
typename T1,
bool SO,
typename T2 >
3335 struct MultTrait< SparseRow<T1,SO>, T2 >
3337 typedef typename MultTrait< typename SparseRow<T1,SO>::ResultType, T2 >::Type Type;
3341 template<
typename T1,
typename T2,
bool SO >
3342 struct MultTrait< T1, SparseRow<T2,SO> >
3344 typedef typename MultTrait< T1, typename SparseRow<T2,SO>::ResultType >::Type Type;
3348 template<
typename T1,
bool SO,
typename T2,
size_t N,
bool TF >
3349 struct MultTrait< SparseRow<T1,SO>, StaticVector<T2,N,TF> >
3351 typedef typename MultTrait< typename SparseRow<T1,SO>::ResultType,
3352 StaticVector<T2,N,TF> >::Type Type;
3355 template<
typename T1,
size_t N,
bool TF,
typename T2,
bool SO >
3356 struct MultTrait< StaticVector<T1,N,TF>, SparseRow<T2,SO> >
3358 typedef typename MultTrait< StaticVector<T1,N,TF>,
3359 typename SparseRow<T2,SO>::ResultType >::Type Type;
3362 template<
typename T1,
bool SO,
typename T2,
bool TF >
3363 struct MultTrait< SparseRow<T1,SO>, DynamicVector<T2,TF> >
3365 typedef typename MultTrait< typename SparseRow<T1,SO>::ResultType,
3366 DynamicVector<T2,TF> >::Type Type;
3369 template<
typename T1,
bool TF,
typename T2,
bool SO >
3370 struct MultTrait< DynamicVector<T1,TF>, SparseRow<T2,SO> >
3372 typedef typename MultTrait< DynamicVector<T1,TF>,
3373 typename SparseRow<T2,SO>::ResultType >::Type Type;
3376 template<
typename T1,
bool SO1,
typename T2,
bool SO2 >
3377 struct MultTrait< SparseRow<T1,SO1>, DenseRow<T2,SO2> >
3379 typedef typename MultTrait< typename SparseRow<T1,SO1>::ResultType,
3380 typename DenseRow <T2,SO2>::ResultType >::Type Type;
3383 template<
typename T1,
bool SO1,
typename T2,
bool SO2 >
3384 struct MultTrait< DenseRow<T1,SO1>, SparseRow<T2,SO2> >
3386 typedef typename MultTrait< typename DenseRow <T1,SO1>::ResultType,
3387 typename SparseRow<T2,SO2>::ResultType >::Type Type;
3390 template<
typename T1,
bool SO,
typename T2,
bool TF >
3391 struct MultTrait< SparseRow<T1,SO>, CompressedVector<T2,TF> >
3393 typedef typename MultTrait< typename SparseRow<T1,SO>::ResultType,
3394 CompressedVector<T2,TF> >::Type Type;
3397 template<
typename T1,
bool TF,
typename T2,
bool SO >
3398 struct MultTrait< CompressedVector<T1,TF>, SparseRow<T2,SO> >
3400 typedef typename MultTrait< CompressedVector<T1,TF>,
3401 typename SparseRow<T2,SO>::ResultType >::Type Type;
3404 template<
typename T1,
bool SO1,
typename T2,
bool SO2 >
3405 struct MultTrait< SparseRow<T1,SO1>, SparseRow<T2,SO2> >
3407 typedef typename MultTrait< typename SparseRow<T1,SO1>::ResultType,
3408 typename SparseRow<T2,SO2>::ResultType >::Type Type;
3411 template<
typename T1,
bool SO1,
typename T2,
size_t M,
size_t N,
bool SO2 >
3412 struct MultTrait< SparseRow<T1,SO1>, StaticMatrix<T2,M,N,SO2> >
3414 typedef typename MultTrait< typename SparseRow<T1,SO1>::ResultType,
3415 StaticMatrix<T2,M,N,SO2> >::Type Type;
3418 template<
typename T1,
bool SO1,
typename T2,
bool SO2 >
3419 struct MultTrait< SparseRow<T1,SO1>, DynamicMatrix<T2,SO2> >
3421 typedef typename MultTrait< typename SparseRow<T1,SO1>::ResultType,
3422 DynamicMatrix<T2,SO2> >::Type Type;
3425 template<
typename T1,
bool SO1,
typename T2,
bool SO2 >
3426 struct MultTrait< SparseRow<T1,SO1>, CompressedMatrix<T2,SO2> >
3428 typedef typename MultTrait< typename SparseRow<T1,SO1>::ResultType,
3429 CompressedMatrix<T2,SO2> >::Type Type;
3445 template<
typename T1,
bool SO,
typename T2 >
3446 struct DivTrait< SparseRow<T1,SO>, T2 >
3448 typedef typename DivTrait< typename SparseRow<T1,SO>::ResultType, T2 >::Type Type;