@@ -24,6 +24,8 @@ module ArrowFormat
2424 using FlatBuffers ::AppendAsBytes if FlatBuffers . const_defined? ( :AppendAsBytes )
2525
2626 class Array
27+ include Enumerable
28+
2729 attr_reader :type
2830 attr_reader :size
2931 alias_method :length , :size
@@ -64,18 +66,29 @@ def empty?
6466 @size . zero?
6567 end
6668
69+ def ==( other )
70+ return false unless other . is_a? ( self . class )
71+ return true if @validity_buffer . nil? and other . validity_buffer . nil?
72+ if @offset == other . offset and
73+ @size == other . size and
74+ @validity_buffer == other . validity_buffer
75+ return true
76+ end
77+ validity_bitmap == other . validity_bitmap
78+ end
79+
6780 protected
6881 def slice! ( offset , size )
6982 @offset = offset
7083 @size = size
7184 clear_cache
7285 end
7386
74- private
7587 def validity_bitmap
7688 @validity_bitmap ||= Bitmap . new ( @validity_buffer , @offset , @size )
7789 end
7890
91+ private
7992 def apply_validity ( array )
8093 return array if @validity_buffer . nil?
8194 validity_bitmap . each_with_index do |is_valid , i |
@@ -159,11 +172,20 @@ def n_nulls
159172 def to_a
160173 [ nil ] * @size
161174 end
175+
176+ def each
177+ return to_enum ( __method__ ) unless block_given?
178+
179+ @size . times do
180+ yield ( nil )
181+ end
182+ end
162183 end
163184
164185 class PrimitiveArray < Array
165186 include BufferAlignable
166187
188+ attr_reader :values_buffer
167189 def initialize ( *args )
168190 n_args = args . size
169191 if self . class . respond_to? ( :type )
@@ -173,7 +195,7 @@ def initialize(*args)
173195 type = args . shift
174196 expected_n_args = "2 or 4"
175197 end
176- args = build_data ( args [ 0 ] , type ) if args . size == 1
198+ args = build_data ( args [ 0 ] , type ) if n_args == 1
177199 if args . size != 3
178200 message =
179201 "wrong number of arguments " +
@@ -192,15 +214,49 @@ def to_a
192214 apply_validity ( @values_buffer . values ( @type . buffer_type , offset , @size ) )
193215 end
194216
217+ def each ( &block )
218+ return to_enum ( __method__ ) { @size } unless block_given?
219+
220+ each_value = Enumerator . new ( @size ) do |yielder |
221+ offset = element_size * @offset
222+ @values_buffer . each ( @type . buffer_type , offset , @size ) do |_ , value |
223+ yielder << value
224+ end
225+ end
226+ if @validity_buffer . nil?
227+ each_value . each ( &block )
228+ else
229+ validity_bitmap . zip ( each_value ) do |is_valid , value |
230+ if is_valid
231+ yield ( value )
232+ else
233+ yield ( nil )
234+ end
235+ end
236+ end
237+ end
238+
195239 def each_buffer
196- return to_enum ( __method__ ) unless block_given?
240+ return to_enum ( __method__ ) { 2 } unless block_given?
197241
198242 yield ( slice_bitmap_buffer ( :validity , @validity_buffer ) )
199243 yield ( slice_fixed_element_size_buffer ( :values ,
200244 @values_buffer ,
201245 element_size ) )
202246 end
203247
248+ def ==( other )
249+ return false unless super ( other )
250+ if @offset == other . offset and
251+ @size == other . size and
252+ @values_buffer == other . values_buffer
253+ return true
254+ end
255+ zip ( other ) . all? do |value , other_value |
256+ value == other_value
257+ end
258+ end
259+
204260 private
205261 def element_size
206262 IO ::Buffer . size_of ( @type . buffer_type )
@@ -243,8 +299,26 @@ def to_a
243299 apply_validity ( values )
244300 end
245301
302+
303+ def each ( &block )
304+ return to_enum ( __method__ ) { @size } unless block_given?
305+
306+ @values_bitmap ||= Bitmap . new ( @values_buffer , @offset , @size )
307+ if @validity_buffer . nil?
308+ @values_bitmap . each ( &block )
309+ else
310+ validity_bitmap . zip ( @values_bitmap ) do |is_valid , value |
311+ if is_valid
312+ yield ( value )
313+ else
314+ yield ( nil )
315+ end
316+ end
317+ end
318+ end
319+
246320 def each_buffer
247- return to_enum ( __method__ ) unless block_given?
321+ return to_enum ( __method__ ) { 2 } unless block_given?
248322
249323 yield ( slice_bitmap_buffer ( :validity , @validity_buffer ) )
250324 yield ( slice_bitmap_buffer ( :values , @values_buffer ) )
0 commit comments