[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: C API - lua_next traversal of "array" table
- From: Tim Hill <drtimhill@...>
- Date: Sat, 20 Aug 2016 01:04:44 -0700
> On Aug 19, 2016, at 11:50 AM, Ross Berteig <Ross@CheshireEng.com> wrote:
>
>
>
> 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`.
>
Yet again, #t and iterating t to the first nil rears it’s ugly head.
—Tim