diff --git a/src/hdf5_interface.cpp b/src/hdf5_interface.cpp index 5d6926479c..74d26a58b6 100644 --- a/src/hdf5_interface.cpp +++ b/src/hdf5_interface.cpp @@ -327,7 +327,7 @@ get_groups(hid_t group_id, char* name[]) } std::vector -group_names(hid_t group_id) +member_names(hid_t group_id, H5O_type_t type) { // Determine number of links in the group H5G_info_t info; @@ -341,7 +341,7 @@ group_names(hid_t group_id) // 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; + if (oinfo.type != type) continue; // Get size of name size = 1 + H5Lget_name_by_idx(group_id, ".", H5_INDEX_NAME, H5_ITER_INC, @@ -356,6 +356,17 @@ group_names(hid_t group_id) return names; } +std::vector +group_names(hid_t group_id) +{ + return member_names(group_id, H5O_TYPE_GROUP); +} + +std::vector +dataset_names(hid_t group_id) +{ + return member_names(group_id, H5O_TYPE_DATASET); +} bool object_exists(hid_t object_id, const char* name) diff --git a/src/hdf5_interface.h b/src/hdf5_interface.h index 65a9e2c995..5f7f3064c0 100644 --- a/src/hdf5_interface.h +++ b/src/hdf5_interface.h @@ -74,6 +74,7 @@ read_nd_vector(hid_t obj_id, const char* name, bool must_have = false); std::vector attribute_shape(hid_t obj_id, const char* name); +std::vector dataset_names(hid_t group_id); void ensure_exists(hid_t group_id, const char* name); std::vector group_names(hid_t group_id); std::vector object_shape(hid_t obj_id); @@ -209,6 +210,25 @@ read_attribute(hid_t obj_id, const char* name, std::string& str) str = std::string{buffer, n}; } +// overload for std::vector +inline void +read_attribute(hid_t obj_id, const char* name, std::vector& vec) +{ + auto dims = attribute_shape(obj_id, name); + auto m = dims[0]; + + // Allocate a C char array to get strings + auto n = attribute_typesize(obj_id, name); + char buffer[m][n+1]; + + // Read char data in attribute + read_attr_string(obj_id, name, n, buffer[0]); + + for (int i = 0; i < m; ++i) { + vec.emplace_back(&buffer[i][0]); + } +} + //============================================================================== // Templates/overloads for read_dataset //==============================================================================