8 type UnsafeArrayType struct {
10 elemRType unsafe.Pointer
11 pElemRType unsafe.Pointer
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),
26 func (type2 *UnsafeArrayType) LikePtr() bool {
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)
36 func (type2 *UnsafeArrayType) UnsafeIndirect(ptr unsafe.Pointer) interface{} {
38 return packEFace(type2.rtype, *(*unsafe.Pointer)(ptr))
40 return packEFace(type2.rtype, ptr)
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)
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)
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)
63 func (type2 *UnsafeArrayType) UnsafeGetIndex(obj unsafe.Pointer, index int) unsafe.Pointer {
64 return arrayAt(obj, index, type2.elemSize, "i < s.Len")