/home/runner/work/DiFfRG_current/DiFfRG_current/DiFfRG/include/hdf5lib/datatype.hh Source File#

DiFfRG: /home/runner/work/DiFfRG_current/DiFfRG_current/DiFfRG/include/hdf5lib/datatype.hh Source File
DiFfRG
datatype.hh
Go to the documentation of this file.
1#pragma once
2
3#include <hdf5lib/handle.hh>
4
5#include <cstddef>
6#include <cstdint>
7#include <string>
8
9namespace DiFfRG::hdf5
10{
12 {
13 public:
14 Datatype() = default;
15 explicit Datatype(hid_t id) : h_(id) {}
16 static Datatype take(hid_t id) { return Datatype(Handle::take(id)); }
17
18 hid_t id() const noexcept { return h_.get(); }
19 bool valid() const noexcept { return h_.valid(); }
20
21 bool operator==(const Datatype &other) const
22 {
23 if (!valid() || !other.valid()) return valid() == other.valid();
24 htri_t r = H5Tequal(h_.get(), other.h_.get());
25 throw_if_negative(static_cast<herr_t>(r < 0 ? -1 : 0), "H5Tequal failed");
26 return r > 0;
27 }
28
29 bool operator!=(const Datatype &other) const { return !(*this == other); }
30
32 static Datatype compound(std::size_t size)
33 {
34 hid_t id = H5Tcreate(H5T_COMPOUND, size);
35 throw_if_negative(id, "H5Tcreate(H5T_COMPOUND) failed");
36 return Datatype::take(id);
37 }
38
40 void insert(const std::string &name, std::size_t offset, const Datatype &member)
41 {
42 throw_if_negative(H5Tinsert(h_.get(), name.c_str(), offset, member.id()), "H5Tinsert failed");
43 }
44
45 private:
46 explicit Datatype(Handle h) : h_(std::move(h)) {}
48 };
49
53 template <class T> struct TypeTrait;
54
56 template <class T> Datatype type_of() { return TypeTrait<T>::get(); }
57
58#define DIFFRG_HDF5LIB_PREDEFINED_TYPE(CXX_TYPE, H5_PREDEF) \
59 template <> struct TypeTrait<CXX_TYPE> { \
60 static Datatype get() { return Datatype(H5_PREDEF); } \
61 }
62
63 // Native C/C++ scalar types. Using NATIVE_* means HDF5 will translate to
64 // file format on write; storage is portable across platforms.
65 DIFFRG_HDF5LIB_PREDEFINED_TYPE(char, H5T_NATIVE_CHAR);
66 DIFFRG_HDF5LIB_PREDEFINED_TYPE(signed char, H5T_NATIVE_SCHAR);
67 DIFFRG_HDF5LIB_PREDEFINED_TYPE(unsigned char, H5T_NATIVE_UCHAR);
68 DIFFRG_HDF5LIB_PREDEFINED_TYPE(short, H5T_NATIVE_SHORT);
69 DIFFRG_HDF5LIB_PREDEFINED_TYPE(unsigned short, H5T_NATIVE_USHORT);
70 DIFFRG_HDF5LIB_PREDEFINED_TYPE(int, H5T_NATIVE_INT);
71 DIFFRG_HDF5LIB_PREDEFINED_TYPE(unsigned int, H5T_NATIVE_UINT);
72 DIFFRG_HDF5LIB_PREDEFINED_TYPE(long, H5T_NATIVE_LONG);
73 DIFFRG_HDF5LIB_PREDEFINED_TYPE(unsigned long, H5T_NATIVE_ULONG);
74 DIFFRG_HDF5LIB_PREDEFINED_TYPE(long long, H5T_NATIVE_LLONG);
75 DIFFRG_HDF5LIB_PREDEFINED_TYPE(unsigned long long, H5T_NATIVE_ULLONG);
76 DIFFRG_HDF5LIB_PREDEFINED_TYPE(float, H5T_NATIVE_FLOAT);
77 DIFFRG_HDF5LIB_PREDEFINED_TYPE(double, H5T_NATIVE_DOUBLE);
78
79#undef DIFFRG_HDF5LIB_PREDEFINED_TYPE
80
82 template <> struct TypeTrait<std::string> {
83 static Datatype get()
84 {
85 hid_t t = H5Tcopy(H5T_C_S1);
86 throw_if_negative(t, "H5Tcopy(H5T_C_S1) failed");
87 throw_if_negative(H5Tset_size(t, H5T_VARIABLE), "H5Tset_size(H5T_VARIABLE) failed");
88 throw_if_negative(H5Tset_cset(t, H5T_CSET_UTF8), "H5Tset_cset(UTF8) failed");
89 return Datatype::take(t);
90 }
91 };
92} // namespace DiFfRG::hdf5
Definition datatype.hh:12
hid_t id() const noexcept
Definition datatype.hh:18
void insert(const std::string &name, std::size_t offset, const Datatype &member)
Insert a member into a compound datatype.
Definition datatype.hh:40
bool operator!=(const Datatype &other) const
Definition datatype.hh:29
Datatype(Handle h)
Definition datatype.hh:46
Datatype(hid_t id)
Definition datatype.hh:15
Handle h_
Definition datatype.hh:47
bool operator==(const Datatype &other) const
Definition datatype.hh:21
static Datatype compound(std::size_t size)
Build a compound datatype with the given total size (in bytes).
Definition datatype.hh:32
bool valid() const noexcept
Definition datatype.hh:19
static Datatype take(hid_t id)
Definition datatype.hh:16
Definition handle.hh:25
bool valid() const noexcept
Definition handle.hh:80
hid_t get() const noexcept
Definition handle.hh:79
static Handle take(hid_t id)
Definition handle.hh:37
#define DIFFRG_HDF5LIB_PREDEFINED_TYPE(CXX_TYPE, H5_PREDEF)
Definition datatype.hh:58
Definition hdf5.hh:12
Datatype type_of()
Convenience factory — type_of<T>() returns the HDF5 datatype for T.
Definition datatype.hh:56
void throw_if_negative(hid_t id, const char *what)
Definition handle.hh:11
static Datatype get()
Definition datatype.hh:83
Definition datatype.hh:53