24 #ifndef BASETYPES_COMPOUND_HPP 25 #define BASETYPES_COMPOUND_HPP 31 #include "splash/CollectionType.hpp" 36 static const char* COMPOUND_ELEMENTS[] = {
"x",
"y",
"z",
"u",
"v",
"w"};
38 #define TYPE_COMPOUND(_name, _h5_type, _real_type, _size) \ 39 class ColType##_name : public CollectionType \ 45 this->type = H5Tcreate(H5T_COMPOUND, sizeof (_real_type) * _size); \ 46 for (size_t i = 0; i < _size; ++i) \ 48 H5Tinsert(this->type, COMPOUND_ELEMENTS[i], \ 49 i * sizeof(_real_type), _h5_type); \ 54 { H5Tclose(this->type); } \ 56 size_t getSize() const \ 57 { return _size * sizeof (_real_type); } \ 59 static CollectionType* genType(hid_t datatype_id) \ 61 H5T_class_t h5_class = H5Tget_class(datatype_id); \ 63 if(h5_class == H5T_COMPOUND) \ 65 int nmembers = H5Tget_nmembers(datatype_id); \ 66 if(nmembers == _size) \ 68 for(int i = 0; i < nmembers && !found ; ++i) \ 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) \ 83 return new ColType##_name; \ 88 std::string toString() const \ 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);
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);
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);