1414# specific language governing permissions and limitations
1515# under the License.
1616
17+ require_relative "bitmap"
18+
1719module ArrowFormat
1820 class Array
1921 attr_reader :type
@@ -37,18 +39,9 @@ def null?(i)
3739 private
3840 def apply_validity ( array )
3941 return array if @validity_buffer . nil?
40- n_bytes = @size / 8
41- @validity_buffer . each ( :U8 , 0 , n_bytes ) do |offset , value |
42- 7 . times do |i |
43- array [ offset * 8 + i ] = nil if ( value & ( 1 << ( i % 8 ) ) ) . zero?
44- end
45- end
46- remained_bits = @size % 8
47- unless remained_bits . zero?
48- value = @validity_buffer . get_value ( :U8 , n_bytes )
49- remained_bits . times do |i |
50- array [ n_bytes * 8 + i ] = nil if ( value & ( 1 << ( i % 8 ) ) ) . zero?
51- end
42+ @validity_bitmap ||= Bitmap . new ( @validity_buffer , @size )
43+ @validity_bitmap . each_with_index do |bit , i |
44+ array [ i ] = nil if bit . zero?
5245 end
5346 array
5447 end
@@ -64,6 +57,21 @@ def to_a
6457 end
6558 end
6659
60+ class BooleanArray < Array
61+ def initialize ( type , size , validity_buffer , values_buffer )
62+ super ( type , size , validity_buffer )
63+ @values_buffer = values_buffer
64+ end
65+
66+ def to_a
67+ @values_bitmap ||= Bitmap . new ( @values_buffer , @size )
68+ values = @values_bitmap . each . collect do |bit |
69+ not bit . zero?
70+ end
71+ apply_validity ( values )
72+ end
73+ end
74+
6775 class IntArray < Array
6876 def initialize ( type , size , validity_buffer , values_buffer )
6977 super ( type , size , validity_buffer )
0 commit comments