codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
function CountedTable(x) assert(type(x) == 'table', 'bad parameter #1: must be table') local mt = {} -- `keys` will represent the number of non integral indexes -- `indxs` will represent the number of integral indexes -- `all` will represent the number of both local keys, indxs, all = 0, 0, 0 for k, v in pairs(x) do if (type(k) == 'number') and (k == math.floor(k)) then indxs = indxs + 1 else keys = keys + 1 end all = all + 1 end mt.__newindex = function(t, k, v) if (type(k) == 'number') and (k == math.floor(k)) then indxs = indxs + 1 else keys = keys + 1 end all = all + 1 t[k] = v end mt.__index = function(t, k) if k == 'keyCount' then return keys elseif k == 'indexCount' then return indxs elseif k == 'totalCount' then return all end end return setmetatable(x, mt) end -- Note `36.35433` would NOT be counted as an integral index. local foo = CountedTable { 1, 2, 3, 4, [36.35433] = 36.35433, [54] = 54 } local bar = CountedTable { x = 23, y = 43, z = 334, [true] = true } local foobar = CountedTable { 1, 2, 3, x = 'x', [true] = true, [64] = 64 } print(foo.indexCount) print(bar.keyCount) print(foobar.totalCount)
Private
[
?
]
Run code
Submit