143 lines
2.8 KiB
Go
143 lines
2.8 KiB
Go
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 <nil> 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
|
|
// }
|