ritsuko
Helper utilities for ArtifactDB C++ code
Loading...
Searching...
No Matches
IterateChunks.hpp
Go to the documentation of this file.
1#ifndef RITSUKO_HDF5_ITERATE_CHUNKS_HPP
2#define RITSUKO_HDF5_ITERATE_CHUNKS_HPP
3
4#include "H5Cpp.h"
5
6#include <vector>
7#include <algorithm>
8#include <cmath>
9
10#include "../utils.hpp"
11
17namespace ritsuko {
18
19namespace hdf5 {
20
35 IterateChunks(std::vector<hsize_t> data_dimensions, std::vector<hsize_t> chunk_dimensions) :
36 my_data_extent(std::move(data_dimensions)),
37 my_chunk_extent(std::move(chunk_dimensions)),
38 my_starts(my_data_extent.size()), // no need to sanisizer::cast as the types are the same.
39 my_counts(my_data_extent.size())
40 {
41 const auto ndims = my_data_extent.size();
42 assert(ndims == my_chunk_extent.size());
43
44 I<decltype(ndims)> num_empty = 0;
45 for (I<decltype(ndims)> d = 0; d < ndims; ++d) {
46 my_chunk_extent[d] = std::min(my_data_extent[d], my_chunk_extent[d]);
47 my_counts[d] = my_chunk_extent[d];
48 num_empty += (my_chunk_extent[d] == 0);
49 }
50
51 if (ndims == 0 || num_empty) {
52 my_finished = true;
53 } else {
54 // Ensure that the first advance() call has no effect.
55 my_counts.back() = 0;
56 }
57 }
58
66 bool advance() {
67 if (my_finished) {
68 return false;
69 }
70
71 // Prioritizing the last dimension as this is the fastest-changing.
72 const auto ndims = my_data_extent.size();
73 for (auto i = ndims; i > 0; --i) {
74 const auto d = i - 1;
75 my_starts[d] += my_counts[d];
76 if (my_starts[d] < my_data_extent[d]) {
77 my_counts[d] = std::min(my_data_extent[d] - my_starts[d], my_chunk_extent[d]);
78 return true;
79 }
80
81 my_starts[d] = 0;
82 my_counts[d] = my_chunk_extent[d];
83 }
84
85 my_finished = true;
86 return false;
87 }
88
89public:
95 const std::vector<hsize_t>& starts () const {
96 return my_starts;
97 }
98
106 const std::vector<hsize_t>& counts () const {
107 return my_counts;
108 }
109
113 const std::vector<hsize_t>& data_dimensions() const {
114 return my_data_extent;
115 }
116
122 const std::vector<hsize_t>& chunk_dimensions() const {
123 return my_chunk_extent;
124 }
125
126private:
127 std::vector<hsize_t> my_data_extent, my_chunk_extent;
128 std::vector<hsize_t> my_starts, my_counts;
129 bool my_finished = false;
130};
131
132}
133
134}
135
136#endif
Helper functions for ArtifactDB parsing and validation.
Definition Pointer.hpp:21
Iterate through an high-dimensional dataspace by chunk.
Definition IterateChunks.hpp:28
const std::vector< hsize_t > & chunk_dimensions() const
Definition IterateChunks.hpp:122
const std::vector< hsize_t > & data_dimensions() const
Definition IterateChunks.hpp:113
bool advance()
Definition IterateChunks.hpp:66
const std::vector< hsize_t > & starts() const
Definition IterateChunks.hpp:95
const std::vector< hsize_t > & counts() const
Definition IterateChunks.hpp:106
IterateChunks(std::vector< hsize_t > data_dimensions, std::vector< hsize_t > chunk_dimensions)
Definition IterateChunks.hpp:35