Sierra Toolkit  Version of the Day
DataTraits.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 
10 #ifndef STK_MESH_DATA_TRAITS_HPP
11 #define STK_MESH_DATA_TRAITS_HPP
12 
13 #include <cstddef>
14 #include <iosfwd>
15 #include <typeinfo>
16 #include <vector>
17 #include <string>
18 #include <complex>
19 
20 #include <stk_util/parallel/ParallelComm.hpp>
21 
22 namespace stk_classic {
23 namespace mesh {
24 
25 class DataTraits ;
26 
27 //----------------------------------------------------------------------
29 template< typename T > const DataTraits & data_traits();
30 
32 template< typename T >
33 inline
34 const DataTraits & data_traits( const T & ) { return data_traits<T>(); }
35 
36 //----------------------------------------------------------------------
37 // Data traits for the fundamental computational data types:
38 
39 template<> const DataTraits & data_traits< void >();
40 template<> const DataTraits & data_traits< signed char >();
41 template<> const DataTraits & data_traits< unsigned char >();
42 template<> const DataTraits & data_traits< signed short >();
43 template<> const DataTraits & data_traits< unsigned short >();
44 template<> const DataTraits & data_traits< signed int >();
45 template<> const DataTraits & data_traits< unsigned int >();
46 template<> const DataTraits & data_traits< signed long >();
47 template<> const DataTraits & data_traits< unsigned long >();
48 template<> const DataTraits & data_traits< float >();
49 template<> const DataTraits & data_traits< double >();
50 template<> const DataTraits & data_traits< std::complex<float> >();
51 template<> const DataTraits & data_traits< std::complex<double> >();
52 
53 template<> const DataTraits & data_traits< void * >();
54 template<> const DataTraits & data_traits< signed char * >();
55 template<> const DataTraits & data_traits< unsigned char * >();
56 template<> const DataTraits & data_traits< signed short * >();
57 template<> const DataTraits & data_traits< unsigned short * >();
58 template<> const DataTraits & data_traits< signed int * >();
59 template<> const DataTraits & data_traits< unsigned int * >();
60 template<> const DataTraits & data_traits< signed long * >();
61 template<> const DataTraits & data_traits< unsigned long * >();
62 template<> const DataTraits & data_traits< float * >();
63 template<> const DataTraits & data_traits< double * >();
64 template<> const DataTraits & data_traits< std::complex<float> * >();
65 template<> const DataTraits & data_traits< std::complex<double> * >();
66 
67 //----------------------------------------------------------------------
68 
69 class DataTraits {
70 public:
71  //------------------------------
72  // Standard properties:
73  const std::type_info & type_info ;
74  std::size_t size_of ;
75 
76  //------------------------------
77  // TR1 primary type categories:
78  bool is_void ;
79  bool is_integral ;
80  bool is_floating_point ;
81  bool is_array ;
82  bool is_pointer ;
83  bool is_enum ;
84  bool is_class ;
85 
86  // TR1 type properties:
87  bool is_pod ;
88  bool is_signed ; // only if 'is_integral'
89  bool is_unsigned ; // only if 'is_integral'
90  std::size_t alignment_of ;
91 
92  // For memory management contiguous arrays of data:
93  // Array must start aligned with 'alignment_of' and
94  // stride by 'stride_of'.
95  std::size_t stride_of ;
96 
97  // TR1 type manipulators:
98  const DataTraits * remove_pointer ; // if 'is_pointer'
99 
100  //------------------------------
102  std::string name ;
103 
104  //------------------------------
105  // Only If 'is_enum'
106  struct EnumMember {
107  std::string name ;
108  long value ;
109  };
110  std::vector< EnumMember > enum_info ;
111 
112  //------------------------------
113  // Only If 'is_class':
114  struct ClassMember {
115  std::string name ;
116  const DataTraits * traits ;
117  std::size_t offset ;
118  };
119  std::vector< ClassMember > class_info ;
120 
121  //------------------------------
122  // Functions required for all field data:
123 
124  virtual void construct( void * , std::size_t ) const = 0 ;
125  virtual void destroy( void * , std::size_t ) const = 0 ;
126  virtual void copy( void * , const void * , std::size_t ) const = 0 ;
127  virtual void pack( CommBuffer & , const void * , std::size_t ) const = 0 ;
128  virtual void unpack( CommBuffer & , void * , std::size_t ) const = 0 ;
129  virtual void print( std::ostream & , const void * , std::size_t ) const = 0 ;
130 
131  //------------------------------
132  // Commutative and associative ops
133  // required for is_integral and is_floating_point data.
134  // In-place reduction: x[0..(n-1)] op= y[0..(n-1)]
135  virtual void sum( void * x , const void * y , std::size_t n ) const = 0 ;
136  virtual void max( void * x , const void * y , std::size_t n ) const = 0 ;
137  virtual void min( void * x , const void * y , std::size_t n ) const = 0 ;
138 
139  // Commutative and associative ops
140  // required for is_integral data.
141  // In-place reduction: x[0..(n-1)] op= y[0..(n-1)]
142  virtual void bit_and( void * x , const void * y, std::size_t n ) const = 0 ;
143  virtual void bit_or( void * x , const void * y, std::size_t n ) const = 0 ;
144  virtual void bit_xor( void * x , const void * y, std::size_t n ) const = 0 ;
145 
146  //------------------------------
147 
148 protected:
149 
150  //------------------------------
152  DataTraits( const std::type_info & arg_type ,
153  const char * const arg_name ,
154  const std::size_t arg_size ,
155  const std::size_t arg_align );
156 
158  DataTraits( const std::type_info & arg_type , const DataTraits & );
159 
160  virtual ~DataTraits() {}
161 private:
162  DataTraits();
163  DataTraits( const DataTraits & );
164  DataTraits & operator = ( const DataTraits & );
165 };
166 
167 } // namespace mesh
168 } // namespace stk_classic
169 
170 #endif
171 
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.