gen.generated.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. // +build codecgen.exec
  2. // Copyright (c) 2012-2020 Ugorji Nwoke. All rights reserved.
  3. // Use of this source code is governed by a MIT license found in the LICENSE file.
  4. package codec
  5. // DO NOT EDIT. THIS FILE IS AUTO-GENERATED FROM gen-dec-(map|array).go.tmpl
  6. const genDecMapTmpl = `
  7. {{var "v"}} := *{{ .Varname }}
  8. {{var "l"}} := z.DecReadMapStart()
  9. if {{var "l"}} == codecSelferDecContainerLenNil{{xs}} {
  10. *{{ .Varname }} = nil
  11. } else {
  12. if {{var "v"}} == nil {
  13. {{var "rl"}} := z.DecInferLen({{var "l"}}, z.DecBasicHandle().MaxInitLen, {{ .Size }})
  14. {{var "v"}} = make(map[{{ .KTyp }}]{{ .Typ }}, {{var "rl"}})
  15. *{{ .Varname }} = {{var "v"}}
  16. }
  17. {{ $mk := var "mk" -}}
  18. var {{ $mk }} {{ .KTyp }}
  19. var {{var "mv"}} {{ .Typ }}
  20. var {{var "mg"}}, {{var "mdn"}} {{if decElemKindPtr}}, {{var "ms"}}, {{var "mok"}}{{end}} bool
  21. if z.DecBasicHandle().MapValueReset {
  22. {{if decElemKindPtr}}{{var "mg"}} = true
  23. {{else if decElemKindIntf}}if !z.DecBasicHandle().InterfaceReset { {{var "mg"}} = true }
  24. {{else if not decElemKindImmutable}}{{var "mg"}} = true
  25. {{end}} }
  26. if {{var "l"}} != 0 {
  27. {{var "hl"}} := {{var "l"}} > 0
  28. for {{var "j"}} := 0; ({{var "hl"}} && {{var "j"}} < {{var "l"}}) || !({{var "hl"}} || z.DecCheckBreak()); {{var "j"}}++ {
  29. z.DecReadMapElemKey()
  30. {{ if eq .KTyp "string" -}}
  31. {{ decLineVarK $mk -}}{{- /* decLineVarKStrZC $mk */ -}}
  32. {{ else -}}
  33. {{ decLineVarK $mk -}}
  34. {{ end -}}
  35. {{ if eq .KTyp "interface{}" }}{{/* // special case if a byte array. */ -}}
  36. if {{var "bv"}}, {{var "bok"}} := {{var "mk"}}.([]byte); {{var "bok"}} {
  37. {{var "mk"}} = z.DecStringZC({{var "bv"}})
  38. }
  39. {{ end -}}
  40. {{if decElemKindPtr -}}
  41. {{var "ms"}} = true
  42. {{end -}}
  43. if {{var "mg"}} {
  44. {{if decElemKindPtr -}}
  45. {{var "mv"}}, {{var "mok"}} = {{var "v"}}[{{ $mk }}]
  46. if {{var "mok"}} {
  47. {{var "ms"}} = false
  48. }
  49. {{else -}}
  50. {{var "mv"}} = {{var "v"}}[{{ $mk }}]
  51. {{end -}}
  52. } {{if not decElemKindImmutable}}else { {{var "mv"}} = {{decElemZero}} }{{end}}
  53. z.DecReadMapElemValue()
  54. {{var "mdn"}} = false
  55. {{ $x := printf "%vmv%v" .TempVar .Rand }}{{ $y := printf "%vmdn%v" .TempVar .Rand }}{{ decLineVar $x $y -}}
  56. if {{var "mdn"}} {
  57. {{var "v"}}[{{ $mk }}] = {{decElemZero}}
  58. } else {{if decElemKindPtr}} if {{var "ms"}} {{end}} {
  59. {{var "v"}}[{{ $mk }}] = {{var "mv"}}
  60. }
  61. }
  62. } // else len==0: leave as-is (do not clear map entries)
  63. z.DecReadMapEnd()
  64. }
  65. `
  66. const genDecListTmpl = `
  67. {{var "v"}} := {{if not isArray}}*{{end}}{{ .Varname }}
  68. {{var "h"}}, {{var "l"}} := z.DecSliceHelperStart() {{/* // helper, containerLenS */}}
  69. {{if not isArray -}}
  70. var {{var "c"}} bool {{/* // changed */}}
  71. _ = {{var "c"}}
  72. if {{var "h"}}.IsNil {
  73. if {{var "v"}} != nil {
  74. {{var "v"}} = nil
  75. {{var "c"}} = true
  76. }
  77. } else {{end -}}
  78. if {{var "l"}} == 0 {
  79. {{if isSlice -}}
  80. if {{var "v"}} == nil {
  81. {{var "v"}} = []{{ .Typ }}{}
  82. {{var "c"}} = true
  83. } else if len({{var "v"}}) != 0 {
  84. {{var "v"}} = {{var "v"}}[:0]
  85. {{var "c"}} = true
  86. } {{else if isChan }}if {{var "v"}} == nil {
  87. {{var "v"}} = make({{ .CTyp }}, 0)
  88. {{var "c"}} = true
  89. }
  90. {{end -}}
  91. } else {
  92. {{var "hl"}} := {{var "l"}} > 0
  93. var {{var "rl"}} int
  94. _ = {{var "rl"}}
  95. {{if isSlice }} if {{var "hl"}} {
  96. if {{var "l"}} > cap({{var "v"}}) {
  97. {{var "rl"}} = z.DecInferLen({{var "l"}}, z.DecBasicHandle().MaxInitLen, {{ .Size }})
  98. if {{var "rl"}} <= cap({{var "v"}}) {
  99. {{var "v"}} = {{var "v"}}[:{{var "rl"}}]
  100. } else {
  101. {{var "v"}} = make([]{{ .Typ }}, {{var "rl"}})
  102. }
  103. {{var "c"}} = true
  104. } else if {{var "l"}} != len({{var "v"}}) {
  105. {{var "v"}} = {{var "v"}}[:{{var "l"}}]
  106. {{var "c"}} = true
  107. }
  108. }
  109. {{end -}}
  110. var {{var "j"}} int
  111. {{/* // var {{var "dn"}} bool */ -}}
  112. for {{var "j"}} = 0; ({{var "hl"}} && {{var "j"}} < {{var "l"}}) || !({{var "hl"}} || z.DecCheckBreak()); {{var "j"}}++ { // bounds-check-elimination
  113. {{if not isArray}} if {{var "j"}} == 0 && {{var "v"}} == nil {
  114. if {{var "hl"}} {
  115. {{var "rl"}} = z.DecInferLen({{var "l"}}, z.DecBasicHandle().MaxInitLen, {{ .Size }})
  116. } else {
  117. {{var "rl"}} = {{if isSlice}}8{{else if isChan}}64{{end}}
  118. }
  119. {{var "v"}} = make({{if isSlice}}[]{{ .Typ }}{{else if isChan}}{{.CTyp}}{{end}}, {{var "rl"}})
  120. {{var "c"}} = true
  121. }
  122. {{end -}}
  123. {{var "h"}}.ElemContainerState({{var "j"}})
  124. {{/* {{var "dn"}} = r.TryDecodeAsNil() */}}{{/* commented out, as decLineVar handles this already each time */ -}}
  125. {{if isChan}}{{ $x := printf "%[1]vvcx%[2]v" .TempVar .Rand }}var {{$x}} {{ .Typ }}
  126. {{ decLineVar $x -}}
  127. {{var "v"}} <- {{ $x }}
  128. {{else}}{{/* // if indefinite, etc, then expand the slice if necessary */ -}}
  129. var {{var "db"}} bool
  130. if {{var "j"}} >= len({{var "v"}}) {
  131. {{if isSlice }} {{var "v"}} = append({{var "v"}}, {{ zero }})
  132. {{var "c"}} = true
  133. {{else}} z.DecArrayCannotExpand(len(v), {{var "j"}}+1); {{var "db"}} = true
  134. {{end -}}
  135. }
  136. if {{var "db"}} {
  137. z.DecSwallow()
  138. } else {
  139. {{ $x := printf "%[1]vv%[2]v[%[1]vj%[2]v]" .TempVar .Rand }}{{ decLineVar $x -}}
  140. }
  141. {{end -}}
  142. }
  143. {{if isSlice}} if {{var "j"}} < len({{var "v"}}) {
  144. {{var "v"}} = {{var "v"}}[:{{var "j"}}]
  145. {{var "c"}} = true
  146. } else if {{var "j"}} == 0 && {{var "v"}} == nil {
  147. {{var "v"}} = []{{ .Typ }}{}
  148. {{var "c"}} = true
  149. }
  150. {{end -}}
  151. }
  152. {{var "h"}}.End()
  153. {{if not isArray }}if {{var "c"}} {
  154. *{{ .Varname }} = {{var "v"}}
  155. }
  156. {{end -}}
  157. `
  158. const genEncChanTmpl = `
  159. {{.Label}}:
  160. switch timeout{{.Sfx}} := z.EncBasicHandle().ChanRecvTimeout; {
  161. case timeout{{.Sfx}} == 0: // only consume available
  162. for {
  163. select {
  164. case b{{.Sfx}} := <-{{.Chan}}:
  165. {{ .Slice }} = append({{.Slice}}, b{{.Sfx}})
  166. default:
  167. break {{.Label}}
  168. }
  169. }
  170. case timeout{{.Sfx}} > 0: // consume until timeout
  171. tt{{.Sfx}} := time.NewTimer(timeout{{.Sfx}})
  172. for {
  173. select {
  174. case b{{.Sfx}} := <-{{.Chan}}:
  175. {{.Slice}} = append({{.Slice}}, b{{.Sfx}})
  176. case <-tt{{.Sfx}}.C:
  177. // close(tt.C)
  178. break {{.Label}}
  179. }
  180. }
  181. default: // consume until close
  182. for b{{.Sfx}} := range {{.Chan}} {
  183. {{.Slice}} = append({{.Slice}}, b{{.Sfx}})
  184. }
  185. }
  186. `