github.com/m4gshm/gollections@v0.0.10/notsafe/notsafe.go (about) 1 // Package notsafe provides unsafe helper functions 2 package notsafe 3 4 import ( 5 "reflect" 6 "unsafe" 7 ) 8 9 // GetTypeSize retrieves size of a type T 10 func GetTypeSize[T any]() uintptr { 11 var t T 12 return unsafe.Sizeof(t) 13 } 14 15 // GetArrayPointer retrieves the pointer of a slice underlying array 16 func GetArrayPointer[T any](elements []T) unsafe.Pointer { 17 return unsafe.Pointer(GetSliceHeader(elements).Data) 18 } 19 20 // GetArrayElem returns an element by index from the array referenced by an unsafe pointer 21 func GetArrayElem[T any](array unsafe.Pointer, index int, elemSize uintptr) T { 22 return *(*T)(GetArrayElemRef(array, index, elemSize)) 23 } 24 25 // GetArrayElemRef returns an element's pointer by index from the array referenced by an unsafe pointer 26 func GetArrayElemRef(array unsafe.Pointer, index int, elemSize uintptr) unsafe.Pointer { 27 return unsafe.Pointer(uintptr(array) + uintptr(index)*elemSize) 28 } 29 30 // GetLen returns the length of elements 31 func GetLen[T any](elements []T) int { 32 return GetSliceHeader(elements).Len 33 } 34 35 // GetSliceHeader retrieves the SliceHeader of elements 36 func GetSliceHeader[T any](elements []T) *reflect.SliceHeader { 37 return GetSliceHeaderByRef(unsafe.Pointer(&elements)) 38 } 39 40 // GetSliceHeaderByRef retrieves the SliceHeader of elements by an unsafe pointer 41 func GetSliceHeaderByRef(elements unsafe.Pointer) *reflect.SliceHeader { 42 return (*reflect.SliceHeader)(elements) 43 } 44 45 // Noescape prevent escaping of t 46 // 47 //go:nosplit 48 //go:nocheckptr 49 func Noescape[T any](t *T) *T { 50 x := uintptr(unsafe.Pointer(t)) 51 return (*T)(unsafe.Pointer(x ^ 0)) //nolint 52 } 53 54 // InHeap is generic link to runtime.inheap 55 func InHeap[T any](t *T) bool { 56 return inheap(uintptr(unsafe.Pointer(t))) 57 } 58 59 //go:linkname inheap runtime.inheap 60 func inheap(p uintptr) bool