libSplash
basetypes_compound.hpp
1 
24 #ifndef BASETYPES_COMPOUND_HPP
25 #define BASETYPES_COMPOUND_HPP
26 
27 #include <stdint.h>
28 #include <cstring>
29 #include <cstdlib>
30 
31 #include "splash/CollectionType.hpp"
32 
33 namespace splash
34 {
35 
36  static const char* COMPOUND_ELEMENTS[] = {"x", "y", "z", "u", "v", "w"};
37 
38 #define TYPE_COMPOUND(_name, _h5_type, _real_type, _size) \
39  class ColType##_name : public CollectionType \
40  { \
41  public: \
42  \
43  ColType##_name() \
44  { \
45  this->type = H5Tcreate(H5T_COMPOUND, sizeof (_real_type) * _size); \
46  for (size_t i = 0; i < _size; ++i) \
47  { \
48  H5Tinsert(this->type, COMPOUND_ELEMENTS[i], \
49  i * sizeof(_real_type), _h5_type); \
50  } \
51  } \
52  \
53  ~ColType##_name() \
54  { H5Tclose(this->type); } \
55  \
56  size_t getSize() const \
57  { return _size * sizeof (_real_type); } \
58  \
59  static CollectionType* genType(hid_t datatype_id) \
60  { \
61  H5T_class_t h5_class = H5Tget_class(datatype_id); \
62  bool found = false; \
63  if(h5_class == H5T_COMPOUND) \
64  { \
65  int nmembers = H5Tget_nmembers(datatype_id); \
66  if(nmembers == _size) \
67  { \
68  for(int i = 0; i < nmembers && !found ; ++i) \
69  { \
70  hid_t mtype = H5Tget_member_type(datatype_id, i); \
71  char* mname = H5Tget_member_name(datatype_id, i); \
72  if(H5Tequal(mtype, _h5_type) == 1 && \
73  strcmp(COMPOUND_ELEMENTS[i], mname) == 0) \
74  { \
75  found = true; \
76  } \
77  free(mname); \
78  H5Tclose(mtype); \
79  } \
80  } \
81  } \
82  if(found) \
83  return new ColType##_name; \
84  else \
85  return NULL; \
86  } \
87  \
88  std::string toString() const \
89  { \
90  return #_name; \
91  } \
92  \
93  }; \
94 
95 
96 TYPE_COMPOUND(Float2, H5T_NATIVE_FLOAT, float, 2);
97 TYPE_COMPOUND(Float3, H5T_NATIVE_FLOAT, float, 3);
98 TYPE_COMPOUND(Float4, H5T_NATIVE_FLOAT, float, 4);
99 
100 TYPE_COMPOUND(Double2, H5T_NATIVE_DOUBLE, double, 2);
101 TYPE_COMPOUND(Double3, H5T_NATIVE_DOUBLE, double, 3);
102 TYPE_COMPOUND(Double4, H5T_NATIVE_DOUBLE, double, 4);
103 
104 TYPE_COMPOUND(Int2, H5T_NATIVE_INT, int, 2);
105 TYPE_COMPOUND(Int3, H5T_NATIVE_INT, int, 3);
106 TYPE_COMPOUND(Int4, H5T_NATIVE_INT, int, 4);
107 
108 }
109 
110 #endif /* BASETYPES_COMPOUND_HPP */