1515// specific language governing permissions and limitations
1616// under the License.
1717
18- use crate :: array:: { empty_offsets , print_long_array} ;
18+ use crate :: array:: { get_offsets , print_long_array} ;
1919use crate :: builder:: GenericByteBuilder ;
2020use crate :: iterator:: ArrayIter ;
21- use crate :: raw_pointer:: RawPtrBox ;
2221use crate :: types:: bytes:: ByteArrayNativeType ;
2322use crate :: types:: ByteArrayType ;
2423use crate :: { Array , ArrayAccessor , OffsetSizeTrait } ;
25- use arrow_buffer:: ArrowNativeType ;
24+ use arrow_buffer:: buffer:: OffsetBuffer ;
25+ use arrow_buffer:: { ArrowNativeType , Buffer } ;
2626use arrow_data:: ArrayData ;
2727use arrow_schema:: DataType ;
2828use std:: any:: Any ;
@@ -39,16 +39,16 @@ use std::any::Any;
3939/// [`LargeBinaryArray`]: crate::LargeBinaryArray
4040pub struct GenericByteArray < T : ByteArrayType > {
4141 data : ArrayData ,
42- value_offsets : RawPtrBox < T :: Offset > ,
43- value_data : RawPtrBox < u8 > ,
42+ value_offsets : OffsetBuffer < T :: Offset > ,
43+ value_data : Buffer ,
4444}
4545
4646impl < T : ByteArrayType > Clone for GenericByteArray < T > {
4747 fn clone ( & self ) -> Self {
4848 Self {
4949 data : self . data . clone ( ) ,
50- value_offsets : self . value_offsets ,
51- value_data : self . value_data ,
50+ value_offsets : self . value_offsets . clone ( ) ,
51+ value_data : self . value_data . clone ( ) ,
5252 }
5353 }
5454}
@@ -68,7 +68,7 @@ impl<T: ByteArrayType> GenericByteArray<T> {
6868
6969 /// Returns the raw value data
7070 pub fn value_data ( & self ) -> & [ u8 ] {
71- self . data . buffers ( ) [ 1 ] . as_slice ( )
71+ self . value_data . as_slice ( )
7272 }
7373
7474 /// Returns true if all data within this array is ASCII
@@ -82,15 +82,7 @@ impl<T: ByteArrayType> GenericByteArray<T> {
8282 /// Returns the offset values in the offsets buffer
8383 #[ inline]
8484 pub fn value_offsets ( & self ) -> & [ T :: Offset ] {
85- // Soundness
86- // pointer alignment & location is ensured by RawPtrBox
87- // buffer bounds/offset is ensured by the ArrayData instance.
88- unsafe {
89- std:: slice:: from_raw_parts (
90- self . value_offsets . as_ptr ( ) . add ( self . data . offset ( ) ) ,
91- self . len ( ) + 1 ,
92- )
93- }
85+ & self . value_offsets
9486 }
9587
9688 /// Returns the element at index `i`
@@ -161,6 +153,8 @@ impl<T: ByteArrayType> GenericByteArray<T> {
161153 . slice_with_length ( self . data . offset ( ) * element_len, value_len * element_len) ;
162154
163155 drop ( self . data ) ;
156+ drop ( self . value_data ) ;
157+ drop ( self . value_offsets ) ;
164158
165159 let try_mutable_null_buffer = match null_bit_buffer {
166160 None => Ok ( None ) ,
@@ -280,18 +274,16 @@ impl<T: ByteArrayType> From<ArrayData> for GenericByteArray<T> {
280274 T :: Offset :: PREFIX ,
281275 T :: PREFIX ,
282276 ) ;
283- // Handle case of empty offsets
284- let offsets = match data. is_empty ( ) && data. buffers ( ) [ 0 ] . is_empty ( ) {
285- true => empty_offsets :: < T :: Offset > ( ) . as_ptr ( ) as * const _ ,
286- false => data. buffers ( ) [ 0 ] . as_ptr ( ) ,
287- } ;
288- let values = data. buffers ( ) [ 1 ] . as_ptr ( ) ;
277+ // SAFETY:
278+ // ArrayData is valid, and verified type above
279+ let value_offsets = unsafe { get_offsets ( & data) } ;
280+ let value_data = data. buffers ( ) [ 1 ] . clone ( ) ;
289281 Self {
290282 data,
291283 // SAFETY:
292284 // ArrayData must be valid, and validated data type above
293- value_offsets : unsafe { RawPtrBox :: new ( offsets ) } ,
294- value_data : unsafe { RawPtrBox :: new ( values ) } ,
285+ value_offsets,
286+ value_data,
295287 }
296288 }
297289}
0 commit comments