|
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 #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