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

DiFfRG: /home/runner/work/DiFfRG_current/DiFfRG_current/DiFfRG/include/hdf5lib/dataspace.hh Source File
DiFfRG
dataspace.hh
Go to the documentation of this file.
1#pragma once
2
3#include <hdf5lib/handle.hh>
4
5#include <vector>
6
7namespace DiFfRG::hdf5
8{
9 using Dims = std::vector<hsize_t>;
10
12 {
13 public:
14 Dataspace() = default;
15 explicit Dataspace(hid_t id) : h_(id) {}
16 static Dataspace take(hid_t id) { return Dataspace(Handle::take(id)); }
17
18 hid_t id() const noexcept { return h_.get(); }
19 bool valid() const noexcept { return h_.valid(); }
20
22 hssize_t size() const
23 {
24 hssize_t n = H5Sget_simple_extent_npoints(h_.get());
25 throw_if_negative(static_cast<herr_t>(n < 0 ? -1 : 0), "H5Sget_simple_extent_npoints failed");
26 return n;
27 }
28
30 Dims extents() const
31 {
32 const int rank = H5Sget_simple_extent_ndims(h_.get());
33 throw_if_negative(static_cast<herr_t>(rank < 0 ? -1 : 0), "H5Sget_simple_extent_ndims failed");
34 Dims out(static_cast<std::size_t>(rank));
35 throw_if_negative(H5Sget_simple_extent_dims(h_.get(), out.data(), nullptr),
36 "H5Sget_simple_extent_dims failed");
37 return out;
38 }
39
42 void select_hyperslab(const Dims &offset, const Dims &count)
43 {
45 H5Sselect_hyperslab(h_.get(), H5S_SELECT_SET, offset.data(), nullptr, count.data(), nullptr),
46 "H5Sselect_hyperslab failed");
47 }
48
50 {
51 hid_t s = H5Screate(H5S_SCALAR);
52 throw_if_negative(s, "H5Screate(H5S_SCALAR) failed");
53 return Dataspace::take(s);
54 }
55
56 static Dataspace simple(const Dims &dims)
57 {
58 hid_t s = H5Screate_simple(static_cast<int>(dims.size()), dims.data(), nullptr);
59 throw_if_negative(s, "H5Screate_simple failed");
60 return Dataspace::take(s);
61 }
62
65 static Dataspace simple_unlimited(const Dims &dims)
66 {
67 Dims maxdims(dims.size(), H5S_UNLIMITED);
68 hid_t s = H5Screate_simple(static_cast<int>(dims.size()), dims.data(), maxdims.data());
69 throw_if_negative(s, "H5Screate_simple (unlimited) failed");
70 return Dataspace::take(s);
71 }
72
73 private:
74 explicit Dataspace(Handle h) : h_(std::move(h)) {}
76 };
77} // namespace DiFfRG::hdf5
Definition dataspace.hh:12
static Dataspace scalar()
Definition dataspace.hh:49
Dataspace(Handle h)
Definition dataspace.hh:74
bool valid() const noexcept
Definition dataspace.hh:19
static Dataspace simple_unlimited(const Dims &dims)
Definition dataspace.hh:65
hssize_t size() const
Number of elements (product of all extents). For a scalar space this is 1.
Definition dataspace.hh:22
static Dataspace simple(const Dims &dims)
Definition dataspace.hh:56
hid_t id() const noexcept
Definition dataspace.hh:18
void select_hyperslab(const Dims &offset, const Dims &count)
Definition dataspace.hh:42
Dims extents() const
Current extents.
Definition dataspace.hh:30
Handle h_
Definition dataspace.hh:75
Dataspace(hid_t id)
Definition dataspace.hh:15
static Dataspace take(hid_t id)
Definition dataspace.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
Definition hdf5.hh:12
std::vector< hsize_t > Dims
Definition dataspace.hh:9
void throw_if_negative(hid_t id, const char *what)
Definition handle.hh:11