h5gt 0.2.0
C++ wrapper for HDF5 library (based on HighFive project)
Loading...
Searching...
No Matches
H5Dataspace_misc.hpp
1/*
2 * Copyright (c), 2017, Adrien Devresse <adrien.devresse@epfl.ch>
3 *
4 * Distributed under the Boost Software License, Version 1.0.
5 * (See accompanying file LICENSE_1_0.txt or copy at
6 * http://www.boost.org/LICENSE_1_0.txt)
7 *
8 */
9#ifndef H5DATASPACE_MISC_HPP
10#define H5DATASPACE_MISC_HPP
11
12#include <array>
13#include <initializer_list>
14#include <vector>
15#include <numeric>
16
17#include <H5Spublic.h>
18
19#include "H5Utils.hpp"
20
21namespace h5gt {
22
23inline DataSpace::DataSpace(const std::vector<size_t>& dims)
24 : DataSpace(dims.begin(), dims.end()) {}
25
26template <size_t N>
27inline DataSpace::DataSpace(const std::array<size_t, N>& dims)
28 : DataSpace(dims.begin(), dims.end()) {}
29
30inline DataSpace::DataSpace(const std::initializer_list<size_t>& items)
31 : DataSpace(std::vector<size_t>(items)) {}
32
33template<typename... Args>
34inline DataSpace::DataSpace(size_t dim1, Args... dims)
35 : DataSpace(std::vector<size_t>{dim1, static_cast<size_t>(dims)...}) {}
36
37template <class IT, typename>
38inline DataSpace::DataSpace(const IT begin, const IT end) {
39 std::vector<hsize_t> real_dims(begin, end);
40
41 if ((_hid = H5Screate_simple(int(real_dims.size()), real_dims.data(),
42 NULL)) < 0) {
43 throw DataSpaceException("Impossible to create dataspace");
44 }
45}
46
47inline DataSpace::DataSpace(const std::vector<size_t>& dims,
48 const std::vector<size_t>& maxdims) {
49
50 if (dims.size() != maxdims.size()) {
51 throw DataSpaceException("dims and maxdims must be the same length.");
52 }
53
54 std::vector<hsize_t> real_dims(dims.begin(), dims.end());
55 std::vector<hsize_t> real_maxdims(maxdims.begin(), maxdims.end());
56
57 // Replace unlimited flag with actual HDF one
58 std::replace(real_maxdims.begin(), real_maxdims.end(),
59 static_cast<hsize_t>(DataSpace::UNLIMITED), H5S_UNLIMITED);
60
61 if ((_hid = H5Screate_simple(int(dims.size()), real_dims.data(),
62 real_maxdims.data())) < 0) {
63 throw DataSpaceException("Impossible to create dataspace");
64 }
65} // namespace h5gt
66
67inline DataSpace::DataSpace(DataSpace::DataspaceType dtype) {
68 H5S_class_t h5_dataspace_type;
69 switch (dtype) {
70 case DataSpace::datascape_scalar:
71 h5_dataspace_type = H5S_SCALAR;
72 break;
73 case DataSpace::datascape_null:
74 h5_dataspace_type = H5S_NULL;
75 break;
76 default:
77 throw DataSpaceException("Invalid dataspace type: should be "
78 "datascape_scalar or datascape_null");
79 }
80
81 if ((_hid = H5Screate(h5_dataspace_type)) < 0) {
82 throw DataSpaceException("Unable to create dataspace");
83 }
84}
85
87 DataSpace res;
88 if ((res._hid = H5Scopy(_hid)) < 0) {
89 throw DataSpaceException("Unable to copy dataspace");
90 }
91 return res;
92}
93
94inline size_t DataSpace::getNumberDimensions() const {
95 const int ndim = H5Sget_simple_extent_ndims(_hid);
96 if (ndim < 0) {
97 HDF5ErrMapper::ToException<DataSetException>(
98 "Unable to get dataspace number of dimensions");
99 }
100 return size_t(ndim);
101}
102
103inline std::vector<size_t> DataSpace::getDimensions() const {
104 std::vector<hsize_t> dims(getNumberDimensions());
105 if (!dims.empty()) {
106 if (H5Sget_simple_extent_dims(_hid, dims.data(), NULL) < 0) {
107 HDF5ErrMapper::ToException<DataSetException>(
108 "Unable to get dataspace dimensions");
109 }
110 }
111 return details::to_vector_size_t(std::move(dims));
112}
113
114inline size_t DataSpace::getElementCount() const {
115 const std::vector<size_t>& dims = getDimensions();
116 return std::accumulate(dims.begin(), dims.end(), size_t{1u},
117 std::multiplies<size_t>());
118}
119
121 return H5Sget_select_npoints(_hid);
122}
123
124inline std::vector<size_t> DataSpace::getMaxDimensions() const {
125 std::vector<hsize_t> maxdims(getNumberDimensions());
126 if (H5Sget_simple_extent_dims(_hid, NULL, maxdims.data()) < 0) {
127 HDF5ErrMapper::ToException<DataSetException>(
128 "Unable to get dataspace dimensions");
129 }
130
131 std::replace(maxdims.begin(), maxdims.end(), H5S_UNLIMITED,
132 static_cast<hsize_t>(DataSpace::UNLIMITED));
133 return details::to_vector_size_t(maxdims);
134}
135
136template <typename T>
137inline DataSpace DataSpace::From(const T& value) {
138 auto dims = details::inspector<T>::getDimensions(value);
139 return DataSpace(dims);
140}
141
142template <std::size_t N, std::size_t Width>
143inline DataSpace DataSpace::FromCharArrayStrings(const char(&)[N][Width]) {
144 return DataSpace(N);
145}
146
147namespace details {
148
150inline bool checkDimensions(const DataSpace& mem_space, size_t input_dims) {
151 size_t dataset_dims = mem_space.getNumberDimensions();
152 if (input_dims == dataset_dims)
153 return true;
154
155 const std::vector<size_t>& dims = mem_space.getDimensions();
156 for (auto i = dims.crbegin(); i != --dims.crend() && *i == 1; ++i)
157 --dataset_dims;
158
159 if (input_dims == dataset_dims)
160 return true;
161
162 dataset_dims = dims.size();
163 for (auto i = dims.cbegin(); i != --dims.cend() && *i == 1; ++i)
164 --dataset_dims;
165
166 if (input_dims == dataset_dims)
167 return true;
168
169 // The final tests is for scalars
170 return input_dims == 0 && dataset_dims == 1 && dims[dims.size() - 1] == 1;
171}
172
173} // namespace details
174} // namespace h5gt
175
176#endif // H5DATASPACE_MISC_HPP
Exception specific to h5gt DataSpace interface.
Definition H5Exception.hpp:99
Class representing the space (dimensions) of a dataset.
Definition H5DataSpace.hpp:37
size_t getElementCount() const
getElementCount
Definition H5Dataspace_misc.hpp:114
DataSpace clone() const
Definition H5Dataspace_misc.hpp:86
size_t getElementCountSelected() const
getElementCountSelected
Definition H5Dataspace_misc.hpp:120
static DataSpace From(const T &value)
Create a dataspace matching a type accepted by details::inspector.
Definition H5Dataspace_misc.hpp:137
DataspaceType
dataspace type
Definition H5DataSpace.hpp:45
size_t getNumberDimensions() const
getNumberDimensions
Definition H5Dataspace_misc.hpp:94
std::vector< size_t > getMaxDimensions() const
getMaxDimensions
Definition H5Dataspace_misc.hpp:124
std::vector< size_t > getDimensions() const
getDimensions
Definition H5Dataspace_misc.hpp:103
Definition H5Utils.hpp:49