package kernels
import (
"unsafe"
"github.com/apache/arrow-go/v18/arrow"
"github.com/apache/arrow-go/v18/arrow/float16"
)
var castNumericUnsafe func (itype, otype arrow .Type , in, out []byte , len int ) = castNumericGo
func DoStaticCast [InT , OutT numeric ](in []InT , out []OutT ) {
for i , v := range in {
out [i ] = OutT (v )
}
}
func DoFloat16Cast [InT numeric ](in []InT , out []float16 .Num ) {
for i , v := range in {
out [i ] = float16 .New (float32 (v ))
}
}
func DoFloat16CastToNumber [OutT numeric ](in []float16 .Num , out []OutT ) {
for i , v := range in {
out [i ] = OutT (v .Float32 ())
}
}
func reinterpret[T numeric | float16 .Num ](b []byte , len int ) (res []T ) {
return unsafe .Slice ((*T )(unsafe .Pointer (&b [0 ])), len )
}
func castNumberToNumberUnsafeImpl[T numeric ](outT arrow .Type , in []T , out []byte ) {
switch outT {
case arrow .INT8 :
DoStaticCast (in , reinterpret [int8 ](out , len (in )))
case arrow .UINT8 :
DoStaticCast (in , reinterpret [uint8 ](out , len (in )))
case arrow .INT16 :
DoStaticCast (in , reinterpret [int16 ](out , len (in )))
case arrow .UINT16 :
DoStaticCast (in , reinterpret [uint16 ](out , len (in )))
case arrow .INT32 :
DoStaticCast (in , reinterpret [int32 ](out , len (in )))
case arrow .UINT32 :
DoStaticCast (in , reinterpret [uint32 ](out , len (in )))
case arrow .INT64 :
DoStaticCast (in , reinterpret [int64 ](out , len (in )))
case arrow .UINT64 :
DoStaticCast (in , reinterpret [uint64 ](out , len (in )))
case arrow .FLOAT16 :
DoFloat16Cast (in , reinterpret [float16 .Num ](out , len (in )))
case arrow .FLOAT32 :
DoStaticCast (in , reinterpret [float32 ](out , len (in )))
case arrow .FLOAT64 :
DoStaticCast (in , reinterpret [float64 ](out , len (in )))
}
}
func castFloat16ToNumberUnsafeImpl(outT arrow .Type , in []float16 .Num , out []byte ) {
switch outT {
case arrow .INT8 :
DoFloat16CastToNumber (in , reinterpret [int8 ](out , len (in )))
case arrow .UINT8 :
DoFloat16CastToNumber (in , reinterpret [uint8 ](out , len (in )))
case arrow .INT16 :
DoFloat16CastToNumber (in , reinterpret [int16 ](out , len (in )))
case arrow .UINT16 :
DoFloat16CastToNumber (in , reinterpret [uint16 ](out , len (in )))
case arrow .INT32 :
DoFloat16CastToNumber (in , reinterpret [int32 ](out , len (in )))
case arrow .UINT32 :
DoFloat16CastToNumber (in , reinterpret [uint32 ](out , len (in )))
case arrow .INT64 :
DoFloat16CastToNumber (in , reinterpret [int64 ](out , len (in )))
case arrow .UINT64 :
DoFloat16CastToNumber (in , reinterpret [uint64 ](out , len (in )))
case arrow .FLOAT16 :
copy (reinterpret [float16 .Num ](out , len (in )), in )
case arrow .FLOAT32 :
DoFloat16CastToNumber (in , reinterpret [float32 ](out , len (in )))
case arrow .FLOAT64 :
DoFloat16CastToNumber (in , reinterpret [float64 ](out , len (in )))
}
}
func castNumericGo(itype , otype arrow .Type , in , out []byte , len int ) {
switch itype {
case arrow .INT8 :
castNumberToNumberUnsafeImpl (otype , reinterpret [int8 ](in , len ), out )
case arrow .UINT8 :
castNumberToNumberUnsafeImpl (otype , reinterpret [uint8 ](in , len ), out )
case arrow .INT16 :
castNumberToNumberUnsafeImpl (otype , reinterpret [int16 ](in , len ), out )
case arrow .UINT16 :
castNumberToNumberUnsafeImpl (otype , reinterpret [uint16 ](in , len ), out )
case arrow .INT32 :
castNumberToNumberUnsafeImpl (otype , reinterpret [int32 ](in , len ), out )
case arrow .UINT32 :
castNumberToNumberUnsafeImpl (otype , reinterpret [uint32 ](in , len ), out )
case arrow .INT64 :
castNumberToNumberUnsafeImpl (otype , reinterpret [int64 ](in , len ), out )
case arrow .UINT64 :
castNumberToNumberUnsafeImpl (otype , reinterpret [uint64 ](in , len ), out )
case arrow .FLOAT16 :
castFloat16ToNumberUnsafeImpl (otype , reinterpret [float16 .Num ](in , len ), out )
case arrow .FLOAT32 :
castNumberToNumberUnsafeImpl (otype , reinterpret [float32 ](in , len ), out )
case arrow .FLOAT64 :
castNumberToNumberUnsafeImpl (otype , reinterpret [float64 ](in , len ), out )
}
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .