added: HDF5File::list

lists a given HDF5 group
This commit is contained in:
Arne Morten Kvarving
2023-02-07 14:31:40 +01:00
parent afba3f948c
commit e5c2fcfaf2
3 changed files with 57 additions and 2 deletions

View File

@@ -109,7 +109,7 @@ void HDF5File::write(const std::string& group,
void HDF5File::read(const std::string& group,
const std::string& dset,
std::vector<char>& buffer)
std::vector<char>& buffer) const
{
hid_t dataset_id = H5Dopen2(m_file, (group + "/"+ dset).c_str(), H5P_DEFAULT);
if (dataset_id == H5I_INVALID_HID) {
@@ -123,4 +123,25 @@ void HDF5File::read(const std::string& group,
H5Dclose(dataset_id);
}
std::vector<std::string> HDF5File::list(const std::string& group) const
{
// Lambda function pushing the group entries to a vector
auto&& list_group = [] (hid_t, const char* name, const H5L_info_t*, void* data) -> herr_t
{
auto& list = *static_cast<std::vector<std::string>*>(data);
list.push_back(name);
return 0;
};
hsize_t idx = 0;
std::vector<std::string> result;
if (H5Literate_by_name(m_file, group.c_str(),
H5_INDEX_NAME, H5_ITER_INC,
&idx, list_group, &result, H5P_DEFAULT) < 0) {
throw std::runtime_error("Failure while listing HDF5 group '" + group + "'");
}
return result;
}
}

View File

@@ -62,7 +62,11 @@ public:
//! \details Throws exception on failure
void read(const std::string& group,
const std::string& dset,
std::vector<char>& buffer);
std::vector<char>& buffer) const;
//! \brief Lists the entries in a given group.
//! \details Note: Both datasets and subgroups are returned
std::vector<std::string> list(const std::string& group) const;
private:
hid_t m_file = H5I_INVALID_HID; //!< File handle

View File

@@ -94,3 +94,33 @@ BOOST_AUTO_TEST_CASE(WriteExistentDset)
std::filesystem::remove(path);
}
BOOST_AUTO_TEST_CASE(List)
{
auto path = std::filesystem::temp_directory_path() / Opm::unique_path("hdf5test%%%%%");
std::filesystem::create_directory(path);
auto rwpath = (path / "existent_dset.hdf5").string();
const std::vector<char> test_data{1,2,3,4,5,6,8,9};
{
Opm::HDF5File out_file(rwpath, Opm::HDF5File::OpenMode::OVERWRITE);
BOOST_CHECK_NO_THROW(out_file.write("/test_data", "d1", test_data));
BOOST_CHECK_NO_THROW(out_file.write("/test_data", "d2", test_data));
BOOST_CHECK_NO_THROW(out_file.write("/test_data/test", "d2", test_data));
}
{
Opm::HDF5File in_file(rwpath, Opm::HDF5File::OpenMode::READ);
auto res1 = in_file.list("/");
BOOST_CHECK_EQUAL(res1.size(), 1u);
BOOST_CHECK_EQUAL(res1[0], "test_data");
auto res2 = in_file.list("/test_data");
BOOST_CHECK_EQUAL(res2.size(), 3u);
BOOST_CHECK_EQUAL(res2[0], "d1");
BOOST_CHECK_EQUAL(res2[1], "d2");
BOOST_CHECK_EQUAL(res2[2], "test");
BOOST_CHECK_THROW(in_file.list("/not_there"), std::runtime_error);
}
std::filesystem::remove(rwpath);
std::filesystem::remove(path);
}