gen-dec-array.go.tmpl 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. {{var "v"}} := *{{ .Varname }}
  2. {{var "h"}}, {{var "l"}} := z.DecSliceHelperStart()
  3. var {{var "c"}} bool
  4. {{ if not isArray }}if {{var "v"}} == nil {
  5. if {{var "l"}} <= 0 {
  6. {{var "v"}} = make({{ .CTyp }}, 0)
  7. } else {
  8. {{var "v"}} = make({{ .CTyp }}, {{var "l"}})
  9. }
  10. {{var "c"}} = true
  11. }
  12. {{ end }}
  13. if {{var "l"}} == 0 { {{ if isSlice }}
  14. if len({{var "v"}}) != 0 {
  15. {{var "v"}} = {{var "v"}}[:0]
  16. {{var "c"}} = true
  17. } {{ end }}
  18. } else if {{var "l"}} > 0 {
  19. {{ if isChan }}
  20. for {{var "r"}} := 0; {{var "r"}} < {{var "l"}}; {{var "r"}}++ {
  21. var {{var "t"}} {{ .Typ }}
  22. {{ $x := printf "%st%s" .TempVar .Rand }}{{ decLineVar $x }}
  23. {{var "v"}} <- {{var "t"}}
  24. {{ else }}
  25. {{var "n"}} := {{var "l"}}
  26. if {{var "l"}} > cap({{var "v"}}) {
  27. {{ if isArray }}r.ReadArrayCannotExpand(len({{var "v"}}), {{var "l"}})
  28. {{var "n"}} = len({{var "v"}})
  29. {{ else }}{{ if .Immutable }}
  30. {{var "v2"}} := {{var "v"}}
  31. {{var "v"}} = make([]{{ .Typ }}, {{var "l"}}, {{var "l"}})
  32. if len({{var "v"}}) > 0 {
  33. copy({{var "v"}}, {{var "v2"}}[:cap({{var "v2"}})])
  34. }
  35. {{ else }}{{var "v"}} = make([]{{ .Typ }}, {{var "l"}}, {{var "l"}})
  36. {{ end }}{{var "c"}} = true
  37. {{ end }}
  38. } else if {{var "l"}} != len({{var "v"}}) {
  39. {{var "v"}} = {{var "v"}}[:{{var "l"}}]
  40. {{var "c"}} = true
  41. }
  42. {{var "j"}} := 0
  43. for ; {{var "j"}} < {{var "n"}} ; {{var "j"}}++ {
  44. {{ $x := printf "%[1]vv%[2]v[%[1]vj%[2]v]" .TempVar .Rand }}{{ decLineVar $x }}
  45. } {{ if isArray }}
  46. for ; {{var "j"}} < {{var "l"}} ; {{var "j"}}++ {
  47. z.DecSwallow()
  48. }{{ end }}
  49. {{ end }}{{/* closing if not chan */}}
  50. } else {
  51. for {{var "j"}} := 0; !r.CheckBreak(); {{var "j"}}++ {
  52. if {{var "j"}} >= len({{var "v"}}) {
  53. {{ if isArray }}r.ReadArrayCannotExpand(len({{var "v"}}), {{var "j"}}+1)
  54. {{ else if isSlice}}{{var "v"}} = append({{var "v"}}, {{zero}})// var {{var "z"}} {{ .Typ }}
  55. {{var "c"}} = true {{ end }}
  56. }
  57. if {{var "j"}} > 0 {
  58. {{var "h"}}.Sep({{var "j"}})
  59. }
  60. {{ if isChan}}
  61. var {{var "t"}} {{ .Typ }}
  62. {{ $x := printf "%st%s" .TempVar .Rand }}{{ decLineVar $x }}
  63. {{var "v"}} <- {{var "t"}}
  64. {{ else }}
  65. if {{var "j"}} < len({{var "v"}}) {
  66. {{ $x := printf "%[1]vv%[2]v[%[1]vj%[2]v]" .TempVar .Rand }}{{ decLineVar $x }}
  67. } else {
  68. z.DecSwallow()
  69. }
  70. {{ end }}
  71. }
  72. {{var "h"}}.End()
  73. }
  74. if {{var "c"}} {
  75. *{{ .Varname }} = {{var "v"}}
  76. }