mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
added: HDF5File::list
lists a given HDF5 group
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user