Sierra Toolkit Version of the Day
DataTraits.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 #ifndef STK_MESH_DATA_TRAITS_HPP
00011 #define STK_MESH_DATA_TRAITS_HPP
00012 
00013 #include <cstddef>
00014 #include <iosfwd>
00015 #include <typeinfo>
00016 #include <vector>
00017 #include <string>
00018 #include <complex>
00019 
00020 #include <stk_util/parallel/ParallelComm.hpp>
00021 
00022 namespace stk {
00023 namespace mesh {
00024 
00025 class DataTraits ;
00026 
00027 //----------------------------------------------------------------------
00029 template< typename T > const DataTraits & data_traits();
00030  
00032 template< typename T >
00033 inline
00034 const DataTraits & data_traits( const T & ) { return data_traits<T>(); }
00035 
00036 //----------------------------------------------------------------------
00037 // Data traits for the fundamental computational data types:
00038 
00039 template<> const DataTraits & data_traits< void >();
00040 template<> const DataTraits & data_traits< signed   char >();
00041 template<> const DataTraits & data_traits< unsigned char >();
00042 template<> const DataTraits & data_traits< signed   short >();
00043 template<> const DataTraits & data_traits< unsigned short >();
00044 template<> const DataTraits & data_traits< signed   int >();
00045 template<> const DataTraits & data_traits< unsigned int >();
00046 template<> const DataTraits & data_traits< signed   long >();
00047 template<> const DataTraits & data_traits< unsigned long >();
00048 template<> const DataTraits & data_traits< float >();
00049 template<> const DataTraits & data_traits< double >();
00050 template<> const DataTraits & data_traits< std::complex<float> >();
00051 template<> const DataTraits & data_traits< std::complex<double> >();
00052 
00053 template<> const DataTraits & data_traits< signed   char * >();
00054 template<> const DataTraits & data_traits< unsigned char * >();
00055 template<> const DataTraits & data_traits< signed   short * >();
00056 template<> const DataTraits & data_traits< unsigned short * >();
00057 template<> const DataTraits & data_traits< signed   int * >();
00058 template<> const DataTraits & data_traits< unsigned int * >();
00059 template<> const DataTraits & data_traits< signed   long * >();
00060 template<> const DataTraits & data_traits< unsigned long * >();
00061 template<> const DataTraits & data_traits< float * >();
00062 template<> const DataTraits & data_traits< double * >();
00063 template<> const DataTraits & data_traits< std::complex<float> * >();
00064 template<> const DataTraits & data_traits< std::complex<double> * >();
00065 
00066 //----------------------------------------------------------------------
00067 
00068 class DataTraits {
00069 public:
00070   //------------------------------
00071   // Standard properties:
00072   const std::type_info & type_info ;
00073   std::size_t            size_of ;
00074  
00075   //------------------------------
00076   // TR1 primary type categories:
00077   bool         is_void ;
00078   bool         is_integral ;
00079   bool         is_floating_point ;
00080   bool         is_array ;
00081   bool         is_pointer ;
00082   bool         is_enum ;
00083   bool         is_class ;
00084 
00085   // TR1 type properties:
00086   bool         is_pod ;
00087   bool         is_signed ;     // only if 'is_integral'
00088   bool         is_unsigned ;   // only if 'is_integral'
00089   std::size_t  alignment_of ;
00090 
00091   // For memory management contiguous arrays of data:
00092   // Array must start aligned with 'alignment_of' and
00093   // stride by 'stride_of'.
00094   std::size_t  stride_of ;
00095 
00096   // TR1 type manipulators:
00097   const DataTraits * remove_pointer ; // if 'is_pointer'
00098  
00099   //------------------------------
00101   std::string  name ;
00102  
00103   //------------------------------
00104   // Only If 'is_enum'
00105   struct EnumMember {
00106     std::string  name ;
00107     long         value ;
00108   };
00109   std::vector< EnumMember > enum_info ;
00110  
00111   //------------------------------
00112   // Only If 'is_class':
00113   struct ClassMember {
00114     std::string        name ;
00115     const DataTraits * traits ;
00116     std::size_t        offset ;
00117   };
00118   std::vector< ClassMember > class_info ;
00119  
00120   //------------------------------
00121   // Functions required for all field data:
00122 
00123   virtual void construct( void * , std::size_t ) const  = 0 ;
00124   virtual void destroy(   void * , std::size_t ) const  = 0 ;
00125   virtual void copy( void * , const void * , std::size_t ) const  = 0 ;
00126   virtual void pack(   CommBuffer & , const void * , std::size_t ) const  = 0 ;
00127   virtual void unpack( CommBuffer & ,       void * , std::size_t ) const  = 0 ;
00128   virtual void print( std::ostream & , const void * , std::size_t ) const  = 0 ;
00129 
00130   //------------------------------
00131   // Commutative and associative ops
00132   // required for is_integral and is_floating_point data.
00133   // In-place reduction: x[0..(n-1)] op= y[0..(n-1)]
00134   virtual void sum( void * x , const void * y , std::size_t n ) const = 0 ;
00135   virtual void max( void * x , const void * y , std::size_t n ) const = 0 ;
00136   virtual void min( void * x , const void * y , std::size_t n ) const = 0 ;
00137 
00138   // Commutative and associative ops
00139   // required for is_integral data.
00140   // In-place reduction: x[0..(n-1)] op= y[0..(n-1)]
00141   virtual void bit_and( void * x , const void * y, std::size_t n ) const = 0 ;
00142   virtual void bit_or(  void * x , const void * y, std::size_t n ) const = 0 ;
00143   virtual void bit_xor( void * x , const void * y, std::size_t n ) const = 0 ;
00144 
00145   //------------------------------
00146 
00147 protected:
00148 
00149   //------------------------------
00151   DataTraits( const std::type_info & arg_type ,
00152               const char * const     arg_name ,
00153               const std::size_t      arg_size ,
00154               const std::size_t      arg_align );
00155  
00157   DataTraits( const std::type_info & arg_type , const DataTraits & );
00158 
00159   void throw_not_supported( const char * method ) const ;
00160 
00161   virtual ~DataTraits();
00162 private:
00163   DataTraits();
00164   DataTraits( const DataTraits & );
00165   DataTraits & operator = ( const DataTraits & );
00166 };
00167 
00168 } // namespace mesh
00169 } // namespace stk
00170 
00171 #endif
00172 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends