h5gt 0.2.0
C++ wrapper for HDF5 library (based on HighFive project)
Loading...
Searching...
No Matches
H5SliceTraits_py.h
1#include "h5gt_py.h"
2
3namespace h5gtpy {
4
5namespace ext {
6
7template <typename Derivate, typename T>
8void write_vector_raw(SliceTraits<Derivate>& self, std::vector<T>& v){
9 self.write_raw(v.data(), AtomicType<T>());
10};
11
12template <typename Derivate, typename T>
13void write_eigen_raw(SliceTraits<Derivate>& self, py::EigenDRef<Eigen::MatrixX<T>> M){
14 self.write_raw(M.data(), AtomicType<T>());
15};
16
17template <typename Derivate, typename T>
18std::vector<T> read_vector_raw(SliceTraits<Derivate>& self){
19 static_assert(!std::is_const<T>::value,
20 "read() requires a non-const structure to read data into");
21 const auto& slice = static_cast<const Derivate&>(self);
22
23 std::vector<T> v;
24 v.resize(slice.getSpace().getElementCount());
25
26 slice.read(v.data(), slice.getDataType());
27 return v;
28}
29
30template <typename Derivate, typename T>
31Eigen::MatrixX<T> read_eigen_raw(SliceTraits<Derivate>& self){
32 static_assert(!std::is_const<T>::value,
33 "read() requires a non-const structure to read data into");
34 const auto& slice = static_cast<const Derivate&>(self);
35
36 std::vector<size_t> dims = slice.getSpace().getDimensions();
37
38 Eigen::MatrixX<T> M;
39 if (dims.size() == 1){
40 M.resize(dims[0], 1);
41 } else if (dims.size() == 2){
42 M.resize(dims[1], dims[0]);
43 } else {
44 M.resize(slice.getSpace().getElementCount(), 1);
45 }
46
47 slice.read(M.data(), slice.getDataType());
48 return M;
49}
50
51
52} // ext
53
54
55void ElementSet_py(py::class_<ElementSet> &py_obj);
56
57template <typename Derivate>
58void SliceTraits_py(py::class_<SliceTraits<Derivate> >& py_obj) {
59 py_obj
60 .def("select", py::overload_cast<
61 const std::vector<size_t>&,
62 const std::vector<size_t>&,
63 const std::vector<size_t>&,
64 const std::vector<size_t>&>(
66 py::arg("offset"),
67 py::arg("count"),
68 py::arg_v("stride", std::vector<size_t>(), "list()"),
69 py::arg_v("block", std::vector<size_t>(), "list()"))
70 .def("select", py::overload_cast<
71 const ElementSet&>(
73 py::arg("elements"))
74 .def("select_rows", py::overload_cast<
75 const std::vector<size_t>&, size_t, size_t>(
77 py::arg("ind"),
78 py::arg_v("offset", 0, "0"),
79 py::arg_v("count", 0, "0"))
80 .def("select_cols", py::overload_cast<
81 const std::vector<size_t>&, size_t, size_t>(
83 py::arg("ind"),
84 py::arg_v("offset", 0, "0"),
85 py::arg_v("count", 0, "0"))
86
87
88 // WRITE PY_TYPES
89 .def("write", &SliceTraits<Derivate>::template write<bool>,
90 py::arg("data"), "An exception is raised if the numbers of dimension of the buffer and of the dataset are different")
91 .def("write", &SliceTraits<Derivate>::template write<long long>)
92 .def("write", &SliceTraits<Derivate>::template write<double>)
93 .def("write", &SliceTraits<Derivate>::template write<std::complex<double>>)
94 .def("write", &SliceTraits<Derivate>::template write<std::string>)
95
96 // WRITE VECTOR_TYPES
97 .def("write", &SliceTraits<Derivate>::template write<std::vector<long long>>)
98 .def("write", &SliceTraits<Derivate>::template write<std::vector<double>>)
99 .def("write", &SliceTraits<Derivate>::template write<std::vector<std::complex<double>>>)
100 .def("write", &SliceTraits<Derivate>::template write<std::vector<std::string>>)
101
102 // WRITE EIGEN_TYPES
103 .def("write", &SliceTraits<Derivate>::template write<Eigen::MatrixX<bool>>)
104 .def("write", &SliceTraits<Derivate>::template write<Eigen::MatrixX<char>>)
105 .def("write", &SliceTraits<Derivate>::template write<Eigen::MatrixX<signed char>>)
106 .def("write", &SliceTraits<Derivate>::template write<Eigen::MatrixX<unsigned char>>)
107 .def("write", &SliceTraits<Derivate>::template write<Eigen::MatrixX<short>>)
108 .def("write", &SliceTraits<Derivate>::template write<Eigen::MatrixX<unsigned short>>)
109 .def("write", &SliceTraits<Derivate>::template write<Eigen::MatrixX<int>>)
110 .def("write", &SliceTraits<Derivate>::template write<Eigen::MatrixX<unsigned>>)
111 .def("write", &SliceTraits<Derivate>::template write<Eigen::MatrixX<long>>)
112 .def("write", &SliceTraits<Derivate>::template write<Eigen::MatrixX<unsigned long>>)
113 .def("write", &SliceTraits<Derivate>::template write<Eigen::MatrixX<long long>>)
114 .def("write", &SliceTraits<Derivate>::template write<Eigen::MatrixX<unsigned long long>>)
115 .def("write", &SliceTraits<Derivate>::template write<Eigen::MatrixX<float>>)
116 .def("write", &SliceTraits<Derivate>::template write<Eigen::MatrixX<double>>)
117 .def("write", &SliceTraits<Derivate>::template write<Eigen::MatrixX<std::complex<float>>>)
118 .def("write", &SliceTraits<Derivate>::template write<Eigen::MatrixX<std::complex<double>>>)
119
120
121 // WRITE_VECTOR_RAW
122 .def("write_raw", &ext::write_vector_raw<Derivate, long long>,
123 py::arg("data"),
124 "No dimensionality checks will be performed")
125 .def("write_raw", &ext::write_vector_raw<Derivate, double>,
126 py::arg("data"))
127 .def("write_raw", &ext::write_vector_raw<Derivate, std::complex<double>>,
128 py::arg("data"))
129// .def("write_raw", &ext::write_vector_raw<Derivate, const char*>, // without any error it doesn't write anything. Doesn't work
130// py::arg("data"))
131
132 // WRITE_EIGEN_RAW
133 .def("write_raw", &ext::write_eigen_raw<Derivate, bool>,
134 py::arg("data"))
135 .def("write_raw", &ext::write_eigen_raw<Derivate, char>,
136 py::arg("data"))
137 .def("write_raw", &ext::write_eigen_raw<Derivate, signed char>,
138 py::arg("data"))
139 .def("write_raw", &ext::write_eigen_raw<Derivate, unsigned char>,
140 py::arg("data"))
141 .def("write_raw", &ext::write_eigen_raw<Derivate, short>,
142 py::arg("data"))
143 .def("write_raw", &ext::write_eigen_raw<Derivate, unsigned short>,
144 py::arg("data"))
145 .def("write_raw", &ext::write_eigen_raw<Derivate, int>,
146 py::arg("data"))
147 .def("write_raw", &ext::write_eigen_raw<Derivate, unsigned>,
148 py::arg("data"))
149 .def("write_raw", &ext::write_eigen_raw<Derivate, long long>,
150 py::arg("data"))
151 .def("write_raw", &ext::write_eigen_raw<Derivate, unsigned long long>,
152 py::arg("data"))
153 .def("write_raw", &ext::write_eigen_raw<Derivate, float>,
154 py::arg("data"))
155 .def("write_raw", &ext::write_eigen_raw<Derivate, double>,
156 py::arg("data"))
157 .def("write_raw", &ext::write_eigen_raw<Derivate, std::complex<float>>,
158 py::arg("data"))
159 .def("write_raw", &ext::write_eigen_raw<Derivate, std::complex<double>>,
160 py::arg("data"))
161
162
163 // READ
164 .def("readBool", &ext::read_eigen_raw<Derivate, bool>)
165 .def("readChar", &ext::read_eigen_raw<Derivate, char>)
166 .def("readSChar", &ext::read_eigen_raw<Derivate, signed char>)
167 .def("readUChar", &ext::read_eigen_raw<Derivate, unsigned char>)
168 .def("readShort", &ext::read_eigen_raw<Derivate, short>)
169 .def("readUShort", &ext::read_eigen_raw<Derivate, unsigned short>)
170 .def("readInt", &ext::read_eigen_raw<Derivate, int>)
171 .def("readUInt", &ext::read_eigen_raw<Derivate, unsigned>)
172 .def("readLong", &ext::read_eigen_raw<Derivate, long>)
173 .def("readULong", &ext::read_eigen_raw<Derivate, unsigned long>)
174 .def("readLLong", &ext::read_eigen_raw<Derivate, long long>)
175 .def("readULLong", &ext::read_eigen_raw<Derivate, unsigned long long>)
176 .def("readFloat", &ext::read_eigen_raw<Derivate, float>)
177 .def("readDouble", &ext::read_eigen_raw<Derivate, double>)
178 .def("readCFloat", &ext::read_eigen_raw<Derivate, std::complex<float>>)
179 .def("readCDouble", &ext::read_eigen_raw<Derivate, std::complex<double>>)
180 .def("readStr", &ext::read_vector_raw<Derivate, const char*>);
181}
182
183} // h5gtpy
create an HDF5 DataType from a C++ type
Definition H5DataType.hpp:124
Definition H5Slice_traits.hpp:20
Definition H5Slice_traits.hpp:54
void write_raw(const T *buffer, const DataType &dtype=DataType())
Definition H5Slice_traits_misc.hpp:293