package gojay

var objKeyStr = []byte(`":"`)
var objKeyObj = []byte(`":{`)
var objKeyArr = []byte(`":[`)
var objKey = []byte(`":`)

// EncodeObject encodes an object to JSON
func ( *Encoder) ( MarshalerJSONObject) error {
	if .isPooled == 1 {
		panic(InvalidUsagePooledEncoderError("Invalid usage of pooled encoder"))
	}
	,  := .encodeObject()
	if  != nil {
		.err = 
		return 
	}
	_,  = .Write()
	if  != nil {
		.err = 
		return 
	}
	return nil
}

// EncodeObjectKeys encodes an object to JSON
func ( *Encoder) ( MarshalerJSONObject,  []string) error {
	if .isPooled == 1 {
		panic(InvalidUsagePooledEncoderError("Invalid usage of pooled encoder"))
	}
	.hasKeys = true
	.keys = 
	,  := .encodeObject()
	if  != nil {
		.err = 
		return 
	}
	_,  = .Write()
	if  != nil {
		.err = 
		return 
	}
	return nil
}

func ( *Encoder) ( MarshalerJSONObject) ([]byte, error) {
	.grow(512)
	.writeByte('{')
	if !.IsNil() {
		.MarshalJSONObject()
	}
	if .hasKeys {
		.hasKeys = false
		.keys = nil
	}
	.writeByte('}')
	return .buf, .err
}

// AddObject adds an object to be encoded, must be used inside a slice or array encoding (does not encode a key)
// value must implement MarshalerJSONObject
func ( *Encoder) ( MarshalerJSONObject) {
	.Object()
}

// AddObjectOmitEmpty adds an object to be encoded or skips it if IsNil returns true.
// Must be used inside a slice or array encoding (does not encode a key)
// value must implement MarshalerJSONObject
func ( *Encoder) ( MarshalerJSONObject) {
	.ObjectOmitEmpty()
}

// AddObjectNullEmpty adds an object to be encoded or skips it if IsNil returns true.
// Must be used inside a slice or array encoding (does not encode a key)
// value must implement MarshalerJSONObject
func ( *Encoder) ( MarshalerJSONObject) {
	.ObjectNullEmpty()
}

// AddObjectKey adds a struct to be encoded, must be used inside an object as it will encode a key
// value must implement MarshalerJSONObject
func ( *Encoder) ( string,  MarshalerJSONObject) {
	.ObjectKey(, )
}

// AddObjectKeyOmitEmpty adds an object to be encoded or skips it if IsNil returns true.
// Must be used inside a slice or array encoding (does not encode a key)
// value must implement MarshalerJSONObject
func ( *Encoder) ( string,  MarshalerJSONObject) {
	.ObjectKeyOmitEmpty(, )
}

// AddObjectKeyNullEmpty adds an object to be encoded or skips it if IsNil returns true.
// Must be used inside a slice or array encoding (does not encode a key)
// value must implement MarshalerJSONObject
func ( *Encoder) ( string,  MarshalerJSONObject) {
	.ObjectKeyNullEmpty(, )
}

// Object adds an object to be encoded, must be used inside a slice or array encoding (does not encode a key)
// value must implement MarshalerJSONObject
func ( *Encoder) ( MarshalerJSONObject) {
	if .IsNil() {
		.grow(2)
		 := .getPreviousRune()
		if  != '{' &&  != '[' {
			.writeByte(',')
		}
		.writeByte('{')
		.writeByte('}')
		return
	}
	.grow(4)
	 := .getPreviousRune()
	if  != '[' {
		.writeByte(',')
	}
	.writeByte('{')

	var  = .hasKeys
	var  = .keys
	.hasKeys = false
	.keys = nil

	.MarshalJSONObject()

	.hasKeys = 
	.keys = 

	.writeByte('}')
}

// ObjectWithKeys adds an object to be encoded, must be used inside a slice or array encoding (does not encode a key)
// value must implement MarshalerJSONObject. It will only encode the keys in keys.
func ( *Encoder) ( MarshalerJSONObject,  []string) {
	if .IsNil() {
		.grow(2)
		 := .getPreviousRune()
		if  != '{' &&  != '[' {
			.writeByte(',')
		}
		.writeByte('{')
		.writeByte('}')
		return
	}
	.grow(4)
	 := .getPreviousRune()
	if  != '[' {
		.writeByte(',')
	}
	.writeByte('{')

	var  = .keys
	var  = .hasKeys
	.hasKeys = true
	.keys = 

	.MarshalJSONObject()

	.hasKeys = 
	.keys = 

	.writeByte('}')
}

// ObjectOmitEmpty adds an object to be encoded or skips it if IsNil returns true.
// Must be used inside a slice or array encoding (does not encode a key)
// value must implement MarshalerJSONObject
func ( *Encoder) ( MarshalerJSONObject) {
	if .IsNil() {
		return
	}
	.grow(2)
	 := .getPreviousRune()
	if  != '[' {
		.writeByte(',')
	}
	.writeByte('{')

	var  = .hasKeys
	var  = .keys
	.hasKeys = false
	.keys = nil

	.MarshalJSONObject()

	.hasKeys = 
	.keys = 

	.writeByte('}')
}

