TRIQS/h5
2.0.0
C++ interface to HDF5
Toggle main menu visibility
Loading...
Searching...
No Matches
map.hpp
Go to the documentation of this file.
1
// Copyright (c) 2019-2024 Simons Foundation
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
// http://www.apache.org/licenses/LICENSE-2.0.txt
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14
//
15
// Authors: Thomas Hahn, Olivier Parcollet, Nils Wentzell, chuffa
16
21
22
#ifndef LIBH5_STL_MAP_HPP
23
#define LIBH5_STL_MAP_HPP
24
25
#include "
../format.hpp
"
26
#include "
../group.hpp
"
27
#include "
./string.hpp
"
28
29
#include <map>
30
#include <string>
31
#include <type_traits>
32
#include <utility>
33
34
namespace
h5 {
35
40
42
template
<
typename
Key,
typename
T,
typename
Compare>
43
struct
hdf5_format_impl
<std::map<Key, T, Compare>> {
44
static
std::string invoke() {
return
"Dict"
; }
45
};
46
57
template
<
typename
Key,
typename
T,
typename
Compare>
58
void
h5_write
(
group
g, std::string
const
&name, std::map<Key, T, Compare>
const
&m) {
59
// create the subgroup and write the hdf5_format tag
60
auto
gr = g.
create_group
(name);
61
write_hdf5_format
(gr, m);
62
63
// write element by element
64
if
constexpr
(std::is_same_v<Key, std::string>) {
65
// if key is a string, use it for the dataset name
66
for
(
auto
const
&[key, val] : m)
h5_write
(gr, key, val);
67
}
else
{
68
// otherwise, create a subgroup for each key-value pair
69
int
idx = 0;
70
for
(
auto
const
&[key, val] : m) {
71
auto
element_gr = gr.create_group(std::to_string(idx));
72
h5_write
(element_gr,
"key"
, key);
73
h5_write
(element_gr,
"val"
, val);
74
++idx;
75
}
76
}
77
}
78
89
template
<
typename
Key,
typename
T,
typename
Compare>
90
void
h5_read
(
group
g, std::string
const
&name, std::map<Key, T, Compare> &m) {
91
// open the subgroup and clear the map
92
auto
gr = g.
open_group
(name);
93
m.clear();
94
95
// loop over all subgroups and datasets in the current group
96
for
(
auto
const
&x : gr.get_all_subgroup_dataset_names()) {
97
T val;
98
if
constexpr
(std::is_same_v<Key, std::string>) {
99
// if key is a string, read from the dataset with the same name
100
h5_read
(gr, x, val);
101
m.emplace(x, std::move(val));
102
}
else
{
103
// otherwise, read from the subgroup
104
auto
element_gr = gr.open_group(x);
105
Key key;
106
h5_read
(element_gr,
"key"
, key);
107
h5_read
(element_gr,
"val"
, val);
108
m.emplace(std::move(key), std::move(val));
109
}
110
}
111
}
112
114
115
}
// namespace h5
116
117
#endif
// LIBH5_STL_MAP_HPP
h5::group
A handle to an HDF5 group.
Definition
group.hpp:44
h5::group::create_group
group create_group(std::string const &key, bool delete_if_exists=true) const
Create a subgroup with the given key in the group.
Definition
group.cpp:109
h5::group::open_group
group open_group(std::string const &key) const
Open a subgroup with the given key in the group.
Definition
group.cpp:96
format.hpp
Provides utilities for reading and writing hdf5_format tags.
group.hpp
Provides a handle to an HDF5 group and various methods to simplify the creation/opening of subgroups,...
h5::write_hdf5_format
void write_hdf5_format(object obj)
Write an hdf5_format tag for type T to an HDF5 attribute with the name 'Format'.
Definition
format.hpp:115
h5::h5_read
T h5_read(group g, std::string const &key)
Generic implementation for reading from an HDF5 dataset/subgroup.
Definition
generic.hpp:53
h5::h5_write
void h5_write(group g, std::string const &name, T const &x)
Write a scalar to an HDF5 dataset.
Definition
scalar.hpp:71
string.hpp
Provides functions to read/write std::string, char* and h5::char_buf objects from/to HDF5.
h5::hdf5_format_impl
Default type trait to get the hdf5_format tag of type T by calling its static member function T::hdf5...
Definition
format.hpp:52
h5
stl
map.hpp
Generated by
1.17.0