structure/hashmap/table.go
2019-05-07 13:59:29 +08:00

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
// }