Program Listing for File h5ppTypeCompoundCreate.h¶
↰ Return to documentation for file (/home/david/GitProjects/h5pp/h5pp/include/h5pp/details/h5ppTypeCompoundCreate.h
)
#pragma once
#include "h5ppHid.h"
#include "h5ppTypeCompound.h"
#include "h5ppTypeSfinae.h"
#include <complex>
namespace h5pp::type::compound::Create {
template<typename T>
[[nodiscard]] hid::h5t createComplexType() {
hid::h5t NEW_COMPLEX_TYPE = H5Tcreate(H5T_COMPOUND, sizeof(H5T_COMPLEX_STRUCT<T>));
hid::h5t h5type = h5pp::util::getH5Type<T>();
herr_t errr = H5Tinsert(NEW_COMPLEX_TYPE, "real", HOFFSET(H5T_COMPLEX_STRUCT<T>, real), h5type);
herr_t erri = H5Tinsert(NEW_COMPLEX_TYPE, "imag", HOFFSET(H5T_COMPLEX_STRUCT<T>, imag), h5type);
if(errr < 0 or erri < 0) {
H5Eprint(H5E_DEFAULT, stderr);
throw std::runtime_error("Failed to insert x or y in new complex type: \n real " + std::to_string(errr) + "\n imag " + std::to_string(erri));
}
return H5Tcopy(NEW_COMPLEX_TYPE);
}
template<typename T>
[[nodiscard]] hid::h5t createScalar2Type() {
hid::h5t NEW_SCALAR2_TYPE = H5Tcreate(H5T_COMPOUND, sizeof(H5T_SCALAR2<T>));
hid::h5t h5type = h5pp::util::getH5Type<T>();
herr_t errx = H5Tinsert(NEW_SCALAR2_TYPE, "x", HOFFSET(H5T_SCALAR2<T>, x), h5type);
herr_t erry = H5Tinsert(NEW_SCALAR2_TYPE, "y", HOFFSET(H5T_SCALAR2<T>, y), h5type);
if(errx < 0 or erry < 0) {
H5Eprint(H5E_DEFAULT, stderr);
throw std::runtime_error("Failed to insert x or y in new Scalar2: \n x " + std::to_string(errx) + "\n y " + std::to_string(erry));
}
return NEW_SCALAR2_TYPE;
}
template<typename T>
[[nodiscard]] hid::h5t createScalar3Type() {
hid::h5t NEW_SCALAR3_TYPE = H5Tcreate(H5T_COMPOUND, sizeof(H5T_SCALAR3<T>));
hid::h5t h5type = h5pp::util::getH5Type<T>();
herr_t errx, erry, errz;
errx = H5Tinsert(NEW_SCALAR3_TYPE, "x", HOFFSET(H5T_SCALAR3<T>, x), h5type);
erry = H5Tinsert(NEW_SCALAR3_TYPE, "y", HOFFSET(H5T_SCALAR3<T>, y), h5type);
errz = H5Tinsert(NEW_SCALAR3_TYPE, "z", HOFFSET(H5T_SCALAR3<T>, z), h5type);
if(errx < 0 or erry < 0 or errz < 0) {
H5Eprint(H5E_DEFAULT, stderr);
throw std::runtime_error("Failed to insert x y or z in new Scalar3: \n x " + std::to_string(errx) + "\n y " + std::to_string(erry) + "\n z" + std::to_string(errz));
}
return NEW_SCALAR3_TYPE;
}
}
namespace h5pp::type::compound {
inline void initTypes() {
if(not H5T_COMPLEX_SHORT.valid()) H5T_COMPLEX_SHORT = Create::createComplexType<short>();
if(not H5T_COMPLEX_INT.valid()) H5T_COMPLEX_INT = Create::createComplexType<int>();
if(not H5T_COMPLEX_LONG.valid()) H5T_COMPLEX_LONG = Create::createComplexType<long>();
if(not H5T_COMPLEX_LLONG.valid()) H5T_COMPLEX_LLONG = Create::createComplexType<long long>();
if(not H5T_COMPLEX_USHORT.valid()) H5T_COMPLEX_USHORT = Create::createComplexType<unsigned short>();
if(not H5T_COMPLEX_UINT.valid()) H5T_COMPLEX_UINT = Create::createComplexType<unsigned int>();
if(not H5T_COMPLEX_ULONG.valid()) H5T_COMPLEX_ULONG = Create::createComplexType<unsigned long>();
if(not H5T_COMPLEX_ULLONG.valid()) H5T_COMPLEX_ULLONG = Create::createComplexType<unsigned long long>();
if(not H5T_COMPLEX_DOUBLE.valid()) H5T_COMPLEX_DOUBLE = Create::createComplexType<double>();
if(not H5T_COMPLEX_LDOUBLE.valid()) H5T_COMPLEX_LDOUBLE = Create::createComplexType<long double>();
if(not H5T_COMPLEX_FLOAT.valid()) H5T_COMPLEX_FLOAT = Create::createComplexType<float>();
if(not H5T_SCALAR2_SHORT.valid()) H5T_SCALAR2_SHORT = Create::createScalar2Type<short>();
if(not H5T_SCALAR2_INT.valid()) H5T_SCALAR2_INT = Create::createScalar2Type<int>();
if(not H5T_SCALAR2_LONG.valid()) H5T_SCALAR2_LONG = Create::createScalar2Type<long>();
if(not H5T_SCALAR2_LLONG.valid()) H5T_SCALAR2_LLONG = Create::createScalar2Type<long long>();
if(not H5T_SCALAR2_USHORT.valid()) H5T_SCALAR2_USHORT = Create::createScalar2Type<unsigned short>();
if(not H5T_SCALAR2_UINT.valid()) H5T_SCALAR2_UINT = Create::createScalar2Type<unsigned int>();
if(not H5T_SCALAR2_ULONG.valid()) H5T_SCALAR2_ULONG = Create::createScalar2Type<unsigned long>();
if(not H5T_SCALAR2_ULLONG.valid()) H5T_SCALAR2_ULLONG = Create::createScalar2Type<unsigned long long>();
if(not H5T_SCALAR2_DOUBLE.valid()) H5T_SCALAR2_DOUBLE = Create::createScalar2Type<double>();
if(not H5T_SCALAR2_LDOUBLE.valid()) H5T_SCALAR2_LDOUBLE = Create::createScalar2Type<long double>();
if(not H5T_SCALAR2_FLOAT.valid()) H5T_SCALAR2_FLOAT = Create::createScalar2Type<float>();
if(not H5T_SCALAR3_SHORT.valid()) H5T_SCALAR3_SHORT = Create::createScalar3Type<int>();
if(not H5T_SCALAR3_INT.valid()) H5T_SCALAR3_INT = Create::createScalar3Type<int>();
if(not H5T_SCALAR3_LONG.valid()) H5T_SCALAR3_LONG = Create::createScalar3Type<long>();
if(not H5T_SCALAR3_LLONG.valid()) H5T_SCALAR3_LLONG = Create::createScalar3Type<long long>();
if(not H5T_SCALAR3_USHORT.valid()) H5T_SCALAR3_USHORT = Create::createScalar3Type<unsigned short>();
if(not H5T_SCALAR3_UINT.valid()) H5T_SCALAR3_UINT = Create::createScalar3Type<unsigned int>();
if(not H5T_SCALAR3_ULONG.valid()) H5T_SCALAR3_ULONG = Create::createScalar3Type<unsigned long>();
if(not H5T_SCALAR3_ULLONG.valid()) H5T_SCALAR3_ULLONG = Create::createScalar3Type<unsigned long long>();
if(not H5T_SCALAR3_DOUBLE.valid()) H5T_SCALAR3_DOUBLE = Create::createScalar3Type<double>();
if(not H5T_SCALAR3_LDOUBLE.valid()) H5T_SCALAR3_LDOUBLE = Create::createScalar3Type<long double>();
if(not H5T_SCALAR3_FLOAT.valid()) H5T_SCALAR3_FLOAT = Create::createScalar3Type<float>();
}
}