isInfinite isInadequate
Timon Gehr
timon.gehr at gmx.ch
Wed Mar 13 03:36:40 PDT 2013
On 03/12/2013 05:16 PM, Andrei Alexandrescu wrote:
> On 3/12/13 11:47 AM, Steven Schveighoffer wrote:
>> ...
>> Wouldn't this also be valid?
>>
>> if(!R.init.empty)
>>
>> Essentially, you can evaluate R.init.empty at compile time AND it's
>> false on an uninitialized range. How can a correctly written
>> non-infinite range pass that?
>>
>> That would make forwarding much easier, as the 'dumb' implementation
>> still would result in an infinite range.
>
> Crossed my mind a few times that fresh non-infinite ranges should be
> empty. But there's no explicit requirement stating that, and I think
> e.g. one may define a k-elements buffer backed by in-situ storage.
>
> Andrei
std.algorithm.joiner assumes that default-initialized separator ranges
are empty.
import std.algorithm, std.array, std.range;
struct NonEmptyRange{
int[] a = [0,8];
@property int front(){ return a.front; }
@property bool empty(){ return a.empty; }
void popFront(){ a.popFront(); }
@property NonEmptyRange save(){ return NonEmptyRange(a.save); }
}
void main(){
assert(equal([[1,2,3],[1,2,3]].joiner(NonEmptyRange()),[1,2,3,0,8,1,2,3]));
// fail
}
I'd report it, but the bug tracker is down.
More information about the Digitalmars-d
mailing list