10
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
38
39
40
41
42
43
44
|
# File 'lib/hdf5/attribute.rb', line 10
def read
type_id = HDF5::FFI.H5Aget_type(@attr_id)
space_id = HDF5::FFI.H5Aget_space(@attr_id)
size = HDF5::FFI.H5Sget_simple_extent_npoints(space_id)
buffer = \
case HDF5::FFI.H5Tget_class(type_id)
when :H5T_INTEGER
::FFI::MemoryPointer.new(:int, size)
when :H5T_FLOAT
::FFI::MemoryPointer.new(:double, size)
when :H5T_STRING
::FFI::MemoryPointer.new(:pointer, size)
else
raise HDF5::Error, 'Unsupported data type'
end
status = HDF5::FFI.H5Aread(@attr_id, type_id, buffer)
raise HDF5::Error, 'Failed to read attribute' if status < 0
case HDF5::FFI.H5Tget_class(type_id)
when :H5T_INTEGER
buffer.read_array_of_int(size)
when :H5T_FLOAT
buffer.read_array_of_double(size)
when :H5T_STRING
buffer.read_pointer.read_string
else
raise HDF5::Error, 'Unsupported data type'
end
ensure
HDF5::FFI.H5Tclose(type_id) if type_id && type_id >= 0
HDF5::FFI.H5Sclose(space_id) if space_id && space_id >= 0
end
|