package msgpack

import (
	
	

	
)

var stringSliceType = reflect.TypeOf(([]string)(nil))

func ( *Encoder,  reflect.Value) error {
	return .EncodeString(.String())
}

func ( *Encoder,  reflect.Value) error {
	return .EncodeBytes(.Bytes())
}

func ( *Encoder,  reflect.Value) error {
	if  := .EncodeBytesLen(.Len());  != nil {
		return 
	}

	if .CanAddr() {
		 := .Slice(0, .Len()).Bytes()
		return .write()
	}

	.buf = grow(.buf, .Len())
	reflect.Copy(reflect.ValueOf(.buf), )
	return .write(.buf)
}

func ( []byte,  int) []byte {
	if cap() >=  {
		return [:]
	}
	 = [:cap()]
	 = append(, make([]byte, -len())...)
	return 
}

func ( *Encoder) ( int) error {
	if  < 256 {
		return .write1(msgpcode.Bin8, uint8())
	}
	if  <= math.MaxUint16 {
		return .write2(msgpcode.Bin16, uint16())
	}
	return .write4(msgpcode.Bin32, uint32())
}

func ( *Encoder) ( int) error {
	if  < 32 {
		return .writeCode(msgpcode.FixedStrLow | byte())
	}
	if  < 256 {
		return .write1(msgpcode.Str8, uint8())
	}
	if  <= math.MaxUint16 {
		return .write2(msgpcode.Str16, uint16())
	}
	return .write4(msgpcode.Str32, uint32())
}

func ( *Encoder) ( string) error {
	if  := .flags&useInternedStringsFlag != 0;  || len(.dict) > 0 {
		return .encodeInternedString(, )
	}
	return .encodeNormalString()
}

func ( *Encoder) ( string) error {
	if  := .encodeStringLen(len());  != nil {
		return 
	}
	return .writeString()
}

func ( *Encoder) ( []byte) error {
	if  == nil {
		return .EncodeNil()
	}
	if  := .EncodeBytesLen(len());  != nil {
		return 
	}
	return .write()
}

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

func ( *Encoder,  reflect.Value) error {
	 := .Convert(stringSliceType).Interface().([]string)
	return .encodeStringSlice()
}

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

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

func ( *Encoder,  reflect.Value) error {
	 := .Len()
	if  := .EncodeArrayLen();  != nil {
		return 
	}
	for  := 0;  < ; ++ {
		if  := .EncodeValue(.Index());  != nil {
			return 
		}
	}
	return nil
}