1
2assert(rawget(_G, "stat") == nil)  -- module not loaded before
3
4if T == nil then
5  stat = function () print"`querytab' nao ativo" end
6  return
7end
8
9
10function checktable (t)
11  local asize, hsize, ff = T.querytab(t)
12  local l = {}
13  for i=0,hsize-1 do
14    local key,val,next = T.querytab(t, i + asize)
15    if key == nil then
16      assert(l[i] == nil and val==nil and next==nil)
17    elseif key == "<undef>" then
18      assert(val==nil)
19    else
20      assert(t[key] == val)
21      local mp = T.hash(key, t)
22      if l[i] then
23        assert(l[i] == mp)
24      elseif mp ~= i then
25        l[i] = mp
26      else  -- list head
27        l[mp] = {mp}   -- first element
28        while next do
29          assert(ff <= next and next < hsize)
30          if l[next] then assert(l[next] == mp) else l[next] = mp end
31          table.insert(l[mp], next)
32          key,val,next = T.querytab(t, next)
33          assert(key)
34        end
35      end
36    end
37  end
38  l.asize = asize; l.hsize = hsize; l.ff = ff
39  return l
40end
41
42function mostra (t)
43  local asize, hsize, ff = T.querytab(t)
44  print(asize, hsize, ff)
45  print'------'
46  for i=0,asize-1 do
47    local _, v = T.querytab(t, i)
48    print(string.format("[%d] -", i), v)
49  end
50  print'------'
51  for i=0,hsize-1 do
52    print(i, T.querytab(t, i+asize))
53  end
54  print'-------------'
55end
56
57function stat (t)
58  t = checktable(t)
59  local nelem, nlist = 0, 0
60  local maxlist = {}
61  for i=0,t.hsize-1 do
62    if type(t[i]) == 'table' then
63      local n = table.getn(t[i])
64      nlist = nlist+1
65      nelem = nelem + n
66      if not maxlist[n] then maxlist[n] = 0 end
67      maxlist[n] = maxlist[n]+1
68    end
69  end
70  print(string.format("hsize=%d  elements=%d  load=%.2f  med.len=%.2f (asize=%d)",
71          t.hsize, nelem, nelem/t.hsize, nelem/nlist, t.asize))
72  for i=1,table.getn(maxlist) do
73    local n = maxlist[i] or 0
74    print(string.format("%5d %10d %.2f%%", i, n, n*100/nlist))
75  end
76end
77
78