@@ -6,24 +6,27 @@ from ..dtypes import *
6
6
7
7
struct StringArray (Array ):
8
8
var data : ArrayData
9
- var bitmap : ArcPointer[Bitmap]
10
- var offsets : ArcPointer[Buffer]
11
- var values : ArcPointer[Buffer]
12
9
var capacity : Int
13
10
14
- fn __init__ (out self , data : ArrayData) raises :
11
+ fn __init__ (out self , var data : ArrayData) raises :
15
12
if data.dtype != string:
16
13
raise Error(
17
14
" Unexpected dtype '{} ' instead of 'string'." .format(data.dtype)
18
15
)
19
16
elif len (data.buffers) != 2 :
20
17
raise Error(" StringArray requires exactly two buffers" )
21
18
22
- self .data = data
23
- self .bitmap = data.bitmap
24
- self .offsets = data.buffers[0 ]
25
- self .values = data.buffers[1 ]
26
19
self .capacity = data.length
20
+ self .data = data^
21
+
22
+ fn bitmap (self ) -> ref [self .data.bitmap] ArcPointer[Bitmap]:
23
+ return self .data.bitmap
24
+
25
+ fn offsets (self ) -> ref [self .data.buffers] ArcPointer[Buffer]:
26
+ return self .data.buffers[0 ]
27
+
28
+ fn values (self ) -> ref [self .data.buffers] ArcPointer[Buffer]:
29
+ return self .data.buffers[1 ]
27
30
28
31
fn __init__ (out self , capacity : Int = 0 ):
29
32
var bitmap = Bitmap.alloc(capacity)
@@ -33,68 +36,67 @@ struct StringArray(Array):
33
36
offsets.unsafe_set[DType.uint32](0 , 0 )
34
37
35
38
self .capacity = capacity
36
- self .bitmap = ArcPointer(bitmap^ )
37
- self .offsets = ArcPointer(offsets^ )
38
- self .values = ArcPointer(values^ )
39
39
self .data = ArrayData(
40
40
dtype = string,
41
41
length = 0 ,
42
- bitmap = self . bitmap,
43
- buffers = List(self . offsets, self . values),
42
+ bitmap = ArcPointer( bitmap^ ) ,
43
+ buffers = List(ArcPointer( offsets^ ), ArcPointer( values^ ) ),
44
44
children = List[ArcPointer[ArrayData]](),
45
45
offset = 0 ,
46
46
)
47
47
48
48
fn __moveinit__ (out self , deinit existing : Self):
49
49
self .data = existing.data^
50
- self .bitmap = existing.bitmap^
51
- self .offsets = existing.offsets^
52
- self .values = existing.values^
53
50
self .capacity = existing.capacity
54
51
55
52
fn __len__ (self ) -> Int:
56
53
return self .data.length
57
54
58
- fn as_data (self ) -> ArrayData:
59
- return self .data
55
+ fn as_data [
56
+ self_origin : ImmutableOrigin
57
+ ](ref [self_origin]self ) -> UnsafePointer[ArrayData, mut=False ]:
58
+ return UnsafePointer(to = self .data)
59
+
60
+ fn take_data (deinit self ) -> ArrayData:
61
+ return self .data^
60
62
61
63
fn grow (mut self , capacity : Int):
62
- self .bitmap[].grow(capacity)
63
- self .offsets[].grow[DType.uint32](capacity + 1 )
64
+ self .bitmap() [].grow(capacity)
65
+ self .offsets() [].grow[DType.uint32](capacity + 1 )
64
66
self .capacity = capacity
65
67
66
68
# fn shrink_to_fit(out self):
67
69
68
70
fn is_valid (self , index : Int) -> Bool:
69
- return self .bitmap[].unsafe_get(index)
71
+ return self .bitmap() [].unsafe_get(index)
70
72
71
73
fn unsafe_append (mut self , value : String):
72
74
# todo(kszucs): use unsafe set
73
75
var index = self .data.length
74
- var last_offset = self .offsets[].unsafe_get[DType.uint32](index)
76
+ var last_offset = self .offsets() [].unsafe_get[DType.uint32](index)
75
77
var next_offset = last_offset + len (value)
76
78
self .data.length += 1
77
- self .bitmap[].unsafe_set(index, True )
78
- self .offsets[].unsafe_set[DType.uint32](index + 1 , next_offset)
79
- self .values[].grow[DType.uint8](next_offset)
80
- var dst_address = self .values[].get_ptr_at(Int(last_offset))
79
+ self .bitmap() [].unsafe_set(index, True )
80
+ self .offsets() [].unsafe_set[DType.uint32](index + 1 , next_offset)
81
+ self .values() [].grow[DType.uint8](next_offset)
82
+ var dst_address = self .values() [].get_ptr_at(Int(last_offset))
81
83
var src_address = value.unsafe_ptr()
82
84
memcpy(dst_address, src_address, len (value))
83
85
84
86
fn unsafe_get (self , index : UInt) -> StringSlice[__origin_of(self )]:
85
- var start_offset = self .offsets[].unsafe_get[DType.uint32](
87
+ var start_offset = self .offsets() [].unsafe_get[DType.uint32](
86
88
index + self .data.offset
87
89
)
88
- var end_offset = self .offsets[].unsafe_get[DType.uint32](
90
+ var end_offset = self .offsets() [].unsafe_get[DType.uint32](
89
91
index + 1 + self .data.offset
90
92
)
91
- var address = self .values[].get_ptr_at(Int(start_offset))
93
+ var address = self .values() [].get_ptr_at(Int(start_offset))
92
94
var length = UInt(Int(end_offset - start_offset))
93
95
return StringSlice[__origin_of(self )](ptr = address, length = length)
94
96
95
97
fn unsafe_set (mut self , index : Int, value : String) raises :
96
- var start_offset = self .offsets[].unsafe_get[DType.int32](index)
97
- var end_offset = self .offsets[].unsafe_get[DType.int32](index + 1 )
98
+ var start_offset = self .offsets() [].unsafe_get[DType.int32](index)
99
+ var end_offset = self .offsets() [].unsafe_get[DType.int32](index + 1 )
98
100
var length = Int(end_offset - start_offset)
99
101
100
102
if length != len (value):
@@ -103,7 +105,7 @@ struct StringArray(Array):
103
105
" length"
104
106
)
105
107
106
- var dst_address = self .values[].get_ptr_at(Int(start_offset))
108
+ var dst_address = self .values() [].get_ptr_at(Int(start_offset))
107
109
var src_address = value.unsafe_ptr()
108
110
memcpy(dst_address, src_address, length)
109
111
0 commit comments