sing/common/varbin/value_slices_unsafe.go
2024-06-24 09:42:23 +08:00

106 lines
2.4 KiB
Go

package varbin
import (
"reflect"
"unsafe"
)
type myValue struct {
typ_ *any
ptr unsafe.Pointer
}
func slicesValue[T any](value reflect.Value) []T {
v := (*myValue)(unsafe.Pointer(&value))
return *(*[]T)(v.ptr)
}
func setSliceValue[T any](value reflect.Value, x []T) {
v := (*myValue)(unsafe.Pointer(&value))
*(*[]T)(v.ptr) = x
}
func baseDataSlices(data reflect.Value) any {
switch data.Type().Elem().Kind() {
case reflect.Bool:
return slicesValue[bool](data)
case reflect.Int8:
return slicesValue[int8](data)
case reflect.Uint8:
return slicesValue[uint8](data)
case reflect.Int16:
return slicesValue[int16](data)
case reflect.Uint16:
return slicesValue[uint16](data)
case reflect.Int32:
return slicesValue[int32](data)
case reflect.Uint32:
return slicesValue[uint32](data)
case reflect.Int64:
return slicesValue[int64](data)
case reflect.Uint64:
return slicesValue[uint64](data)
case reflect.Float32:
return slicesValue[float32](data)
case reflect.Float64:
return slicesValue[float64](data)
default:
return nil
}
}
func makeBaseDataSlices(data reflect.Value, dataLen int) any {
switch data.Type().Elem().Kind() {
case reflect.Bool:
return make([]bool, dataLen)
case reflect.Int8:
return make([]int8, dataLen)
case reflect.Uint8:
return make([]uint8, dataLen)
case reflect.Int16:
return make([]int16, dataLen)
case reflect.Uint16:
return make([]uint16, dataLen)
case reflect.Int32:
return make([]int32, dataLen)
case reflect.Uint32:
return make([]uint32, dataLen)
case reflect.Int64:
return make([]int64, dataLen)
case reflect.Uint64:
return make([]uint64, dataLen)
case reflect.Float32:
return make([]float32, dataLen)
case reflect.Float64:
return make([]float64, dataLen)
default:
return nil
}
}
func setBaseDataSlices(data reflect.Value, rawDataSlices any) {
switch dataSlices := rawDataSlices.(type) {
case []bool:
setSliceValue(data, dataSlices)
case []int8:
setSliceValue(data, dataSlices)
case []uint8:
setSliceValue(data, dataSlices)
case []int16:
setSliceValue(data, dataSlices)
case []uint16:
setSliceValue(data, dataSlices)
case []int32:
setSliceValue(data, dataSlices)
case []uint32:
setSliceValue(data, dataSlices)
case []int64:
setSliceValue(data, dataSlices)
case []uint64:
setSliceValue(data, dataSlices)
case []float32:
setSliceValue(data, dataSlices)
case []float64:
setSliceValue(data, dataSlices)
}
}