package decoder

import (
	
	

	
	
)

type arrayDecoder struct {
	elemType     *runtime.Type
	size         uintptr
	valueDecoder Decoder
	alen         int
	structName   string
	fieldName    string
	zeroValue    unsafe.Pointer
}

func newArrayDecoder( Decoder,  *runtime.Type,  int, ,  string) *arrayDecoder {
	// workaround to avoid checkptr errors. cannot use `*(*unsafe.Pointer)(unsafe_New(elemType))` directly.
	 := unsafe_New()
	 := **(**unsafe.Pointer)(unsafe.Pointer(&))
	return &arrayDecoder{
		valueDecoder: ,
		elemType:     ,
		size:         .Size(),
		alen:         ,
		structName:   ,
		fieldName:    ,
		zeroValue:    ,
	}
}

func ( *arrayDecoder) ( *Stream,  int64,  unsafe.Pointer) error {
	++
	if  > maxDecodeNestingDepth {
		return errors.ErrExceededMaxDepth(.char(), .cursor)
	}

	for {
		switch .char() {
		case ' ', '\n', '\t', '\r':
		case 'n':
			if  := nullBytes();  != nil {
				return 
			}
			return nil
		case '[':
			 := 0
			.cursor++
			if .skipWhiteSpace() == ']' {
				for  < .alen {
					*(*unsafe.Pointer)(unsafe.Pointer(uintptr() + uintptr()*.size)) = .zeroValue
					++
				}
				.cursor++
				return nil
			}
			for {
				if  < .alen {
					if  := .valueDecoder.DecodeStream(, , unsafe.Pointer(uintptr()+uintptr()*.size));  != nil {
						return 
					}
				} else {
					if  := .skipValue();  != nil {
						return 
					}
				}
				++
				switch .skipWhiteSpace() {
				case ']':
					for  < .alen {
						*(*unsafe.Pointer)(unsafe.Pointer(uintptr() + uintptr()*.size)) = .zeroValue
						++
					}
					.cursor++
					return nil
				case ',':
					.cursor++
					continue
				case nul:
					if .read() {
						.cursor++
						continue
					}
					goto 
				default:
					goto 
				}
			}
		case nul:
			if .read() {
				continue
			}
			goto 
		default:
			goto 
		}
		.cursor++
	}
:
	return errors.ErrUnexpectedEndOfJSON("array", .totalOffset())
}

func ( *arrayDecoder) ( *RuntimeContext, ,  int64,  unsafe.Pointer) (int64, error) {
	 := .Buf
	++
	if  > maxDecodeNestingDepth {
		return 0, errors.ErrExceededMaxDepth([], )
	}

	for {
		switch [] {
		case ' ', '\n', '\t', '\r':
			++
			continue
		case 'n':
			if  := validateNull(, );  != nil {
				return 0, 
			}
			 += 4
			return , nil
		case '[':
			 := 0
			++
			 = skipWhiteSpace(, )
			if [] == ']' {
				for  < .alen {
					*(*unsafe.Pointer)(unsafe.Pointer(uintptr() + uintptr()*.size)) = .zeroValue
					++
				}
				++
				return , nil
			}
			for {
				if  < .alen {
					,  := .valueDecoder.Decode(, , , unsafe.Pointer(uintptr()+uintptr()*.size))
					if  != nil {
						return 0, 
					}
					 = 
				} else {
					,  := skipValue(, , )
					if  != nil {
						return 0, 
					}
					 = 
				}
				++
				 = skipWhiteSpace(, )
				switch [] {
				case ']':
					for  < .alen {
						*(*unsafe.Pointer)(unsafe.Pointer(uintptr() + uintptr()*.size)) = .zeroValue
						++
					}
					++
					return , nil
				case ',':
					++
					continue
				default:
					return 0, errors.ErrInvalidCharacter([], "array", )
				}
			}
		default:
			return 0, errors.ErrUnexpectedEndOfJSON("array", )
		}
	}
}

func ( *arrayDecoder) ( *RuntimeContext, ,  int64) ([][]byte, int64, error) {
	return nil, 0, fmt.Errorf("json: array decoder does not support decode path")
}