isBidirectionalRange fails for unknown reasons

Jack Stouffer via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Dec 16 12:43:02 PST 2015


I'm trying to add a ReferenceBidirectionalRange range type to 
std.internal.test.dummyrange so I can test some range code I'm 
writing, but I've hit a wall and I'm not sure why. For some 
reason, the isBidirectionalRange check fails even though back and 
popBack are present. Any help here would be appreciated.

the code:
============================
import std.range;

class ReferenceInputRange(T)
{
     import std.array : array;

     this(Range)(Range r) if (isInputRange!Range) { _payload = 
array(r); }
     final @property ref T front(){ return _payload.front; }
     final void popFront(){ _payload.popFront(); }
     final @property bool empty(){ return _payload.empty; }
     protected T[] _payload;
}

class ReferenceForwardRange(T) : ReferenceInputRange!T
{
     this(Range)(Range r) if (isInputRange!Range) { super(r); }
     final @property ReferenceForwardRange save()
     {return new ReferenceForwardRange!T( _payload); }
}

class ReferenceBidirectionalRange(T) : ReferenceForwardRange!T
{
     this(Range)(Range r) if (isInputRange!Range) { super(r); }
     final @property ref T back(){ return _payload.back; }
     final void popBack(){ _payload.popBack(); }
}

unittest
{
     static assert(isInputRange!(ReferenceInputRange!int)); // 
works
     static assert(isForwardRange!(ReferenceForwardRange!int)); // 
works
     static 
assert(isBidirectionalRange!(ReferenceBidirectionalRange!int)); 
//fails
}


More information about the Digitalmars-d-learn mailing list