structure/hashmap/table.go
2019-04-22 04:46:07 +08:00

203 lines
4.1 KiB
Go

package hashmap
type Table struct {
// ysizes []int
// xsizes [][]int
// xyproduct int
size uint
growsize uint
data [][4][4]*avlTree
cap uint
}
func newTable() *Table {
table := &Table{}
table.data = make([][4][4]*avlTree, 4, 4)
table.countCap()
return table
}
func (t *Table) countCap() {
t.cap = uint(len(t.data)) << 4 // * (4 * 4)
}
// func (t *Table) countNextGrow() {
// t.growsize = uint(len(t.data)) << 6 // +4 * (4 * 4)
// }
// func (arr *Table) debugValues() []interface{} {
// var result []interface{}
// for _, z := range arr.data {
// if z != nil {
// for _, y := range z {
// if y == nil {
// for i := 0; i < arr.xsize; i++ {
// result = append(result, nil)
// }
// } else {
// for _, x := range y {
// if x == nil {
// result = append(result, struct{}{})
// } else {
// result = append(result, x)
// }
// }
// }
// }
// } else {
// for i := 0; i < arr.ysize*arr.xsize; i++ {
// result = append(result, nil)
// }
// }
// }
// return result
// }
// func (arr *Table) Values() []interface{} {
// var result []interface{}
// for _, z := range arr.data {
// if z != nil {
// for _, y := range z {
// if y == nil {
// for i := 0; i < arr.xsize; i++ {
// result = append(result, nil)
// }
// } else {
// for _, x := range y {
// if x == nil {
// result = append(result, nil)
// } else {
// result = append(result, x)
// }
// }
// }
// }
// } else {
// for i := 0; i < arr.ysize*arr.xsize; i++ {
// result = append(result, nil)
// }
// }
// }
// return result
// }
func (t *Table) Cap() uint {
return t.cap
}
func (t *Table) Grow(size int) {
zsize := len(t.data) + size
temp := make([][4][4]*avlTree, zsize, zsize)
copy(temp, t.data)
t.data = temp
t.countCap()
}
func (t *Table) GetWithNilSet(idx int, DoSetValue func([4]*avlTree, int)) *avlTree {
zindex := idx / 16
nidx := (idx % 16)
yindex := nidx / 4
xindex := nidx % 4
ydata := t.data[zindex]
xdata := ydata[yindex]
v := xdata[xindex]
if v == nil {
DoSetValue(xdata, xindex)
}
return v
}
// 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
// }