package avro

import (
	
	

	
)

func decoderOfPtr( *decoderContext,  Schema,  reflect2.Type) ValDecoder {
	 := .(*reflect2.UnsafePtrType)
	 := .Elem()

	 := decoderOfType(, , )

	return &dereferenceDecoder{typ: , decoder: }
}

type dereferenceDecoder struct {
	typ     reflect2.Type
	decoder ValDecoder
}

func ( *dereferenceDecoder) ( unsafe.Pointer,  *Reader) {
	if *((*unsafe.Pointer)()) == nil {
		// Create new instance
		 := .typ.UnsafeNew()
		.decoder.Decode(, )
		*((*unsafe.Pointer)()) = 
		return
	}

	// Reuse existing instance
	.decoder.Decode(*((*unsafe.Pointer)()), )
}

func encoderOfPtr( *encoderContext,  Schema,  reflect2.Type) ValEncoder {
	 := .(*reflect2.UnsafePtrType)
	 := .Elem()

	 := encoderOfType(, , )

	return &dereferenceEncoder{typ: , encoder: }
}

type dereferenceEncoder struct {
	typ     reflect2.Type
	encoder ValEncoder
}

func ( *dereferenceEncoder) ( unsafe.Pointer,  *Writer) {
	if *((*unsafe.Pointer)()) == nil {
		.Error = errors.New("avro: cannot encode nil pointer")
		return
	}

	.encoder.Encode(*((*unsafe.Pointer)()), )
}

type referenceDecoder struct {
	decoder ValDecoder
}

func ( *referenceDecoder) ( unsafe.Pointer,  *Reader) {
	.decoder.Decode(unsafe.Pointer(&), )
}