github.com/xyproto/gopher-lua@v1.0.2/_lua5.1-tests/checktable.lua (about)

     1  
     2  assert(rawget(_G, "stat") == nil)  -- module not loaded before
     3  
     4  if T == nil then
     5    stat = function () print"`querytab' nao ativo" end
     6    return
     7  end
     8  
     9  
    10  function 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
    40  end
    41  
    42  function 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'-------------'
    55  end
    56  
    57  function 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
    76  end
    77