diff --git a/tools/vt/linebuf.go b/tools/vt/linebuf.go index 121b090d0..73d02f1b9 100644 --- a/tools/vt/linebuf.go +++ b/tools/vt/linebuf.go @@ -6,21 +6,26 @@ import ( var _ = fmt.Print +const extra_capacity uint = 4 + type LineBuf struct { - cells []Cell - attrs []LineAttrs - line_map []uint - xnum, ynum uint + cells []Cell + attrs []LineAttrs + line_map, scratch []uint + xnum, ynum uint } func NewLineBuf(xnum, ynum uint) *LineBuf { - lm := make([]uint, ynum, ynum) + lm := make([]uint, ynum, ynum+extra_capacity) var i uint for i = 0; i < ynum; i++ { lm[i] = i } return &LineBuf{ - cells: make([]Cell, xnum*ynum, xnum*ynum), attrs: make([]LineAttrs, ynum, ynum), xnum: xnum, ynum: ynum, line_map: lm, + cells: make([]Cell, xnum*ynum, xnum*(ynum+extra_capacity)), + attrs: make([]LineAttrs, len(lm), cap(lm)), + scratch: make([]uint, len(lm), cap(lm)), + xnum: xnum, ynum: ynum, line_map: lm, } } @@ -32,11 +37,11 @@ func (self *LineBuf) Line(y uint) Line { func (self *LineBuf) AddLines(n uint) { ynum := self.ynum + n if uint(cap(self.line_map)) >= ynum { - self.line_map = self.line_map[:ynum] - self.attrs = self.attrs[:ynum] - self.cells = self.cells[:ynum*self.xnum] + self.line_map = self.line_map[0:ynum:cap(self.line_map)] + self.scratch = self.scratch[0:ynum:cap(self.scratch)] + self.attrs = self.attrs[0:ynum:cap(self.attrs)] + self.cells = self.cells[0 : ynum*self.xnum : cap(self.cells)] } else { - const extra_capacity uint = 2 newattrs := make([]LineAttrs, ynum, ynum+extra_capacity) copy(newattrs, self.attrs) newlinemap := make([]uint, ynum, ynum+extra_capacity) @@ -49,6 +54,7 @@ func (self *LineBuf) AddLines(n uint) { self.attrs = newattrs self.line_map = newlinemap self.cells = newcells + self.scratch = make([]uint, len(self.line_map), cap(self.line_map)) } self.ynum = ynum }