14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
# File 'lib/hdf5/attribute.rb', line 14
def read
raise ClosedError, 'HDF5 attribute is closed' if @attr_id.nil?
@context&.ensure_open!(@dataset_id)
type_id = HDF5::FFI.H5Aget_type(@attr_id)
raise NativeError, 'Failed to get attribute datatype' if type_id < 0
space_id = HDF5::FFI.H5Aget_space(@attr_id)
raise NativeError, 'Failed to get attribute dataspace' if space_id < 0
return HDF5::Empty.new(DType.for_hdf5(type_id)) if Native.extent_type(space_id) == :H5S_NULL
return read_string(type_id, space_id) if Native.datatype_class(type_id) == :H5T_STRING
dtype_object = DType.for_hdf5(type_id)
attribute_shape = shape(space_id)
size = attribute_shape.empty? ? 1 : attribute_shape.inject(:*)
buffer = ::FFI::MemoryPointer.new(:char, size * dtype_object.itemsize)
status = HDF5::FFI.H5Aread(@attr_id, dtype_object.memory_type_id, buffer)
raise NativeError, 'Failed to read attribute' if status < 0
result = HDF5::DataHelpers.from_binary(dtype_object, buffer.read_bytes(size * dtype_object.itemsize),
attribute_shape)
return result unless attribute_shape.empty?
scalar = result.
dtype_object.kind == :bool ? !scalar.zero? : scalar
ensure
Native.close([:H5Tclose, type_id], [:H5Sclose, space_id])
end
|