Proposal for SentinelInputRange

deadalnix deadalnix at gmail.com
Wed Feb 27 23:37:22 PST 2013


On Thursday, 28 February 2013 at 07:22:53 UTC, Walter Bright 
wrote:
> On 2/27/2013 10:02 PM, deadalnix wrote:
>> On Thursday, 28 February 2013 at 05:28:47 UTC, Walter Bright 
>> wrote:
>>> On 2/27/2013 9:20 PM, deadalnix wrote:
>>>> If the range define empty with something like front == 
>>>> sentinel, the inliner
>>>> should kick in a reduce the whole stuff to only one read, no 
>>>> ?
>>>
>>>    auto c = front;
>>>    if (c == sentinel || c == XX)
>>>
>>> is two reads. This may not seem important, but when you want 
>>> high speed, it
>>> can halve it.
>>
>> Don't you have to check for both all the time ? You have to 
>> check for the
>> sentinel anyway.
>
> I suggest again taking a look at the dmd source lexer.c for how 
> to do it. There is no extra check.

I did, in fact I know it for quite a while.

It does check for sentinel in many places (and it has to). How is 
it better than a empty property defined as front == sentinel ?

For instance,

if(!r.empty) {
    switch(r.front) {
        // cases
    }

    // somecode
} else {
     // error code
}

Will be optimized by adding a case for the sentinel in the switch 
(if dmd don't, then it has to be fixed, LLVM is definitively able 
to do stuff like that, and I didn't checked, but I'd bet that GCC 
can do it as well) in the given way :

switch(r.front) {
     case sentinel :
        // error code
        goto Label;

     // cases
}

// somecode

Label:

I don't see how defining a specific sentinel range here helps.


More information about the Digitalmars-d mailing list