|
| 1 | +module HDF5 |
| 2 | + class File |
| 3 | + def initialize(filename, mode = 0) |
| 4 | + @filename = filename |
| 5 | + @mode = mode |
| 6 | + @file_id = HDF5::FFI.H5Fopen(filename, mode, 0) |
| 7 | + end |
| 8 | + |
| 9 | + def close |
| 10 | + HDF5::FFI.H5Fclose(@file_id) |
| 11 | + end |
| 12 | + |
| 13 | + def create_group(name) |
| 14 | + Group.new(@file_id, name) |
| 15 | + end |
| 16 | + |
| 17 | + def create_dataset(name, data) |
| 18 | + Dataset.new(@file_id, name, data) |
| 19 | + end |
| 20 | + |
| 21 | + def [](name) |
| 22 | + if HDF5::FFI.group_exists?(@file_id, name) |
| 23 | + Group.new(@file_id, name) |
| 24 | + elsif HDF5::FFI.dataset_exists?(@file_id, name) |
| 25 | + Dataset.new(@file_id, name, nil) |
| 26 | + else |
| 27 | + raise 'Group or Dataset not found' |
| 28 | + end |
| 29 | + end |
| 30 | + |
| 31 | + def list_entries |
| 32 | + list = [] |
| 33 | + callback = ::FFI::Function.new(:int, %i[int64_t string pointer pointer]) do |_, name, _, _| |
| 34 | + list << name |
| 35 | + 0 # continue |
| 36 | + end |
| 37 | + |
| 38 | + status = HDF5::FFI.H5Literate(@file_id, :H5_INDEX_NAME, :H5_ITER_NATIVE, nil, callback, nil) |
| 39 | + raise 'Failed to iterate over file entries' if status < 0 |
| 40 | + |
| 41 | + list |
| 42 | + end |
| 43 | + |
| 44 | + def [](name) |
| 45 | + if group?(name) |
| 46 | + Group.new(@file_id, name) |
| 47 | + elsif dataset?(name) |
| 48 | + Dataset.new(@file_id, name) |
| 49 | + else |
| 50 | + raise 'Unknown object type' |
| 51 | + end |
| 52 | + end |
| 53 | + |
| 54 | + private |
| 55 | + |
| 56 | + def group?(name) |
| 57 | + info = HDF5::FFI::H5OInfoT.new |
| 58 | + HDF5::FFI.H5Oget_info_by_name(@file_id, name, info, 0) |
| 59 | + info[:type] == :H5O_TYPE_GROUP |
| 60 | + end |
| 61 | + |
| 62 | + def dataset?(name) |
| 63 | + info = HDF5::FFI::H5OInfoT.new |
| 64 | + HDF5::FFI.H5Oget_info_by_name(@file_id, name, info, 0) |
| 65 | + info[:type] == :H5O_TYPE_DATASET |
| 66 | + end |
| 67 | + end |
| 68 | +end |
0 commit comments