Polymorphic ranges?

Andrej Mitrovic none at none.none
Sat Apr 30 19:33:53 PDT 2011


As an example I have a cyclic buffer (using std.range.Cycle) where I can set the lower and upper bounds of the buffer. I'd also like to enable a stepping mode, so I thought first about using std.range.Stride.

The code: http://codepad.org/TR7NDWTC

This line is commented out:
//~ buffer = stride(buffer, newStep);

Obviously I can't assign a Stride structure to a Cycle structure. Structures aren't polymorphic.

The idea was that the private _buffer could be traversed in different ways, and the Work structure would allow reconfiguration on how the public "buffer" walks through the private _buffer array, this would be done at runtime via function calls like "setStep" which changes the buffer type.

But this isn't possible since buffer can only be one type, since it's a structure.

So the question is, how can I use std.range and its various types  polymorphically, is that in any way possible?

>From what I can tell std.range functions all return structs. I was hoping of being able to do something like:

class Work
{
    float[256] _buffer;
    InfiniteRange buffer;

    this() { buffer = new InfiniteRange(_buffer); }  // initialize

    void setStride()
    {
        buffer = new Stride(buffer);  // now buffer has a dynamic type of Stride, which would be a subtype of InfiniteRange
    }
}

And then main would create a Work object, and call its buffer.front and buffer.popFront properties, and later call setStride to change how the object behaves by simply creating a new subtype which has the same interface but different behavior. 

But I can't do that here since pretty much everything in std.range returns a struct.


More information about the Digitalmars-d-learn mailing list