Sierra Toolkit  Version of the Day
DataTraitsEnum.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 #include <stk_mesh/base/DataTraits.hpp>
10 
11 #include <stk_util/environment/ReportHandler.hpp>
12 
13 //----------------------------------------------------------------------
14 
15 namespace stk_classic {
16 namespace mesh {
17 
18 template< typename EnumType > class DataTraitsEnum ;
19 
20 //----------------------------------------------------------------------
21 //----------------------------------------------------------------------
22 
23 namespace {
24 
25 template< typename T >
26 class DataTraitsEnum : public DataTraits {
27 public:
28  DataTraitsEnum( const char * name , std::size_t n )
29  : DataTraits( typeid(T) , name , sizeof(T) , sizeof(T) )
30  {
31  is_pod = true ;
32  is_enum = true ;
33  enum_info.reserve( n );
34  }
35 
36  void add_member( const char * n , T v )
37  {
38  const std::size_t i = enum_info.size();
39  enum_info.resize( i + 1 );
40  enum_info[i].name.assign( n );
41  enum_info[i].value = static_cast<long>( v );
42  }
43 
44  void construct( void * v , std::size_t n ) const
45  {
46  const T init = static_cast<T>( enum_info.front().value );
47  T * x = reinterpret_cast<T*>(v);
48  T * const x_end = x + n ;
49  while ( x_end != x ) { *x++ = init ; }
50  }
51 
52  void destroy( void * v , std::size_t n ) const {}
53 
54  void copy( void * vx , const void * vy , std::size_t n ) const
55  {
56  const T * y = reinterpret_cast<const T*>(vy);
57  T * x = reinterpret_cast<T*>(vx);
58  T * const x_end = x + n ;
59  while ( x_end != x ) { *x++ = *y++ ; }
60  }
61 
62  void max( void * vx , const void * vy , std::size_t n ) const
63  {
64  const T * y = reinterpret_cast<const T*>(vy);
65  T * x = reinterpret_cast<T*>(vx);
66  T * const x_end = x + n ;
67  for ( ; x_end != x ; ++x , ++y ) { if ( *x < *y ) { *x = *y ; } }
68  }
69 
70  void min( void * vx , const void * vy , std::size_t n ) const
71  {
72  const T * y = reinterpret_cast<const T*>(vy);
73  T * x = reinterpret_cast<T*>(vx);
74  T * const x_end = x + n ;
75  for ( ; x_end != x ; ++x , ++y ) { if ( *x > *y ) { *x = *y ; } }
76  }
77 
78  void print_one( std::ostream & s , T v ) const
79  {
80  std::vector<EnumMember>::const_iterator i = enum_info.begin();
81  for ( ; i != enum_info.end() && i->value != v ; ++i );
82  if ( i != enum_info.end() ) {
83  s << i->name ;
84  }
85  else {
86  s << name << "( " << static_cast<long>( v ) << " VALUE_NOT_VALID )" ;
87  }
88  }
89 
90  void print( std::ostream & s , const void * v , std::size_t n ) const
91  {
92  if ( n ) {
93  const T * x = reinterpret_cast<const T*>(v);
94  const T * const x_end = x + n ;
95  print_one( s , *x++ );
96  while ( x_end != x ) { s << " " ; print_one( s , *x++ ); }
97  }
98  }
99 
100  void pack( CommBuffer & buf , const void * v , std::size_t n ) const
101  {
102  const T * x = reinterpret_cast<const T*>(v);
103  buf.pack<T>( x , n );
104  }
105 
106  void unpack( CommBuffer & buf , void * v , std::size_t n ) const
107  {
108  T * x = reinterpret_cast<T*>(v);
109  buf.unpack<T>( x , n );
110  }
111 
112  void sum( void * , const void * , std::size_t ) const
113  { ThrowErrorMsg( "not supported" ); }
114 
115  void bit_and( void * , const void * , std::size_t ) const
116  { ThrowErrorMsg( "not supported" ); }
117 
118  void bit_or( void * , const void * , std::size_t ) const
119  { ThrowErrorMsg( "not supported" ); }
120 
121  void bit_xor( void * , const void * , std::size_t ) const
122  { ThrowErrorMsg( "not supported" ); }
123 };
124 
125 }
126 
127 //----------------------------------------------------------------------
128 
129 #define DATA_TRAITS_ENUM_1( T , V1 ) \
130 namespace { \
131 class DataTraitsEnum ## T : public DataTraitsEnum<T> { \
132 public: \
133  DataTraitsEnum ## T () : DataTraitsEnum<T>( # T , 1 ) \
134  { add_member( # V1 , V1 ); } \
135 }; \
136 } \
137 template<> const DataTraits & data_traits< T >() \
138 { static const DataTraitsEnum ## T traits ; return traits ; }
139 
140 //----------------------------------------------------------------------
141 
142 #define DATA_TRAITS_ENUM_2( T , V1 , V2 ) \
143 namespace { \
144 class DataTraitsEnum ## T : public DataTraitsEnum<T> { \
145 public: \
146  DataTraitsEnum ## T () : DataTraitsEnum<T>( # T , 2 ) \
147  { \
148  add_member( # V1 , V1 ); \
149  add_member( # V2 , V2 ); \
150  } \
151 }; \
152 } \
153 template<> const DataTraits & data_traits< T >() \
154 { static const DataTraitsEnum ## T traits ; return traits ; }
155 
156 //----------------------------------------------------------------------
157 
158 #define DATA_TRAITS_ENUM_3( T , V1 , V2 , V3 ) \
159 namespace { \
160 class DataTraitsEnum ## T : public DataTraitsEnum<T> { \
161 public: \
162  DataTraitsEnum ## T () : DataTraitsEnum<T>( # T , 3 ) \
163  { \
164  add_member( # V1 , V1 ); \
165  add_member( # V2 , V2 ); \
166  add_member( # V3 , V3 ); \
167  } \
168 }; \
169 } \
170 template<> const DataTraits & data_traits< T >() \
171 { static const DataTraitsEnum ## T traits ; return traits ; }
172 
173 //----------------------------------------------------------------------
174 
175 } // namespace mesh
176 } // namespace stk_classic
177 
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.