1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
package dstream
import (
"fmt"
"time"
)
func (gen *generate) init() {
for _, na := range gen.source.Names() {
if gen.newvarname == na {
msg := fmt.Sprintf("Generate: variable '%s' already exists.\n", gen.newvarname)
panic(msg)
}
}
gen.names = append(gen.source.Names(), gen.newvarname)
gen.bdata = make([]interface{}, len(gen.names))
switch gen.dtype {
{{- range . }}
case {{ .Utype }}:
gen.bdata[len(gen.bdata)-1] = make([]{{ .Type }}, 0)
{{ end }}
default:
panic("Generate: unknown dtype")
}
}
func (gen *generate) Next() bool {
if !gen.source.Next() {
return false
}
// All but new variable
for j := 0; j < gen.source.NumVar(); j++ {
gen.bdata[j] = gen.source.GetPos(j)
}
n := ilen(gen.GetPos(0))
// The new variable goes in the last position
q := len(gen.names) - 1
switch x := gen.bdata[q].(type) {
{{- range . }}
case []{{ .Type }}:
gen.bdata[q] = resize{{ .Utype }}(x, n)
{{ end }}
default:
panic("unknown type")
}
mp := make(map[string]interface{})
for k, na := range gen.names {
if na != gen.newvarname {
mp[na] = gen.bdata[k]
}
}
gen.gfunc(mp, gen.bdata[q])
return true
}
|