--- source: src/main.rs expression: compiled input_file: test-data/lua5.2-tests/checktable.lua --- assert(rawget(_G, "stat") == nil); if T == nil { stat = fn () { print("`querytab' not active"); } return } global fn checktable(t) { local asize, hsize, ff = T.querytab(t) local l = {} for i = 0, hsize - 1 { local key, val, next = T.querytab(t, i + asize) if key == nil { assert(l[(i)] == nil && val == nil && next == nil); } elseif if key == "" { assert(val == nil); } else { assert(t[(key)] == val); local mp = T.hash(key, t) if l[(i)] { assert(l[(i)] == mp); } elseif if mp != i { l[(i)] = mp } else { l[(mp)] = { mp } while next { assert(ff <= next && next < hsize); if l[(next)] { assert(l[(next)] == mp); } else { l[(next)] = mp } table.insert(l[(mp)], next); key, val, next = T.querytab(t, next) assert(key); } } } } l.asize = asize l.hsize = hsize l.ff = ff return l } global fn mostra(t) { local asize, hsize, ff = T.querytab(t) print(asize, hsize, ff); print('------'); for i = 0, asize - 1 { local _, v = T.querytab(t, i) print(string.format("[%d] -", i), v); } print('------'); for i = 0, hsize - 1 { print(i, T.querytab(t, i + asize)); } print('-------------'); } global fn stat(t) { t = checktable(t) local nelem, nlist = 0, 0 local maxlist = {} for i = 0, t.hsize - 1 { if type(t[(i)]) == 'table' { local n = table.getn(t[(i)]) nlist = nlist + 1 nelem = nelem + n if !maxlist[(n)] { maxlist[(n)] = 0 } maxlist[(n)] = maxlist[(n)] + 1 } } print(string.format("hsize=%d elements=%d load=%.2f med.len=%.2f (asize=%d)", t.hsize, nelem, nelem / t.hsize, nelem / nlist, t.asize)); for i = 1, table.getn(maxlist) { local n = maxlist[(i)] || 0 print(string.format("%5d %10d %.2f%%", i, n, n * 100 / nlist)); } }