11module HDF5
22 class Dataset
3- class << self
4- def create ( parent_id , name , data )
5- values = normalize_data ( data )
6- dims = ::FFI ::MemoryPointer . new ( :ulong_long , 1 )
7- dims . write_array_of_ulong_long ( [ values . length ] )
8- datatype_id = datatype_id_for ( values )
9- dataspace_id = HDF5 ::FFI . H5Screate_simple ( 1 , dims , nil )
10- raise HDF5 ::Error , "Failed to create dataspace for dataset: #{ name } " if dataspace_id < 0
11-
12- dataset = from_id (
13- HDF5 ::FFI . H5Dcreate2 ( parent_id , name , datatype_id , dataspace_id , HDF5 ::DEFAULT_PROPERTY_LIST ,
14- HDF5 ::DEFAULT_PROPERTY_LIST , HDF5 ::DEFAULT_PROPERTY_LIST ) , name
15- )
16- dataset . write ( values )
17- return dataset unless block_given?
18-
19- begin
20- yield dataset
21- ensure
22- dataset . close
23- end
24- ensure
25- HDF5 ::FFI . H5Sclose ( dataspace_id ) if dataspace_id && dataspace_id >= 0
26- end
27-
28- def open ( parent_id , name )
29- dataset = from_id ( HDF5 ::FFI . H5Dopen2 ( parent_id , name , HDF5 ::DEFAULT_PROPERTY_LIST ) , name )
30- return dataset unless block_given?
31-
32- begin
33- yield dataset
34- ensure
35- dataset . close
36- end
37- end
3+ module DataHelpers
4+ module_function
385
396 def normalize_data ( data )
407 values = data . is_a? ( Array ) ? data : [ data ]
@@ -82,8 +49,45 @@ def validate_native_int_range!(values)
8249 raise HDF5 ::Error ,
8350 "Integer value #{ out_of_range } is outside native int range (#{ min } ..#{ max } ). Use a smaller value."
8451 end
52+ end
53+
54+ private_constant :DataHelpers
55+
56+ class << self
57+ def create ( parent_id , name , data )
58+ values = DataHelpers . normalize_data ( data )
59+ dims = ::FFI ::MemoryPointer . new ( :ulong_long , 1 )
60+ dims . write_array_of_ulong_long ( [ values . length ] )
61+ datatype_id = DataHelpers . datatype_id_for ( values )
62+ dataspace_id = HDF5 ::FFI . H5Screate_simple ( 1 , dims , nil )
63+ raise HDF5 ::Error , "Failed to create dataspace for dataset: #{ name } " if dataspace_id < 0
64+
65+ dataset = from_id (
66+ HDF5 ::FFI . H5Dcreate2 ( parent_id , name , datatype_id , dataspace_id , HDF5 ::DEFAULT_PROPERTY_LIST ,
67+ HDF5 ::DEFAULT_PROPERTY_LIST , HDF5 ::DEFAULT_PROPERTY_LIST ) , name
68+ )
69+ dataset . write ( values )
70+ return dataset unless block_given?
71+
72+ begin
73+ yield dataset
74+ ensure
75+ dataset . close
76+ end
77+ ensure
78+ HDF5 ::FFI . H5Sclose ( dataspace_id ) if dataspace_id && dataspace_id >= 0
79+ end
8580
86- private :normalize_data , :datatype_id_for , :buffer_for , :native_int_bounds , :validate_native_int_range!
81+ def open ( parent_id , name )
82+ dataset = from_id ( HDF5 ::FFI . H5Dopen2 ( parent_id , name , HDF5 ::DEFAULT_PROPERTY_LIST ) , name )
83+ return dataset unless block_given?
84+
85+ begin
86+ yield dataset
87+ ensure
88+ dataset . close
89+ end
90+ end
8791
8892 private
8993
@@ -103,9 +107,9 @@ def attrs
103107 end
104108
105109 def write ( data )
106- values = self . class . send ( : normalize_data, data )
107- mem_type_id = self . class . send ( : datatype_id_for, values )
108- buffer = self . class . send ( : buffer_for, values )
110+ values = DataHelpers . normalize_data ( data )
111+ mem_type_id = DataHelpers . datatype_id_for ( values )
112+ buffer = DataHelpers . buffer_for ( values )
109113 status = HDF5 ::FFI . H5Dwrite ( @dataset_id , mem_type_id , HDF5 ::DEFAULT_PROPERTY_LIST , HDF5 ::DEFAULT_PROPERTY_LIST ,
110114 HDF5 ::DEFAULT_PROPERTY_LIST , buffer )
111115 raise HDF5 ::Error , 'Failed to write dataset' if status < 0
0 commit comments