Proposal for SentinelInputRange
jerro
a at a.com
Thu Feb 28 15:14:11 PST 2013
> I didn't say can't, I said didn't. llvm handles that case
> (which does surprise me), dmc, gcc, and vc do not. Furthermore,
> I'll say "cannot" on this:
>
> case '|':
> p++;
> if (*p == '=')
> { p++;
> t->value = TOKorass;
> }
> else if (*p == '|')
> { p++;
> t->value = TOKoror;
> }
> else
> t->value = TOKor;
> return;
This code is correct without assuming that r is a sentinel range,
and it is pretty close to your code above:
void foo(R)(ref R r, ref int tvalue)
{
if(!r.empty)
switch(r.front)
{
case '|':
r.popFront();
if (!r.empty && r.front == '=')
{ r.popFront();
tvalue = 1;
}
else if (!r.empty && r.front == '|')
{ r.popFront();
tvalue = 2;
}
else
tvalue = 3;
return;
default:
}
}
If I add this:
struct R
{
ubyte* p;
@property front(){ return *p; }
@property empty(){ return *p == 0; }
void popFront() { p++; }
}
alias foo!R bar;
ldc2 -O3 -release compiles it to:
0: mov (%rsi),%rax
3: cmpb $0x7c,(%rax)
6: jne 3e
8: lea 0x1(%rax),%rcx
c: mov %rcx,(%rsi)
f: mov 0x1(%rax),%cl
12: cmp $0x7c,%cl
15: jne 25
17: add $0x2,%rax
1b: mov %rax,(%rsi)
1e: movl $0x2,(%rdi)
24: retq
25: cmp $0x3d,%cl
28: jne 38
2a: add $0x2,%rax
2e: mov %rax,(%rsi)
31: movl $0x1,(%rdi)
37: retq
38: movl $0x3,(%rdi)
3e: retq
More information about the Digitalmars-d
mailing list