chunkBy array at compile time

Steven Schveighoffer schveiguy at gmail.com
Wed Dec 19 19:01:28 UTC 2018


On 12/19/18 1:30 PM, H. S. Teoh wrote:
> On Wed, Dec 19, 2018 at 01:19:28PM -0500, Steven Schveighoffer via Digitalmars-d-learn wrote:
>> On 12/19/18 12:20 PM, H. S. Teoh wrote:
> [...]
>>> It was originally a simple wrapper when I first submitted it, but
>>> Andrei requested to use RefCounted in order to work around the
>>> subrange traversal problem. I.e., in the original implementation,
>>> the underlying range traversed twice, once when each subrange is
>>> consumed, and once when you call popFront on the outer range. Having
>>> RefCounted allows us to retain a reference to the original range so
>>> that subranges will also advance the underlying range as seen by the
>>> outer range, thereby eliminating calling popFront on the underlying
>>> range twice per element.
>>
>> I see, that does pose an issue, especially if you aren't traversing it
>> in order. Communicating back to the "outer" range where the traversal
>> should stop requires having a reference to it in the subrange.
>>
>> However, in terms of a random-access range, or even an array, it
>> should be pretty straightforward to... oh wait, these are narrow
>> strings. nevermind.
> [...]
> 
> For CTFE, though, we don't really care about calling popFront twice, so
> I surmise that we should be able to just use the original non-RefCounted
> implementation. It's not hard, just take out the bits where the
> subranges communicate with the outer range, and just have each subrange
> carry its own instance of the underlying range.  It will incur some CTFE
> performance hit, but that's better than not being CTFE-able at all.

There is a problem here though -- CTFE must compile the same 
(essentially) as normal runtime. We can make different code paths for 
CTFE, but the problem I see in the meantime is that the TYPE must be the 
same.

In other words, the CTFE version shouldn't use RefCounted, but the type 
already has that in there.

I also see some bad things happening if initialized at compile time via 
CTFE, but then used at runtime. But I don't know if that works or not.

-Steve


More information about the Digitalmars-d-learn mailing list