package jsoniter

import (
	
	
	
	
)

func decoderOfArray( *ctx,  reflect2.Type) ValDecoder {
	 := .(*reflect2.UnsafeArrayType)
	 := decoderOfType(.append("[arrayElem]"), .Elem())
	return &arrayDecoder{, }
}

func encoderOfArray( *ctx,  reflect2.Type) ValEncoder {
	 := .(*reflect2.UnsafeArrayType)
	if .Len() == 0 {
		return emptyArrayEncoder{}
	}
	 := encoderOfType(.append("[arrayElem]"), .Elem())
	return &arrayEncoder{, }
}

type emptyArrayEncoder struct{}

func ( emptyArrayEncoder) ( unsafe.Pointer,  *Stream) {
	.WriteEmptyArray()
}

func ( emptyArrayEncoder) ( unsafe.Pointer) bool {
	return true
}

type arrayEncoder struct {
	arrayType   *reflect2.UnsafeArrayType
	elemEncoder ValEncoder
}

func ( *arrayEncoder) ( unsafe.Pointer,  *Stream) {
	.WriteArrayStart()
	 := unsafe.Pointer()
	.elemEncoder.Encode(, )
	for  := 1;  < .arrayType.Len(); ++ {
		.WriteMore()
		 = .arrayType.UnsafeGetIndex(, )
		.elemEncoder.Encode(, )
	}
	.WriteArrayEnd()
	if .Error != nil && .Error != io.EOF {
		.Error = fmt.Errorf("%v: %s", .arrayType, .Error.Error())
	}
}

func ( *arrayEncoder) ( unsafe.Pointer) bool {
	return false
}

type arrayDecoder struct {
	arrayType   *reflect2.UnsafeArrayType
	elemDecoder ValDecoder
}

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

func ( *arrayDecoder) ( unsafe.Pointer,  *Iterator) {
	 := .nextToken()
	 := .arrayType
	if  == 'n' {
		.skipThreeBytes('u', 'l', 'l')
		return
	}
	if  != '[' {
		.ReportError("decode array", "expect [ or n, but found "+string([]byte{}))
		return
	}
	 = .nextToken()
	if  == ']' {
		return
	}
	.unreadByte()
	 := .UnsafeGetIndex(, 0)
	.elemDecoder.Decode(, )
	 := 1
	for  = .nextToken();  == ',';  = .nextToken() {
		if  >= .Len() {
			.Skip()
			continue
		}
		 := 
		 += 1
		 = .UnsafeGetIndex(, )
		.elemDecoder.Decode(, )
	}
	if  != ']' {
		.ReportError("decode array", "expect ], but found "+string([]byte{}))
		return
	}
}