package jsoniter

import (
	
	
	
	
)

func decoderOfSlice( *ctx,  reflect2.Type) ValDecoder {
	 := .(*reflect2.UnsafeSliceType)
	 := decoderOfType(.append("[sliceElem]"), .Elem())
	return &sliceDecoder{, }
}

func encoderOfSlice( *ctx,  reflect2.Type) ValEncoder {
	 := .(*reflect2.UnsafeSliceType)
	 := encoderOfType(.append("[sliceElem]"), .Elem())
	return &sliceEncoder{, }
}

type sliceEncoder struct {
	sliceType   *reflect2.UnsafeSliceType
	elemEncoder ValEncoder
}

func ( *sliceEncoder) ( unsafe.Pointer,  *Stream) {
	if .sliceType.UnsafeIsNil() {
		.WriteNil()
		return
	}
	 := .sliceType.UnsafeLengthOf()
	if  == 0 {
		.WriteEmptyArray()
		return
	}
	.WriteArrayStart()
	.elemEncoder.Encode(.sliceType.UnsafeGetIndex(, 0), )
	for  := 1;  < ; ++ {
		.WriteMore()
		 := .sliceType.UnsafeGetIndex(, )
		.elemEncoder.Encode(, )
	}
	.WriteArrayEnd()
	if .Error != nil && .Error != io.EOF {
		.Error = fmt.Errorf("%v: %s", .sliceType, .Error.Error())
	}
}

func ( *sliceEncoder) ( unsafe.Pointer) bool {
	return .sliceType.UnsafeLengthOf() == 0
}

type sliceDecoder struct {
	sliceType   *reflect2.UnsafeSliceType
	elemDecoder ValDecoder
}

func ( *sliceDecoder) ( unsafe.Pointer,  *Iterator) {
	.doDecode(, )
	if .Error != nil && .Error != io.EOF {
		.Error = fmt.Errorf("%v: %s", .sliceType, .Error.Error())
	}
}

func ( *sliceDecoder) ( unsafe.Pointer,  *Iterator) {
	 := .nextToken()
	 := .sliceType
	if  == 'n' {
		.skipThreeBytes('u', 'l', 'l')
		.UnsafeSetNil()
		return
	}
	if  != '[' {
		.ReportError("decode slice", "expect [ or n, but found "+string([]byte{}))
		return
	}
	 = .nextToken()
	if  == ']' {
		.UnsafeSet(, .UnsafeMakeSlice(0, 0))
		return
	}
	.unreadByte()
	.UnsafeGrow(, 1)
	 := .UnsafeGetIndex(, 0)
	.elemDecoder.Decode(, )
	 := 1
	for  = .nextToken();  == ',';  = .nextToken() {
		 := 
		 += 1
		.UnsafeGrow(, )
		 = .UnsafeGetIndex(, )
		.elemDecoder.Decode(, )
	}
	if  != ']' {
		.ReportError("decode slice", "expect ], but found "+string([]byte{}))
		return
	}
}