22 #ifndef _BLAZE_MATH_DENSE_STATICVECTOR_H_
23 #define _BLAZE_MATH_DENSE_STATICVECTOR_H_
147 template<
typename Type
160 enum { NN = N + ( IT::size - ( N % IT::size ) ) % IT::size };
194 enum { canAlias = 0 };
203 template<
typename Other >
inline StaticVector(
const StaticVector<Other,N,TF>& v );
205 template<
typename Other >
explicit inline StaticVector(
const Other (&rhs)[N] );
208 inline StaticVector(
const Type& v1,
const Type& v2,
const Type& v3 );
209 inline StaticVector(
const Type& v1,
const Type& v2,
const Type& v3,
const Type& v4 );
210 inline StaticVector(
const Type& v1,
const Type& v2,
const Type& v3,
211 const Type& v4,
const Type& v5 );
212 inline StaticVector(
const Type& v1,
const Type& v2,
const Type& v3,
213 const Type& v4,
const Type& v5,
const Type& v6 );
226 inline Type*
data ();
227 inline const Type*
data ()
const;
249 template<
typename Other >
250 inline typename EnableIf< IsNumeric<Other>,
StaticVector >::Type&
253 template<
typename Other >
254 inline typename EnableIf< IsNumeric<Other>,
StaticVector >::Type&
262 inline size_t size()
const;
270 inline Type
min()
const;
271 inline Type
max()
const;
280 template<
typename VT >
281 struct VectorizedAssign {
282 enum { value = vectorizable && VT::vectorizable &&
283 IsSame<Type,typename VT::ElementType>::value };
291 template<
typename VT >
292 struct VectorizedAddAssign {
293 enum { value = vectorizable && VT::vectorizable &&
294 IsSame<Type,typename VT::ElementType>::value &&
295 IntrinsicTrait<Type>::addition };
303 template<
typename VT >
304 struct VectorizedSubAssign {
305 enum { value = vectorizable && VT::vectorizable &&
306 IsSame<Type,typename VT::ElementType>::value &&
307 IntrinsicTrait<Type>::subtraction };
315 template<
typename VT >
316 struct VectorizedMultAssign {
317 enum { value = vectorizable && VT::vectorizable &&
318 IsSame<Type,typename VT::ElementType>::value &&
319 IntrinsicTrait<Type>::multiplication };
328 template<
typename Other >
inline bool isAliased(
const Other* alias )
const;
331 template<
typename VT >
332 inline typename DisableIf< VectorizedAssign<VT> >::Type
333 assign(
const DenseVector<VT,TF>& rhs );
335 template<
typename VT >
336 inline typename EnableIf< VectorizedAssign<VT> >::Type
337 assign(
const DenseVector<VT,TF>& rhs );
341 template<
typename VT >
342 inline typename DisableIf< VectorizedAddAssign<VT> >::Type
343 addAssign(
const DenseVector<VT,TF>& rhs );
345 template<
typename VT >
346 inline typename EnableIf< VectorizedAddAssign<VT> >::Type
347 addAssign(
const DenseVector<VT,TF>& rhs );
351 template<
typename VT >
352 inline typename DisableIf< VectorizedSubAssign<VT> >::Type
353 subAssign(
const DenseVector<VT,TF>& rhs );
355 template<
typename VT >
356 inline typename EnableIf< VectorizedSubAssign<VT> >::Type
357 subAssign(
const DenseVector<VT,TF>& rhs );
361 template<
typename VT >
362 inline typename DisableIf< VectorizedMultAssign<VT> >::Type
365 template<
typename VT >
366 inline typename EnableIf< VectorizedMultAssign<VT> >::Type
413 template<
typename Type
418 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
421 for(
size_t i=0UL; i<NN; ++i )
433 template<
typename Type
438 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
440 for(
size_t i=0UL; i<N; ++i )
444 for(
size_t i=N; i<NN; ++i )
458 template<
typename Type
463 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
465 for(
size_t i=0UL; i<NN; ++i )
476 template<
typename Type
479 template<
typename Other >
482 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
484 for(
size_t i=0UL; i<N; ++i )
488 for(
size_t i=N; i<NN; ++i )
505 template<
typename Type
508 template<
typename VT >
513 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
515 if( (~v).size() != N )
516 throw std::invalid_argument(
"Invalid setup of static vector" );
542 template<
typename Type
545 template<
typename Other >
548 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
550 for(
size_t i=0UL; i<N; ++i )
554 for(
size_t i=N; i<NN; ++i )
573 template<
typename Type
579 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
585 for(
size_t i=N; i<NN; ++i )
605 template<
typename Type
611 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
618 for(
size_t i=N; i<NN; ++i )
639 template<
typename Type
643 const Type& v3,
const Type& v4 )
646 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
654 for(
size_t i=N; i<NN; ++i )
676 template<
typename Type
680 const Type& v4,
const Type& v5 )
683 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
692 for(
size_t i=N; i<NN; ++i )
715 template<
typename Type
719 const Type& v4,
const Type& v5,
const Type& v6 )
722 BLAZE_INTERNAL_ASSERT( !( reinterpret_cast<size_t>( v_ ) % IT::alignment ),
"Invalid alignment detected" );
732 for(
size_t i=N; i<NN; ++i )
755 template<
typename Type
775 template<
typename Type
792 template<
typename Type
807 template<
typename Type
822 template<
typename Type
837 template<
typename Type
852 template<
typename Type
867 template<
typename Type
882 template<
typename Type
897 template<
typename Type
921 template<
typename Type
926 for(
size_t i=0UL; i<N; ++i )
941 template<
typename Type
952 for(
size_t i=0UL; i<N; ++i )
965 template<
typename Type
968 template<
typename Other >
977 for(
size_t i=0UL; i<N; ++i )
994 template<
typename Type
997 template<
typename VT >
1002 if( (~rhs).size() != N )
1003 throw std::invalid_argument(
"Invalid assignment to static vector" );
1036 template<
typename Type
1039 template<
typename Other >
1042 for(
size_t i=0UL; i<N; ++i )
1059 template<
typename Type
1062 template<
typename VT >
1067 if( (~rhs).size() != N )
1068 throw std::invalid_argument(
"Vector sizes do not match" );
1093 template<
typename Type
1096 template<
typename VT >
1101 if( (~rhs).size() != N )
1102 throw std::invalid_argument(
"Vector sizes do not match" );
1128 template<
typename Type
1131 template<
typename VT >
1136 if( (~rhs).size() != N )
1137 throw std::invalid_argument(
"Vector sizes do not match" );
1141 this->operator=( tmp );
1144 assign( *
this, *
this * (~rhs) );
1159 template<
typename Type
1162 template<
typename Other >
1166 return operator=( (*
this) * rhs );
1180 template<
typename Type
1183 template<
typename Other >
1189 return operator=( (*
this) / rhs );
1207 template<
typename Type
1225 template<
typename Type
1230 size_t nonzeros( 0 );
1232 for(
size_t i=0UL; i<N; ++i ) {
1247 template<
typename Type
1253 for(
size_t i=0UL; i<N; ++i )
1289 template<
typename Type
1301 for(
size_t i=0UL; i<N; ++i )
1302 sum += v_[i] * v_[i];
1303 return std::sqrt( sum );
1318 template<
typename Type
1326 for(
size_t i=0UL; i<N; ++i )
1327 sum += v_[i] * v_[i];
1342 template<
typename Type
1349 const Type len( length() );
1351 if( len == Type(0) )
1354 const Type ilen( Type(1) / len );
1356 for(
size_t i=0UL; i<N; ++i )
1373 template<
typename Type
1380 const Type len( length() );
1382 if( len == Type(0) )
1385 const Type ilen( Type(1) / len );
1388 for(
size_t i=0UL; i<N; ++i )
1389 tmp[i] = v_[i] * ilen;
1402 template<
typename Type
1405 template<
typename Other >
1408 for(
size_t i=0; i<N; ++i )
1420 template<
typename Type
1427 Type minimum( v_[0] );
1428 for(
size_t i=1UL; i<N; ++i )
1429 minimum =
min( minimum, v_[i] );
1440 template<
typename Type
1447 Type maximum( v_[0] );
1448 for(
size_t i=1UL; i<N; ++i )
1449 maximum =
max( maximum, v_[i] );
1462 template<
typename Type
1469 for(
size_t i=0UL; i<N; ++i )
1489 template<
typename Type
1492 template<
typename Other >
1495 return static_cast<const void*
>( this ) == static_cast<const void*>( alias );
1511 template<
typename Type
1523 return load( &v_[index] );
1539 template<
typename Type
1542 template<
typename VT >
1548 for(
size_t i=0UL; i<N; ++i )
1565 template<
typename Type
1568 template<
typename VT >
1576 for(
size_t i=0UL; i<N; i+=IT::size ) {
1577 store( v_+i, (~rhs).
get(i) );
1594 template<
typename Type
1597 template<
typename VT >
1602 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1603 v_[element->index()] = element->value();
1619 template<
typename Type
1622 template<
typename VT >
1628 for(
size_t i=0UL; i<N; ++i )
1645 template<
typename Type
1648 template<
typename VT >
1656 for(
size_t i=0UL; i<N; i+=IT::size ) {
1657 store( v_+i,
load( v_+i ) + (~rhs).
get(i) );
1674 template<
typename Type
1677 template<
typename VT >
1682 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1683 v_[element->index()] += element->value();
1699 template<
typename Type
1702 template<
typename VT >
1708 for(
size_t i=0UL; i<N; ++i )
1725 template<
typename Type
1728 template<
typename VT >
1736 for(
size_t i=0UL; i<N; i+=IT::size ) {
1737 store( v_+i,
load( v_+i ) - (~rhs).
get(i) );
1754 template<
typename Type
1757 template<
typename VT >
1762 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1763 v_[element->index()] -= element->value();
1779 template<
typename Type
1782 template<
typename VT >
1788 for(
size_t i=0UL; i<N; ++i )
1805 template<
typename Type
1808 template<
typename VT >
1816 for(
size_t i=0UL; i<N; i+=IT::size ) {
1817 store( v_+i,
load( v_+i ) * (~rhs).
get(i) );
1834 template<
typename Type
1837 template<
typename VT >
1846 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1847 v_[element->index()] = tmp[element->index()] * element->value();
1872 template<
typename Type
1894 template<
typename Type,
size_t N,
bool TF >
1897 template<
typename Type,
size_t N,
bool TF >
1900 template<
typename Type,
size_t N,
bool TF >
1903 template<
typename Type,
size_t N,
bool TF >
1906 template<
typename Type,
bool TF >
1909 template<
typename Type,
bool TF >
1912 template<
typename Type,
size_t N,
bool TF >
1935 template<
typename Type
1940 for(
size_t i=0UL; i<N; ++i ) {
1941 if(
isnan( v[i] ) )
return true;
1955 template<
typename Type
1974 template<
typename Type
2002 template<
typename Type
2007 for(
size_t i=0UL; i<N; ++i )
2025 template<
typename Type
2042 template<
typename Type
2046 if( v[0] != Type() || v[1] != Type() )
2063 template<
typename Type
2083 template<
typename T1,
size_t N,
bool TF,
typename T2 >
2084 struct AddTrait< StaticVector<T1,N,TF>, StaticVector<T2,N,TF> >
2086 typedef StaticVector< typename AddTrait<T1,T2>::Type, N, TF > Type;
2102 template<
typename T1,
size_t N,
bool TF,
typename T2 >
2103 struct SubTrait< StaticVector<T1,N,TF>, StaticVector<T2,N,TF> >
2105 typedef StaticVector< typename SubTrait<T1,T2>::Type, N, TF > Type;
2121 template<
typename T1,
size_t N,
bool TF,
typename T2 >
2122 struct MultTrait< StaticVector<T1,N,TF>, T2 >
2124 typedef StaticVector< typename MultTrait<T1,T2>::Type, N, TF > Type;
2128 template<
typename T1,
typename T2,
size_t N,
bool TF >
2129 struct MultTrait< T1, StaticVector<T2,N,TF> >
2131 typedef StaticVector< typename MultTrait<T1,T2>::Type, N, TF > Type;
2135 template<
typename T1,
size_t N,
bool TF,
typename T2 >
2136 struct MultTrait< StaticVector<T1,N,TF>, StaticVector<T2,N,TF> >
2138 typedef StaticVector< typename MultTrait<T1,T2>::Type, N, TF > Type;
2141 template<
typename T1,
size_t M,
typename T2,
size_t N >
2142 struct MultTrait< StaticVector<T1,M,false>, StaticVector<T2,N,true> >
2144 typedef StaticMatrix< typename MultTrait<T1,T2>::Type, M, N,
false > Type;
2147 template<
typename T1,
size_t N,
typename T2 >
2148 struct MultTrait< StaticVector<T1,N,true>, StaticVector<T2,N,false> >
2150 typedef typename MultTrait<T1,T2>::Type Type;
2166 template<
typename T1,
typename T2 >
2167 struct CrossTrait< StaticVector<T1,3UL,false>, StaticVector<T2,3UL,false> >
2170 typedef typename MultTrait<T1,T2>::Type T;
2173 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
2189 template<
typename T1,
size_t N,
bool TF,
typename T2 >
2190 struct DivTrait< StaticVector<T1,N,TF>, T2 >
2192 typedef StaticVector< typename DivTrait<T1,T2>::Type, N, TF > Type;
2209 template<
typename T1,
size_t N,
bool TF,
typename T2 >
2210 struct MathTrait< StaticVector<T1,N,TF>, StaticVector<T2,N,TF> >
2212 typedef StaticVector< typename MathTrait<T1,T2>::HighType, N, TF > HighType;
2213 typedef StaticVector< typename MathTrait<T1,T2>::LowType , N, TF > LowType;