18#include "../H5PropertyList.hpp"
30 ElementSet(std::initializer_list<std::size_t> list);
35 ElementSet(std::initializer_list<std::vector<std::size_t>> list);
41 explicit ElementSet(
const std::vector<std::size_t>& element_ids);
46 explicit ElementSet(
const std::vector<std::vector<std::size_t>>& element_ids);
49 std::vector<std::size_t> _ids;
51 template <
typename Derivate>
56 return detail::convertSizeVector<hsize_t>(from);
60 return detail::convertSizeVector<size_t>(from);
66template <
typename Impl>
70 return static_cast<const Impl&
>(*this).apply(space);
78 const std::vector<size_t>& count_ = {},
79 const std::vector<size_t>& stride_ = {},
80 const std::vector<size_t>& block_ = {})
87 std::vector<hsize_t> count_ = {},
88 std::vector<hsize_t> stride_ = {},
89 std::vector<hsize_t> block_ = {}) {
91 slab.
offset = std::move(offset_);
92 slab.count = std::move(count_);
93 slab.stride = std::move(stride_);
94 slab.block = std::move(block_);
100 return std::max(std::max(
offset.size(),
count.size()),
106 auto n_dims =
rank();
107 auto dims = std::vector<size_t>(n_dims, 0);
109 for (
size_t i = 0; i < n_dims; ++i) {
129 selects.emplace_back(sel, Op::Set);
139 selects.emplace_back(sel, Op::Or);
150 selects.emplace_back(sel, Op::And);
161 selects.emplace_back(sel, Op::Xor);
166 selects.emplace_back(sel, Op::NotA);
171 selects.emplace_back(sel, Op::NotB);
194 H5S_seloper_t convert(Op op)
const {
197 return H5S_SELECT_NOOP;
199 return H5S_SELECT_SET;
201 return H5S_SELECT_OR;
203 return H5S_SELECT_AND;
205 return H5S_SELECT_XOR;
207 return H5S_SELECT_NOTB;
209 return H5S_SELECT_NOTA;
211 return H5S_SELECT_APPEND;
213 return H5S_SELECT_PREPEND;
215 return H5S_SELECT_INVALID;
217 throw DataSpaceException(
"Invalid HyperSlab operation.");
221 struct Select_:
public RegularHyperSlab {
229 std::vector<Select_> selects;
233 auto space = outer_space.
clone();
234 detail::h5s_select_none(space.getId());
239 detail::h5s_select_hyperslab(space.
getId(),
241 sel.offset.empty() ?
nullptr : sel.offset.data(),
242 sel.stride.empty() ? nullptr : sel.stride.data(),
243 sel.count.empty() ? nullptr : sel.count.data(),
244 sel.block.empty() ? nullptr : sel.block.data());
247#if H5_VERSION_GE(1, 10, 6)
249 size_t detect_streak(Select_
const* begin, Select_
const* end, Op op)
const {
250 assert(op == Op::Or);
252 std::find_if(begin, end, [op](
const Select_& sel) {
return sel.op != op; });
253 return static_cast<size_t>(it - begin);
256 DataSpace combine_selections(
const DataSpace& left_space,
258 const DataSpace& right_space)
const {
259 assert(op == Op::Or);
261 auto left_type = detail::h5s_get_select_type(left_space.getId());
262 auto right_type = detail::h5s_get_select_type(right_space.getId());
266 if (left_type == H5S_SEL_NONE) {
268 }
else if (right_type == H5S_SEL_NONE) {
270 }
else if (left_type == H5S_SEL_ALL) {
272 }
else if (right_type == H5S_SEL_ALL) {
275 return detail::make_data_space(
276 detail::h5s_combine_select(left_space.getId(), convert(op), right_space.getId()));
291 DataSpace reduce_streak(
const DataSpace& outer_space,
292 Select_
const* begin,
295 assert(op == Op::Or);
298 throw std::runtime_error(
"Broken logic in 'DataSpace::reduce_streak'.");
301 std::ptrdiff_t distance = end - begin;
308 Select_
const* mid = begin + distance / 2;
309 auto right_space = reduce_streak(outer_space, begin, mid, op);
310 auto left_space = reduce_streak(outer_space, mid, end, op);
312 return combine_selections(left_space, op, right_space);
316 auto space = space_.
clone();
317 auto n_selects = selects.size();
318 for (
size_t i = 0; i < n_selects; ++i) {
319 auto const*
const begin = selects.data() + i;
320 auto const*
const end = selects.data() + n_selects;
322 auto n_ors = detect_streak(begin, end, Op::Or);
325 auto right_space = reduce_streak(space_, begin, begin + n_ors, Op::Or);
326 space = combine_selections(space, Op::Or, right_space);
328 }
else if (selects[i].op == Op::None) {
329 detail::h5s_select_none(space.getId());
338 auto space = space_.
clone();
339 for (
const auto& sel: selects) {
340 if (sel.op == Op::None) {
341 detail::h5s_select_none(space.getId());
419 template <
class... Slices>
424 std::vector<size_t> shape;
426 template <
typename Derivate>
430template <
typename Derivate>
441 template <
class Impl>
461 const std::vector<size_t>& count,
462 const std::vector<size_t>& stride = {},
463 const std::vector<size_t>& block = {})
const;
484 template <
typename T>
497 template <
typename T>
509 template <
typename T>
523 template <
typename T>
534 template <
typename T>
551 template <
typename T>
563 template <
typename T>
Class representing the space (dimensions) of a DataSet.
Definition H5DataSpace.hpp:39
DataSpace clone() const
Create a copy of the DataSpace which will have different id.
Definition H5Dataspace_misc.hpp:96
HDF5 Data Type.
Definition H5DataType.hpp:62
Definition H5Slice_traits.hpp:23
Definition H5Slice_traits.hpp:122
HyperSlab & notA(const RegularHyperSlab &sel)
Definition H5Slice_traits.hpp:165
DataSpace apply_impl(const DataSpace &space_) const
Definition H5Slice_traits.hpp:337
HyperSlab & notB(const RegularHyperSlab &sel)
Definition H5Slice_traits.hpp:170
HyperSlab operator&(const RegularHyperSlab &sel) const
Definition H5Slice_traits.hpp:143
HyperSlab operator^(const RegularHyperSlab &sel) const
Definition H5Slice_traits.hpp:154
HyperSlab operator|(const RegularHyperSlab &sel) const
Definition H5Slice_traits.hpp:132
HyperSlab & operator&=(const RegularHyperSlab &sel)
Definition H5Slice_traits.hpp:149
HyperSlab()
Definition H5Slice_traits.hpp:124
void select_hyperslab(DataSpace &space, const Select_ &sel) const
Definition H5Slice_traits.hpp:238
HyperSlab & operator^=(const RegularHyperSlab &sel)
Definition H5Slice_traits.hpp:160
DataSpace select_none(const DataSpace &outer_space) const
Definition H5Slice_traits.hpp:232
HyperSlab(const RegularHyperSlab &sel)
Definition H5Slice_traits.hpp:128
HyperSlab & operator|=(const RegularHyperSlab &sel)
Definition H5Slice_traits.hpp:138
DataSpace apply(const DataSpace &space_) const
Definition H5Slice_traits.hpp:175
A CRTP base class for hyper slab-like objects.
Definition H5Slice_traits.hpp:67
DataSpace apply(const DataSpace &space) const
Definition H5Slice_traits.hpp:69
hid_t getId() const noexcept
getId
Definition H5Object_misc.hpp:75
Selects the Cartesian product of slices.
Definition H5Slice_traits.hpp:417
HDF5 property Lists.
Definition H5PropertyList.hpp:138
Selection: represent a view on a slice/part of a dataset.
Definition H5Selection.hpp:27
Definition H5Slice_traits.hpp:431
Selection squeezeMemSpace(const std::vector< size_t > &axes) const
Return a Selection with axes squeezed from the memspace.
Definition H5Slice_traits_misc.hpp:465
T read(const DataTransferProps &xfer_props=DataTransferProps()) const
Definition H5Slice_traits_misc.hpp:321
void write(const T &buffer, const DataTransferProps &xfer_props=DataTransferProps())
Definition H5Slice_traits_misc.hpp:404
void read_raw(T *array, const DataType &mem_datatype, const DataTransferProps &xfer_props=DataTransferProps()) const
Definition H5Slice_traits_misc.hpp:375
Selection reshapeMemSpace(const std::vector< size_t > &dims) const
Return a Selection with a simple memspace with dims.
Definition H5Slice_traits_misc.hpp:476
Selection select(const HyperSlabInterface< Impl > &hyper_slab) const
Select an hyper_slab in the current Slice/Dataset.
Definition H5Slice_traits_misc.hpp:233
void write_raw(const T *buffer, const DataType &mem_datatype, const DataTransferProps &xfer_props=DataTransferProps())
Definition H5Slice_traits_misc.hpp:430
PropertyList< PropertyType::DATASET_XFER > DataTransferProps
Definition H5PropertyList.hpp:179
Definition assert_compatible_spaces.hpp:15
std::vector< size_t > toSTLSizeVector(const std::vector< hsize_t > &from)
Definition H5Slice_traits.hpp:59
std::vector< hsize_t > toHDF5SizeVector(const std::vector< size_t > &from)
Definition H5Slice_traits.hpp:55
Definition H5Slice_traits.hpp:74
size_t rank() const
Definition H5Slice_traits.hpp:99
std::vector< hsize_t > offset
Definition H5Slice_traits.hpp:116
RegularHyperSlab(const std::vector< size_t > &offset_, const std::vector< size_t > &count_={}, const std::vector< size_t > &stride_={}, const std::vector< size_t > &block_={})
Definition H5Slice_traits.hpp:77
std::vector< hsize_t > block
Definition H5Slice_traits.hpp:119
std::vector< size_t > packedDims() const
Dimensions when all gaps are removed.
Definition H5Slice_traits.hpp:105
RegularHyperSlab()=default
std::vector< hsize_t > count
Definition H5Slice_traits.hpp:117
static RegularHyperSlab fromHDF5Sizes(std::vector< hsize_t > offset_, std::vector< hsize_t > count_={}, std::vector< hsize_t > stride_={}, std::vector< hsize_t > block_={})
Definition H5Slice_traits.hpp:86
std::vector< hsize_t > stride
Definition H5Slice_traits.hpp:118