47 Stream1dArray(
const H5::DataSet* pointers,
const H5::DataSet* heap, hsize_t
length, hsize_t buffer_size) :
48 my_pointers(pointers),
50 my_pointer_full_length(
length),
51 my_heap_full_length(
get_1d_length(my_heap->getSpace(), false)),
52 my_pointer_block_size(
pick_1d_block_size(my_pointers->getCreatePlist(), my_pointer_full_length, buffer_size)),
53 my_pointer_mspace(1, &my_pointer_block_size),
54 my_pointer_dspace(1, &my_pointer_full_length),
55 my_heap_dspace(1, &my_heap_full_length),
57 my_pointer_buffer(my_pointer_block_size),
58 my_final_buffer(my_pointer_block_size)
70 Stream1dArray(
const H5::DataSet* pointers,
const H5::DataSet* heap, hsize_t buffer_size) :
79 while (my_consumed >= my_available) {
80 my_consumed -= my_available;
83 return my_final_buffer[my_consumed];
92 while (my_consumed >= my_available) {
93 my_consumed -= my_available;
96 return std::move(my_final_buffer[my_consumed]);
112 return my_pointer_full_length;
119 return my_consumed + my_last_loaded;
123 const H5::DataSet* my_pointers;
124 const H5::DataSet* my_heap;
125 hsize_t my_pointer_full_length, my_heap_full_length;
126 hsize_t my_pointer_block_size;
127 H5::DataSpace my_pointer_mspace, my_pointer_dspace;
128 H5::DataSpace my_heap_mspace, my_heap_dspace;
130 H5::DataType my_pointer_dtype;
131 std::vector<Pointer<Offset_, Length_> > my_pointer_buffer;
132 std::vector<uint8_t> my_heap_buffer;
133 std::vector<std::string> my_final_buffer;
135 hsize_t my_last_loaded = 0;
136 hsize_t my_consumed = 0;
137 hsize_t my_available = 0;
140 if (my_last_loaded >= my_pointer_full_length) {
141 throw std::runtime_error(
"requesting data beyond the end of the dataset at '" +
get_name(*my_pointers) +
"'");
143 my_available = std::min(my_pointer_full_length - my_last_loaded, my_pointer_block_size);
145 constexpr hsize_t zero = 0;
146 my_pointer_mspace.selectHyperslab(H5S_SELECT_SET, &my_available, &zero);
147 my_pointer_dspace.selectHyperslab(H5S_SELECT_SET, &my_available, &my_last_loaded);
148 my_heap_dspace.selectNone();
149 my_pointers->read(my_pointer_buffer.data(), my_pointer_dtype, my_pointer_mspace, my_pointer_dspace);
151 for (
size_t i = 0; i < my_available; ++i) {
152 const auto& val = my_pointer_buffer[i];
153 hsize_t start = val.offset;
154 hsize_t count = val.length;
155 if (start > my_heap_full_length || start + count > my_heap_full_length) {
156 throw std::runtime_error(
"VLS array pointers at '" +
get_name(*my_pointers) +
"' are out of range of the heap at '" +
get_name(*my_heap) +
"'");
159 auto& curstr = my_final_buffer[i];
166 my_heap_mspace.setExtentSimple(1, &count);
167 my_heap_mspace.selectAll();
168 my_heap_dspace.selectHyperslab(H5S_SELECT_SET, &count, &start);
169 my_heap_buffer.resize(count);
170 my_heap->read(my_heap_buffer.data(), H5::PredType::NATIVE_UINT8, my_heap_mspace, my_heap_dspace);
171 const char* text_ptr =
reinterpret_cast<const char*
>(my_heap_buffer.data());
172 curstr.insert(curstr.end(), text_ptr, text_ptr + find_string_length(text_ptr, count));
191 my_last_loaded += my_available;
hsize_t pick_1d_block_size(const H5::DSetCreatPropList &cplist, hsize_t full_length, hsize_t buffer_size=10000)
Definition pick_1d_block_size.hpp:26