gen-dec-map.go.tmpl 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. {{var "v"}} := *{{ .Varname }}
  2. {{var "l"}} := r.ReadMapStart()
  3. if {{var "v"}} == nil {
  4. if {{var "l"}} > 0 {
  5. {{var "v"}} = make(map[{{ .KTyp }}]{{ .Typ }}, {{var "l"}})
  6. } else {
  7. {{var "v"}} = make(map[{{ .KTyp }}]{{ .Typ }}) // supports indefinite-length, etc
  8. }
  9. *{{ .Varname }} = {{var "v"}}
  10. }
  11. if {{var "l"}} > 0 {
  12. for {{var "j"}} := 0; {{var "j"}} < {{var "l"}}; {{var "j"}}++ {
  13. var {{var "mk"}} {{ .KTyp }}
  14. {{ $x := printf "%vmk%v" .TempVar .Rand }}{{ decLineVarK $x }}
  15. {{ if eq .KTyp "interface{}" }}// special case if a byte array.
  16. if {{var "bv"}}, {{var "bok"}} := {{var "mk"}}.([]byte); {{var "bok"}} {
  17. {{var "mk"}} = string({{var "bv"}})
  18. }
  19. {{ end }}
  20. {{var "mv"}} := {{var "v"}}[{{var "mk"}}]
  21. {{ $x := printf "%vmv%v" .TempVar .Rand }}{{ decLineVar $x }}
  22. if {{var "v"}} != nil {
  23. {{var "v"}}[{{var "mk"}}] = {{var "mv"}}
  24. }
  25. }
  26. } else if {{var "l"}} < 0 {
  27. for {{var "j"}} := 0; !r.CheckBreak(); {{var "j"}}++ {
  28. if {{var "j"}} > 0 {
  29. r.ReadMapEntrySeparator()
  30. }
  31. var {{var "mk"}} {{ .KTyp }}
  32. {{ $x := printf "%vmk%v" .TempVar .Rand }}{{ decLineVarK $x }}
  33. {{ if eq .KTyp "interface{}" }}// special case if a byte array.
  34. if {{var "bv"}}, {{var "bok"}} := {{var "mk"}}.([]byte); {{var "bok"}} {
  35. {{var "mk"}} = string({{var "bv"}})
  36. }
  37. {{ end }}
  38. r.ReadMapKVSeparator()
  39. {{var "mv"}} := {{var "v"}}[{{var "mk"}}]
  40. {{ $x := printf "%vmv%v" .TempVar .Rand }}{{ decLineVar $x }}
  41. if {{var "v"}} != nil {
  42. {{var "v"}}[{{var "mk"}}] = {{var "mv"}}
  43. }
  44. }
  45. r.ReadMapEnd()
  46. } // else len==0: TODO: Should we clear map entries?