mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2025-10-29 10:42:27 -05:00
- github.com/KimMachineGun/automemlimit v0.7.2 => v0.7.3
- github.com/gin-contrib/cors v1.7.5 => v1.7.6
- github.com/minio/minio-go/v7 v7.0.92 => v7.0.94
- github.com/spf13/cast v1.8.0 => v1.9.2
- github.com/uptrace/bun{,/*} v1.2.11 => v1.2.14
- golang.org/x/image v0.27.0 => v0.28.0
- golang.org/x/net v0.40.0 => v0.41.0
- code.superseriousbusiness.org/go-swagger v0.31.0-gts-go1.23-fix => v0.32.3-gts-go1.23-fix
Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4304
Co-authored-by: kim <grufwub@gmail.com>
Co-committed-by: kim <grufwub@gmail.com>
525 lines
16 KiB
Cheetah
525 lines
16 KiB
Cheetah
//go:build !notfastpath && !codec.notfastpath && (notmono || codec.notmono)
|
|
|
|
// Copyright (c) 2012-2020 Ugorji Nwoke. All rights reserved.
|
|
// Use of this source code is governed by a MIT license found in the LICENSE file.
|
|
|
|
// Code generated from fastpath.notmono.go.tmpl - DO NOT EDIT.
|
|
|
|
package codec
|
|
|
|
import (
|
|
"reflect"
|
|
"sort"
|
|
"slices"
|
|
)
|
|
|
|
type fastpathE[T encDriver] struct {
|
|
rtid uintptr
|
|
rt reflect.Type
|
|
encfn func(*encoder[T], *encFnInfo, reflect.Value)
|
|
}
|
|
type fastpathD[T decDriver] struct {
|
|
rtid uintptr
|
|
rt reflect.Type
|
|
decfn func(*decoder[T], *decFnInfo, reflect.Value)
|
|
}
|
|
type fastpathEs[T encDriver] [{{ .FastpathLen }}]fastpathE[T]
|
|
type fastpathDs[T decDriver] [{{ .FastpathLen }}]fastpathD[T]
|
|
|
|
type fastpathET[T encDriver] struct{}
|
|
type fastpathDT[T decDriver] struct{}
|
|
|
|
func (helperEncDriver[T]) fastpathEList() *fastpathEs[T] {
|
|
var i uint = 0
|
|
var s fastpathEs[T]
|
|
fn := func(v interface{}, fe func(*encoder[T], *encFnInfo, reflect.Value)) {
|
|
xrt := reflect.TypeOf(v)
|
|
s[i] = fastpathE[T]{rt2id(xrt), xrt, fe}
|
|
i++
|
|
}
|
|
{{/* do not register []byte in fastpath */}}
|
|
{{range .Values}}{{if not .Primitive}}{{if not .MapKey -}}
|
|
fn([]{{ .Elem }}(nil), (*encoder[T]).{{ .MethodNamePfx "fastpathEnc" false }}R)
|
|
{{end}}{{end}}{{end}}
|
|
|
|
{{range .Values}}{{if not .Primitive}}{{if .MapKey -}}
|
|
fn(map[{{ .MapKey }}]{{ .Elem }}(nil), (*encoder[T]).{{ .MethodNamePfx "fastpathEnc" false }}R)
|
|
{{end}}{{end}}{{end}}
|
|
|
|
sort.Slice(s[:], func(i, j int) bool { return s[i].rtid < s[j].rtid })
|
|
return &s
|
|
}
|
|
|
|
func (helperDecDriver[T]) fastpathDList() *fastpathDs[T] {
|
|
var i uint = 0
|
|
var s fastpathDs[T]
|
|
fn := func(v interface{}, fd func(*decoder[T], *decFnInfo, reflect.Value)) {
|
|
xrt := reflect.TypeOf(v)
|
|
s[i] = fastpathD[T]{rt2id(xrt), xrt, fd}
|
|
i++
|
|
}
|
|
{{/* do not register []byte in fastpath */}}
|
|
{{range .Values}}{{if not .Primitive}}{{if not .MapKey -}}
|
|
fn([]{{ .Elem }}(nil), (*decoder[T]).{{ .MethodNamePfx "fastpathDec" false }}R)
|
|
{{end}}{{end}}{{end}}
|
|
|
|
{{range .Values}}{{if not .Primitive}}{{if .MapKey -}}
|
|
fn(map[{{ .MapKey }}]{{ .Elem }}(nil), (*decoder[T]).{{ .MethodNamePfx "fastpathDec" false }}R)
|
|
{{end}}{{end}}{{end}}
|
|
|
|
sort.Slice(s[:], func(i, j int) bool { return s[i].rtid < s[j].rtid })
|
|
return &s
|
|
}
|
|
|
|
// -- encode
|
|
|
|
// -- -- fast path type switch
|
|
func (helperEncDriver[T]) fastpathEncodeTypeSwitch(iv interface{}, e *encoder[T]) bool {
|
|
var ft fastpathET[T]
|
|
switch v := iv.(type) {
|
|
{{range .Values}}{{if not .Primitive}}{{if not .MapKey -}}
|
|
case []{{ .Elem }}:
|
|
if v == nil { e.e.writeNilArray() } else { ft.{{ .MethodNamePfx "Enc" false }}V(v, e) }
|
|
{{end}}{{end}}{{end -}}
|
|
|
|
{{range .Values}}{{if not .Primitive}}{{if .MapKey -}}
|
|
case map[{{ .MapKey }}]{{ .Elem }}:
|
|
if v == nil { e.e.writeNilMap() } else { ft.{{ .MethodNamePfx "Enc" false }}V(v, e) }
|
|
{{end}}{{end}}{{end -}}
|
|
|
|
default:
|
|
_ = v // workaround https://github.com/golang/go/issues/12927 seen in go1.4
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
// -- -- fast path functions
|
|
{{range .Values}}{{if not .Primitive}}{{if not .MapKey -}}
|
|
func (e *encoder[T]) {{ .MethodNamePfx "fastpathEnc" false }}R(f *encFnInfo, rv reflect.Value) {
|
|
var ft fastpathET[T]
|
|
var v []{{ .Elem }}
|
|
if rv.Kind() == reflect.Array {
|
|
rvGetSlice4Array(rv, &v)
|
|
} else {
|
|
v = rv2i(rv).([]{{ .Elem }})
|
|
}
|
|
if f.ti.mbs {
|
|
ft.{{ .MethodNamePfx "EncAsMap" false }}V(v, e)
|
|
return
|
|
}
|
|
ft.{{ .MethodNamePfx "Enc" false }}V(v, e)
|
|
}
|
|
func (fastpathET[T]) {{ .MethodNamePfx "Enc" false }}V(v []{{ .Elem }}, e *encoder[T]) {
|
|
{{ if eq .Elem "uint8" "byte" -}}
|
|
e.e.EncodeStringBytesRaw(v)
|
|
{{ else -}}
|
|
if len(v) == 0 {
|
|
e.c = 0; e.e.WriteArrayEmpty()
|
|
return
|
|
}
|
|
e.arrayStart(len(v))
|
|
for j := range v {
|
|
e.c = containerArrayElem; e.e.WriteArrayElem(j == 0)
|
|
{{ encmd .Elem "v[j]"}}
|
|
}
|
|
e.c = 0; e.e.WriteArrayEnd()
|
|
{{ end -}}
|
|
}
|
|
func (fastpathET[T]) {{ .MethodNamePfx "EncAsMap" false }}V(v []{{ .Elem }}, e *encoder[T]) {
|
|
if len(v) == 0 {
|
|
e.c = 0; e.e.WriteMapEmpty()
|
|
return
|
|
}
|
|
e.haltOnMbsOddLen(len(v))
|
|
e.mapStart(len(v) >> 1) // e.mapStart(len(v) / 2)
|
|
for j := range v {
|
|
if j&1 == 0 { // if j%2 == 0 {
|
|
e.c = containerMapKey; e.e.WriteMapElemKey(j == 0)
|
|
} else {
|
|
e.mapElemValue()
|
|
}
|
|
{{ encmd .Elem "v[j]"}}
|
|
}
|
|
e.c = 0; e.e.WriteMapEnd()
|
|
}
|
|
|
|
{{end}}{{end}}{{end -}}
|
|
|
|
{{range .Values}}{{if not .Primitive}}{{if .MapKey -}}
|
|
func (e *encoder[T]) {{ .MethodNamePfx "fastpathEnc" false }}R(f *encFnInfo, rv reflect.Value) {
|
|
{{/* var ft fastpathET[T]
|
|
ft.{{ .MethodNamePfx "Enc" false }}V(rv2i(rv).(map[{{ .MapKey }}]{{ .Elem }}), e) */ -}}
|
|
fastpathET[T]{}.{{ .MethodNamePfx "Enc" false }}V(rv2i(rv).(map[{{ .MapKey }}]{{ .Elem }}), e)
|
|
}
|
|
func (fastpathET[T]) {{ .MethodNamePfx "Enc" false }}V(v map[{{ .MapKey }}]{{ .Elem }}, e *encoder[T]) {
|
|
{{/* if v == nil { e.e.EncodeNil(); return } */ -}}
|
|
if len(v) == 0 {
|
|
e.e.WriteMapEmpty()
|
|
return
|
|
}
|
|
var i uint
|
|
e.mapStart(len(v))
|
|
if e.h.Canonical { {{/* need to figure out .NoCanonical */}}
|
|
{{if eq .MapKey "interface{}"}}{{/* out of band */ -}}
|
|
var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding
|
|
e2 := NewEncoderBytes(&mksv, e.hh)
|
|
v2 := make([]bytesIntf, len(v))
|
|
var l uint {{/* put loop variables outside. seems currently needed for better perf */}}
|
|
var vp *bytesIntf
|
|
for k2 := range v {
|
|
l = uint(len(mksv))
|
|
e2.MustEncode(k2)
|
|
vp = &v2[i]
|
|
vp.v = mksv[l:]
|
|
vp.i = k2
|
|
i++
|
|
}
|
|
slices.SortFunc(v2, cmpBytesIntf)
|
|
for j := range v2 {
|
|
e.c = containerMapKey; e.e.WriteMapElemKey(j == 0)
|
|
e.asis(v2[j].v)
|
|
e.mapElemValue()
|
|
e.encode(v[v2[j].i])
|
|
} {{else}}{{ $x := sorttype .MapKey true}}v2 := make([]{{ $x }}, len(v))
|
|
for k := range v {
|
|
v2[i] = {{if eq $x .MapKey}}k{{else}}{{ $x }}(k){{end}}
|
|
i++
|
|
}
|
|
slices.Sort(v2)
|
|
{{/* // sort.Sort({{ sorttype .MapKey false}}(v2)) */ -}}
|
|
for i, k2 := range v2 {
|
|
e.c = containerMapKey; e.e.WriteMapElemKey(i == 0)
|
|
{{if eq .MapKey "string"}} e.e.EncodeString(k2) {{else}}{{ $y := printf "%s(k2)" .MapKey }}{{if eq $x .MapKey }}{{ $y = "k2" }}{{end}}{{ encmd .MapKey $y }}{{end}}
|
|
e.mapElemValue()
|
|
{{ $y := printf "v[%s(k2)]" .MapKey }}{{if eq $x .MapKey }}{{ $y = "v[k2]" }}{{end}}{{ encmd .Elem $y }}
|
|
} {{end}}
|
|
} else {
|
|
i = 0
|
|
for k2, v2 := range v {
|
|
e.c = containerMapKey; e.e.WriteMapElemKey(i == 0)
|
|
{{if eq .MapKey "string"}} e.e.EncodeString(k2) {{else}}{{ encmd .MapKey "k2"}}{{end}}
|
|
e.mapElemValue()
|
|
{{ encmd .Elem "v2"}}
|
|
i++
|
|
}
|
|
}
|
|
e.c = 0; e.e.WriteMapEnd()
|
|
}
|
|
{{end}}{{end}}{{end -}}
|
|
|
|
// -- decode
|
|
|
|
// -- -- fast path type switch
|
|
func (helperDecDriver[T]) fastpathDecodeTypeSwitch(iv interface{}, d *decoder[T]) bool {
|
|
var ft fastpathDT[T]
|
|
var changed bool
|
|
var containerLen int
|
|
switch v := iv.(type) {
|
|
{{range .Values}}{{if not .Primitive}}{{if not .MapKey -}}
|
|
case []{{ .Elem }}:
|
|
ft.{{ .MethodNamePfx "Dec" false }}N(v, d)
|
|
case *[]{{ .Elem }}:
|
|
var v2 []{{ .Elem }}
|
|
if v2, changed = ft.{{ .MethodNamePfx "Dec" false }}Y(*v, d); changed {
|
|
*v = v2
|
|
}
|
|
{{end}}{{end}}{{end -}}
|
|
{{range .Values}}{{if not .Primitive}}{{if .MapKey }}{{/*
|
|
// maps only change if nil, and in that case, there's no point copying
|
|
*/ -}}
|
|
case map[{{ .MapKey }}]{{ .Elem }}:
|
|
if containerLen = d.mapStart(d.d.ReadMapStart()); containerLen != containerLenNil {
|
|
if containerLen != 0 {
|
|
ft.{{ .MethodNamePfx "Dec" false }}L(v, containerLen, d)
|
|
}
|
|
d.mapEnd()
|
|
}
|
|
case *map[{{ .MapKey }}]{{ .Elem }}:
|
|
if containerLen = d.mapStart(d.d.ReadMapStart()); containerLen == containerLenNil {
|
|
*v = nil
|
|
} else {
|
|
if *v == nil {
|
|
*v = make(map[{{ .MapKey }}]{{ .Elem }}, decInferLen(containerLen, d.maxInitLen(), {{ .Size }}))
|
|
}
|
|
if containerLen != 0 {
|
|
ft.{{ .MethodNamePfx "Dec" false }}L(*v, containerLen, d)
|
|
}
|
|
d.mapEnd()
|
|
}
|
|
{{end}}{{end}}{{end -}}
|
|
default:
|
|
_ = v // workaround https://github.com/golang/go/issues/12927 seen in go1.4
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
// -- -- fast path functions
|
|
{{range .Values}}{{if not .Primitive}}{{if not .MapKey -}}
|
|
{{/*
|
|
Slices can change if they
|
|
- did not come from an array
|
|
- are addressable (from a ptr)
|
|
- are settable (e.g. contained in an interface{})
|
|
*/}}
|
|
func (d *decoder[T]) {{ .MethodNamePfx "fastpathDec" false }}R(f *decFnInfo, rv reflect.Value) {
|
|
var ft fastpathDT[T]
|
|
{{/*
|
|
// seqTypeArray=true means that we are not getting a pointer, so no need to check that.
|
|
if f.seq != seqTypeArray && rv.Kind() == reflect.Ptr {
|
|
*/ -}}
|
|
switch rv.Kind() {
|
|
case reflect.Ptr: {{- /* this block is called for types that wrap a fastpath type e.g. wrapSliceUint64 */}}
|
|
v := rv2i(rv).(*[]{{ .Elem }})
|
|
if vv, changed := ft.{{ .MethodNamePfx "Dec" false }}Y(*v, d); changed {
|
|
*v = vv
|
|
}
|
|
case reflect.Array:
|
|
var v []{{ .Elem }}
|
|
rvGetSlice4Array(rv, &v)
|
|
ft.{{ .MethodNamePfx "Dec" false }}N(v, d)
|
|
default:
|
|
ft.{{ .MethodNamePfx "Dec" false }}N(rv2i(rv).([]{{ .Elem }}), d)
|
|
}
|
|
}
|
|
func (fastpathDT[T]) {{ .MethodNamePfx "Dec" false }}Y(v []{{ .Elem }}, d *decoder[T]) (v2 []{{ .Elem }}, changed bool) {
|
|
ctyp := d.d.ContainerType()
|
|
if ctyp == valueTypeNil {
|
|
return nil, v != nil
|
|
}
|
|
{{ if eq .Elem "uint8" "byte" -}}
|
|
if ctyp != valueTypeMap {
|
|
var dbi dBytesIntoState
|
|
v2, dbi = d.decodeBytesInto(v[:len(v):len(v)], false)
|
|
return v2, dbi != dBytesIntoParamOut
|
|
}
|
|
containerLenS := d.mapStart(d.d.ReadMapStart()) * 2
|
|
{{ else -}}
|
|
var containerLenS int
|
|
isArray := ctyp == valueTypeArray
|
|
if isArray {
|
|
containerLenS = d.arrayStart(d.d.ReadArrayStart())
|
|
} else if ctyp == valueTypeMap {
|
|
containerLenS = d.mapStart(d.d.ReadMapStart()) * 2
|
|
} else {
|
|
halt.errorStr2("decoding into a slice, expect map/array - got ", ctyp.String())
|
|
}
|
|
{{ end -}}
|
|
hasLen := containerLenS >= 0
|
|
var j int
|
|
fnv := func(dst []{{ .Elem }}) { v, changed = dst, true }
|
|
for ; d.containerNext(j, containerLenS, hasLen); j++ {
|
|
if j == 0 {
|
|
if containerLenS == len(v) {
|
|
} else if containerLenS < 0 || containerLenS > cap(v) {
|
|
if xlen := int(decInferLen(containerLenS, d.maxInitLen(), {{ .Size }})); xlen <= cap(v) {
|
|
fnv(v[:uint(xlen)])
|
|
} else {
|
|
v2 = make([]{{ .Elem }}, uint(xlen))
|
|
copy(v2, v)
|
|
fnv(v2)
|
|
}
|
|
} else {
|
|
fnv(v[:containerLenS])
|
|
}
|
|
}
|
|
{{ if eq .Elem "uint8" "byte" }}{{ else -}}
|
|
if isArray { d.arrayElem(j == 0) } else
|
|
{{ end -}}
|
|
if j&1 == 0 { d.mapElemKey(j == 0) } else { d.mapElemValue() }
|
|
if j >= len(v) { {{- /* // if indefinite, json, etc, then expand the slice (if necessary) */}}
|
|
fnv(append(v, {{ zerocmd .Elem }}))
|
|
}
|
|
{{ if eq .Elem "interface{}" }}d.decode(&v[uint(j)]){{ else }}v[uint(j)] = {{ decmd .Elem false }}{{ end }}
|
|
}
|
|
if j < len(v) {
|
|
fnv(v[:uint(j)])
|
|
} else if j == 0 && v == nil {
|
|
fnv([]{{ .Elem }}{})
|
|
}
|
|
{{ if eq .Elem "uint8" "byte" -}}
|
|
d.mapEnd()
|
|
{{ else -}}
|
|
if isArray { d.arrayEnd() } else { d.mapEnd() }
|
|
{{ end -}}
|
|
return v, changed
|
|
}
|
|
func (fastpathDT[T]) {{ .MethodNamePfx "Dec" false }}N(v []{{ .Elem }}, d *decoder[T]) {
|
|
ctyp := d.d.ContainerType()
|
|
if ctyp == valueTypeNil {
|
|
return
|
|
}
|
|
{{ if eq .Elem "uint8" "byte" -}}
|
|
if ctyp != valueTypeMap {
|
|
d.decodeBytesInto(v[:len(v):len(v)], true)
|
|
return
|
|
}
|
|
containerLenS := d.mapStart(d.d.ReadMapStart()) * 2
|
|
{{ else -}}
|
|
var containerLenS int
|
|
isArray := ctyp == valueTypeArray
|
|
if isArray {
|
|
containerLenS = d.arrayStart(d.d.ReadArrayStart())
|
|
} else if ctyp == valueTypeMap {
|
|
containerLenS = d.mapStart(d.d.ReadMapStart()) * 2
|
|
} else {
|
|
halt.errorStr2("decoding into a slice, expect map/array - got ", ctyp.String())
|
|
}
|
|
{{ end -}}
|
|
hasLen := containerLenS >= 0
|
|
for j := 0; d.containerNext(j, containerLenS, hasLen); j++ {
|
|
{{/* // if indefinite, etc, then expand the slice if necessary */ -}}
|
|
{{ if not (eq .Elem "uint8" "byte") -}}
|
|
if isArray { d.arrayElem(j == 0) } else
|
|
{{ end -}}
|
|
if j&1 == 0 { d.mapElemKey(j == 0) } else { d.mapElemValue() }
|
|
if j < len(v) {
|
|
{{ if eq .Elem "interface{}" }}d.decode(&v[uint(j)]){{ else }}v[uint(j)] = {{ decmd .Elem false }}{{ end }}
|
|
} else {
|
|
d.arrayCannotExpand(len(v), j+1)
|
|
d.swallow()
|
|
}
|
|
}
|
|
{{ if eq .Elem "uint8" "byte" -}}
|
|
d.mapEnd()
|
|
{{ else -}}
|
|
if isArray { d.arrayEnd() } else { d.mapEnd() }
|
|
{{ end -}}
|
|
}
|
|
{{end}}{{end}}{{end -}}
|
|
|
|
{{range .Values}}{{if not .Primitive}}{{if .MapKey -}}
|
|
{{/*
|
|
Maps can change if they are
|
|
- addressable (from a ptr)
|
|
- settable (e.g. contained in an interface{})
|
|
*/ -}}
|
|
func (d *decoder[T]) {{ .MethodNamePfx "fastpathDec" false }}R(f *decFnInfo, rv reflect.Value) {
|
|
var ft fastpathDT[T]
|
|
containerLen := d.mapStart(d.d.ReadMapStart())
|
|
if rv.Kind() == reflect.Ptr { {{- /* this block is called for types that wrap a fastpath type e.g. wrapMapStringUint64 */}}
|
|
vp, _ := rv2i(rv).(*map[{{ .MapKey }}]{{ .Elem }})
|
|
if *vp == nil {
|
|
*vp = make(map[{{ .MapKey }}]{{ .Elem }}, decInferLen(containerLen, d.maxInitLen(), {{ .Size }}))
|
|
}
|
|
if containerLen != 0 {
|
|
ft.{{ .MethodNamePfx "Dec" false }}L(*vp, containerLen, d)
|
|
}
|
|
} else if containerLen != 0 {
|
|
ft.{{ .MethodNamePfx "Dec" false }}L(rv2i(rv).(map[{{ .MapKey }}]{{ .Elem }}), containerLen, d)
|
|
}
|
|
d.mapEnd()
|
|
}
|
|
func (fastpathDT[T]) {{ .MethodNamePfx "Dec" false }}L(v map[{{ .MapKey }}]{{ .Elem }}, containerLen int, d *decoder[T]) {
|
|
if v == nil {
|
|
halt.errorInt("cannot decode into nil map[{{ .MapKey }}]{{ .Elem }} given stream length: ", int64(containerLen))
|
|
{{/* d.swallowMapContents(containerLen); return */ -}}
|
|
}
|
|
{{if eq .MapKey "interface{}" -}}
|
|
var mk {{ .MapKey }}
|
|
{{end -}}
|
|
{{ if eq .Elem "interface{}" "[]byte" "bytes" -}}
|
|
var mv {{ .Elem }}
|
|
mapGet := !d.h.MapValueReset
|
|
{{- if eq .Elem "interface{}" -}}
|
|
&& !d.h.InterfaceReset
|
|
{{- end}}
|
|
{{end -}}
|
|
hasLen := containerLen >= 0
|
|
for j := 0; d.containerNext(j, containerLen, hasLen); j++ {
|
|
d.mapElemKey(j == 0)
|
|
{{ if eq .MapKey "interface{}" -}}
|
|
mk = nil
|
|
d.decode(&mk)
|
|
if bv, bok := mk.([]byte); bok {
|
|
mk = d.detach2Str(bv) {{/* // maps cannot have []byte as key. switch to string. */}}
|
|
}{{ else }}mk := {{ decmd .MapKey true }}{{ end }}
|
|
d.mapElemValue()
|
|
{{ if eq .Elem "interface{}" "[]byte" "bytes" -}}
|
|
if mapGet { mv = v[mk] } else { mv = nil }
|
|
{{ end -}}
|
|
{{ if eq .Elem "interface{}" -}}
|
|
d.decode(&mv)
|
|
v[mk] = mv
|
|
{{ else if eq .Elem "[]byte" "bytes" -}}
|
|
v[mk], _ = d.decodeBytesInto(mv, false)
|
|
{{ else -}}
|
|
v[mk] = {{ decmd .Elem false }}
|
|
{{ end -}}
|
|
}
|
|
}
|
|
{{end}}{{end}}{{end}}
|
|
|
|
{{- /*
|
|
|
|
// -- -- fast path type switch
|
|
func (helperEncDriver[T]) fastpathEncodeTypeSwitch(iv interface{}, e *encoder[T]) bool {
|
|
var ft fastpathET[T]
|
|
switch v := iv.(type) {
|
|
{{range .Values}}{{if not .Primitive}}{{if not .MapKey -}}
|
|
case []{{ .Elem }}:
|
|
if v != nil {
|
|
ft.{{ .MethodNamePfx "Enc" false }}V(v, e)
|
|
} else if e.h.NilCollectionToZeroLength {
|
|
e.e.WriteArrayEmpty()
|
|
} else {
|
|
e.e.EncodeNil()
|
|
}
|
|
case *[]{{ .Elem }}:
|
|
if *v != nil {
|
|
ft.{{ .MethodNamePfx "Enc" false }}V(*v, e)
|
|
} else if e.h.NilCollectionToZeroLength {
|
|
e.e.WriteArrayEmpty()
|
|
} else {
|
|
e.e.EncodeNil()
|
|
}
|
|
{{end}}{{end}}{{end -}}
|
|
|
|
{{range .Values}}{{if not .Primitive}}{{if .MapKey -}}
|
|
case map[{{ .MapKey }}]{{ .Elem }}:
|
|
if v != nil {
|
|
ft.{{ .MethodNamePfx "Enc" false }}V(v, e)
|
|
} else if e.h.NilCollectionToZeroLength {
|
|
e.e.WriteMapEmpty()
|
|
} else {
|
|
e.e.EncodeNil()
|
|
}
|
|
case *map[{{ .MapKey }}]{{ .Elem }}:
|
|
if *v != nil {
|
|
ft.{{ .MethodNamePfx "Enc" false }}V(*v, e)
|
|
} else if e.h.NilCollectionToZeroLength {
|
|
e.e.WriteMapEmpty()
|
|
} else {
|
|
e.e.EncodeNil()
|
|
}
|
|
{{end}}{{end}}{{end -}}
|
|
|
|
default:
|
|
_ = v // workaround https://github.com/golang/go/issues/12927 seen in go1.4
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
// used within codecgen, which is no longer supported
|
|
func (f fastpathDT[T]) {{ .MethodNamePfx "Dec" false }}X(vp *[]{{ .Elem }}, d *decoder[T]) {
|
|
if v, changed := f.{{ .MethodNamePfx "Dec" false }}Y(*vp, d); changed { *vp = v }
|
|
}
|
|
|
|
func (f fastpathDT[T]) {{ .MethodNamePfx "Dec" false }}X(vp *map[{{ .MapKey }}]{{ .Elem }}, d *decoder[T]) {
|
|
containerLen := d.mapStart(d.d.ReadMapStart())
|
|
if containerLen == containerLenNil {
|
|
*vp = nil
|
|
return
|
|
}
|
|
if *vp == nil {
|
|
*vp = make(map[{{ .MapKey }}]{{ .Elem }}, decInferLen(containerLen, d.maxInitLen(), {{ .Size }}))
|
|
}
|
|
if containerLen != 0 {
|
|
f.{{ .MethodNamePfx "Dec" false }}L(*vp, containerLen, d)
|
|
}
|
|
d.mapEnd()
|
|
}
|
|
|
|
*/ -}}
|