package jsoniter

import (
	
	
)

type arrayLazyAny struct {
	baseAny
	cfg *frozenConfig
	buf []byte
	err error
}

func ( *arrayLazyAny) () ValueType {
	return ArrayValue
}

func ( *arrayLazyAny) () Any {
	return 
}

func ( *arrayLazyAny) () error {
	return .err
}

func ( *arrayLazyAny) () bool {
	 := .cfg.BorrowIterator(.buf)
	defer .cfg.ReturnIterator()
	return .ReadArray()
}

func ( *arrayLazyAny) () int {
	if .ToBool() {
		return 1
	}
	return 0
}

func ( *arrayLazyAny) () int32 {
	if .ToBool() {
		return 1
	}
	return 0
}

func ( *arrayLazyAny) () int64 {
	if .ToBool() {
		return 1
	}
	return 0
}

func ( *arrayLazyAny) () uint {
	if .ToBool() {
		return 1
	}
	return 0
}

func ( *arrayLazyAny) () uint32 {
	if .ToBool() {
		return 1
	}
	return 0
}

func ( *arrayLazyAny) () uint64 {
	if .ToBool() {
		return 1
	}
	return 0
}

func ( *arrayLazyAny) () float32 {
	if .ToBool() {
		return 1
	}
	return 0
}

func ( *arrayLazyAny) () float64 {
	if .ToBool() {
		return 1
	}
	return 0
}

func ( *arrayLazyAny) () string {
	return *(*string)(unsafe.Pointer(&.buf))
}

func ( *arrayLazyAny) ( interface{}) {
	 := .cfg.BorrowIterator(.buf)
	defer .cfg.ReturnIterator()
	.ReadVal()
}

func ( *arrayLazyAny) ( ...interface{}) Any {
	if len() == 0 {
		return 
	}
	switch firstPath := [0].(type) {
	case int:
		 := .cfg.BorrowIterator(.buf)
		defer .cfg.ReturnIterator()
		 := locateArrayElement(, )
		if  == nil {
			return newInvalidAny()
		}
		.ResetBytes()
		return locatePath(, [1:])
	case int32:
		if '*' ==  {
			 := .cfg.BorrowIterator(.buf)
			defer .cfg.ReturnIterator()
			 := make([]Any, 0)
			.ReadArrayCB(func( *Iterator) bool {
				 := .readAny().Get([1:]...)
				if .ValueType() != InvalidValue {
					 = append(, )
				}
				return true
			})
			return wrapArray()
		}
		return newInvalidAny()
	default:
		return newInvalidAny()
	}
}

func ( *arrayLazyAny) () int {
	 := 0
	 := .cfg.BorrowIterator(.buf)
	defer .cfg.ReturnIterator()
	.ReadArrayCB(func( *Iterator) bool {
		++
		.Skip()
		return true
	})
	return 
}

func ( *arrayLazyAny) ( *Stream) {
	.Write(.buf)
}

func ( *arrayLazyAny) () interface{} {
	 := .cfg.BorrowIterator(.buf)
	defer .cfg.ReturnIterator()
	return .Read()
}

type arrayAny struct {
	baseAny
	val reflect.Value
}

func wrapArray( interface{}) *arrayAny {
	return &arrayAny{baseAny{}, reflect.ValueOf()}
}

func ( *arrayAny) () ValueType {
	return ArrayValue
}

func ( *arrayAny) () Any {
	return 
}

func ( *arrayAny) () error {
	return nil
}

func ( *arrayAny) () bool {
	return .val.Len() != 0
}

func ( *arrayAny) () int {
	if .val.Len() == 0 {
		return 0
	}
	return 1
}

func ( *arrayAny) () int32 {
	if .val.Len() == 0 {
		return 0
	}
	return 1
}

func ( *arrayAny) () int64 {
	if .val.Len() == 0 {
		return 0
	}
	return 1
}

func ( *arrayAny) () uint {
	if .val.Len() == 0 {
		return 0
	}
	return 1
}

func ( *arrayAny) () uint32 {
	if .val.Len() == 0 {
		return 0
	}
	return 1
}

func ( *arrayAny) () uint64 {
	if .val.Len() == 0 {
		return 0
	}
	return 1
}

func ( *arrayAny) () float32 {
	if .val.Len() == 0 {
		return 0
	}
	return 1
}

func ( *arrayAny) () float64 {
	if .val.Len() == 0 {
		return 0
	}
	return 1
}

func ( *arrayAny) () string {
	,  := MarshalToString(.val.Interface())
	return 
}

func ( *arrayAny) ( ...interface{}) Any {
	if len() == 0 {
		return 
	}
	switch firstPath := [0].(type) {
	case int:
		if  < 0 ||  >= .val.Len() {
			return newInvalidAny()
		}
		return Wrap(.val.Index().Interface())
	case int32:
		if '*' ==  {
			 := make([]Any, 0)
			for  := 0;  < .val.Len(); ++ {
				 := Wrap(.val.Index().Interface()).Get([1:]...)
				if .ValueType() != InvalidValue {
					 = append(, )
				}
			}
			return wrapArray()
		}
		return newInvalidAny()
	default:
		return newInvalidAny()
	}
}

func ( *arrayAny) () int {
	return .val.Len()
}

func ( *arrayAny) ( *Stream) {
	.WriteVal(.val)
}

func ( *arrayAny) () interface{} {
	return .val.Interface()
}