| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | """ |
| | 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() |
| |
|