diff --git a/test/triqs/h5/CMakeLists.txt b/test/triqs/h5/CMakeLists.txt new file mode 100644 index 00000000..917a5baf --- /dev/null +++ b/test/triqs/h5/CMakeLists.txt @@ -0,0 +1,2 @@ +all_tests() + diff --git a/test/triqs/h5/map_h5.cpp b/test/triqs/h5/map_h5.cpp new file mode 100644 index 00000000..11f5e8ae --- /dev/null +++ b/test/triqs/h5/map_h5.cpp @@ -0,0 +1,58 @@ +/******************************************************************************* + * + * TRIQS: a Toolbox for Research in Interacting Quantum Systems + * + * Copyright (C) 2011 by O. Parcollet + * + * TRIQS is free software: you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * TRIQS. If not, see . + * + ******************************************************************************/ +#include +#include +#include + +namespace h5 = triqs::h5; + +int main(int argc, char **argv) { + + try { + + // write + std::map m = { {"a",1}, {"b",2} }; + std::map> mv = { {"a",{1.0, 2.0}}, {"b",{2.0, 3.0, 4.0}} }; + + H5::H5File file1("test_map.h5", H5F_ACC_TRUNC); + h5::group top1(file1); + h5_write(top1, "map_int", m); + h5_write(top1, "map_vec", mv); + + // read + std::map mm = { {"c",1} }; + std::map> mmv = { {"c",{1.0}} }; + + H5::H5File file2("test_map.h5", H5F_ACC_RDONLY); + h5::group top2(file2); + h5_read(top2, "map_int", mm); + h5_read(top2, "map_vec", mmv); + + for (auto const & val: mm) std::cout << val.first << " " << val.second << std::endl; + for (auto const & val: mmv) { + std::cout << val.first << std::endl; + for (auto const & x: val.second) std::cout << x << std::endl; + } + + } + TRIQS_CATCH_AND_ABORT; +} + diff --git a/triqs/h5.hpp b/triqs/h5.hpp index 100b6a47..7b8ef728 100644 --- a/triqs/h5.hpp +++ b/triqs/h5.hpp @@ -23,6 +23,7 @@ #include "./h5/group.hpp" #include "./h5/scalar.hpp" #include "./h5/vector.hpp" +#include "./h5/map.hpp" #include "./h5/string.hpp" //#include "./h5/make_h5_read_write.hpp" diff --git a/triqs/h5/map.hpp b/triqs/h5/map.hpp new file mode 100644 index 00000000..318d2f80 --- /dev/null +++ b/triqs/h5/map.hpp @@ -0,0 +1,56 @@ +/******************************************************************************* + * + * TRIQS: a Toolbox for Research in Interacting Quantum Systems + * + * Copyright (C) 2011 by O. Parcollet + * + * TRIQS is free software: you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * TRIQS. If not, see . + * + ******************************************************************************/ +#pragma once + +#include "group.hpp" +#include "string.hpp" +#include + +namespace triqs { + + template + std::string get_triqs_hdf5_data_scheme(std::map const&) { + using triqs::get_triqs_hdf5_data_scheme; + return "std::map"; + } + + namespace h5 { + + template + void h5_write (group f, std::string const & name, std::map const & M) { + auto gr = f.create_group(name); + for (auto& pvp : M) h5_write(gr, pvp.first, pvp.second); + } + + template + void h5_read (group f, std::string const & name, std::map & M) { + auto gr = f.open_group(name); + M.clear(); + T value; + for (auto const & x: gr.get_all_dataset_names()) { + h5_read(gr, x, value); + M.emplace(x, value); + } + } + + } +} +