@@ -338,14 +338,14 @@ public class Date64BufferBuilder: AbstractWrapperBufferBuilder<Date, Int64> {
338
338
339
339
public final class StructBufferBuilder : BaseBufferBuilder , ArrowBufferBuilder {
340
340
public typealias ItemType = [ Any ? ]
341
- var info : ArrowNestedType ?
341
+ var info : ArrowTypeStruct ?
342
342
public init ( ) throws {
343
343
let nulls = ArrowBuffer . createBuffer ( 0 , size: UInt ( MemoryLayout< UInt8> . stride) )
344
344
super. init ( nulls)
345
345
}
346
346
347
347
public func initializeTypeInfo( _ fields: [ ArrowField ] ) {
348
- info = ArrowNestedType ( ArrowType . ArrowStruct, fields: fields)
348
+ info = ArrowTypeStruct ( ArrowType . ArrowStruct, fields: fields)
349
349
}
350
350
351
351
public func append( _ newValue: [ Any ? ] ? ) {
@@ -379,3 +379,62 @@ public final class StructBufferBuilder: BaseBufferBuilder, ArrowBufferBuilder {
379
379
return [ nulls]
380
380
}
381
381
}
382
+
383
+ public class ListBufferBuilder : BaseBufferBuilder , ArrowBufferBuilder {
384
+ public typealias ItemType = [ Any ? ]
385
+ var offsets : ArrowBuffer
386
+
387
+ public required init ( ) throws {
388
+ self . offsets = ArrowBuffer . createBuffer ( 1 , size: UInt ( MemoryLayout< Int32> . stride) )
389
+ let nulls = ArrowBuffer . createBuffer ( 0 , size: UInt ( MemoryLayout< UInt8> . stride) )
390
+ super. init ( nulls)
391
+ self . offsets. rawPointer. storeBytes ( of: Int32 ( 0 ) , as: Int32 . self)
392
+ }
393
+
394
+ public func append( _ newValue: [ Any ? ] ? ) {
395
+ let index = UInt ( self . length)
396
+ self . length += 1
397
+
398
+ if length >= self . offsets. length {
399
+ self . resize ( length + 1 )
400
+ }
401
+
402
+ let offsetIndex = Int ( index) * MemoryLayout< Int32> . stride
403
+ let currentOffset = self . offsets. rawPointer. advanced ( by: offsetIndex) . load ( as: Int32 . self)
404
+
405
+ if let vals = newValue {
406
+ BitUtility . setBit ( index + self . offset, buffer: self . nulls)
407
+ let newOffset = currentOffset + Int32( vals. count)
408
+ self . offsets. rawPointer. advanced ( by: offsetIndex + MemoryLayout< Int32> . stride) . storeBytes ( of: newOffset, as: Int32 . self)
409
+ } else {
410
+ self . nullCount += 1
411
+ BitUtility . clearBit ( index + self . offset, buffer: self . nulls)
412
+ self . offsets. rawPointer. advanced ( by: offsetIndex + MemoryLayout< Int32> . stride) . storeBytes ( of: currentOffset, as: Int32 . self)
413
+ }
414
+ }
415
+
416
+ public override func isNull( _ index: UInt ) -> Bool {
417
+ return !BitUtility. isSet ( index + self . offset, buffer: self . nulls)
418
+ }
419
+
420
+ public func resize( _ length: UInt ) {
421
+ if length > self . offsets. length {
422
+ let resizeLength = resizeLength ( self . offsets)
423
+ var offsets = ArrowBuffer . createBuffer ( resizeLength, size: UInt ( MemoryLayout< Int32> . size) )
424
+ var nulls = ArrowBuffer . createBuffer ( resizeLength/ 8 + 1 , size: UInt ( MemoryLayout< UInt8> . size) )
425
+ ArrowBuffer . copyCurrent ( self . offsets, to: & offsets, len: self . offsets. capacity)
426
+ ArrowBuffer . copyCurrent ( self . nulls, to: & nulls, len: self . nulls. capacity)
427
+ self . offsets = offsets
428
+ self . nulls = nulls
429
+ }
430
+ }
431
+
432
+ public func finish( ) -> [ ArrowBuffer ] {
433
+ let length = self . length
434
+ var nulls = ArrowBuffer . createBuffer ( length/ 8 + 1 , size: UInt ( MemoryLayout< UInt8> . size) )
435
+ var offsets = ArrowBuffer . createBuffer ( length + 1 , size: UInt ( MemoryLayout< Int32> . size) )
436
+ ArrowBuffer . copyCurrent ( self . nulls, to: & nulls, len: nulls. capacity)
437
+ ArrowBuffer . copyCurrent ( self . offsets, to: & offsets, len: offsets. capacity)
438
+ return [ nulls, offsets]
439
+ }
440
+ }
0 commit comments