22 #ifndef _BLAZE_MATH_VIEWS_SPARSECOLUMN_H_
23 #define _BLAZE_MATH_VIEWS_SPARSECOLUMN_H_
323 template<
typename MT
324 ,
bool SO = IsColumnMajorMatrix<MT>::value >
325 class SparseColumn :
public SparseVector< SparseColumn<MT,SO>, false >
337 enum { useConst = IsConst<MT>::value };
365 explicit inline SparseColumn( MT& matrix,
size_t index );
398 template<
typename Other >
400 operator*=( Other rhs );
402 template<
typename Other >
404 operator/=( Other rhs );
411 inline size_t size()
const;
416 inline void erase (
size_t index );
420 inline void reserve(
size_t n );
421 template<
typename Other >
inline SparseColumn& scale ( Other scalar );
435 template<
typename Other >
inline bool canAlias (
const Other* alias )
const;
436 template<
typename Other >
inline bool isAliased(
const Other* alias )
const;
488 template<
typename MT
494 if(
matrix_.columns() <= index )
495 throw std::invalid_argument(
"Invalid column access index" );
514 template<
typename MT
519 return matrix_(index,col_);
530 template<
typename MT
535 return const_cast<const MT&
>( matrix_ )(index,col_);
547 template<
typename MT
551 return matrix_.begin( col_ );
563 template<
typename MT
567 return matrix_.begin( col_ );
579 template<
typename MT
583 return matrix_.begin( col_ );
595 template<
typename MT
599 return matrix_.end( col_ );
611 template<
typename MT
615 return matrix_.end( col_ );
627 template<
typename MT
631 return matrix_.end( col_ );
654 template<
typename MT
660 if(
this == &rhs || ( &matrix_ == &rhs.matrix_ && col_ == rhs.col_ ) )
663 if( size() != rhs.size() )
664 throw std::invalid_argument(
"Column sizes do not match" );
666 if( rhs.canAlias( &matrix_ ) ) {
668 matrix_.reset ( col_ );
669 matrix_.reserve( col_, tmp.nonZeros() );
673 matrix_.reset ( col_ );
674 matrix_.reserve( col_, rhs.nonZeros() );
693 template<
typename MT
695 template<
typename VT >
700 if( size() != (~rhs).size() )
701 throw std::invalid_argument(
"Vector sizes do not match" );
703 if( (~rhs).canAlias( &matrix_ ) ) {
704 const typename VT::ResultType tmp( ~rhs );
705 matrix_.reset( col_ );
709 matrix_.reset( col_ );
728 template<
typename MT
730 template<
typename VT >
735 if( size() != (~rhs).size() )
736 throw std::invalid_argument(
"Vector sizes do not match" );
738 if( (~rhs).canAlias( &matrix_ ) ) {
739 const typename VT::ResultType tmp( ~rhs );
740 matrix_.reset ( col_ );
741 matrix_.reserve( col_, tmp.nonZeros() );
745 matrix_.reset ( col_ );
746 matrix_.reserve( col_, (~rhs).nonZeros() );
765 template<
typename MT
767 template<
typename VT >
772 if( (~rhs).size() != size() )
773 throw std::invalid_argument(
"Vector sizes do not match" );
792 template<
typename MT
794 template<
typename VT >
799 if( (~rhs).size() != size() )
800 throw std::invalid_argument(
"Vector sizes do not match" );
820 template<
typename MT
822 template<
typename VT >
825 if( (~rhs).size() != size() )
826 throw std::invalid_argument(
"Vector sizes do not match" );
833 const MultType tmp( *
this * (~rhs) );
834 matrix_.reset( col_ );
853 template<
typename MT
855 template<
typename Other >
859 for(
Iterator element=begin(); element!=end(); ++element )
860 element->value() *= rhs;
878 template<
typename MT
880 template<
typename Other >
892 const Tmp tmp( Tmp(1)/static_cast<Tmp>( rhs ) );
893 for(
Iterator element=begin(); element!=end(); ++element )
894 element->value() *= tmp;
897 for(
Iterator element=begin(); element!=end(); ++element )
898 element->value() /= rhs;
919 template<
typename MT
923 return matrix_.rows();
933 template<
typename MT
937 return matrix_.capacity( col_ );
950 template<
typename MT
954 return matrix_.nonZeros( col_ );
964 template<
typename MT
968 matrix_.reset( col_ );
985 template<
typename MT
990 return matrix_.insert( index, col_, value )->value();
1003 template<
typename MT
1007 matrix_.erase( index, col_ );
1020 template<
typename MT
1024 return matrix_.erase( col_, pos );
1042 template<
typename MT
1046 return matrix_.find( index, col_ );
1064 template<
typename MT
1068 return matrix_.find( index, col_ );
1082 template<
typename MT
1086 matrix_.reserve( col_, n );
1097 template<
typename MT
1099 template<
typename Other >
1102 for(
Iterator element=begin(); element!=end(); ++element )
1103 element->value() *= scalar;
1117 template<
typename MT
1124 size_t nonzeros( 2UL*capacity()+1UL );
1125 nonzeros =
max( nonzeros, 7UL );
1126 nonzeros =
min( nonzeros, size() );
1167 template<
typename MT
1171 matrix_.append( index, col_, value, check );
1194 template<
typename MT
1196 template<
typename Other >
1199 return static_cast<const void*
>( &matrix_ ) == static_cast<const void*>( alias );
1214 template<
typename MT
1216 template<
typename Other >
1219 return static_cast<const void*
>( &matrix_ ) == static_cast<const void*>( alias );
1235 template<
typename MT
1237 template<
typename VT >
1242 size_t nonzeros( 0UL );
1244 for(
size_t i=0UL; i<size(); ++i )
1246 if( matrix_.nonZeros( col_ ) == matrix_.capacity( col_ ) )
1247 matrix_.reserve( col_, extendCapacity() );
1249 matrix_.append( i, col_, (~rhs)[i],
true );
1266 template<
typename MT
1268 template<
typename VT >
1273 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element ) {
1274 matrix_.append( element->index(), col_, element->value() );
1291 template<
typename MT
1293 template<
typename VT >
1304 const AddType tmp( *
this + (~rhs) );
1305 matrix_.reset( col_ );
1322 template<
typename MT
1324 template<
typename VT >
1335 const AddType tmp( *
this + (~rhs) );
1336 matrix_.reset ( col_ );
1337 matrix_.reserve( col_, tmp.nonZeros() );
1354 template<
typename MT
1356 template<
typename VT >
1367 const SubType tmp( *
this - (~rhs) );
1368 matrix_.reset( col_ );
1385 template<
typename MT
1387 template<
typename VT >
1398 const SubType tmp( *
this - (~rhs) );
1399 matrix_.reset ( col_ );
1400 matrix_.reserve( col_, tmp.nonZeros() );
1426 template<
typename MT >
1444 typedef SparseColumn<MT,false>
This;
1445 typedef typename ColumnTrait<MT>::Type
ResultType;
1455 typedef typename SelectType< useConst, ConstReference, typename MT::Reference >::Type
Reference;
1461 template<
typename MatrixType
1462 ,
typename IteratorType >
1473 enum { returnConst = IsConst<MatrixType>::value };
1478 typedef typename SelectType< returnConst, const ElementType&, ElementType& >::Type ReferenceType;
1487 inline ColumnElement( IteratorType pos,
size_t row )
1499 template<
typename T >
inline ColumnElement&
operator=(
const T& v ) {
1511 template<
typename T >
inline ColumnElement& operator+=(
const T& v ) {
1523 template<
typename T >
inline ColumnElement& operator-=(
const T& v ) {
1535 template<
typename T >
inline ColumnElement& operator*=(
const T& v ) {
1547 template<
typename T >
inline ColumnElement& operator/=(
const T& v ) {
1558 inline const ColumnElement* operator->()
const {
1568 inline ReferenceType value()
const {
1569 return pos_->value();
1578 inline size_t index()
const {
1594 template<
typename MatrixType
1595 ,
typename IteratorType >
1596 class ColumnIterator
1606 enum { returnConst = IsConst<MatrixType>::value };
1611 typedef std::forward_iterator_tag IteratorCategory;
1612 typedef ColumnElement<MatrixType,IteratorType> ValueType;
1613 typedef ValueType PointerType;
1614 typedef ValueType ReferenceType;
1615 typedef ptrdiff_t DifferenceType;
1618 typedef IteratorCategory iterator_category;
1619 typedef ValueType value_type;
1620 typedef PointerType pointer;
1621 typedef ReferenceType reference;
1622 typedef DifferenceType difference_type;
1625 typedef typename SelectType< returnConst, ReturnType, ElementType& >::Type Value;
1635 inline ColumnIterator( MatrixType& matrix,
size_t row,
size_t column )
1641 for( ; row_<
matrix_.rows(); ++row_ ) {
1642 pos_ =
matrix_.find( row_, column_ );
1643 if( pos_ !=
matrix_.end( row_ ) )
break;
1656 inline ColumnIterator( MatrixType& matrix,
size_t row,
size_t column, IteratorType pos )
1671 template<
typename MatrixType2,
typename IteratorType2 >
1672 inline ColumnIterator(
const ColumnIterator<MatrixType2,IteratorType2>& it )
1675 , column_( it.column_ )
1685 inline ColumnIterator& operator++() {
1687 for( ; row_<
matrix_.rows(); ++row_ ) {
1688 pos_ =
matrix_.find( row_, column_ );
1689 if( pos_ !=
matrix_.end( row_ ) )
break;
1701 inline const ColumnIterator operator++(
int ) {
1702 const ColumnIterator tmp( *
this );
1713 inline ReferenceType
operator*()
const {
1714 return ReferenceType( pos_, row_ );
1723 inline PointerType operator->()
const {
1724 return PointerType( pos_, row_ );
1734 template<
typename MatrixType2,
typename IteratorType2 >
1735 inline bool operator==(
const ColumnIterator<MatrixType2,IteratorType2>& rhs )
const {
1736 return ( &
matrix_ == &rhs.matrix_ ) && ( row_ == rhs.row_ ) && ( column_ == rhs.column_ );
1746 template<
typename MatrixType2,
typename IteratorType2 >
1747 inline bool operator!=(
const ColumnIterator<MatrixType2,IteratorType2>& rhs )
const {
1748 return !( *
this == rhs );
1758 inline DifferenceType
operator-(
const ColumnIterator& rhs )
const {
1759 size_t counter( 0UL );
1760 for(
size_t i=rhs.row_; i<row_; ++i ) {
1778 template<
typename MatrixType2,
typename IteratorType2 >
friend class ColumnIterator;
1779 template<
typename MT2,
bool SO2 >
friend class SparseColumn;
1787 typedef ColumnIterator<const MT,typename MT::ConstIterator>
ConstIterator;
1790 typedef typename SelectType< useConst, ConstIterator, ColumnIterator<MT,typename MT::Iterator> >::Type
Iterator;
1796 explicit inline SparseColumn( MT& matrix,
size_t index );
1824 template<
typename VT >
inline SparseColumn& operator+=(
const Vector<VT,false>& rhs );
1825 template<
typename VT >
inline SparseColumn& operator-=(
const Vector<VT,false>& rhs );
1826 template<
typename VT >
inline SparseColumn& operator*=(
const Vector<VT,false>& rhs );
1828 template<
typename Other >
1829 inline typename EnableIf< IsNumeric<Other>,
SparseColumn >::Type&
1830 operator*=( Other rhs );
1832 template<
typename Other >
1833 inline typename EnableIf< IsNumeric<Other>,
SparseColumn >::Type&
1834 operator/=( Other rhs );
1841 inline size_t size()
const;
1844 inline void reset();
1846 inline void erase (
size_t index );
1850 inline void reserve(
size_t n );
1851 template<
typename Other >
inline SparseColumn& scale ( Other scalar );
1865 template<
typename Other >
inline bool canAlias (
const Other* alias )
const;
1866 template<
typename Other >
inline bool isAliased(
const Other* alias )
const;
1867 template<
typename VT >
inline void assign (
const DenseVector <VT,false>& rhs );
1868 template<
typename VT >
inline void assign (
const SparseVector<VT,false>& rhs );
1869 template<
typename VT >
inline void addAssign(
const Vector<VT,false>& rhs );
1870 template<
typename VT >
inline void subAssign(
const Vector<VT,false>& rhs );
1911 template<
typename MT >
1916 if(
matrix_.columns() <= index )
1917 throw std::invalid_argument(
"Invalid column access index" );
1938 template<
typename MT >
1942 return matrix_(index,col_);
1955 template<
typename MT >
1959 return const_cast<const MT&
>( matrix_ )(index,col_);
1973 template<
typename MT >
1976 return Iterator( matrix_, 0UL, col_ );
1990 template<
typename MT >
1993 return ConstIterator( matrix_, 0UL, col_ );
2007 template<
typename MT >
2010 return ConstIterator( matrix_, 0UL, col_ );
2024 template<
typename MT >
2027 return Iterator( matrix_, size(), col_ );
2041 template<
typename MT >
2044 return ConstIterator( matrix_, size(), col_ );
2058 template<
typename MT >
2061 return ConstIterator( matrix_, size(), col_ );
2086 template<
typename MT >
2091 if(
this == &rhs || ( &matrix_ == &rhs.matrix_ && col_ == rhs.col_ ) )
2094 if( size() != rhs.size() )
2095 throw std::invalid_argument(
"Column sizes do not match" );
2097 if( rhs.canAlias( &matrix_ ) ) {
2098 const ResultType tmp( rhs );
2122 template<
typename MT >
2123 template<
typename VT >
2128 if( size() != (~rhs).size() )
2129 throw std::invalid_argument(
"Vector sizes do not match" );
2131 const typename VT::CompositeType tmp( ~rhs );
2151 template<
typename MT >
2152 template<
typename VT >
2153 inline SparseColumn<MT,false>& SparseColumn<MT,false>::operator+=(
const Vector<VT,false>& rhs )
2157 if( (~rhs).size() != size() )
2158 throw std::invalid_argument(
"Vector sizes do not match" );
2179 template<
typename MT >
2180 template<
typename VT >
2181 inline SparseColumn<MT,false>& SparseColumn<MT,false>::operator-=(
const Vector<VT,false>& rhs )
2185 if( (~rhs).size() != size() )
2186 throw std::invalid_argument(
"Vector sizes do not match" );
2208 template<
typename MT >
2209 template<
typename VT >
2210 inline SparseColumn<MT,false>& SparseColumn<MT,false>::operator*=(
const Vector<VT,false>& rhs )
2212 if( (~rhs).size() != size() )
2213 throw std::invalid_argument(
"Vector sizes do not match" );
2215 typedef typename MultTrait<This,typename VT::ResultType>::Type MultType;
2220 const MultType tmp( *
this * (~rhs) );
2241 template<
typename MT >
2242 template<
typename Other >
2243 inline typename EnableIf< IsNumeric<Other>, SparseColumn<MT,false> >::Type&
2244 SparseColumn<MT,false>::operator*=( Other rhs )
2246 for( Iterator element=begin(); element!=end(); ++element )
2247 element->value() *= rhs;
2267 template<
typename MT >
2268 template<
typename Other >
2269 inline typename EnableIf< IsNumeric<Other>, SparseColumn<MT,false> >::Type&
2270 SparseColumn<MT,false>::operator/=( Other rhs )
2274 typedef typename DivTrait<ElementType,Other>::Type DT;
2275 typedef typename If< IsNumeric<DT>, DT, Other >::Type Tmp;
2279 if( IsNumeric<DT>::value && IsFloatingPoint<DT>::value ) {
2280 const Tmp tmp( Tmp(1)/static_cast<Tmp>( rhs ) );
2281 for( Iterator element=begin(); element!=end(); ++element )
2282 element->value() *= tmp;
2285 for( Iterator element=begin(); element!=end(); ++element )
2286 element->value() /= rhs;
2309 template<
typename MT >
2312 return matrix_.rows();
2324 template<
typename MT >
2327 return matrix_.rows();
2342 template<
typename MT >
2345 size_t counter( 0UL );
2346 for( ConstIterator element=begin(); element!=end(); ++element ) {
2361 template<
typename MT >
2364 for(
size_t i=0UL; i<size(); ++i ) {
2365 matrix_.erase( i, col_ );
2385 template<
typename MT >
2386 inline typename SparseColumn<MT,false>::ElementType&
2389 return matrix_.insert( index, col_, value )->value();
2404 template<
typename MT >
2407 matrix_.erase( index, col_ );
2422 template<
typename MT >
2425 const size_t row( pos.row_ );
2430 matrix_.erase( row, pos.pos_ );
2431 return Iterator( matrix_, row+1UL, col_ );
2451 template<
typename MT >
2454 const typename MT::Iterator pos( matrix_.find( index, col_ ) );
2456 if( pos != matrix_.end( index ) )
2457 return Iterator( matrix_, index, col_, pos );
2479 template<
typename MT >
2482 const typename MT::ConstIterator pos( matrix_.find( index, col_ ) );
2484 if( pos != matrix_.end( index ) )
2485 return ConstIterator( matrix_, index, col_, pos );
2503 template<
typename MT >
2519 template<
typename MT >
2520 template<
typename Other >
2521 inline SparseColumn<MT,false>& SparseColumn<MT,false>::scale( Other scalar )
2523 for( Iterator element=begin(); element!=end(); ++element )
2524 element->value() *= scalar;
2564 template<
typename MT >
2567 matrix_.insert( index, col_, value );
2592 template<
typename MT >
2593 template<
typename Other >
2596 return static_cast<const void*
>( &matrix_ ) == static_cast<const void*>( alias );
2609 template<
typename MT >
2610 template<
typename Other >
2613 return static_cast<const void*
>( &matrix_ ) == static_cast<const void*>( alias );
2631 template<
typename MT >
2632 template<
typename VT >
2637 for(
size_t i=0UL; i<(~rhs).size(); ++i ) {
2638 matrix_(i,col_) = (~rhs)[i];
2657 template<
typename MT >
2658 template<
typename VT >
2665 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element ) {
2666 for( ; i<element->index(); ++i )
2667 matrix_.erase( i, col_ );
2668 matrix_(i++,col_) = element->value();
2670 for( ; i<size(); ++i ) {
2671 matrix_.erase( i, col_ );
2690 template<
typename MT >
2691 template<
typename VT >
2694 typedef typename AddTrait<This,typename VT::ResultType>::Type AddType;
2701 const AddType tmp( *
this + (~rhs) );
2720 template<
typename MT >
2721 template<
typename VT >
2724 typedef typename SubTrait<This,typename VT::ResultType>::Type SubType;
2731 const SubType tmp( *
this - (~rhs) );
2753 template<
typename MT,
bool SO >
2754 inline void reset( SparseColumn<MT,SO>& column );
2756 template<
typename MT,
bool SO >
2757 inline void clear( SparseColumn<MT,SO>& column );
2759 template<
typename MT,
bool SO >
2760 inline bool isnan(
const SparseColumn<MT,SO>& column );
2762 template<
typename MT,
bool SO >
2763 inline bool isDefault(
const SparseColumn<MT,SO>& column );
2775 template<
typename MT
2791 template<
typename MT
2816 template<
typename MT
2822 const ConstIterator end( column.end() );
2823 for( ConstIterator element=column.begin(); element!=end; ++element ) {
2824 if(
isnan( element->value() ) )
return true;
2849 template<
typename MT
2855 const ConstIterator end( column.end() );
2856 for( ConstIterator element=column.begin(); element!=end; ++element )
2857 if( !
isDefault( element->value() ) )
return false;
2890 template<
typename MT
2920 template<
typename MT
2941 template<
typename T1,
bool SO,
typename T2,
size_t N >
2942 struct AddTrait< SparseColumn<T1,SO>, StaticVector<T2,N,false> >
2944 typedef typename AddTrait< typename SparseColumn<T1,SO>::ResultType,
2945 StaticVector<T2,N,false> >::Type Type;
2948 template<
typename T1,
size_t N,
typename T2,
bool SO >
2949 struct AddTrait< StaticVector<T1,N,false>, SparseColumn<T2,SO> >
2951 typedef typename AddTrait< StaticVector<T1,N,false>,
2952 typename SparseColumn<T2,SO>::ResultType >::Type Type;
2955 template<
typename T1,
bool SO,
typename T2 >
2956 struct AddTrait< SparseColumn<T1,SO>, DynamicVector<T2,false> >
2958 typedef typename AddTrait< typename SparseColumn<T1,SO>::ResultType,
2959 DynamicVector<T2,false> >::Type Type;
2962 template<
typename T1,
typename T2,
bool SO >
2963 struct AddTrait< DynamicVector<T1,false>, SparseColumn<T2,SO> >
2965 typedef typename AddTrait< DynamicVector<T1,false>,
2966 typename SparseColumn<T2,SO>::ResultType >::Type Type;
2969 template<
typename T1,
bool SO1,
typename T2,
bool SO2 >
2970 struct AddTrait< SparseColumn<T1,SO1>, DenseColumn<T2,SO2> >
2972 typedef typename AddTrait< typename SparseColumn<T1,SO1>::ResultType,
2973 typename DenseColumn <T2,SO2>::ResultType >::Type Type;
2976 template<
typename T1,
bool SO1,
typename T2,
bool SO2 >
2977 struct AddTrait< DenseColumn<T1,SO1>, SparseColumn<T2,SO2> >
2979 typedef typename AddTrait< typename DenseColumn <T1,SO1>::ResultType,
2980 typename SparseColumn<T2,SO2>::ResultType >::Type Type;
2983 template<
typename T1,
bool SO,
typename T2 >
2984 struct AddTrait< SparseColumn<T1,SO>, CompressedVector<T2,false> >
2986 typedef typename AddTrait< typename SparseColumn<T1,SO>::ResultType,
2987 CompressedVector<T2,false> >::Type Type;
2990 template<
typename T1,
typename T2,
bool SO >
2991 struct AddTrait< CompressedVector<T1,false>, SparseColumn<T2,SO> >
2993 typedef typename AddTrait< CompressedVector<T1,false>,
2994 typename SparseColumn<T2,SO>::ResultType >::Type Type;
2997 template<
typename T1,
bool SO1,
typename T2,
bool SO2 >
2998 struct AddTrait< SparseColumn<T1,SO1>, SparseColumn<T2,SO2> >
3000 typedef typename AddTrait< typename SparseColumn<T1,SO1>::ResultType,
3001 typename SparseColumn<T2,SO2>::ResultType >::Type Type;
3017 template<
typename T1,
bool SO,
typename T2,
size_t N >
3018 struct SubTrait< SparseColumn<T1,SO>, StaticVector<T2,N,false> >
3020 typedef typename SubTrait< typename SparseColumn<T1,SO>::ResultType,
3021 StaticVector<T2,N,false> >::Type Type;
3024 template<
typename T1,
size_t N,
typename T2,
bool SO >
3025 struct SubTrait< StaticVector<T1,N,false>, SparseColumn<T2,SO> >
3027 typedef typename SubTrait< StaticVector<T1,N,false>,
3028 typename SparseColumn<T2,SO>::ResultType >::Type Type;
3031 template<
typename T1,
bool SO,
typename T2 >
3032 struct SubTrait< SparseColumn<T1,SO>, DynamicVector<T2,false> >
3034 typedef typename SubTrait< typename SparseColumn<T1,SO>::ResultType,
3035 DynamicVector<T2,false> >::Type Type;
3038 template<
typename T1,
typename T2,
bool SO >
3039 struct SubTrait< DynamicVector<T1,false>, SparseColumn<T2,SO> >
3041 typedef typename SubTrait< DynamicVector<T1,false>,
3042 typename SparseColumn<T2,SO>::ResultType >::Type Type;
3045 template<
typename T1,
bool SO1,
typename T2,
bool SO2 >
3046 struct SubTrait< SparseColumn<T1,SO1>, DenseColumn<T2,SO2> >
3048 typedef typename SubTrait< typename SparseColumn<T1,SO1>::ResultType,
3049 typename DenseColumn <T2,SO2>::ResultType >::Type Type;
3052 template<
typename T1,
bool SO1,
typename T2,
bool SO2 >
3053 struct SubTrait< DenseColumn<T1,SO1>, SparseColumn<T2,SO2> >
3055 typedef typename SubTrait< typename DenseColumn <T1,SO1>::ResultType,
3056 typename SparseColumn<T2,SO2>::ResultType >::Type Type;
3059 template<
typename T1,
bool SO,
typename T2 >
3060 struct SubTrait< SparseColumn<T1,SO>, CompressedVector<T2,false> >
3062 typedef typename SubTrait< typename SparseColumn<T1,SO>::ResultType,
3063 CompressedVector<T2,false> >::Type Type;
3066 template<
typename T1,
typename T2,
bool SO >
3067 struct SubTrait< CompressedVector<T1,false>, SparseColumn<T2,SO> >
3069 typedef typename SubTrait< CompressedVector<T1,false>,
3070 typename SparseColumn<T2,SO>::ResultType >::Type Type;
3073 template<
typename T1,
bool SO1,
typename T2,
bool SO2 >
3074 struct SubTrait< SparseColumn<T1,SO1>, SparseColumn<T2,SO2> >
3076 typedef typename SubTrait< typename SparseColumn<T1,SO1>::ResultType,
3077 typename SparseColumn<T2,SO2>::ResultType >::Type Type;
3093 template<
typename T1,
bool SO,
typename T2 >
3094 struct MultTrait< SparseColumn<T1,SO>, T2 >
3096 typedef typename MultTrait< typename SparseColumn<T1,SO>::ResultType, T2 >::Type Type;
3100 template<
typename T1,
typename T2,
bool SO >
3101 struct MultTrait< T1, SparseColumn<T2,SO> >
3103 typedef typename MultTrait< T1, typename SparseColumn<T2,SO>::ResultType >::Type Type;
3107 template<
typename T1,
bool SO,
typename T2,
size_t N,
bool TF >
3108 struct MultTrait< SparseColumn<T1,SO>, StaticVector<T2,N,TF> >
3110 typedef typename MultTrait< typename SparseColumn<T1,SO>::ResultType,
3111 StaticVector<T2,N,TF> >::Type Type;
3114 template<
typename T1,
size_t N,
bool TF,
typename T2,
bool SO >
3115 struct MultTrait< StaticVector<T1,N,TF>, SparseColumn<T2,SO> >
3117 typedef typename MultTrait< StaticVector<T1,N,TF>,
3118 typename SparseColumn<T2,SO>::ResultType >::Type Type;
3121 template<
typename T1,
bool SO,
typename T2,
bool TF >
3122 struct MultTrait< SparseColumn<T1,SO>, DynamicVector<T2,TF> >
3124 typedef typename MultTrait< typename SparseColumn<T1,SO>::ResultType,
3125 DynamicVector<T2,TF> >::Type Type;
3128 template<
typename T1,
bool TF,
typename T2,
bool SO >
3129 struct MultTrait< DynamicVector<T1,TF>, SparseColumn<T2,SO> >
3131 typedef typename MultTrait< DynamicVector<T1,TF>,
3132 typename SparseColumn<T2,SO>::ResultType >::Type Type;
3135 template<
typename T1,
bool SO1,
typename T2,
bool SO2 >
3136 struct MultTrait< SparseColumn<T1,SO1>, DenseColumn<T2,SO2> >
3138 typedef typename MultTrait< typename SparseColumn<T1,SO1>::ResultType,
3139 typename DenseColumn <T2,SO2>::ResultType >::Type Type;
3142 template<
typename T1,
bool SO1,
typename T2,
bool SO2 >
3143 struct MultTrait< DenseColumn<T1,SO1>, SparseColumn<T2,SO2> >
3145 typedef typename MultTrait< typename DenseColumn <T1,SO1>::ResultType,
3146 typename SparseColumn<T2,SO2>::ResultType >::Type Type;
3149 template<
typename T1,
bool SO,
typename T2,
bool TF >
3150 struct MultTrait< SparseColumn<T1,SO>, CompressedVector<T2,TF> >
3152 typedef typename MultTrait< typename SparseColumn<T1,SO>::ResultType,
3153 CompressedVector<T2,TF> >::Type Type;
3156 template<
typename T1,
bool TF,
typename T2,
bool SO >
3157 struct MultTrait< CompressedVector<T1,TF>, SparseColumn<T2,SO> >
3159 typedef typename MultTrait< CompressedVector<T1,TF>,
3160 typename SparseColumn<T2,SO>::ResultType >::Type Type;
3163 template<
typename T1,
bool SO1,
typename T2,
bool SO2 >
3164 struct MultTrait< SparseColumn<T1,SO1>, SparseColumn<T2,SO2> >
3166 typedef typename MultTrait< typename SparseColumn<T1,SO1>::ResultType,
3167 typename SparseColumn<T2,SO2>::ResultType >::Type Type;
3170 template<
typename T1,
size_t M,
size_t N,
bool SO1,
typename T2,
bool SO2 >
3171 struct MultTrait< StaticMatrix<T1,M,N,SO1>, SparseColumn<T2,SO2> >
3173 typedef typename MultTrait< StaticMatrix<T1,M,N,SO1>,
3174 typename SparseColumn<T2,SO2>::ResultType >::Type Type;
3177 template<
typename T1,
bool SO1,
typename T2,
bool SO2 >
3178 struct MultTrait< DynamicMatrix<T1,SO1>, SparseColumn<T2,SO2> >
3180 typedef typename MultTrait< DynamicMatrix<T1,SO1>,
3181 typename SparseColumn<T2,SO2>::ResultType >::Type Type;
3184 template<
typename T1,
bool SO1,
typename T2,
bool SO2 >
3185 struct MultTrait< CompressedMatrix<T1,SO1>, SparseColumn<T2,SO2> >
3187 typedef typename MultTrait< CompressedMatrix<T1,SO1>,
3188 typename SparseColumn<T2,SO2>::ResultType >::Type Type;
3204 template<
typename T1,
bool SO,
typename T2 >
3205 struct DivTrait< SparseColumn<T1,SO>, T2 >
3207 typedef typename DivTrait< typename SparseColumn<T1,SO>::ResultType, T2 >::Type Type;