From 7ded07f9cfc710f973bd98ec07ed374d8379df35 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 11 Jul 2018 07:01:32 -0500 Subject: [PATCH] Add group_names function in HDF5 interface --- src/hdf5_interface.cpp | 30 ++++++++++++++++++++++++++++++ src/hdf5_interface.h | 1 + 2 files changed, 31 insertions(+) diff --git a/src/hdf5_interface.cpp b/src/hdf5_interface.cpp index ff1d173b3..db4dab96c 100644 --- a/src/hdf5_interface.cpp +++ b/src/hdf5_interface.cpp @@ -314,6 +314,36 @@ get_groups(hid_t group_id, char* name[]) } } +std::vector +group_names(hid_t group_id) +{ + // Determine number of links in the group + H5G_info_t info; + H5Gget_info(group_id, &info); + + // Iterate over links to get names + H5O_info_t oinfo; + size_t size; + std::vector names; + for (hsize_t i = 0; i < info.nlinks; ++i) { + // Determine type of object (and skip non-group) + H5Oget_info_by_idx(group_id, ".", H5_INDEX_NAME, H5_ITER_INC, i, &oinfo, + H5P_DEFAULT); + if (oinfo.type != H5O_TYPE_GROUP) continue; + + // Get size of name + size = 1 + H5Lget_name_by_idx(group_id, ".", H5_INDEX_NAME, H5_ITER_INC, + i, nullptr, 0, H5P_DEFAULT); + + // Read name + char buffer[size]; + H5Lget_name_by_idx(group_id, ".", H5_INDEX_NAME, H5_ITER_INC, i, + buffer, size, H5P_DEFAULT); + names.emplace_back(&buffer[0], size); + } + return names; +} + bool object_exists(hid_t object_id, const char* name) diff --git a/src/hdf5_interface.h b/src/hdf5_interface.h index 121b2c6c7..cd6056861 100644 --- a/src/hdf5_interface.h +++ b/src/hdf5_interface.h @@ -75,6 +75,7 @@ read_nd_vector(hid_t obj_id, const char* name, std::vector attribute_shape(hid_t obj_id, const char* name); std::vector object_shape(hid_t obj_id); +std::vector group_names(hid_t group_id); //============================================================================== // Fortran compatibility functions