61 auto vstring = internal_json::extract_version_for_type(metadata.
other,
"dense_array");
62 auto version = ritsuko::parse_version_string(vstring.c_str(), vstring.size(),
true);
63 if (version.major != 1) {
64 throw std::runtime_error(
"unsupported version '" + vstring +
"'");
67 auto handle = ritsuko::hdf5::open_file(path /
"array.h5");
68 auto ghandle = ritsuko::hdf5::open_group(handle,
"dense_array");
69 internal::is_transposed(ghandle);
70 auto dhandle = ritsuko::hdf5::open_dataset(ghandle,
"data");
72 auto dspace = dhandle.getSpace();
73 size_t ndims = dspace.getSimpleExtentNdims();
75 throw std::runtime_error(
"expected 'data' array to have at least one dimension");
77 std::vector<hsize_t> extents(ndims);
78 dspace.getSimpleExtentDims(extents.data());
80 auto type = ritsuko::hdf5::open_and_load_scalar_string_attribute(ghandle,
"type");
81 if (type ==
"integer") {
82 if (ritsuko::hdf5::exceeds_integer_limit(dhandle, 32,
true)) {
83 throw std::runtime_error(
"expected integer array to have a datatype that fits into a 32-bit signed integer");
85 }
else if (type ==
"boolean") {
86 if (ritsuko::hdf5::exceeds_integer_limit(dhandle, 32,
true)) {
87 throw std::runtime_error(
"expected boolean array to have a datatype that fits into a 32-bit signed integer");
89 }
else if (type ==
"number") {
90 if (ritsuko::hdf5::exceeds_float_limit(dhandle, 64)) {
91 throw std::runtime_error(
"expected number array to have a datatype that fits into a 64-bit float");
93 }
else if (type ==
"string") {
94 if (!ritsuko::hdf5::is_utf8_string(dhandle)) {
95 throw std::runtime_error(
"expected string array to have a datatype that can be represented by a UTF-8 encoded string");
97 ritsuko::hdf5::validate_nd_string_dataset(dhandle, extents, options.
hdf5_buffer_size);
99 throw std::runtime_error(
"unknown array type '" + type +
"'");
102 if (dhandle.attrExists(
"missing-value-placeholder")) {
103 auto attr = dhandle.openAttribute(
"missing-value-placeholder");
104 ritsuko::hdf5::check_missing_placeholder_attribute(dhandle, attr);
107 if (ghandle.exists(
"names")) {
108 internal_array::check_dimnames(ghandle,
"names", extents, options);
119 auto handle = ritsuko::hdf5::open_file(path /
"array.h5");
120 auto ghandle = ritsuko::hdf5::open_group(handle,
"dense_array");
122 auto dhandle = ritsuko::hdf5::open_dataset(ghandle,
"data");
123 auto dspace = dhandle.getSpace();
124 size_t ndims = dspace.getSimpleExtentNdims();
125 std::vector<hsize_t> extents(ndims);
126 dspace.getSimpleExtentDims(extents.data());
128 if (internal::is_transposed(ghandle)) {
129 return extents.back();
131 return extents.front();
142 auto handle = ritsuko::hdf5::open_file(path /
"array.h5");
143 auto ghandle = ritsuko::hdf5::open_group(handle,
"dense_array");
145 auto dhandle = ritsuko::hdf5::open_dataset(ghandle,
"data");
146 auto dspace = dhandle.getSpace();
147 size_t ndims = dspace.getSimpleExtentNdims();
148 std::vector<hsize_t> extents(ndims);
149 dspace.getSimpleExtentDims(extents.data());
151 if (internal::is_transposed(ghandle)) {
152 return std::vector<size_t>(extents.rbegin(), extents.rend());
154 return std::vector<size_t>(extents.begin(), extents.end());
size_t height(const std::filesystem::path &path, const ObjectMetadata &metadata, Options &options)
Definition dense_array.hpp:118
std::vector< size_t > dimensions(const std::filesystem::path &path, const ObjectMetadata &metadata, Options &options)
Definition dense_array.hpp:141