package msgpack

import (
	
	
	

	
)

func ( *Encoder,  reflect.Value) error {
	if .IsNil() {
		return .EncodeNil()
	}

	if  := .EncodeMapLen(.Len());  != nil {
		return 
	}

	 := .MapRange()
	for .Next() {
		if  := .EncodeValue(.Key());  != nil {
			return 
		}
		if  := .EncodeValue(.Value());  != nil {
			return 
		}
	}

	return nil
}

func ( *Encoder,  reflect.Value) error {
	if .IsNil() {
		return .EncodeNil()
	}

	if  := .EncodeMapLen(.Len());  != nil {
		return 
	}

	 := .Convert(mapStringStringType).Interface().(map[string]string)
	if .flags&sortMapKeysFlag != 0 {
		return .encodeSortedMapStringString()
	}

	for ,  := range  {
		if  := .EncodeString();  != nil {
			return 
		}
		if  := .EncodeString();  != nil {
			return 
		}
	}

	return nil
}

func ( *Encoder,  reflect.Value) error {
	if .IsNil() {
		return .EncodeNil()
	}
	 := .Convert(mapStringInterfaceType).Interface().(map[string]interface{})
	if .flags&sortMapKeysFlag != 0 {
		return .EncodeMapSorted()
	}
	return .EncodeMap()
}

func ( *Encoder) ( map[string]interface{}) error {
	if  == nil {
		return .EncodeNil()
	}
	if  := .EncodeMapLen(len());  != nil {
		return 
	}
	for ,  := range  {
		if  := .EncodeString();  != nil {
			return 
		}
		if  := .Encode();  != nil {
			return 
		}
	}
	return nil
}

func ( *Encoder) ( map[string]interface{}) error {
	if  == nil {
		return .EncodeNil()
	}
	if  := .EncodeMapLen(len());  != nil {
		return 
	}

	 := make([]string, 0, len())

	for  := range  {
		 = append(, )
	}

	sort.Strings()

	for ,  := range  {
		if  := .EncodeString();  != nil {
			return 
		}
		if  := .Encode([]);  != nil {
			return 
		}
	}

	return nil
}

func ( *Encoder) ( map[string]string) error {
	 := make([]string, 0, len())
	for  := range  {
		 = append(, )
	}
	sort.Strings()

	for ,  := range  {
		 := .EncodeString()
		if  != nil {
			return 
		}
		if  = .EncodeString([]);  != nil {
			return 
		}
	}

	return nil
}

func ( *Encoder) ( int) error {
	if  < 16 {
		return .writeCode(msgpcode.FixedMapLow | byte())
	}
	if  <= math.MaxUint16 {
		return .write2(msgpcode.Map16, uint16())
	}
	return .write4(msgpcode.Map32, uint32())
}

func ( *Encoder,  reflect.Value) error {
	 := structs.Fields(.Type(), .structTag)
	if .flags&arrayEncodedStructsFlag != 0 || .AsArray {
		return encodeStructValueAsArray(, , .List)
	}
	 := .OmitEmpty(, .flags&omitEmptyFlag != 0)

	if  := .EncodeMapLen(len());  != nil {
		return 
	}

	for ,  := range  {
		if  := .EncodeString(.name);  != nil {
			return 
		}
		if  := .EncodeValue(, );  != nil {
			return 
		}
	}

	return nil
}

func ( *Encoder,  reflect.Value,  []*field) error {
	if  := .EncodeArrayLen(len());  != nil {
		return 
	}
	for ,  := range  {
		if  := .EncodeValue(, );  != nil {
			return 
		}
	}
	return nil
}