11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
# File 'lib/hdf5/attribute.rb', line 11
def read
type_id = HDF5::FFI.H5Aget_type(@attr_id)
raise HDF5::Error, 'Failed to get attribute datatype' if type_id < 0
space_id = HDF5::FFI.H5Aget_space(@attr_id)
raise HDF5::Error, 'Failed to get attribute dataspace' if space_id < 0
return HDF5::Empty.new(DType.for_hdf5(type_id)) if HDF5::FFI.H5Sget_simple_extent_type(space_id) == :H5S_NULL
return read_string(type_id, space_id) if HDF5::FFI.H5Tget_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 HDF5::Error, '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
HDF5::FFI.H5Tclose(type_id) if type_id && type_id >= 0
HDF5::FFI.H5Sclose(space_id) if space_id && space_id >= 0
end
|