github.com/cybriq/giocore@v0.0.7-0.20210703034601-cfb9cb5f3900/internal/byteslice/byteslice.go (about)

     1  // SPDX-License-Identifier: Unlicense OR MIT
     2  
     3  // Package byteslice provides byte slice views of other Go values  such as
     4  // slices and structs.
     5  package byteslice
     6  
     7  import (
     8  	"reflect"
     9  	"unsafe"
    10  )
    11  
    12  // Struct returns a byte slice view of a struct.
    13  func Struct(s interface{}) []byte {
    14  	v := reflect.ValueOf(s).Elem()
    15  	sz := int(v.Type().Size())
    16  	var res []byte
    17  	h := (*reflect.SliceHeader)(unsafe.Pointer(&res))
    18  	h.Data = uintptr(unsafe.Pointer(v.UnsafeAddr()))
    19  	h.Cap = sz
    20  	h.Len = sz
    21  	return res
    22  }
    23  
    24  // Uint32 returns a byte slice view of a uint32 slice.
    25  func Uint32(s []uint32) []byte {
    26  	n := len(s)
    27  	if n == 0 {
    28  		return nil
    29  	}
    30  	blen := n * int(unsafe.Sizeof(s[0]))
    31  	return (*[1 << 30]byte)(unsafe.Pointer(&s[0]))[:blen:blen]
    32  }
    33  
    34  // Slice returns a byte slice view of a slice.
    35  func Slice(s interface{}) []byte {
    36  	v := reflect.ValueOf(s)
    37  	first := v.Index(0)
    38  	sz := int(first.Type().Size())
    39  	var res []byte
    40  	h := (*reflect.SliceHeader)(unsafe.Pointer(&res))
    41  	h.Data = first.UnsafeAddr()
    42  	h.Cap = v.Cap() * sz
    43  	h.Len = v.Len() * sz
    44  	return res
    45  }