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