45 my_data_ptr(std::move(data_ptr)),
46 my_full_length(length),
48 assert(my_data_ptr->getSpace().getSimpleExtentNdims() == 1);
50 const auto& plist = my_data_ptr->getCreatePlist();
51 if (plist.getLayout() == H5D_CHUNKED) {
52 plist.getChunk(1, &output);
56 output = sanisizer::min(length, 10000);
60 my_mspace(1, &my_block_size),
61 my_fspace(1, &my_full_length),
62 my_dtype(my_data_ptr->getDataType()),
63 my_is_variable(my_dtype.isVariableStr())
65 assert(my_dtype.getClass() == H5T_STRING);
67 sanisizer::resize(my_var_buffer, my_block_size);
69 my_fixed_length = my_dtype.getSize();
70 my_fix_buffer.resize(sanisizer::product<I<
decltype(my_fix_buffer.size())> >(my_fixed_length, my_block_size));
92 hsize_t
load(std::string* buffer) {
93 my_last_loaded += my_available;
94 my_available = sanisizer::min(my_full_length - my_last_loaded, my_block_size);
95 if (my_available == 0) {
99 constexpr hsize_t zero = 0;
100 my_mspace.selectHyperslab(H5S_SELECT_SET, &my_available, &zero);
101 my_fspace.selectHyperslab(H5S_SELECT_SET, &my_available, &my_last_loaded);
103 if (my_is_variable) {
104 my_data_ptr->read(my_var_buffer.data(), my_dtype, my_mspace, my_fspace);
105 const auto& plist = H5::DSetMemXferPropList::DEFAULT;
106 [[maybe_unused]]
ReclaimVlsMemory deletor(&my_dtype, &my_mspace, &plist, my_var_buffer.data());
107 for (hsize_t i = 0; i < my_available; ++i) {
108 if (my_var_buffer[i] == NULL) {
109 throw std::runtime_error(
"detected a NULL pointer for a variable length string in '" +
get_name(*my_data_ptr) +
"'");
111 auto& curstr = buffer[i];
113 curstr.insert(0, my_var_buffer[i]);
117 my_data_ptr->read(my_fix_buffer.data(), my_dtype, my_mspace, my_fspace);
118 for (I<
decltype(my_available)> i = 0; i < my_available; ++i) {
119 auto& curstr = buffer[i];
121 auto bptr = my_fix_buffer.data() + sanisizer::product_unsafe<std::size_t>(i, my_fixed_length);
122 curstr.insert(curstr.end(), bptr, bptr +
strnlen(bptr, my_fixed_length));
155 static_assert(std::is_base_of<H5::DataSet, I<
decltype(*my_data_ptr)> >::value);