github.com/kamalshkeir/kencoding@v0.0.2-0.20230409043843-44b609a0475a/internal/runtime_reflect/slice.go (about)

     1  package runtime_reflect
     2  
     3  import "unsafe"
     4  
     5  type Slice struct {
     6  	data unsafe.Pointer
     7  	len  int
     8  	cap  int
     9  }
    10  
    11  func (s *Slice) Cap() int {
    12  	return s.cap
    13  }
    14  
    15  func (s *Slice) Len() int {
    16  	return s.len
    17  }
    18  
    19  func (s *Slice) SetLen(n int) {
    20  	s.len = n
    21  }
    22  
    23  func (s *Slice) Index(i int, elemSize uintptr) unsafe.Pointer {
    24  	return unsafe.Pointer(uintptr(s.data) + (uintptr(i) * elemSize))
    25  }
    26  
    27  func MakeSlice(elemType unsafe.Pointer, len, cap int) Slice {
    28  	return Slice{
    29  		data: newarray(elemType, cap),
    30  		len:  len,
    31  		cap:  cap,
    32  	}
    33  }
    34  
    35  func CopySlice(elemType unsafe.Pointer, dst, src Slice) int {
    36  	return typedslicecopy(elemType, dst, src)
    37  }
    38  
    39  //go:linkname newarray runtime.newarray
    40  func newarray(t unsafe.Pointer, n int) unsafe.Pointer
    41  
    42  //go:linkname typedslicecopy runtime.typedslicecopy
    43  //go:noescape
    44  func typedslicecopy(t unsafe.Pointer, dst, src Slice) int