|
Sierra Toolkit Version of the Day
|
00001 /*------------------------------------------------------------------------*/ 00002 /* Copyright 2010 Sandia Corporation. */ 00003 /* Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive */ 00004 /* license for use of this work by or on behalf of the U.S. Government. */ 00005 /* Export of this program may require a license from the */ 00006 /* United States Government. */ 00007 /*------------------------------------------------------------------------*/ 00008 00009 00010 #include <stk_mesh/base/DataTraits.hpp> 00011 00012 namespace stk { 00013 namespace mesh { 00014 00015 //---------------------------------------------------------------------- 00016 00017 namespace { 00018 00019 template< typename T > 00020 class DataTraitsClassPOD : public DataTraits { 00021 public: 00022 DataTraitsClassPOD( const char * name , std::size_t n ) 00023 : DataTraits( typeid(T) , name , sizeof(T) , 1 ) 00024 { 00025 is_pod = true ; 00026 is_class = true ; 00027 class_info.reserve( n ); 00028 } 00029 00030 void set_stride( const void * first , const void * second ) 00031 { 00032 stride_of = reinterpret_cast<const unsigned char *>(second) - 00033 reinterpret_cast<const unsigned char *>(first); 00034 } 00035 00036 void add_member( const char * n , const DataTraits & t , 00037 const void * base , const void * member ) 00038 { 00039 const std::size_t i = class_info.size(); 00040 const std::size_t d = reinterpret_cast<const unsigned char *>(member) - 00041 reinterpret_cast<const unsigned char *>(base); 00042 class_info.resize( i + 1 ); 00043 class_info[i].name.assign( n ); 00044 class_info[i].traits = & t ; 00045 class_info[i].offset = d ; 00046 if ( alignment_of < t.alignment_of ) { alignment_of = t.alignment_of ; } 00047 } 00048 00049 void construct( void * v , std::size_t n ) const 00050 { 00051 T * x = reinterpret_cast<T*>( v ); 00052 T * const x_end = x + n ; 00053 for ( ; x_end != x ; ++x ) { new(x) T(); } 00054 } 00055 00056 void destroy( void * v , std::size_t n ) const 00057 { 00058 T * x = reinterpret_cast<T*>( v ); 00059 T * const x_end = x + n ; 00060 for ( ; x_end != x ; ++x ) { x->~T(); } 00061 } 00062 00063 void copy( void * vx , const void * vy , std::size_t n ) const 00064 { 00065 const T * y = reinterpret_cast<const T*>( vy ); 00066 T * x = reinterpret_cast<T*>( vx ); 00067 T * const x_end = x + n ; 00068 while ( x_end != x ) { *x++ = *y++ ; }; 00069 } 00070 00071 void pack( CommBuffer & buf , const void * v , std::size_t n ) const 00072 { 00073 const T * x = reinterpret_cast<const T*>( v ); 00074 buf.pack<T>( x , n ); 00075 } 00076 00077 void unpack( CommBuffer & buf , void * v , std::size_t n ) const 00078 { 00079 T * x = reinterpret_cast<T*>( v ); 00080 buf.unpack<T>( x , n ); 00081 } 00082 00083 void print( std::ostream & s , const void * v , std::size_t n ) const 00084 { throw_not_supported( "print" ); } 00085 00086 void sum( void * , const void * , std::size_t ) const 00087 { throw_not_supported( "sum" ); } 00088 00089 void max( void * , const void * , std::size_t ) const 00090 { throw_not_supported( "max" ); } 00091 00092 void min( void * , const void * , std::size_t ) const 00093 { throw_not_supported( "min" ); } 00094 00095 void bit_and( void * , const void * , std::size_t ) const 00096 { throw_not_supported( "bit_and" ); } 00097 00098 void bit_or( void * , const void * , std::size_t ) const 00099 { throw_not_supported( "bit_and" ); } 00100 00101 void bit_xor( void * , const void * , std::size_t ) const 00102 { throw_not_supported( "bit_and" ); } 00103 }; 00104 00105 } 00106 00107 //---------------------------------------------------------------------- 00108 00109 #define DATA_TRAITS_POD_CLASS_2( C , M1 , M2 ) \ 00110 namespace { \ 00111 class DataTraitsClass ## C : public DataTraitsClassPOD<C> { \ 00112 public: \ 00113 DataTraitsClass ## C () : DataTraitsClassPOD<C>( # C , 2 ) \ 00114 { \ 00115 C tmp[1] ; \ 00116 set_stride( tmp , tmp + 1 ); \ 00117 add_member( # M1 , data_traits( tmp->M1 ) , tmp , & tmp->M1 ); \ 00118 add_member( # M2 , data_traits( tmp->M2 ) , tmp , & tmp->M2 ); \ 00119 } \ 00120 }; \ 00121 } \ 00122 template<> const DataTraits & data_traits< C >() \ 00123 { static const DataTraitsClass ## C traits ; return traits ; } 00124 00125 //---------------------------------------------------------------------- 00126 00127 #define DATA_TRAITS_POD_CLASS_3( C , M1 , M2 , M3 ) \ 00128 namespace { \ 00129 class DataTraitsClass ## C : public DataTraitsClassPOD<C> { \ 00130 public: \ 00131 DataTraitsClass ## C () : DataTraitsClassPOD<C>( # C , 3 ) \ 00132 { \ 00133 C tmp[1] ; \ 00134 set_stride( tmp , tmp + 1 ); \ 00135 add_member( # M1 , data_traits( tmp->M1 ) , tmp , & tmp->M1 ); \ 00136 add_member( # M2 , data_traits( tmp->M2 ) , tmp , & tmp->M2 ); \ 00137 add_member( # M3 , data_traits( tmp->M3 ) , tmp , & tmp->M3 ); \ 00138 } \ 00139 }; \ 00140 } \ 00141 template<> const DataTraits & data_traits< C >() \ 00142 { static const DataTraitsClass ## C traits ; return traits ; } 00143 00144 //---------------------------------------------------------------------- 00145 00146 #define DATA_TRAITS_POD_CLASS_4( C , M1 , M2 , M3 , M4 ) \ 00147 namespace { \ 00148 class DataTraitsClass ## C : public DataTraitsClassPOD<C> { \ 00149 public: \ 00150 DataTraitsClass ## C () : DataTraitsClassPOD<C>( # C , 4 ) \ 00151 { \ 00152 C tmp[1] ; \ 00153 set_stride( tmp , tmp + 1 ); \ 00154 add_member( # M1 , data_traits( tmp->M1 ) , tmp , & tmp->M1 ); \ 00155 add_member( # M2 , data_traits( tmp->M2 ) , tmp , & tmp->M2 ); \ 00156 add_member( # M3 , data_traits( tmp->M3 ) , tmp , & tmp->M3 ); \ 00157 add_member( # M4 , data_traits( tmp->M4 ) , tmp , & tmp->M4 ); \ 00158 } \ 00159 }; \ 00160 } \ 00161 template<> const DataTraits & data_traits< C >() \ 00162 { static const DataTraitsClass ## C traits ; return traits ; } 00163 00164 //---------------------------------------------------------------------- 00165 00166 #define DATA_TRAITS_POD_CLASS_5( C , M1 , M2 , M3 , M4 , M5 ) \ 00167 namespace { \ 00168 class DataTraitsClass ## C : public DataTraitsClassPOD<C> { \ 00169 public: \ 00170 DataTraitsClass ## C () : DataTraitsClassPOD<C>( # C , 5 ) \ 00171 { \ 00172 C tmp[1] ; \ 00173 set_stride( tmp , tmp + 1 ); \ 00174 add_member( # M1 , data_traits( tmp->M1 ) , tmp , & tmp->M1 ); \ 00175 add_member( # M2 , data_traits( tmp->M2 ) , tmp , & tmp->M2 ); \ 00176 add_member( # M3 , data_traits( tmp->M3 ) , tmp , & tmp->M3 ); \ 00177 add_member( # M4 , data_traits( tmp->M4 ) , tmp , & tmp->M4 ); \ 00178 add_member( # M5 , data_traits( tmp->M5 ) , tmp , & tmp->M5 ); \ 00179 } \ 00180 }; \ 00181 } \ 00182 template<> const DataTraits & data_traits< C >() \ 00183 { static const DataTraitsClass ## C traits ; return traits ; } 00184 00185 //---------------------------------------------------------------------- 00186 00187 #define DATA_TRAITS_POD_CLASS_6( C , M1 , M2 , M3 , M4 , M5 , M6 ) \ 00188 namespace { \ 00189 class DataTraitsClass ## C : public DataTraitsClassPOD<C> { \ 00190 public: \ 00191 DataTraitsClass ## C () : DataTraitsClassPOD<C>( # C , 5 ) \ 00192 { \ 00193 C tmp[1] ; \ 00194 set_stride( tmp , tmp + 1 ); \ 00195 add_member( # M1 , data_traits( tmp->M1 ) , tmp , & tmp->M1 ); \ 00196 add_member( # M2 , data_traits( tmp->M2 ) , tmp , & tmp->M2 ); \ 00197 add_member( # M3 , data_traits( tmp->M3 ) , tmp , & tmp->M3 ); \ 00198 add_member( # M4 , data_traits( tmp->M4 ) , tmp , & tmp->M4 ); \ 00199 add_member( # M5 , data_traits( tmp->M5 ) , tmp , & tmp->M5 ); \ 00200 add_member( # M6 , data_traits( tmp->M6 ) , tmp , & tmp->M6 ); \ 00201 } \ 00202 }; \ 00203 } \ 00204 template<> const DataTraits & data_traits< C >() \ 00205 { static const DataTraitsClass ## C traits ; return traits ; } 00206 00207 //---------------------------------------------------------------------- 00208 00209 } 00210 } 00211