9 #include <stk_mesh/base/DataTraits.hpp>
11 #include <stk_util/environment/ReportHandler.hpp>
13 namespace stk_classic {
20 template<
typename T >
21 class DataTraitsClassPOD :
public DataTraits {
23 DataTraitsClassPOD(
const char * name , std::size_t n )
24 : DataTraits( typeid(T) , name , sizeof(T) , 1 )
28 class_info.reserve( n );
31 void set_stride(
const void * first ,
const void * second )
33 stride_of =
reinterpret_cast<const unsigned char *
>(second) -
34 reinterpret_cast<const unsigned char *>(first);
37 void add_member(
const char * n ,
const DataTraits & t ,
38 const void * base ,
const void * member )
40 const std::size_t i = class_info.size();
41 const std::size_t d =
reinterpret_cast<const unsigned char *
>(member) -
42 reinterpret_cast<const unsigned char *>(base);
43 class_info.resize( i + 1 );
44 class_info[i].name.assign( n );
45 class_info[i].traits = & t ;
46 class_info[i].offset = d ;
47 if ( alignment_of < t.alignment_of ) { alignment_of = t.alignment_of ; }
50 void construct(
void * v , std::size_t n )
const
52 T * x =
reinterpret_cast<T*
>( v );
53 T *
const x_end = x + n ;
54 for ( ; x_end != x ; ++x ) {
new(x) T(); }
57 void destroy(
void * v , std::size_t n )
const
59 T * x =
reinterpret_cast<T*
>( v );
60 T *
const x_end = x + n ;
61 for ( ; x_end != x ; ++x ) { x->~T(); }
64 void copy(
void * vx ,
const void * vy , std::size_t n )
const
66 const T * y =
reinterpret_cast<const T*
>( vy );
67 T * x =
reinterpret_cast<T*
>( vx );
68 T *
const x_end = x + n ;
69 while ( x_end != x ) { *x++ = *y++ ; };
72 void pack( CommBuffer & buf ,
const void * v , std::size_t n )
const
74 const T * x =
reinterpret_cast<const T*
>( v );
78 void unpack( CommBuffer & buf ,
void * v , std::size_t n )
const
80 T * x =
reinterpret_cast<T*
>( v );
81 buf.unpack<T>( x , n );
84 void print( std::ostream & s ,
const void * v , std::size_t n )
const
85 { ThrowErrorMsg(
"not supported" ); }
87 void sum(
void * ,
const void * , std::size_t )
const
88 { ThrowErrorMsg(
"not supported" ); }
90 void max(
void * ,
const void * , std::size_t )
const
91 { ThrowErrorMsg(
"not supported" ); }
93 void min(
void * ,
const void * , std::size_t )
const
94 { ThrowErrorMsg(
"not supported" ); }
96 void bit_and(
void * ,
const void * , std::size_t )
const
97 { ThrowErrorMsg(
"not supported" ); }
99 void bit_or(
void * ,
const void * , std::size_t )
const
100 { ThrowErrorMsg(
"not supported" ); }
102 void bit_xor(
void * ,
const void * , std::size_t )
const
103 { ThrowErrorMsg(
"not supported" ); }
110 #define DATA_TRAITS_POD_CLASS_2( C , M1 , M2 ) \
112 class DataTraitsClass ## C : public DataTraitsClassPOD<C> { \
114 DataTraitsClass ## C () : DataTraitsClassPOD<C>( # C , 2 ) \
117 set_stride( tmp , tmp + 1 ); \
118 add_member( # M1 , data_traits( tmp->M1 ) , tmp , & tmp->M1 ); \
119 add_member( # M2 , data_traits( tmp->M2 ) , tmp , & tmp->M2 ); \
123 template<> const DataTraits & data_traits< C >() \
124 { static const DataTraitsClass ## C traits ; return traits ; }
128 #define DATA_TRAITS_POD_CLASS_3( C , M1 , M2 , M3 ) \
130 class DataTraitsClass ## C : public DataTraitsClassPOD<C> { \
132 DataTraitsClass ## C () : DataTraitsClassPOD<C>( # C , 3 ) \
135 set_stride( tmp , tmp + 1 ); \
136 add_member( # M1 , data_traits( tmp->M1 ) , tmp , & tmp->M1 ); \
137 add_member( # M2 , data_traits( tmp->M2 ) , tmp , & tmp->M2 ); \
138 add_member( # M3 , data_traits( tmp->M3 ) , tmp , & tmp->M3 ); \
142 template<> const DataTraits & data_traits< C >() \
143 { static const DataTraitsClass ## C traits ; return traits ; }
147 #define DATA_TRAITS_POD_CLASS_4( C , M1 , M2 , M3 , M4 ) \
149 class DataTraitsClass ## C : public DataTraitsClassPOD<C> { \
151 DataTraitsClass ## C () : DataTraitsClassPOD<C>( # C , 4 ) \
154 set_stride( tmp , tmp + 1 ); \
155 add_member( # M1 , data_traits( tmp->M1 ) , tmp , & tmp->M1 ); \
156 add_member( # M2 , data_traits( tmp->M2 ) , tmp , & tmp->M2 ); \
157 add_member( # M3 , data_traits( tmp->M3 ) , tmp , & tmp->M3 ); \
158 add_member( # M4 , data_traits( tmp->M4 ) , tmp , & tmp->M4 ); \
162 template<> const DataTraits & data_traits< C >() \
163 { static const DataTraitsClass ## C traits ; return traits ; }
167 #define DATA_TRAITS_POD_CLASS_5( C , M1 , M2 , M3 , M4 , M5 ) \
169 class DataTraitsClass ## C : public DataTraitsClassPOD<C> { \
171 DataTraitsClass ## C () : DataTraitsClassPOD<C>( # C , 5 ) \
174 set_stride( tmp , tmp + 1 ); \
175 add_member( # M1 , data_traits( tmp->M1 ) , tmp , & tmp->M1 ); \
176 add_member( # M2 , data_traits( tmp->M2 ) , tmp , & tmp->M2 ); \
177 add_member( # M3 , data_traits( tmp->M3 ) , tmp , & tmp->M3 ); \
178 add_member( # M4 , data_traits( tmp->M4 ) , tmp , & tmp->M4 ); \
179 add_member( # M5 , data_traits( tmp->M5 ) , tmp , & tmp->M5 ); \
183 template<> const DataTraits & data_traits< C >() \
184 { static const DataTraitsClass ## C traits ; return traits ; }
188 #define DATA_TRAITS_POD_CLASS_6( C , M1 , M2 , M3 , M4 , M5 , M6 ) \
190 class DataTraitsClass ## C : public DataTraitsClassPOD<C> { \
192 DataTraitsClass ## C () : DataTraitsClassPOD<C>( # C , 5 ) \
195 set_stride( tmp , tmp + 1 ); \
196 add_member( # M1 , data_traits( tmp->M1 ) , tmp , & tmp->M1 ); \
197 add_member( # M2 , data_traits( tmp->M2 ) , tmp , & tmp->M2 ); \
198 add_member( # M3 , data_traits( tmp->M3 ) , tmp , & tmp->M3 ); \
199 add_member( # M4 , data_traits( tmp->M4 ) , tmp , & tmp->M4 ); \
200 add_member( # M5 , data_traits( tmp->M5 ) , tmp , & tmp->M5 ); \
201 add_member( # M6 , data_traits( tmp->M6 ) , tmp , & tmp->M6 ); \
205 template<> const DataTraits & data_traits< C >() \
206 { static const DataTraitsClass ## C traits ; return traits ; }
std::ostream & print(std::ostream &os, const std::string &indent, const Bucket &bucket)
Print the parts and entities of this bucket.
OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result)