package decoder

import (
	
	

	
)

type ptrDecoder struct {
	dec        Decoder
	typ        *runtime.Type
	structName string
	fieldName  string
}

func newPtrDecoder( Decoder,  *runtime.Type, ,  string) *ptrDecoder {
	return &ptrDecoder{
		dec:        ,
		typ:        ,
		structName: ,
		fieldName:  ,
	}
}

func ( *ptrDecoder) () Decoder {
	,  := .dec.(*ptrDecoder)
	if ! {
		return .dec
	}
	return .()
}

//nolint:golint
//go:linkname unsafe_New reflect.unsafe_New
func unsafe_New(*runtime.Type) unsafe.Pointer

func ( *runtime.Type) unsafe.Pointer {
	return unsafe_New()
}

func ( *ptrDecoder) ( *Stream,  int64,  unsafe.Pointer) error {
	if .skipWhiteSpace() == nul {
		.read()
	}
	if .char() == 'n' {
		if  := nullBytes();  != nil {
			return 
		}
		*(*unsafe.Pointer)() = nil
		return nil
	}
	var  unsafe.Pointer
	if *(*unsafe.Pointer)() == nil {
		 = unsafe_New(.typ)
		*(*unsafe.Pointer)() = 
	} else {
		 = *(*unsafe.Pointer)()
	}
	if  := .dec.DecodeStream(, , );  != nil {
		return 
	}
	return nil
}

func ( *ptrDecoder) ( *RuntimeContext, ,  int64,  unsafe.Pointer) (int64, error) {
	 := .Buf
	 = skipWhiteSpace(, )
	if [] == 'n' {
		if  := validateNull(, );  != nil {
			return 0, 
		}
		if  != nil {
			*(*unsafe.Pointer)() = nil
		}
		 += 4
		return , nil
	}
	var  unsafe.Pointer
	if *(*unsafe.Pointer)() == nil {
		 = unsafe_New(.typ)
		*(*unsafe.Pointer)() = 
	} else {
		 = *(*unsafe.Pointer)()
	}
	,  := .dec.Decode(, , , )
	if  != nil {
		*(*unsafe.Pointer)() = nil
		return 0, 
	}
	 = 
	return , nil
}

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