gioui.org@v0.6.1-0.20240506124620-7a9ce51988ce/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)
    15  	sz := int(v.Elem().Type().Size())
    16  	return unsafe.Slice((*byte)(unsafe.Pointer(v.Pointer())), sz)
    17  }
    18  
    19  // Uint32 returns a byte slice view of a uint32 slice.
    20  func Uint32(s []uint32) []byte {
    21  	n := len(s)
    22  	if n == 0 {
    23  		return nil
    24  	}
    25  	blen := n * int(unsafe.Sizeof(s[0]))
    26  	return unsafe.Slice((*byte)(unsafe.Pointer(&s[0])), blen)
    27  }
    28  
    29  // Slice returns a byte slice view of a slice.
    30  func Slice(s interface{}) []byte {
    31  	v := reflect.ValueOf(s)
    32  	first := v.Index(0)
    33  	sz := int(first.Type().Size())
    34  	res := unsafe.Slice((*byte)(unsafe.Pointer(v.Pointer())), sz*v.Cap())
    35  	return res[:sz*v.Len()]
    36  }