// ObjectNullEmpty adds an object to be encoded or skips it if IsNil returns true.
// Must be used inside a slice or array encoding (does not encode a key)
// value must implement MarshalerJSONObject
func ( *Encoder) ( MarshalerJSONObject) {
	.grow(2)
	 := .getPreviousRune()
	if  != '[' {
		.writeByte(',')
	}
	if .IsNil() {
		.writeBytes(nullBytes)
		return
	}
	.writeByte('{')

	var  = .hasKeys
	var  = .keys
	.hasKeys = false
	.keys = nil

	.MarshalJSONObject()

	.hasKeys = 
	.keys = 

	.writeByte('}')
}

// ObjectKey adds a struct to be encoded, must be used inside an object as it will encode a key
// value must implement MarshalerJSONObject
func ( *Encoder) ( string,  MarshalerJSONObject) {
	if .hasKeys {
		if !.keyExists() {
			return
		}
	}
	if .IsNil() {
		.grow(2 + len())
		 := .getPreviousRune()
		if  != '{' {
			.writeByte(',')
		}
		.writeByte('"')
		.writeStringEscape()
		.writeBytes(objKeyObj)
		.writeByte('}')
		return
	}
	.grow(5 + len())
	 := .getPreviousRune()
	if  != '{' {
		.writeByte(',')
	}
	.writeByte('"')
	.writeStringEscape()
	.writeBytes(objKeyObj)

	var  = .hasKeys
	var  = .keys
	.hasKeys = false
	.keys = nil

	.MarshalJSONObject()

	.hasKeys = 
	.keys = 

	.writeByte('}')
}

// ObjectKeyWithKeys adds a struct to be encoded, must be used inside an object as it will encode a key.
// Value must implement MarshalerJSONObject. It will only encode the keys in keys.
func ( *Encoder) ( string,  MarshalerJSONObject,  []string) {
	if .hasKeys {
		if !.keyExists() {
			return
		}
	}
	if .IsNil() {
		.grow(2 + len())
		 := .getPreviousRune()
		if  != '{' {
			.writeByte(',')
		}
		.writeByte('"')
		.writeStringEscape()
		.writeBytes(objKeyObj)
		.writeByte('}')
		return
	}
	.grow(5 + len())
	 := .getPreviousRune()
	if  != '{' {
		.writeByte(',')
	}
	.writeByte('"')
	.writeStringEscape()
	.writeBytes(objKeyObj)
	var  = .keys
	var  = .hasKeys
	.hasKeys = true
	.keys = 
	.MarshalJSONObject()
	.hasKeys = 
	.keys = 
	.writeByte('}')
}

// ObjectKeyOmitEmpty adds an object to be encoded or skips it if IsNil returns true.
// Must be used inside a slice or array encoding (does not encode a key)
// value must implement MarshalerJSONObject
func ( *Encoder) ( string,  MarshalerJSONObject) {
	if .hasKeys {
		if !.keyExists() {
			return
		}
	}
	if .IsNil() {
		return
	}
	.grow(5 + len())
	 := .getPreviousRune()
	if  != '{' {
		.writeByte(',')
	}
	.writeByte('"')
	.writeStringEscape()
	.writeBytes(objKeyObj)

	var  = .hasKeys
	var  = .keys
	.hasKeys = false
	.keys = nil

	.MarshalJSONObject()

	.hasKeys = 
	.keys = 

	.writeByte('}')
}

// ObjectKeyNullEmpty adds an object to be encoded or skips it if IsNil returns true.
// Must be used inside a slice or array encoding (does not encode a key)
// value must implement MarshalerJSONObject
func ( *Encoder) ( string,  MarshalerJSONObject) {
	if .hasKeys {
		if !.keyExists() {
			return
		}
	}
	.grow(5 + len())
	 := .getPreviousRune()
	if  != '{' {
		.writeByte(',')
	}
	.writeByte('"')
	.writeStringEscape()
	.writeBytes(objKey)
	if .IsNil() {
		.writeBytes(nullBytes)
		return
	}
	.writeByte('{')

	var  = .hasKeys
	var  = .keys
	.hasKeys = false
	.keys = nil

	.MarshalJSONObject()

	.hasKeys = 
	.keys = 

	.writeByte('}')
}

// EncodeObjectFunc is a custom func type implementing MarshaleObject.
// Use it to cast a func(*Encoder) to Marshal an object.
//
//	enc := gojay.NewEncoder(io.Writer)
//	enc.EncodeObject(gojay.EncodeObjectFunc(func(enc *gojay.Encoder) {
//		enc.AddStringKey("hello", "world")
//	}))
type EncodeObjectFunc func(*Encoder)

// MarshalJSONObject implements MarshalerJSONObject.
func ( EncodeObjectFunc) ( *Encoder) {
	()
}

// IsNil implements MarshalerJSONObject.
func ( EncodeObjectFunc) () bool {
	return  == nil
}

func ( *Encoder) ( string) bool {
	if .keys == nil {
		return false
	}
	for ,  := range .keys {
		if  ==  {
			return true
		}
	}
	return false
}