Sierra Toolkit Version of the Day
DataTraitsClass.hpp
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 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends