Sierra Toolkit  Version of the Day
DataTraitsClass.hpp
1 /*------------------------------------------------------------------------*/
2 /* Copyright 2010 Sandia Corporation. */
3 /* Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive */
4 /* license for use of this work by or on behalf of the U.S. Government. */
5 /* Export of this program may require a license from the */
6 /* United States Government. */
7 /*------------------------------------------------------------------------*/
8 
9 #include <stk_mesh/base/DataTraits.hpp>
10 
11 #include <stk_util/environment/ReportHandler.hpp>
12 
13 namespace stk_classic {
14 namespace mesh {
15 
16 //----------------------------------------------------------------------
17 
18 namespace {
19 
20 template< typename T >
21 class DataTraitsClassPOD : public DataTraits {
22 public:
23  DataTraitsClassPOD( const char * name , std::size_t n )
24  : DataTraits( typeid(T) , name , sizeof(T) , 1 )
25  {
26  is_pod = true ;
27  is_class = true ;
28  class_info.reserve( n );
29  }
30 
31  void set_stride( const void * first , const void * second )
32  {
33  stride_of = reinterpret_cast<const unsigned char *>(second) -
34  reinterpret_cast<const unsigned char *>(first);
35  }
36 
37  void add_member( const char * n , const DataTraits & t ,
38  const void * base , const void * member )
39  {
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 ; }
48  }
49 
50  void construct( void * v , std::size_t n ) const
51  {
52  T * x = reinterpret_cast<T*>( v );
53  T * const x_end = x + n ;
54  for ( ; x_end != x ; ++x ) { new(x) T(); }
55  }
56 
57  void destroy( void * v , std::size_t n ) const
58  {
59  T * x = reinterpret_cast<T*>( v );
60  T * const x_end = x + n ;
61  for ( ; x_end != x ; ++x ) { x->~T(); }
62  }
63 
64  void copy( void * vx , const void * vy , std::size_t n ) const
65  {
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++ ; };
70  }
71 
72  void pack( CommBuffer & buf , const void * v , std::size_t n ) const
73  {
74  const T * x = reinterpret_cast<const T*>( v );
75  buf.pack<T>( x , n );
76  }
77 
78  void unpack( CommBuffer & buf , void * v , std::size_t n ) const
79  {
80  T * x = reinterpret_cast<T*>( v );
81  buf.unpack<T>( x , n );
82  }
83 
84  void print( std::ostream & s , const void * v , std::size_t n ) const
85  { ThrowErrorMsg( "not supported" ); }
86 
87  void sum( void * , const void * , std::size_t ) const
88  { ThrowErrorMsg( "not supported" ); }
89 
90  void max( void * , const void * , std::size_t ) const
91  { ThrowErrorMsg( "not supported" ); }
92 
93  void min( void * , const void * , std::size_t ) const
94  { ThrowErrorMsg( "not supported" ); }
95 
96  void bit_and( void * , const void * , std::size_t ) const
97  { ThrowErrorMsg( "not supported" ); }
98 
99  void bit_or( void * , const void * , std::size_t ) const
100  { ThrowErrorMsg( "not supported" ); }
101 
102  void bit_xor( void * , const void * , std::size_t ) const
103  { ThrowErrorMsg( "not supported" ); }
104 };
105 
106 }
107 
108 //----------------------------------------------------------------------
109 
110 #define DATA_TRAITS_POD_CLASS_2( C , M1 , M2 ) \
111 namespace { \
112 class DataTraitsClass ## C : public DataTraitsClassPOD<C> { \
113 public: \
114  DataTraitsClass ## C () : DataTraitsClassPOD<C>( # C , 2 ) \
115  { \
116  C tmp[1] ; \
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 ); \
120  } \
121 }; \
122 } \
123 template<> const DataTraits & data_traits< C >() \
124 { static const DataTraitsClass ## C traits ; return traits ; }
125 
126 //----------------------------------------------------------------------
127 
128 #define DATA_TRAITS_POD_CLASS_3( C , M1 , M2 , M3 ) \
129 namespace { \
130 class DataTraitsClass ## C : public DataTraitsClassPOD<C> { \
131 public: \
132  DataTraitsClass ## C () : DataTraitsClassPOD<C>( # C , 3 ) \
133  { \
134  C tmp[1] ; \
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 ); \
139  } \
140 }; \
141 } \
142 template<> const DataTraits & data_traits< C >() \
143 { static const DataTraitsClass ## C traits ; return traits ; }
144 
145 //----------------------------------------------------------------------
146 
147 #define DATA_TRAITS_POD_CLASS_4( C , M1 , M2 , M3 , M4 ) \
148 namespace { \
149 class DataTraitsClass ## C : public DataTraitsClassPOD<C> { \
150 public: \
151  DataTraitsClass ## C () : DataTraitsClassPOD<C>( # C , 4 ) \
152  { \
153  C tmp[1] ; \
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 ); \
159  } \
160 }; \
161 } \
162 template<> const DataTraits & data_traits< C >() \
163 { static const DataTraitsClass ## C traits ; return traits ; }
164 
165 //----------------------------------------------------------------------
166 
167 #define DATA_TRAITS_POD_CLASS_5( C , M1 , M2 , M3 , M4 , M5 ) \
168 namespace { \
169 class DataTraitsClass ## C : public DataTraitsClassPOD<C> { \
170 public: \
171  DataTraitsClass ## C () : DataTraitsClassPOD<C>( # C , 5 ) \
172  { \
173  C tmp[1] ; \
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 ); \
180  } \
181 }; \
182 } \
183 template<> const DataTraits & data_traits< C >() \
184 { static const DataTraitsClass ## C traits ; return traits ; }
185 
186 //----------------------------------------------------------------------
187 
188 #define DATA_TRAITS_POD_CLASS_6( C , M1 , M2 , M3 , M4 , M5 , M6 ) \
189 namespace { \
190 class DataTraitsClass ## C : public DataTraitsClassPOD<C> { \
191 public: \
192  DataTraitsClass ## C () : DataTraitsClassPOD<C>( # C , 5 ) \
193  { \
194  C tmp[1] ; \
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 ); \
202  } \
203 }; \
204 } \
205 template<> const DataTraits & data_traits< C >() \
206 { static const DataTraitsClass ## C traits ; return traits ; }
207 
208 //----------------------------------------------------------------------
209 
210 }
211 }
212 
std::ostream & print(std::ostream &os, const std::string &indent, const Bucket &bucket)
Print the parts and entities of this bucket.
Definition: Bucket.cpp:259
OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result)
Sierra Toolkit.