Switch branches/tags
Find file
Fetching contributors…
Cannot retrieve contributors at this time
58 lines (49 sloc) 1.18 KB
package markdown
Elements are not allocated one at a time, but in rows of
elemHeap.RowSize elements. After N elements have been
requested, a row is exhausted, and the next one will
be allocated. Previously allocated rows are tracked in
The Reset() method allows to reset the current position (row, and
position within the row), which allows reusing elements. Whether
elements can be reused, depends on the value of the hasGlobals
type elemHeap struct {
rows [][]element
rowSize int
base heapPos
hasGlobals bool
type heapPos struct {
iRow int
row []element
func (h *elemHeap) nextRow() []element {
if h.iRow == len(h.rows) {
h.rows = append(h.rows, make([]element, h.rowSize))
h.row = h.rows[h.iRow]
return h.row
func (h *elemHeap) init(size int) {
h.rowSize = size
h.rows = [][]element{make([]element, size)}
h.row = h.rows[h.iRow]
h.base = h.heapPos
func (h *elemHeap) Reset() {
if !h.hasGlobals {
h.heapPos = h.base
} else {
/* Don't restore saved position in case elements added
* after the previous Reset call are needed in
* global context, like notes.
h.hasGlobals = false
h.base = h.heapPos