github.com/parquet-go/parquet-go@v0.21.1-0.20240501160520-b3c3a0c3ed6f/array.go (about) 1 package parquet 2 3 import ( 4 "unsafe" 5 6 "github.com/parquet-go/parquet-go/internal/unsafecast" 7 "github.com/parquet-go/parquet-go/sparse" 8 ) 9 10 func makeArrayValue(values []Value, offset uintptr) sparse.Array { 11 ptr := *(*unsafe.Pointer)(unsafe.Pointer(&values)) 12 return sparse.UnsafeArray(unsafe.Add(ptr, offset), len(values), unsafe.Sizeof(Value{})) 13 } 14 15 func makeArrayString(values []string) sparse.Array { 16 str := "" 17 ptr := *(*unsafe.Pointer)(unsafe.Pointer(&values)) 18 return sparse.UnsafeArray(ptr, len(values), unsafe.Sizeof(str)) 19 } 20 21 func makeArrayBE128(values []*[16]byte) sparse.Array { 22 ptr := *(*unsafe.Pointer)(unsafe.Pointer(&values)) 23 return sparse.UnsafeArray(ptr, len(values), unsafe.Sizeof((*[16]byte)(nil))) 24 } 25 26 func makeArray(base unsafe.Pointer, length int, offset uintptr) sparse.Array { 27 return sparse.UnsafeArray(base, length, offset) 28 } 29 30 func makeArrayOf[T any](s []T) sparse.Array { 31 var model T 32 return makeArray(unsafecast.PointerOf(s), len(s), unsafe.Sizeof(model)) 33 } 34 35 func makeSlice[T any](a sparse.Array) []T { 36 return slice[T](a.Index(0), a.Len()) 37 } 38 39 func slice[T any](p unsafe.Pointer, n int) []T { 40 return unsafe.Slice((*T)(p), n) 41 } 42 43 type sliceHeader struct { 44 base unsafe.Pointer 45 len int 46 cap int 47 }