package reflect2

import (
	
	
)

// sliceHeader is a safe version of SliceHeader used within this package.
type sliceHeader struct {
	Data unsafe.Pointer
	Len  int
	Cap  int
}

type UnsafeSliceType struct {
	unsafeType
	elemRType  unsafe.Pointer
	pElemRType unsafe.Pointer
	elemSize   uintptr
}

func newUnsafeSliceType( *frozenConfig,  reflect.Type) SliceType {
	 := .Elem()
	return &UnsafeSliceType{
		unsafeType: *newUnsafeType(, ),
		pElemRType: unpackEFace(reflect.PtrTo()).data,
		elemRType:  unpackEFace().data,
		elemSize:   .Size(),
	}
}

func ( *UnsafeSliceType) ( interface{},  interface{}) {
	 := unpackEFace()
	assertType("Type.Set argument 1", .ptrRType, .rtype)
	 := unpackEFace()
	assertType("Type.Set argument 2", .ptrRType, .rtype)
	.UnsafeSet(.data, .data)
}

func ( *UnsafeSliceType) ( unsafe.Pointer,  unsafe.Pointer) {
	*(*sliceHeader)() = *(*sliceHeader)()
}

func ( *UnsafeSliceType) ( interface{}) bool {
	if  == nil {
		return true
	}
	 := unpackEFace()
	assertType("Type.IsNil argument 1", .ptrRType, .rtype)
	return .UnsafeIsNil(.data)
}

func ( *UnsafeSliceType) ( unsafe.Pointer) bool {
	if  == nil {
		return true
	}
	return (*sliceHeader)().Data == nil
}

func ( *UnsafeSliceType) ( interface{}) {
	 := unpackEFace()
	assertType("SliceType.SetNil argument 1", .ptrRType, .rtype)
	.UnsafeSetNil(.data)
}

func ( *UnsafeSliceType) ( unsafe.Pointer) {
	 := (*sliceHeader)()
	.Len = 0
	.Cap = 0
	.Data = nil
}

func ( *UnsafeSliceType) ( int,  int) interface{} {
	return packEFace(.ptrRType, .UnsafeMakeSlice(, ))
}

func ( *UnsafeSliceType) ( int,  int) unsafe.Pointer {
	 := &sliceHeader{unsafe_NewArray(.elemRType, ), , }
	return unsafe.Pointer()
}

func ( *UnsafeSliceType) ( interface{}) int {
	 := unpackEFace()
	assertType("SliceType.Len argument 1", .ptrRType, .rtype)
	return .UnsafeLengthOf(.data)
}

func ( *UnsafeSliceType) ( unsafe.Pointer) int {
	 := (*sliceHeader)()
	return .Len
}

func ( *UnsafeSliceType) ( interface{},  int,  interface{}) {
	 := unpackEFace()
	assertType("SliceType.SetIndex argument 1", .ptrRType, .rtype)
	 := unpackEFace()
	assertType("SliceType.SetIndex argument 3", .pElemRType, .rtype)
	.UnsafeSetIndex(.data, , .data)
}

func ( *UnsafeSliceType) ( unsafe.Pointer,  int,  unsafe.Pointer) {
	 := (*sliceHeader)()
	 := arrayAt(.Data, , .elemSize, "i < s.Len")
	typedmemmove(.elemRType, , )
}

func ( *UnsafeSliceType) ( interface{},  int) interface{} {
	 := unpackEFace()
	assertType("SliceType.GetIndex argument 1", .ptrRType, .rtype)
	 := .UnsafeGetIndex(.data, )
	return packEFace(.pElemRType, )
}

func ( *UnsafeSliceType) ( unsafe.Pointer,  int) unsafe.Pointer {
	 := (*sliceHeader)()
	return arrayAt(.Data, , .elemSize, "i < s.Len")
}

func ( *UnsafeSliceType) ( interface{},  interface{}) {
	 := unpackEFace()
	assertType("SliceType.Append argument 1", .ptrRType, .rtype)
	 := unpackEFace()
	assertType("SliceType.Append argument 2", .pElemRType, .rtype)
	.UnsafeAppend(.data, .data)
}

func ( *UnsafeSliceType) ( unsafe.Pointer,  unsafe.Pointer) {
	 := (*sliceHeader)()
	 := .Len
	.UnsafeGrow(, +1)
	.UnsafeSetIndex(, , )
}

func ( *UnsafeSliceType) ( interface{}) int {
	 := unpackEFace()
	assertType("SliceType.Cap argument 1", .ptrRType, .rtype)
	return .UnsafeCap(.data)
}

func ( *UnsafeSliceType) ( unsafe.Pointer) int {
	return (*sliceHeader)().Cap
}

func ( *UnsafeSliceType) ( interface{},  int) {
	 := unpackEFace()
	assertType("SliceType.Grow argument 1", .ptrRType, .rtype)
	.UnsafeGrow(.data, )
}

func ( *UnsafeSliceType) ( unsafe.Pointer,  int) {
	 := (*sliceHeader)()
	if  <= .Cap {
		.Len = 
		return
	}
	 := calcNewCap(.Cap, )
	 := (*sliceHeader)(.UnsafeMakeSlice(.Len, ))
	typedslicecopy(.elemRType, *, *)
	.Data = .Data
	.Cap = .Cap
	.Len = 
}

func calcNewCap( int,  int) int {
	if  == 0 {
		 = 
	} else {
		for  <  {
			if  < 1024 {
				 += 
			} else {
				 +=  / 4
			}
		}
	}
	return 
}