[Date Prev][Date Next][Thread Prev][Thread Next]
- Subject: Re: Lua hashes
- From: Andre de Leiradella <aleirade@...>
- Date: Mon, 12 Oct 2009 18:56:18 -0300
So instead of feeding all my strings to gperf, I would insert them all
in a Lua table as keys to integer values. In the metamethods, I just
index that table with the key which already has its hash value computed
(i.e. the hash will not be re-evaluated) and get back the unique integer
I can use in a switch for example.
This is precisely what I suggested to Chris Gagnon, but done in the C
side. How on Earth I didn't think of it?
Mark Hamburg wrote:
Your __index and __newindex functions can also store string to integer
maps as upvalues and do the following:
lua_pushvalue( L, 2 ); /* The key */
lua_gettable( L, lua_upvalueindex( kKeyTableIndex ) );
int keyIndex = lua_tointeger( L, -1 );
You could also use the environment index for the functions to do this.
Note that you don't want to have 0 be a valid result index (offset
everything by 1 if need be) since undefined keys will come back as 1.
The actual lookup will probably be about as fast as your hash table so
the overhead is in the other API calls.
You could become more clever for __index by having the translation table
itself have an __index method that returns the key for any undefined
items and you could then avoid the need to copy the key and instead
could just translate it in place.