package jsoniter

import (
	
	
)

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

func ( *objectLazyAny) () ValueType {
	return ObjectValue
}

func ( *objectLazyAny) () Any {
	return 
}

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

func ( *objectLazyAny) () bool {
	return true
}

func ( *objectLazyAny) () int {
	return 0
}

func ( *objectLazyAny) () int32 {
	return 0
}

func ( *objectLazyAny) () int64 {
	return 0
}

func ( *objectLazyAny) () uint {
	return 0
}

func ( *objectLazyAny) () uint32 {
	return 0
}

func ( *objectLazyAny) () uint64 {
	return 0
}

func ( *objectLazyAny) () float32 {
	return 0
}

func ( *objectLazyAny) () float64 {
	return 0
}

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

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

func ( *objectLazyAny) ( ...interface{}) Any {
	if len() == 0 {
		return 
	}
	switch firstPath := [0].(type) {
	case string:
		 := .cfg.BorrowIterator(.buf)
		defer .cfg.ReturnIterator()
		 := locateObjectField(, )
		if  == nil {
			return newInvalidAny()
		}
		.ResetBytes()
		return locatePath(, [1:])
	case int32:
		if '*' ==  {
			 := map[string]Any{}
			 := .cfg.BorrowIterator(.buf)
			defer .cfg.ReturnIterator()
			.ReadMapCB(func( *Iterator,  string) bool {
				 := locatePath(, [1:])
				if .ValueType() != InvalidValue {
					[] = 
				}
				return true
			})
			return wrapMap()
		}
		return newInvalidAny()
	default:
		return newInvalidAny()
	}
}

func ( *objectLazyAny) () []string {
	 := []string{}
	 := .cfg.BorrowIterator(.buf)
	defer .cfg.ReturnIterator()
	.ReadMapCB(func( *Iterator,  string) bool {
		.Skip()
		 = append(, )
		return true
	})
	return 
}

func ( *objectLazyAny) () int {
	 := 0
	 := .cfg.BorrowIterator(.buf)
	defer .cfg.ReturnIterator()
	.ReadObjectCB(func( *Iterator,  string) bool {
		.Skip()
		++
		return true
	})
	return 
}

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

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

type objectAny struct {
	baseAny
	err error
	val reflect.Value
}

func wrapStruct( interface{}) *objectAny {
	return &objectAny{baseAny{}, nil, reflect.ValueOf()}
}

func ( *objectAny) () ValueType {
	return ObjectValue
}

func ( *objectAny) () Any {
	return 
}

func ( *objectAny) () *Iterator {
	return nil
}

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

func ( *objectAny) () bool {
	return .val.NumField() != 0
}

func ( *objectAny) () int {
	return 0
}

func ( *objectAny) () int32 {
	return 0
}

func ( *objectAny) () int64 {
	return 0
}

func ( *objectAny) () uint {
	return 0
}

func ( *objectAny) () uint32 {
	return 0
}

func ( *objectAny) () uint64 {
	return 0
}

func ( *objectAny) () float32 {
	return 0
}

func ( *objectAny) () float64 {
	return 0
}

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

func ( *objectAny) ( ...interface{}) Any {
	if len() == 0 {
		return 
	}
	switch firstPath := [0].(type) {
	case string:
		 := .val.FieldByName()
		if !.IsValid() {
			return newInvalidAny()
		}
		return Wrap(.Interface())
	case int32:
		if '*' ==  {
			 := map[string]Any{}
			for  := 0;  < .val.NumField(); ++ {
				 := .val.Field()
				if .CanInterface() {
					 := Wrap(.Interface()).Get([1:]...)
					if .ValueType() != InvalidValue {
						[.val.Type().Field().Name] = 
					}
				}
			}
			return wrapMap()
		}
		return newInvalidAny()
	default:
		return newInvalidAny()
	}
}

func ( *objectAny) () []string {
	 := make([]string, 0, .val.NumField())
	for  := 0;  < .val.NumField(); ++ {
		 = append(, .val.Type().Field().Name)
	}
	return 
}

func ( *objectAny) () int {
	return .val.NumField()
}

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

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

type mapAny struct {
	baseAny
	err error
	val reflect.Value
}

func wrapMap( interface{}) *mapAny {
	return &mapAny{baseAny{}, nil, reflect.ValueOf()}
}

func ( *mapAny) () ValueType {
	return ObjectValue
}

func ( *mapAny) () Any {
	return 
}

func ( *mapAny) () *Iterator {
	return nil
}

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

func ( *mapAny) () bool {
	return true
}

func ( *mapAny) () int {
	return 0
}

func ( *mapAny) () int32 {
	return 0
}

func ( *mapAny) () int64 {
	return 0
}

func ( *mapAny) () uint {
	return 0
}

func ( *mapAny) () uint32 {
	return 0
}

func ( *mapAny) () uint64 {
	return 0
}

func ( *mapAny) () float32 {
	return 0
}

func ( *mapAny) () float64 {
	return 0
}

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

func ( *mapAny) ( ...interface{}) Any {
	if len() == 0 {
		return 
	}
	switch firstPath := [0].(type) {
	case int32:
		if '*' ==  {
			 := map[string]Any{}
			for ,  := range .val.MapKeys() {
				 := .String()
				 := Wrap(.val.MapIndex().Interface())
				 := .Get([1:]...)
				if .ValueType() != InvalidValue {
					[] = 
				}
			}
			return wrapMap()
		}
		return newInvalidAny()
	default:
		 := .val.MapIndex(reflect.ValueOf())
		if !.IsValid() {
			return newInvalidAny()
		}
		return Wrap(.Interface())
	}
}

func ( *mapAny) () []string {
	 := make([]string, 0, .val.Len())
	for ,  := range .val.MapKeys() {
		 = append(, .String())
	}
	return 
}

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

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

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