32 #include <boost/static_assert.hpp>
34 #include "../WAssert.h"
35 #include "WCompileTimeFunctions.h"
47 template< std::
size_t order, std::
size_t dim,
typename Data_T >
64 template< std::
size_t order, std::
size_t dim >
65 inline void positionIterateOneStep( std::vector< std::size_t >& pos )
67 WAssert( pos.size() >= order,
"" );
69 for( std::size_t k = order - 1; k > 0; --k )
71 if( pos[ k ] == dim - 1)
99 template< std::
size_t order, std::
size_t dim >
100 inline void positionIterateSortedOneStep( std::vector< std::size_t >& pos )
102 WAssert( pos.size() >= order,
"" );
104 for(
int k = order - 1; k > -1; --k )
106 if( pos[ k ] != dim - 1 )
109 for( std::size_t i = k + 1; i < order; ++i )
125 inline void positionIterateSortedOneStep( std::size_t order, std::size_t dim, std::vector< std::size_t >& pos )
127 WAssert( pos.size() >= order,
"" );
129 for(
int k = order - 1; k > -1; --k )
131 if( pos[ k ] != dim - 1 )
134 for( std::size_t i = k + 1; i < order; ++i )
158 template< std::
size_t order, std::
size_t dim,
typename Data_T >
167 friend class WTensorBase< order + 1, dim, Data_T >;
170 friend class ::WTensorBaseTest;
173 friend class ::WTensorFuncTest;
236 template<
typename Index_T >
237 Data_T&
operator[] ( std::vector< Index_T >
const& indices );
246 template<
typename Index_T >
247 Data_T
const&
operator[] ( std::vector< Index_T >
const& indices )
const;
258 template<
typename Index_T >
270 template<
typename Index_T >
271 Data_T
const&
operator[] ( Index_T indices[] )
const;
300 template<
typename Index_T >
301 static inline std::size_t
getPos( Index_T pos[] );
320 template< std::
size_t order, std::
size_t dim,
typename Data_T >
326 template< std::
size_t order, std::
size_t dim,
typename Data_T >
332 template< std::
size_t order, std::
size_t dim,
typename Data_T >
339 template< std::
size_t order, std::
size_t dim,
typename Data_T >
346 template< std::
size_t order, std::
size_t dim,
typename Data_T >
349 std::vector< std::size_t > pos( order, 0 );
351 for( std::size_t k = 0; k <
dataSize; ++k )
353 ( *this )[ pos ] = t[ pos ];
354 positionIterateOneStep< order, dim >( pos );
360 template< std::
size_t order, std::
size_t dim,
typename Data_T >
366 template< std::
size_t order, std::
size_t dim,
typename Data_T >
372 template< std::
size_t order, std::
size_t dim,
typename Data_T >
373 template<
typename Index_T >
379 template< std::
size_t order, std::
size_t dim,
typename Data_T >
380 template<
typename Index_T >
383 return const_cast< Data_T&
>(
static_cast< WTensorBase const&
>( *this ).operator[] ( indices ) );
386 template< std::
size_t order, std::
size_t dim,
typename Data_T >
387 template<
typename Index_T >
390 WAssert( indices.size() >= order,
"" );
394 template< std::
size_t order, std::
size_t dim,
typename Data_T >
395 template<
typename Index_T >
398 return const_cast< Data_T&
>(
static_cast< WTensorBase const&
>( *this ).operator[] ( indices ) );
401 template< std::
size_t order, std::
size_t dim,
typename Data_T >
402 template<
typename Index_T >
405 for( std::size_t k = 0; k < order; ++k )
407 WAssert( static_cast< std::size_t >( indices[ k ] ) < dim,
"" );
409 std::size_t p =
getPos( indices );
413 template< std::
size_t order, std::
size_t dim,
typename Data_T >
419 template< std::
size_t order, std::
size_t dim,
typename Data_T >
435 template< std::
size_t dim,
typename Data_T >
442 friend class ::WTensorBaseTest;
445 friend class ::WTensorFuncTest;
477 m_data = t.operator[]< std::size_t >( NULL );
502 m_data = t.operator[]< std::size_t >( NULL );
531 template<
typename Index_T >
542 template<
typename Index_T >
543 Data_T
const&
operator[] ( std::vector< Index_T >
const& )
const
553 template<
typename Index_T >
564 template<
typename Index_T >
601 template<
typename Index_T >
602 static inline std::size_t
getPos( Index_T[] )
640 template< std::
size_t order, std::
size_t dim,
typename Data_T >
649 friend class ::WTensorBaseSymTest;
652 friend class ::WTensorFuncTest;
707 template<
typename Index_T >
708 Data_T&
operator[] ( std::vector< Index_T >
const& indices );
717 template<
typename Index_T >
718 Data_T
const&
operator[] ( std::vector< Index_T >
const& indices )
const;
729 template<
typename Index_T >
741 template<
typename Index_T >
742 Data_T
const&
operator[] ( Index_T indices[] )
const;
799 template<
typename Index_T >
800 inline std::size_t
operator[] ( Index_T pos[] )
const;
827 template< std::
size_t order, std::
size_t dim,
typename Data_T >
832 template< std::
size_t order, std::
size_t dim,
typename Data_T >
836 std::map< std::vector< std::size_t >, std::size_t > m;
840 std::vector< std::size_t > pos( order, 0 );
841 for( std::size_t k = 0; k <
dataSize; ++k )
847 positionIterateSortedOneStep< order, dim >( pos );
851 pos = std::vector< std::size_t >( order, 0 );
852 std::vector< std::size_t > _p( order, 0 );
853 for( std::size_t k = 0; k < WPower< dim, order >::value; ++k )
858 std::sort( _p.begin(), _p.end() );
865 WAssert( m.size() ==
dataSize,
"" );
868 positionIterateOneStep< order, dim >( pos );
872 template< std::
size_t order, std::
size_t dim,
typename Data_T >
873 template<
typename Index_T >
876 return m_positions[ pos ];
881 template< std::
size_t order, std::
size_t dim,
typename Data_T >
887 template< std::
size_t order, std::
size_t dim,
typename Data_T >
889 : m_data( &data[0], &data[0] + data.size() )
891 WAssert(
dataSize ==
m_data.size(),
"Number of given components does not match the order and dimension of this symmetric tensor" );
894 template< std::
size_t order, std::
size_t dim,
typename Data_T >
900 template< std::
size_t order, std::
size_t dim,
typename Data_T >
907 template< std::
size_t order, std::
size_t dim,
typename Data_T >
913 template< std::
size_t order, std::
size_t dim,
typename Data_T >
919 template< std::
size_t order, std::
size_t dim,
typename Data_T >
920 template<
typename Index_T >
923 return const_cast< Data_T&
>(
static_cast< WTensorBaseSym const&
>( *this ).operator[] ( indices ) );
926 template< std::
size_t order, std::
size_t dim,
typename Data_T >
927 template<
typename Index_T >
930 WAssert( indices.size() >= order,
"" );
931 return operator[] ( &indices[ 0 ] );
934 template< std::
size_t order, std::
size_t dim,
typename Data_T >
935 template<
typename Index_T >
938 return const_cast< Data_T&
>(
static_cast< WTensorBaseSym const&
>( *this ).operator[] ( indices ) );
941 template< std::
size_t order, std::
size_t dim,
typename Data_T >
942 template<
typename Index_T >
945 std::size_t p = m_indexer[ indices ];
946 WAssert( p < m_data.size(),
"" );
950 template< std::
size_t order, std::
size_t dim,
typename Data_T >
953 return m_data == other.
m_data;
956 template< std::
size_t order, std::
size_t dim,
typename Data_T >
959 return m_data != other.
m_data;
972 template< std::
size_t dim,
typename Data_T >
975 friend class ::WTensorBaseSymTest;
976 friend class ::WTensorFuncTest;
1038 template<
typename Index_T >
1049 template<
typename Index_T >
1060 template<
typename Index_T >
1071 template<
typename Index_T >
1131 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t order, std::size_t dim,
typename Data_T >
1144 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1145 class WTensorFunc< TensorBase_T, 6, dim, Data_T > :
public TensorBase_T< 6, dim, Data_T >
1160 Data_T& operator() ( std::size_t i0, std::size_t i1, std::size_t i2, std::size_t i3, std::size_t i4, std::size_t i5 );
1174 Data_T
const& operator() ( std::size_t i0, std::size_t i1, std::size_t i2, std::size_t i3, std::size_t i4, std::size_t i5 )
const;
1177 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1179 std::size_t i3, std::size_t i4, std::size_t i5 )
1181 return const_cast< Data_T&
>(
static_cast< WTensorFunc const&
>( *this ).operator() ( i0, i1, i2, i3, i4, i5 ) );
1184 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1186 std::size_t i3, std::size_t i4, std::size_t i5 )
const
1188 std::size_t p[] = { i0, i1, i2, i3, i4, i5 };
1203 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1204 class WTensorFunc< TensorBase_T, 5, dim, Data_T > :
public TensorBase_T< 5, dim, Data_T >
1218 Data_T& operator() ( std::size_t i0, std::size_t i1, std::size_t i2, std::size_t i3, std::size_t i4 );
1231 Data_T
const& operator() ( std::size_t i0, std::size_t i1, std::size_t i2, std::size_t i3, std::size_t i4 )
const;
1234 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1236 std::size_t i3, std::size_t i4 )
1238 return const_cast< Data_T&
>(
static_cast< WTensorFunc const&
>( *this ).operator() ( i0, i1, i2, i3, i4 ) );
1241 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1243 std::size_t i3, std::size_t i4 )
const
1245 std::size_t p[] = { i0, i1, i2, i3, i4 };
1260 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1261 class WTensorFunc< TensorBase_T, 4, dim, Data_T > :
public TensorBase_T< 4, dim, Data_T >
1274 Data_T& operator() ( std::size_t i0, std::size_t i1, std::size_t i2, std::size_t i3 );
1286 Data_T
const& operator() ( std::size_t i0, std::size_t i1, std::size_t i2, std::size_t i3 )
const;
1289 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1292 return const_cast< Data_T&
>(
static_cast< WTensorFunc const&
>( *this ).operator() ( i0, i1, i2, i3 ) );
1295 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1298 std::size_t p[] = { i0, i1, i2, i3 };
1312 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1313 class WTensorFunc< TensorBase_T, 3, dim, Data_T > :
public TensorBase_T< 3, dim, Data_T >
1325 Data_T& operator() ( std::size_t i0, std::size_t i1, std::size_t i2 );
1336 Data_T
const& operator() ( std::size_t i0, std::size_t i1, std::size_t i2 )
const;
1339 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1342 return const_cast< Data_T&
>(
static_cast< WTensorFunc const&
>( *this ).operator() ( i0, i1, i2 ) );
1345 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1348 std::size_t p[] = { i0, i1, i2 };
1360 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1361 class WTensorFunc< TensorBase_T, 2, dim, Data_T > :
public TensorBase_T< 2, dim, Data_T >
1384 Data_T& operator() ( std::size_t i0, std::size_t i1 );
1394 Data_T
const& operator() ( std::size_t i0, std::size_t i1 )
const;
1402 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1404 : TensorBase_T< 2, dim, Data_T >()
1408 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1410 : TensorBase_T< 2, dim, Data_T >( data )
1414 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1417 return const_cast< Data_T&
>(
static_cast< WTensorFunc const&
>( *this ).operator() ( i0, i1 ) );
1420 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1423 std::size_t p[] = { i0, i1 };
1427 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1431 for( std::size_t i = 0; i < dim; ++i )
1433 for( std::size_t j = 0; j < dim; ++j )
1435 m( i, j ) = this->operator() ( i, j );
1449 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1450 class WTensorFunc< TensorBase_T, 1, dim, Data_T > :
public TensorBase_T< 1, dim, Data_T >
1460 Data_T& operator() ( std::size_t i0 );
1469 Data_T
const& operator() ( std::size_t i0 )
const;
1477 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1480 return const_cast< Data_T&
>(
static_cast< WTensorFunc const&
>( *this ).operator() ( i0 ) );
1483 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1486 std::size_t p[] = { i0 };
1490 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1495 for( std::size_t k = 0; k < dim; ++k )
1497 v[ k ] = this->operator() ( k );
1511 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1512 class WTensorFunc< TensorBase_T, 0, dim, Data_T > :
public TensorBase_T< 0, dim, Data_T >
1520 Data_T& operator() ();
1527 Data_T
const& operator() ()
const;
1532 operator Data_T()
const;
1535 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1538 return const_cast< Data_T&
>(
static_cast< WTensorFunc const&
>( *this ).operator() () );
1541 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1551 template<
template< std::
size_t, std::
size_t,
typename >
class TensorBase_T, std::size_t dim,
typename Data_T >
1561 #endif // WTENSORBASE_H