49 Stream1dArray(DataSetPointer_ pointers_ptr, hsize_t length, DataSetPointer_ heap_ptr) :
50 my_pointers_ptr(std::move(pointers_ptr)),
51 my_heap_ptr(std::move(heap_ptr)),
52 my_pointer_full_length(length),
53 my_heap_full_length([&]{
55 my_heap_ptr->getSpace().getSimpleExtentDims(&output);
58 my_pointer_block_size([&]{
59 assert(my_pointers_ptr->getSpace().getSimpleExtentNdims() == 1);
61 const auto& plist = my_pointers_ptr->getCreatePlist();
62 if (plist.getLayout() == H5D_CHUNKED) {
63 plist.getChunk(1, &output);
66 output = sanisizer::min(my_pointer_full_length, 10000);
70 my_pointer_mspace(1, &my_pointer_block_size),
71 my_pointer_dspace(1, &my_pointer_full_length),
72 my_heap_dspace(1, &my_heap_full_length),
74 my_pointer_buffer(sanisizer::cast<I<
decltype(my_pointer_buffer.size())> >(my_pointer_block_size))
77 sanisizer::cast<I<
decltype(my_heap_buffer.size())> >(my_heap_full_length);
98 hsize_t
load(std::string* buffer) {
99 my_last_loaded += my_available;
100 my_available = std::min(my_pointer_full_length - my_last_loaded, my_pointer_block_size);
101 if (my_available == 0) {
105 constexpr hsize_t zero = 0;
106 my_pointer_mspace.selectHyperslab(H5S_SELECT_SET, &my_available, &zero);
107 my_pointer_dspace.selectHyperslab(H5S_SELECT_SET, &my_available, &my_last_loaded);
108 my_heap_dspace.selectNone();
109 my_pointers_ptr->read(my_pointer_buffer.data(), my_pointer_dtype, my_pointer_mspace, my_pointer_dspace);
111 for (
size_t i = 0; i < my_available; ++i) {
112 const auto& val = my_pointer_buffer[i];
114 throw std::runtime_error(
"compressed VLS array pointers at '" +
116 "' are out of range of the heap at '" +
122 auto& curstr = buffer[i];
127 const hsize_t
start = val.offset;
128 const hsize_t count = val.length;
133 my_heap_mspace.setExtentSimple(1, &count);
134 my_heap_mspace.selectAll();
135 my_heap_dspace.selectHyperslab(H5S_SELECT_SET, &count, &
start);
136 my_heap_buffer.resize(count);
137 my_heap_ptr->read(my_heap_buffer.data(), H5::PredType::NATIVE_UINT8, my_heap_mspace, my_heap_dspace);
138 const char* text_ptr =
reinterpret_cast<const char*
>(my_heap_buffer.data());
139 curstr.insert(curstr.end(), text_ptr, text_ptr +
hdf5::strnlen(text_ptr, count));
172 static_assert(std::is_base_of<H5::DataSet, I<
decltype(*my_pointers_ptr)> >::value);
173 static_assert(std::is_base_of<H5::DataSet, I<
decltype(*my_heap_ptr)> >::value);