9#ifndef H5DATASPACE_MISC_HPP
10#define H5DATASPACE_MISC_HPP
13#include <initializer_list>
31 :
DataSpace(std::vector<size_t>(items)) {}
33template<
typename... Args>
35 :
DataSpace(std::vector<size_t>{dim1,
static_cast<size_t>(dims)...}) {}
37template <
class IT,
typename>
39 std::vector<hsize_t> real_dims(begin, end);
41 if ((
_hid = H5Screate_simple(
int(real_dims.size()), real_dims.data(),
48 const std::vector<size_t>& maxdims) {
50 if (dims.size() != maxdims.size()) {
54 std::vector<hsize_t> real_dims(dims.begin(), dims.end());
55 std::vector<hsize_t> real_maxdims(maxdims.begin(), maxdims.end());
58 std::replace(real_maxdims.begin(), real_maxdims.end(),
61 if ((
_hid = H5Screate_simple(
int(dims.size()), real_dims.data(),
62 real_maxdims.data())) < 0) {
68 H5S_class_t h5_dataspace_type;
71 h5_dataspace_type = H5S_SCALAR;
74 h5_dataspace_type = H5S_NULL;
78 "datascape_scalar or datascape_null");
81 if ((
_hid = H5Screate(h5_dataspace_type)) < 0) {
88 if ((res.
_hid = H5Scopy(
_hid)) < 0) {
95 const int ndim = H5Sget_simple_extent_ndims(
_hid);
97 HDF5ErrMapper::ToException<DataSetException>(
98 "Unable to get dataspace number of dimensions");
106 if (H5Sget_simple_extent_dims(
_hid, dims.data(), NULL) < 0) {
107 HDF5ErrMapper::ToException<DataSetException>(
108 "Unable to get dataspace dimensions");
111 return details::to_vector_size_t(std::move(dims));
116 return std::accumulate(dims.begin(), dims.end(),
size_t{1u},
117 std::multiplies<size_t>());
122 if (H5Sget_simple_extent_dims(
_hid, NULL, maxdims.data()) < 0) {
123 HDF5ErrMapper::ToException<DataSetException>(
124 "Unable to get dataspace dimensions");
127 std::replace(maxdims.begin(), maxdims.end(), H5S_UNLIMITED,
129 return details::to_vector_size_t(maxdims);
134 auto dims = details::inspector<T>::getDimensions(value);
138template <std::
size_t N, std::
size_t W
idth>
146inline bool checkDimensions(
const DataSpace& mem_space,
size_t input_dims) {
148 if (input_dims == dataset_dims)
152 for (
auto i = dims.crbegin(); i != --dims.crend() && *i == 1; ++i)
155 if (input_dims == dataset_dims)
158 dataset_dims = dims.size();
159 for (
auto i = dims.cbegin(); i != --dims.cend() && *i == 1; ++i)
162 if (input_dims == dataset_dims)
166 return input_dims == 0 && dataset_dims == 1 && dims[dims.size() - 1] == 1;
Exception specific to HighFive DataSpace interface.
Definition: H5Exception.hpp:99
Class representing the space (dimensions) of a dataset.
Definition: H5DataSpace.hpp:37
static DataSpace FromCharArrayStrings(const char(&)[N][Width])
Definition: H5Dataspace_misc.hpp:139
static DataSpace From(const T &value)
Create a dataspace matching a type accepted by details::inspector.
Definition: H5Dataspace_misc.hpp:133
size_t getNumberDimensions() const
getNumberDimensions
Definition: H5Dataspace_misc.hpp:94
std::vector< size_t > getMaxDimensions() const
getMaxDimensions
Definition: H5Dataspace_misc.hpp:120
DataspaceType
dataspace type
Definition: H5DataSpace.hpp:45
@ datascape_null
Definition: H5DataSpace.hpp:47
@ datascape_scalar
Definition: H5DataSpace.hpp:46
size_t getElementCount() const
getElementCount
Definition: H5Dataspace_misc.hpp:114
std::vector< size_t > getDimensions() const
getDimensions
Definition: H5Dataspace_misc.hpp:103
DataSpace clone() const
Definition: H5Dataspace_misc.hpp:86
static const size_t UNLIMITED
Definition: H5DataSpace.hpp:42
hid_t _hid
Definition: H5Object.hpp:87
Definition: H5_definitions.hpp:15