[Date Prev][Date Next][Thread Prev][Thread Next]
- Subject: Re: C API - lua_next traversal of "array" table
- From: Ross Berteig <Ross@...>
- Date: Fri, 19 Aug 2016 11:50:10 -0700
On 8/18/2016 5:48 PM, ThePhD wrote:
My only problem is: how do I know how big the array part is?
See, this is why naming the internal implementation detail "array part"
is a mistake. Forget there ever was such a thing.
What you have is called a "sequence". It is a table that contains
integer keys from 1 to n with no holes. It might have other keys too,
and generally that doesn't prevent it being a sequence.
The implementation detail that some or all of those integers are
physically in "the array part" is not what made it a sequence. It is
still a sequence if none of the integers are in the array part.
I could use
`#t` or fight with its equivalent in the Lua 5.1/2/3 code, which is
either lua_objlen or lua_rawlength (I can't remember which).
If your code is sufficiently disciplined to never poke holes in your
sequences, then `#t` is the right way to learn the length of the
sequence in the table `t`. In C, the equivalent is lua_objlen() in 5.1,
and lua_len() in 5.2 and 5.3.
Right now I
have a fixed size at compile-time... I could just keep iterating integer
keys from 1 to infinity until I hit a snag, but that seems less than
useful (and doesn't allow me to pre-allocate the size to save performance).
Since you already need to iterate, then iterating until nil saves you
the additional O(log n) cost from `#t`.
Ross Berteig Ross@CheshireEng.com
Cheshire Engineering Corp. http://www.CheshireEng.com/
+1 626 303 1602