22 #ifndef _BLAZE_MATH_DENSE_STATICVECTOR_H_
23 #define _BLAZE_MATH_DENSE_STATICVECTOR_H_
141 template<
typename Type
144 class StaticVector :
public DenseVector< StaticVector<Type,N,TF>, TF >
145 ,
private AlignedStorage<Type>
154 enum { NN = N + ( IT::size - ( N % IT::size ) ) % IT::size };
189 template<
typename Other >
explicit inline StaticVector(
const Other (&rhs)[N] );
192 inline StaticVector(
const Type& v1,
const Type& v2,
const Type& v3 );
193 inline StaticVector(
const Type& v1,
const Type& v2,
const Type& v3,
const Type& v4 );
194 inline StaticVector(
const Type& v1,
const Type& v2,
const Type& v3,
195 const Type& v4,
const Type& v5 );
196 inline StaticVector(
const Type& v1,
const Type& v2,
const Type& v3,
197 const Type& v4,
const Type& v5,
const Type& v6 );
210 inline Type*
data ();
211 inline const Type*
data ()
const;
233 template<
typename Other >
235 operator*=( Other rhs );
237 template<
typename Other >
239 operator/=( Other rhs );
246 inline size_t size()
const;
250 template<
typename Other >
inline StaticVector& scale( Other scalar );
259 template<
typename VT >
260 struct VectorizedAssign {
261 enum { value = vectorizable && VT::vectorizable &&
270 template<
typename VT >
271 struct VectorizedAddAssign {
272 enum { value = vectorizable && VT::vectorizable &&
273 IsSame<Type,typename VT::ElementType>::value &&
274 IntrinsicTrait<Type>::addition };
282 template<
typename VT >
283 struct VectorizedSubAssign {
284 enum { value = vectorizable && VT::vectorizable &&
285 IsSame<Type,typename VT::ElementType>::value &&
286 IntrinsicTrait<Type>::subtraction };
294 template<
typename VT >
295 struct VectorizedMultAssign {
296 enum { value = vectorizable && VT::vectorizable &&
297 IsSame<Type,typename VT::ElementType>::value &&
298 IntrinsicTrait<Type>::multiplication };
307 template<
typename Other >
inline bool canAlias (
const Other* alias )
const;
308 template<
typename Other >
inline bool isAliased(
const Other* alias )
const;
311 template<
typename VT >
312 inline typename DisableIf< VectorizedAssign<VT> >::Type
313 assign(
const DenseVector<VT,TF>& rhs );
315 template<
typename VT >
316 inline typename EnableIf< VectorizedAssign<VT> >::Type
317 assign(
const DenseVector<VT,TF>& rhs );
319 template<
typename VT >
inline void assign(
const SparseVector<VT,TF>& rhs );
321 template<
typename VT >
322 inline typename DisableIf< VectorizedAddAssign<VT> >::Type
323 addAssign(
const DenseVector<VT,TF>& rhs );
325 template<
typename VT >
326 inline typename EnableIf< VectorizedAddAssign<VT> >::Type
327 addAssign(
const DenseVector<VT,TF>& rhs );
329 template<
typename VT >
inline void addAssign(
const SparseVector<VT,TF>& rhs );
331 template<
typename VT >
332 inline typename DisableIf< VectorizedSubAssign<VT> >::Type
333 subAssign(
const DenseVector<VT,TF>& rhs );
335 template<
typename VT >
336 inline typename EnableIf< VectorizedSubAssign<VT> >::Type
337 subAssign(
const DenseVector<VT,TF>& rhs );
339 template<
typename VT >
inline void subAssign(
const SparseVector<VT,TF>& rhs );
341 template<
typename VT >
342 inline typename DisableIf< VectorizedMultAssign<VT> >::Type
343 multAssign(
const DenseVector<VT,TF>& rhs );
345 template<
typename VT >
346 inline typename EnableIf< VectorizedMultAssign<VT> >::Type
347 multAssign(
const DenseVector<VT,TF>& rhs );
349 template<
typename VT >
inline void multAssign(
const SparseVector<VT,TF>& rhs );
393 template<
typename Type
398 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
401 for(
size_t i=0UL; i<NN; ++i )
413 template<
typename Type
418 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
420 for(
size_t i=0UL; i<N; ++i )
424 for(
size_t i=N; i<NN; ++i )
438 template<
typename Type
443 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
445 for(
size_t i=0UL; i<NN; ++i )
456 template<
typename Type
459 template<
typename Other >
462 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
464 for(
size_t i=0UL; i<N; ++i )
468 for(
size_t i=N; i<NN; ++i )
485 template<
typename Type
488 template<
typename VT >
493 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
495 if( (~v).size() != N )
496 throw std::invalid_argument(
"Invalid setup of static vector" );
522 template<
typename Type
525 template<
typename Other >
528 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
530 for(
size_t i=0UL; i<N; ++i )
534 for(
size_t i=N; i<NN; ++i )
553 template<
typename Type
559 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
565 for(
size_t i=N; i<NN; ++i )
585 template<
typename Type
591 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
598 for(
size_t i=N; i<NN; ++i )
619 template<
typename Type
623 const Type& v3,
const Type& v4 )
626 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
634 for(
size_t i=N; i<NN; ++i )
656 template<
typename Type
660 const Type& v4,
const Type& v5 )
663 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
672 for(
size_t i=N; i<NN; ++i )
695 template<
typename Type
699 const Type& v4,
const Type& v5,
const Type& v6 )
702 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
712 for(
size_t i=N; i<NN; ++i )
735 template<
typename Type
755 template<
typename Type
772 template<
typename Type
787 template<
typename Type
802 template<
typename Type
817 template<
typename Type
832 template<
typename Type
847 template<
typename Type
862 template<
typename Type
877 template<
typename Type
901 template<
typename Type
906 for(
size_t i=0UL; i<N; ++i )
921 template<
typename Type
932 for(
size_t i=0UL; i<N; ++i )
945 template<
typename Type
948 template<
typename Other >
957 for(
size_t i=0UL; i<N; ++i )
974 template<
typename Type
977 template<
typename VT >
982 if( (~rhs).size() != N )
983 throw std::invalid_argument(
"Invalid assignment to static vector" );
985 if( (~rhs).canAlias(
this ) ) {
1016 template<
typename Type
1019 template<
typename Other >
1022 for(
size_t i=0UL; i<N; ++i )
1039 template<
typename Type
1042 template<
typename VT >
1047 if( (~rhs).size() != N )
1048 throw std::invalid_argument(
"Vector sizes do not match" );
1050 if( (~rhs).canAlias(
this ) ) {
1073 template<
typename Type
1076 template<
typename VT >
1081 if( (~rhs).size() != N )
1082 throw std::invalid_argument(
"Vector sizes do not match" );
1084 if( (~rhs).canAlias(
this ) ) {
1108 template<
typename Type
1111 template<
typename VT >
1116 if( (~rhs).size() != N )
1117 throw std::invalid_argument(
"Vector sizes do not match" );
1121 this->operator=( tmp );
1124 assign( *
this, *
this * (~rhs) );
1139 template<
typename Type
1142 template<
typename Other >
1146 return operator=( (*
this) * rhs );
1160 template<
typename Type
1163 template<
typename Other >
1169 return operator=( (*
this) / rhs );
1187 template<
typename Type
1202 template<
typename Type
1220 template<
typename Type
1225 size_t nonzeros( 0 );
1227 for(
size_t i=0UL; i<N; ++i ) {
1242 template<
typename Type
1248 for(
size_t i=0UL; i<N; ++i )
1260 template<
typename Type
1263 template<
typename Other >
1266 for(
size_t i=0; i<N; ++i )
1280 template<
typename Type
1287 for(
size_t i=0UL; i<N; ++i )
1288 swap( v_[i], v.v_[i] );
1311 template<
typename Type
1314 template<
typename Other >
1317 return static_cast<const void*
>( this ) == static_cast<const void*>( alias );
1332 template<
typename Type
1335 template<
typename Other >
1338 return static_cast<const void*
>( this ) == static_cast<const void*>( alias );
1354 template<
typename Type
1366 return load( &v_[index] );
1382 template<
typename Type
1385 template<
typename VT >
1391 for(
size_t i=0UL; i<N; ++i )
1408 template<
typename Type
1411 template<
typename VT >
1419 for(
size_t i=0UL; i<N; i+=IT::size ) {
1420 store( v_+i, (~rhs).
get(i) );
1437 template<
typename Type
1440 template<
typename VT >
1445 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1446 v_[element->index()] = element->value();
1462 template<
typename Type
1465 template<
typename VT >
1471 for(
size_t i=0UL; i<N; ++i )
1488 template<
typename Type
1491 template<
typename VT >
1499 for(
size_t i=0UL; i<N; i+=IT::size ) {
1500 store( v_+i,
load( v_+i ) + (~rhs).
get(i) );
1517 template<
typename Type
1520 template<
typename VT >
1525 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1526 v_[element->index()] += element->value();
1542 template<
typename Type
1545 template<
typename VT >
1551 for(
size_t i=0UL; i<N; ++i )
1568 template<
typename Type
1571 template<
typename VT >
1579 for(
size_t i=0UL; i<N; i+=IT::size ) {
1580 store( v_+i,
load( v_+i ) - (~rhs).
get(i) );
1597 template<
typename Type
1600 template<
typename VT >
1605 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1606 v_[element->index()] -= element->value();
1622 template<
typename Type
1625 template<
typename VT >
1631 for(
size_t i=0UL; i<N; ++i )
1648 template<
typename Type
1651 template<
typename VT >
1659 for(
size_t i=0UL; i<N; i+=IT::size ) {
1660 store( v_+i,
load( v_+i ) * (~rhs).
get(i) );
1677 template<
typename Type
1680 template<
typename VT >
1689 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1690 v_[element->index()] = tmp[element->index()] * element->value();
1715 template<
typename Type
1737 template<
typename Type,
size_t N,
bool TF >
1740 template<
typename Type,
size_t N,
bool TF >
1743 template<
typename Type,
size_t N,
bool TF >
1746 template<
typename Type,
size_t N,
bool TF >
1749 template<
typename Type,
bool TF >
1752 template<
typename Type,
bool TF >
1755 template<
typename Type,
size_t N,
bool TF >
1778 template<
typename Type
1783 for(
size_t i=0UL; i<N; ++i ) {
1784 if(
isnan( v[i] ) )
return true;
1798 template<
typename Type
1817 template<
typename Type
1845 template<
typename Type
1850 for(
size_t i=0UL; i<N; ++i )
1868 template<
typename Type
1885 template<
typename Type
1889 if( v[0] != Type() || v[1] != Type() )
1906 template<
typename Type
1926 template<
typename T1,
size_t N,
bool TF,
typename T2 >
1927 struct AddTrait< StaticVector<T1,N,TF>, StaticVector<T2,N,TF> >
1929 typedef StaticVector< typename AddTrait<T1,T2>::Type, N, TF > Type;
1945 template<
typename T1,
size_t N,
bool TF,
typename T2 >
1946 struct SubTrait< StaticVector<T1,N,TF>, StaticVector<T2,N,TF> >
1948 typedef StaticVector< typename SubTrait<T1,T2>::Type, N, TF > Type;
1964 template<
typename T1,
size_t N,
bool TF,
typename T2 >
1965 struct MultTrait< StaticVector<T1,N,TF>, T2 >
1967 typedef StaticVector< typename MultTrait<T1,T2>::Type, N, TF > Type;
1971 template<
typename T1,
typename T2,
size_t N,
bool TF >
1972 struct MultTrait< T1, StaticVector<T2,N,TF> >
1974 typedef StaticVector< typename MultTrait<T1,T2>::Type, N, TF > Type;
1978 template<
typename T1,
size_t N,
bool TF,
typename T2 >
1979 struct MultTrait< StaticVector<T1,N,TF>, StaticVector<T2,N,TF> >
1981 typedef StaticVector< typename MultTrait<T1,T2>::Type, N, TF > Type;
1984 template<
typename T1,
size_t M,
typename T2,
size_t N >
1985 struct MultTrait< StaticVector<T1,M,false>, StaticVector<T2,N,true> >
1987 typedef StaticMatrix< typename MultTrait<T1,T2>::Type, M, N,
false > Type;
1990 template<
typename T1,
size_t N,
typename T2 >
1991 struct MultTrait< StaticVector<T1,N,true>, StaticVector<T2,N,false> >
1993 typedef typename MultTrait<T1,T2>::Type Type;
2009 template<
typename T1,
typename T2 >
2010 struct CrossTrait< StaticVector<T1,3UL,false>, StaticVector<T2,3UL,false> >
2013 typedef typename MultTrait<T1,T2>::Type T;
2016 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
2032 template<
typename T1,
size_t N,
bool TF,
typename T2 >
2033 struct DivTrait< StaticVector<T1,N,TF>, T2 >
2035 typedef StaticVector< typename DivTrait<T1,T2>::Type, N, TF > Type;
2052 template<
typename T1,
size_t N,
bool TF,
typename T2 >
2053 struct MathTrait< StaticVector<T1,N,TF>, StaticVector<T2,N,TF> >
2055 typedef StaticVector< typename MathTrait<T1,T2>::HighType, N, TF > HighType;
2056 typedef StaticVector< typename MathTrait<T1,T2>::LowType , N, TF > LowType;