blob: b47839c368a1cd4de053bb55be89adcd5257c6c2 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package vdl
import (
"reflect"
"unsafe"
)
var (
bitlenReflect = [...]uintptr{
reflect.Uint8: 8,
reflect.Uint16: 16,
reflect.Uint32: 32,
reflect.Uint64: 64,
reflect.Uint: 8 * unsafe.Sizeof(uint(0)),
reflect.Uintptr: 8 * unsafe.Sizeof(uintptr(0)),
reflect.Int8: 8,
reflect.Int16: 16,
reflect.Int32: 32,
reflect.Int64: 64,
reflect.Int: 8 * unsafe.Sizeof(int(0)),
reflect.Float32: 32,
reflect.Float64: 64,
reflect.Complex64: 32, // bitlen of each float
reflect.Complex128: 64, // bitlen of each float
}
bitlenVDL = [...]uintptr{
Byte: 8,
Uint16: 16,
Uint32: 32,
Uint64: 64,
Int8: 8,
Int16: 16,
Int32: 32,
Int64: 64,
Float32: 32,
Float64: 64,
Complex64: 32, // bitlen of each float
Complex128: 64, // bitlen of each float
}
)
// bitlen{R,V} enforce static type safety on kind.
func bitlenR(kind reflect.Kind) uintptr { return bitlenReflect[kind] }
func bitlenV(kind Kind) uintptr { return bitlenVDL[kind] }
// isRTBytes returns true iff rt is an array or slice of bytes.
func isRTBytes(rt reflect.Type) bool {
return (rt.Kind() == reflect.Array || rt.Kind() == reflect.Slice) && rt.Elem().Kind() == reflect.Uint8
}
// rtBytes extracts []byte from rv. Assumes isRTBytes(rv.Type()) == true.
func rtBytes(rv reflect.Value) []byte {
// Fastpath if the underlying type is []byte
if rv.Kind() == reflect.Slice && rv.Type().Elem() == rtByte {
return rv.Bytes()
}
// Slowpath copying bytes one by one.
ret := make([]byte, rv.Len())
for ix := 0; ix < rv.Len(); ix++ {
ret[ix] = rv.Index(ix).Convert(rtByte).Interface().(byte)
}
return ret
}