22 #ifndef _BLAZE_MATH_DENSE_STATICVECTOR_H_
23 #define _BLAZE_MATH_DENSE_STATICVECTOR_H_
146 template<
typename Type
149 class StaticVector :
public DenseVector< StaticVector<Type,N,TF>, TF >
150 ,
private AlignedStorage<Type>
159 enum { NN = N + ( IT::size - ( N % IT::size ) ) % IT::size };
198 template<
typename Other >
explicit inline StaticVector(
const Other (&rhs)[N] );
201 inline StaticVector(
const Type& v1,
const Type& v2,
const Type& v3 );
202 inline StaticVector(
const Type& v1,
const Type& v2,
const Type& v3,
const Type& v4 );
203 inline StaticVector(
const Type& v1,
const Type& v2,
const Type& v3,
204 const Type& v4,
const Type& v5 );
205 inline StaticVector(
const Type& v1,
const Type& v2,
const Type& v3,
206 const Type& v4,
const Type& v5,
const Type& v6 );
219 inline Type*
data ();
220 inline const Type*
data ()
const;
242 template<
typename Other >
244 operator*=( Other rhs );
246 template<
typename Other >
248 operator/=( Other rhs );
255 inline size_t size()
const;
263 template<
typename Other >
inline StaticVector& scale( Other scalar );
272 template<
typename VT >
273 struct VectorizedAssign {
274 enum { value = vectorizable && VT::vectorizable &&
283 template<
typename VT >
284 struct VectorizedAddAssign {
285 enum { value = vectorizable && VT::vectorizable &&
286 IsSame<Type,typename VT::ElementType>::value &&
287 IntrinsicTrait<Type>::addition };
295 template<
typename VT >
296 struct VectorizedSubAssign {
297 enum { value = vectorizable && VT::vectorizable &&
298 IsSame<Type,typename VT::ElementType>::value &&
299 IntrinsicTrait<Type>::subtraction };
307 template<
typename VT >
308 struct VectorizedMultAssign {
309 enum { value = vectorizable && VT::vectorizable &&
310 IsSame<Type,typename VT::ElementType>::value &&
311 IntrinsicTrait<Type>::multiplication };
320 template<
typename Other >
inline bool canAlias (
const Other* alias )
const;
321 template<
typename Other >
inline bool isAliased(
const Other* alias )
const;
324 template<
typename VT >
325 inline typename DisableIf< VectorizedAssign<VT> >::Type
326 assign(
const DenseVector<VT,TF>& rhs );
328 template<
typename VT >
329 inline typename EnableIf< VectorizedAssign<VT> >::Type
330 assign(
const DenseVector<VT,TF>& rhs );
332 template<
typename VT >
inline void assign(
const SparseVector<VT,TF>& rhs );
334 template<
typename VT >
335 inline typename DisableIf< VectorizedAddAssign<VT> >::Type
336 addAssign(
const DenseVector<VT,TF>& rhs );
338 template<
typename VT >
339 inline typename EnableIf< VectorizedAddAssign<VT> >::Type
340 addAssign(
const DenseVector<VT,TF>& rhs );
342 template<
typename VT >
inline void addAssign(
const SparseVector<VT,TF>& rhs );
344 template<
typename VT >
345 inline typename DisableIf< VectorizedSubAssign<VT> >::Type
346 subAssign(
const DenseVector<VT,TF>& rhs );
348 template<
typename VT >
349 inline typename EnableIf< VectorizedSubAssign<VT> >::Type
350 subAssign(
const DenseVector<VT,TF>& rhs );
352 template<
typename VT >
inline void subAssign(
const SparseVector<VT,TF>& rhs );
354 template<
typename VT >
355 inline typename DisableIf< VectorizedMultAssign<VT> >::Type
356 multAssign(
const DenseVector<VT,TF>& rhs );
358 template<
typename VT >
359 inline typename EnableIf< VectorizedMultAssign<VT> >::Type
360 multAssign(
const DenseVector<VT,TF>& rhs );
362 template<
typename VT >
inline void multAssign(
const SparseVector<VT,TF>& rhs );
406 template<
typename Type
411 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
414 for(
size_t i=0UL; i<NN; ++i )
426 template<
typename Type
431 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
433 for(
size_t i=0UL; i<N; ++i )
437 for(
size_t i=N; i<NN; ++i )
451 template<
typename Type
456 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
458 for(
size_t i=0UL; i<NN; ++i )
469 template<
typename Type
472 template<
typename Other >
475 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
477 for(
size_t i=0UL; i<N; ++i )
481 for(
size_t i=N; i<NN; ++i )
498 template<
typename Type
501 template<
typename VT >
506 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
508 if( (~v).size() != N )
509 throw std::invalid_argument(
"Invalid setup of static vector" );
535 template<
typename Type
538 template<
typename Other >
541 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
543 for(
size_t i=0UL; i<N; ++i )
547 for(
size_t i=N; i<NN; ++i )
566 template<
typename Type
572 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
578 for(
size_t i=N; i<NN; ++i )
598 template<
typename Type
604 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
611 for(
size_t i=N; i<NN; ++i )
632 template<
typename Type
636 const Type& v3,
const Type& v4 )
639 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
647 for(
size_t i=N; i<NN; ++i )
669 template<
typename Type
673 const Type& v4,
const Type& v5 )
676 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
685 for(
size_t i=N; i<NN; ++i )
708 template<
typename Type
712 const Type& v4,
const Type& v5,
const Type& v6 )
715 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
725 for(
size_t i=N; i<NN; ++i )
748 template<
typename Type
768 template<
typename Type
785 template<
typename Type
800 template<
typename Type
815 template<
typename Type
830 template<
typename Type
845 template<
typename Type
860 template<
typename Type
875 template<
typename Type
890 template<
typename Type
914 template<
typename Type
919 for(
size_t i=0UL; i<N; ++i )
934 template<
typename Type
945 for(
size_t i=0UL; i<N; ++i )
958 template<
typename Type
961 template<
typename Other >
970 for(
size_t i=0UL; i<N; ++i )
987 template<
typename Type
990 template<
typename VT >
995 if( (~rhs).size() != N )
996 throw std::invalid_argument(
"Invalid assignment to static vector" );
998 if( (~rhs).canAlias(
this ) ) {
1029 template<
typename Type
1032 template<
typename Other >
1035 for(
size_t i=0UL; i<N; ++i )
1052 template<
typename Type
1055 template<
typename VT >
1060 if( (~rhs).size() != N )
1061 throw std::invalid_argument(
"Vector sizes do not match" );
1063 if( (~rhs).canAlias(
this ) ) {
1086 template<
typename Type
1089 template<
typename VT >
1094 if( (~rhs).size() != N )
1095 throw std::invalid_argument(
"Vector sizes do not match" );
1097 if( (~rhs).canAlias(
this ) ) {
1121 template<
typename Type
1124 template<
typename VT >
1129 if( (~rhs).size() != N )
1130 throw std::invalid_argument(
"Vector sizes do not match" );
1134 this->operator=( tmp );
1137 assign( *
this, *
this * (~rhs) );
1152 template<
typename Type
1155 template<
typename Other >
1159 return operator=( (*
this) * rhs );
1173 template<
typename Type
1176 template<
typename Other >
1182 return operator=( (*
this) / rhs );
1200 template<
typename Type
1215 template<
typename Type
1233 template<
typename Type
1238 size_t nonzeros( 0 );
1240 for(
size_t i=0UL; i<N; ++i ) {
1255 template<
typename Type
1261 for(
size_t i=0UL; i<N; ++i )
1297 template<
typename Type
1309 for(
size_t i=0UL; i<N; ++i )
1310 sum += v_[i] * v_[i];
1311 return std::sqrt( sum );
1326 template<
typename Type
1334 for(
size_t i=0UL; i<N; ++i )
1335 sum += v_[i] * v_[i];
1350 template<
typename Type
1357 const Type len( length() );
1359 if( len == Type(0) )
1362 const Type ilen( Type(1) / len );
1364 for(
size_t i=0UL; i<N; ++i )
1381 template<
typename Type
1388 const Type len( length() );
1390 if( len == Type(0) )
1393 const Type ilen( Type(1) / len );
1396 for(
size_t i=0UL; i<N; ++i )
1397 tmp[i] = v_[i] * ilen;
1410 template<
typename Type
1413 template<
typename Other >
1416 for(
size_t i=0; i<N; ++i )
1430 template<
typename Type
1437 for(
size_t i=0UL; i<N; ++i )
1438 swap( v_[i], v.v_[i] );
1461 template<
typename Type
1464 template<
typename Other >
1467 return static_cast<const void*
>( this ) == static_cast<const void*>( alias );
1482 template<
typename Type
1485 template<
typename Other >
1488 return static_cast<const void*
>( this ) == static_cast<const void*>( alias );
1504 template<
typename Type
1516 return load( &v_[index] );
1532 template<
typename Type
1535 template<
typename VT >
1541 for(
size_t i=0UL; i<N; ++i )
1558 template<
typename Type
1561 template<
typename VT >
1569 for(
size_t i=0UL; i<N; i+=IT::size ) {
1570 store( v_+i, (~rhs).
get(i) );
1587 template<
typename Type
1590 template<
typename VT >
1595 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1596 v_[element->index()] = element->value();
1612 template<
typename Type
1615 template<
typename VT >
1621 for(
size_t i=0UL; i<N; ++i )
1638 template<
typename Type
1641 template<
typename VT >
1649 for(
size_t i=0UL; i<N; i+=IT::size ) {
1650 store( v_+i,
load( v_+i ) + (~rhs).
get(i) );
1667 template<
typename Type
1670 template<
typename VT >
1675 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1676 v_[element->index()] += element->value();
1692 template<
typename Type
1695 template<
typename VT >
1701 for(
size_t i=0UL; i<N; ++i )
1718 template<
typename Type
1721 template<
typename VT >
1729 for(
size_t i=0UL; i<N; i+=IT::size ) {
1730 store( v_+i,
load( v_+i ) - (~rhs).
get(i) );
1747 template<
typename Type
1750 template<
typename VT >
1755 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1756 v_[element->index()] -= element->value();
1772 template<
typename Type
1775 template<
typename VT >
1781 for(
size_t i=0UL; i<N; ++i )
1798 template<
typename Type
1801 template<
typename VT >
1809 for(
size_t i=0UL; i<N; i+=IT::size ) {
1810 store( v_+i,
load( v_+i ) * (~rhs).
get(i) );
1827 template<
typename Type
1830 template<
typename VT >
1839 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1840 v_[element->index()] = tmp[element->index()] * element->value();
1865 template<
typename Type
1887 template<
typename Type,
size_t N,
bool TF >
1890 template<
typename Type,
size_t N,
bool TF >
1893 template<
typename Type,
size_t N,
bool TF >
1896 template<
typename Type,
size_t N,
bool TF >
1899 template<
typename Type,
bool TF >
1902 template<
typename Type,
bool TF >
1905 template<
typename Type,
size_t N,
bool TF >
1928 template<
typename Type
1933 for(
size_t i=0UL; i<N; ++i ) {
1934 if(
isnan( v[i] ) )
return true;
1948 template<
typename Type
1967 template<
typename Type
1995 template<
typename Type
2000 for(
size_t i=0UL; i<N; ++i )
2018 template<
typename Type
2035 template<
typename Type
2039 if( v[0] != Type() || v[1] != Type() )
2056 template<
typename Type
2076 template<
typename T1,
size_t N,
bool TF,
typename T2 >
2077 struct AddTrait< StaticVector<T1,N,TF>, StaticVector<T2,N,TF> >
2079 typedef StaticVector< typename AddTrait<T1,T2>::Type, N, TF > Type;
2095 template<
typename T1,
size_t N,
bool TF,
typename T2 >
2096 struct SubTrait< StaticVector<T1,N,TF>, StaticVector<T2,N,TF> >
2098 typedef StaticVector< typename SubTrait<T1,T2>::Type, N, TF > Type;
2114 template<
typename T1,
size_t N,
bool TF,
typename T2 >
2115 struct MultTrait< StaticVector<T1,N,TF>, T2 >
2117 typedef StaticVector< typename MultTrait<T1,T2>::Type, N, TF > Type;
2121 template<
typename T1,
typename T2,
size_t N,
bool TF >
2122 struct MultTrait< T1, StaticVector<T2,N,TF> >
2124 typedef StaticVector< typename MultTrait<T1,T2>::Type, N, TF > Type;
2128 template<
typename T1,
size_t N,
bool TF,
typename T2 >
2129 struct MultTrait< StaticVector<T1,N,TF>, StaticVector<T2,N,TF> >
2131 typedef StaticVector< typename MultTrait<T1,T2>::Type, N, TF > Type;
2134 template<
typename T1,
size_t M,
typename T2,
size_t N >
2135 struct MultTrait< StaticVector<T1,M,false>, StaticVector<T2,N,true> >
2137 typedef StaticMatrix< typename MultTrait<T1,T2>::Type, M, N,
false > Type;
2140 template<
typename T1,
size_t N,
typename T2 >
2141 struct MultTrait< StaticVector<T1,N,true>, StaticVector<T2,N,false> >
2143 typedef typename MultTrait<T1,T2>::Type Type;
2159 template<
typename T1,
typename T2 >
2160 struct CrossTrait< StaticVector<T1,3UL,false>, StaticVector<T2,3UL,false> >
2163 typedef typename MultTrait<T1,T2>::Type T;
2166 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
2182 template<
typename T1,
size_t N,
bool TF,
typename T2 >
2183 struct DivTrait< StaticVector<T1,N,TF>, T2 >
2185 typedef StaticVector< typename DivTrait<T1,T2>::Type, N, TF > Type;
2202 template<
typename T1,
size_t N,
bool TF,
typename T2 >
2203 struct MathTrait< StaticVector<T1,N,TF>, StaticVector<T2,N,TF> >
2205 typedef StaticVector< typename MathTrait<T1,T2>::HighType, N, TF > HighType;
2206 typedef StaticVector< typename MathTrait<T1,T2>::LowType , N, TF > LowType;