Remove BPA from Makefile
[icn.git] / cmd / bpa-operator / vendor / github.com / modern-go / reflect2 / unsafe_array.go
1 package reflect2
2
3 import (
4         "reflect"
5         "unsafe"
6 )
7
8 type UnsafeArrayType struct {
9         unsafeType
10         elemRType  unsafe.Pointer
11         pElemRType unsafe.Pointer
12         elemSize   uintptr
13         likePtr    bool
14 }
15
16 func newUnsafeArrayType(cfg *frozenConfig, type1 reflect.Type) *UnsafeArrayType {
17         return &UnsafeArrayType{
18                 unsafeType: *newUnsafeType(cfg, type1),
19                 elemRType:  unpackEFace(type1.Elem()).data,
20                 pElemRType: unpackEFace(reflect.PtrTo(type1.Elem())).data,
21                 elemSize:   type1.Elem().Size(),
22                 likePtr:    likePtrType(type1),
23         }
24 }
25
26 func (type2 *UnsafeArrayType) LikePtr() bool {
27         return type2.likePtr
28 }
29
30 func (type2 *UnsafeArrayType) Indirect(obj interface{}) interface{} {
31         objEFace := unpackEFace(obj)
32         assertType("Type.Indirect argument 1", type2.ptrRType, objEFace.rtype)
33         return type2.UnsafeIndirect(objEFace.data)
34 }
35
36 func (type2 *UnsafeArrayType) UnsafeIndirect(ptr unsafe.Pointer) interface{} {
37         if type2.likePtr {
38                 return packEFace(type2.rtype, *(*unsafe.Pointer)(ptr))
39         }
40         return packEFace(type2.rtype, ptr)
41 }
42
43 func (type2 *UnsafeArrayType) SetIndex(obj interface{}, index int, elem interface{}) {
44         objEFace := unpackEFace(obj)
45         assertType("ArrayType.SetIndex argument 1", type2.ptrRType, objEFace.rtype)
46         elemEFace := unpackEFace(elem)
47         assertType("ArrayType.SetIndex argument 3", type2.pElemRType, elemEFace.rtype)
48         type2.UnsafeSetIndex(objEFace.data, index, elemEFace.data)
49 }
50
51 func (type2 *UnsafeArrayType) UnsafeSetIndex(obj unsafe.Pointer, index int, elem unsafe.Pointer) {
52         elemPtr := arrayAt(obj, index, type2.elemSize, "i < s.Len")
53         typedmemmove(type2.elemRType, elemPtr, elem)
54 }
55
56 func (type2 *UnsafeArrayType) GetIndex(obj interface{}, index int) interface{} {
57         objEFace := unpackEFace(obj)
58         assertType("ArrayType.GetIndex argument 1", type2.ptrRType, objEFace.rtype)
59         elemPtr := type2.UnsafeGetIndex(objEFace.data, index)
60         return packEFace(type2.pElemRType, elemPtr)
61 }
62
63 func (type2 *UnsafeArrayType) UnsafeGetIndex(obj unsafe.Pointer, index int) unsafe.Pointer {
64         return arrayAt(obj, index, type2.elemSize, "i < s.Len")
65 }