poolgen.go raw
1 package main
2
3 import (
4 "os"
5 )
6
7 type poolType struct {
8 name, sliceName, constructor string
9 }
10
11 var types = []poolType{
12 {"Bool", "bools", "Bool(false)"},
13 {"List", "lists", "List()"},
14 {"Checkable", "checkables", "Checkable()"},
15 {"Clickable", "clickables", "Clickable()"},
16 {"Editor", "editors", "Editor()"},
17 {"IncDec", "incDecs", "IncDec()"},
18 // {"Stack", "stacks", "Stack()"},
19 }
20
21 func main() {
22 var out string
23 out += `// generated by go run github.com/p9c/gel/poolgen/poolgen.go; DO NOT EDIT
24 //
25 `+`//go:generate go run ./poolgen/.
26
27 package gel
28 `
29 for i := range types {
30 out += `
31 func (p *Pool) Get` + types[i].name + `() (out *` + types[i].name + `) {
32 if len(p.` + types[i].sliceName + `) >= p.` + types[i].sliceName + `InUse {
33 for i := 0; i < 10; i++ {
34 p.` + types[i].sliceName + ` = append(p.` + types[i].sliceName + `, p.` + types[i].constructor + `)
35 }
36 }
37 out = p.` + types[i].sliceName + `[p.` + types[i].sliceName + `InUse]
38 p.` + types[i].sliceName + `InUse++
39 return
40 }
41
42 func (p *Pool) Free` + types[i].name + `(b *` + types[i].name + `) {
43 for i := 0; i < p.` + types[i].sliceName + `InUse; i++ {
44 if p.` + types[i].sliceName + `[i] == b {
45 if i != p.` + types[i].sliceName + `InUse-1 {
46 // move the item to the end. the next allocation will be then at index p.` + types[i].sliceName + `InUse
47 tmp := p.` + types[i].sliceName + `[i]
48 p.` + types[i].sliceName + ` = append(p.` + types[i].sliceName + `[:i], p.` + types[i].sliceName + `[i+1:]...)
49 p.` + types[i].sliceName + ` = append(p.` + types[i].sliceName + `, tmp)
50 p.` + types[i].sliceName + `InUse--
51 break
52 }
53 }
54 }
55 }
56
57 `
58 }
59 if fd, e := os.Create("pooltypes.go"); E.Chk(e) {
60 } else {
61 defer func() {
62 if e = fd.Close(); E.Chk(e) {
63 }
64 }()
65
66 if _, e = fd.Write([]byte(out)); E.Chk(e) {
67 }
68 }
69 }
70