| |
| |
| |
| |
| |
| |
| |
| |
|
|
| """ |
| Implements a portion of the selection operations. |
| """ |
|
|
| import numpy as np |
| from .. import h5s |
|
|
| def read_dtypes(dataset_dtype, names): |
| """ Returns a 2-tuple containing: |
| |
| 1. Output dataset dtype |
| 2. Dtype containing HDF5-appropriate description of destination |
| """ |
|
|
| if len(names) == 0: |
| format_dtype = dataset_dtype |
|
|
| elif dataset_dtype.names is None: |
| raise ValueError("Field names only allowed for compound types") |
|
|
| elif any(x not in dataset_dtype.names for x in names): |
| raise ValueError("Field does not appear in this type.") |
|
|
| else: |
| format_dtype = np.dtype([(name, dataset_dtype.fields[name][0]) for name in names]) |
|
|
| if len(names) == 1: |
| |
| output_dtype = format_dtype.fields[names[0]][0] |
|
|
| else: |
| output_dtype = format_dtype |
|
|
| return output_dtype, format_dtype |
|
|
|
|
| def read_selections_scalar(dsid, args): |
| """ Returns a 2-tuple containing: |
| |
| 1. Output dataset shape |
| 2. HDF5 dataspace containing source selection. |
| |
| Works for scalar datasets. |
| """ |
|
|
| if dsid.shape != (): |
| raise RuntimeError("Illegal selection function for non-scalar dataset") |
|
|
| if args == (): |
| |
| |
| out_shape = None |
|
|
| elif args == (Ellipsis,): |
| out_shape = () |
|
|
| else: |
| raise ValueError("Illegal slicing argument for scalar dataspace") |
|
|
| source_space = dsid.get_space() |
| source_space.select_all() |
|
|
| return out_shape, source_space |
|
|
| class ScalarReadSelection: |
|
|
| """ |
| Implements slicing for scalar datasets. |
| """ |
|
|
| def __init__(self, fspace, args): |
| if args == (): |
| self.mshape = None |
| elif args == (Ellipsis,): |
| self.mshape = () |
| else: |
| raise ValueError("Illegal slicing argument for scalar dataspace") |
|
|
| self.mspace = h5s.create(h5s.SCALAR) |
| self.fspace = fspace |
|
|
| def __iter__(self): |
| self.mspace.select_all() |
| yield self.fspace, self.mspace |
|
|
| def select_read(fspace, args): |
| """ Top-level dispatch function for reading. |
| |
| At the moment, only supports reading from scalar datasets. |
| """ |
| if fspace.shape == (): |
| return ScalarReadSelection(fspace, args) |
|
|
| raise NotImplementedError() |
|
|