diff --git a/src/hdf5_interface.cpp b/src/hdf5_interface.cpp index 726e036e60..ff1d173b34 100644 --- a/src/hdf5_interface.cpp +++ b/src/hdf5_interface.cpp @@ -51,6 +51,35 @@ get_shape(hid_t obj_id, hsize_t* dims) } +std::vector attribute_shape(hid_t obj_id, const char* name) +{ + hid_t attr = H5Aopen(obj_id, name, H5P_DEFAULT); + std::vector shape = object_shape(attr); + H5Aclose(attr); + return shape; +} + +std::vector object_shape(hid_t obj_id) +{ + // Get number of dimensions + auto type = H5Iget_type(obj_id); + hid_t dspace; + if (type == H5I_DATASET) { + dspace = H5Dget_space(obj_id); + } else if (type == H5I_ATTR) { + dspace = H5Aget_space(obj_id); + } + int n = H5Sget_simple_extent_ndims(dspace); + + // Get shape of array + std::vector shape(n); + H5Sget_simple_extent_dims(dspace, shape.data(), nullptr); + + // Free resources and return + H5Sclose(dspace); + return shape; +} + void get_shape_attr(hid_t obj_id, const char* name, hsize_t* dims) { diff --git a/src/hdf5_interface.h b/src/hdf5_interface.h index d7d30e0a0c..d9b744685c 100644 --- a/src/hdf5_interface.h +++ b/src/hdf5_interface.h @@ -72,6 +72,9 @@ read_nd_vector(hid_t obj_id, const char* name, std::vector > > > >& result, bool must_have = false); +std::vector attribute_shape(hid_t obj_id, const char* name); +std::vector object_shape(hid_t obj_id); + //============================================================================== // Fortran compatibility functions //==============================================================================