mirror of
https://github.com/SagerNet/sing.git
synced 2025-04-03 20:07:38 +03:00
106 lines
2.4 KiB
Go
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)
|
|
}
|
|
}
|