  lua-l archive

• Subject: Re: Newbie questions regarding luasocket, tables
• From: Luis Carvalho <carvalho@...>
• Date: Tue, 8 May 2007 13:47:31 -0400

```> Wouldn't it be easy, and very low-overhead, to increment and decrement a
> count for every add/remove? My countpairs() is O(n) :-(

If you really, really need to know the number of key-value pairs in your table
(which is probably not the case, as Javier suggested), you can try this:

-- hash.lua
local new = function()
local t = {}
local n = 0
local u = newproxy(true)
local mt = getmetatable(u)
mt.__index = t
mt.__newindex = function(o, k, v)
if t[k] == nil and v ~= nil then -- new key?
n = n + 1
elseif t[k] ~= nil and v == nil then -- remove key?
n = n - 1
end
t[k] = v
end
mt.__len = function() return n end
mt.__call = function() return next, t, nil end -- pairs
return u
end

module(..., function(mod) setmetatable(mod, {__call = new}) end)

\$ lua -i -lhash
Lua 5.1.1  Copyright (C) 1994-2006 Lua.org, PUC-Rio
> h = hash()
> h.k1 = 10
> h.k2 = "hash"
> = #h
2
> h.k2 = nil
> for k, v in h() do print(k,v) end
k1      10
> = #h
1

It's simple and pure Lua, but I'm not sure it's right. :) I hope you never
need to keep counts on weak tables, as this could get trickier.

Cheers,
Luis.

--
A mathematician is a device for turning coffee into theorems.
-- P. Erdos

--
Luis Carvalho
Applied Math PhD Student - Brown University
PGP Key: E820854A <carvalho@dam.brown.edu>

```