package hashmap type Table struct { // ysizes []int // xsizes [][]int // xyproduct int size uint growsize uint data []*avlTree cap uint } func newTable() *Table { table := &Table{} table.data = make([]*avlTree, 16, 16) table.countCap() return table } func (t *Table) countCap() { t.cap = uint(len(t.data)) // * (4 * 4) } func (t *Table) Cap() uint { return t.cap } func (t *Table) Traversal(every func(node *avlTree)) { for _, z := range t.data { every(z) } } func (t *Table) Grow(size int) { zsize := len(t.data) + size temp := make([]*avlTree, zsize, zsize) copy(temp, t.data) t.data = temp t.countCap() } func (t *Table) Get(idx uint) *avlTree { return t.data[idx] } func (t *Table) GetWithNilSet(idx uint, DoSetValue func([]*avlTree, uint)) *avlTree { if t.data[idx] == nil { DoSetValue(t.data, idx) } return t.data[idx] } // func (arr *Table) Get(idx int) (interface{}, bool) { // zindex := idx / arr.xyproduct // nextsize := (idx % arr.xyproduct) // yindex := nextsize / arr.xsize // xindex := nextsize % arr.xsize // ydata := arr.data[zindex] // if ydata == nil { // return nil, false // } // xdata := ydata[yindex] // if xdata == nil { // return nil, false // } // v := xdata[xindex] // return v, v != nil // } // func (arr *Table) GetOrSet(idx int, DoSetValue func([]interface{}, int)) (result interface{}, isSet bool) { // zindex := idx / arr.xyproduct // nidx := (idx % arr.xyproduct) // yindex := nidx / arr.xsize // xindex := nidx % arr.xsize // ydata := arr.data[zindex] // if ydata == nil { // ydata = make([][]interface{}, arr.ysize, arr.ysize) // arr.data[zindex] = ydata // } // xdata := ydata[yindex] // if xdata == nil { // xdata = make([]interface{}, arr.xsize, arr.xsize) // ydata[yindex] = xdata // arr.ysizes[zindex]++ // } // result = xdata[xindex] // if result == nil { // DoSetValue(xdata, xindex) // result = xdata[xindex] // if result == nil { // panic("DoSetValue Not Set Value") // } // arr.xsizes[zindex][yindex]++ // return result, false // } // return result, true // } // func (arr *Table) Del(idx int) (interface{}, bool) { // zindex := idx / arr.xyproduct // nextsize := (idx % arr.xyproduct) // yindex := nextsize / arr.xsize // xindex := nextsize % arr.xsize // ydata := arr.data[zindex] // if ydata == nil { // return nil, false // } // xdata := ydata[yindex] // if xdata == nil { // return nil, false // } // v := xdata[xindex] // xdata[xindex] = nil // isnotnil := v != nil // if isnotnil { // arr.xsizes[zindex][yindex]-- // if arr.xsizes[zindex][yindex] == 0 { // arr.data[zindex][yindex] = nil // arr.ysizes[zindex]-- // if arr.ysizes[zindex] == 0 { // arr.data[zindex] = nil // } // } // } // return v, isnotnil // }