May 02, 2011 Re: Polymorphic ranges? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrej Mitrovic | On 05/01/2011 07:30 AM, Andrej Mitrovic wrote: > I'm not sure how to use those wrappers though. Maybe I'm just doing it wrong: > > http://codepad.org/eHIdhasc To make it more convenient to others, I paste Andrej Mitrovic's code: import std.stdio; import std.range; import core.thread; import std.random; enum BufferSize = 10; struct Work { private float[BufferSize] _buffer; InputRangeObject!(float[]) buffer; this(T)(T unused) { _buffer[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; buffer = inputRangeObject(cycle(_buffer[])); } void setNewRange(size_t min, size_t max) { buffer = inputRangeObject(cycle(_buffer[min..max])); } } void main(){} /* Error: cannot implicitly convert expression (inputRangeObject(cycle(this._buffer[min..max]))) of type std.range.InputRangeObject!(Cycle!(float[])).InputRangeObject to std.range.InputRangeObject!(float[]).InputRangeObject */ > > But it seems these wrappers have some problems, the docs say about the > interfaces: > > Limitations: > These interfaces are not capable of forwarding ref access to elements. > Infiniteness of the wrapped range is not propagated. > Length is not propagated in the case of non-random access ranges. Ali |
May 02, 2011 Re: Polymorphic ranges? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Dmitry Olshansky | On 05/01/2011 08:04 AM, Dmitry Olshansky wrote: > On 01.05.2011 18:30, Andrej Mitrovic wrote: >> I'm not sure how to use those wrappers though. Maybe I'm just doing it >> wrong: >> >> http://codepad.org/eHIdhasc >> >> But it seems these wrappers have some problems, the docs say about the >> interfaces: >> >> Limitations: >> These interfaces are not capable of forwarding ref access to elements. >> Infiniteness of the wrapped range is not propagated. >> Length is not propagated in the case of non-random access ranges. > Well, this compiles, you just need to pick suitable type of range > 'interface', that's the subtle thingie: > http://codepad.org/uE0nIwbk To make it more convenient to other, I paste Dmitry Olshansky's code: import std.stdio; import std.range; import core.thread; import std.random; enum BufferSize = 10; struct Work { private float[BufferSize] _buffer; RandomAccessInfinite!(float) buffer; this(T)(T unused) { _buffer[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; buffer = inputRangeObject(cycle(_buffer[])); } void setNewRange(size_t min, size_t max) { buffer = inputRangeObject(cycle(_buffer[min..max])); } } void main(){} I also paste the compilation output: Line 6: enum declaration is invalid Line 6: Declaration expected, not '=' Line 13: semicolon expected following function declaration Line 13: Declaration expected, not '(' Line 17: no identifier for declarator buffer Line 24: unrecognized declaration > > Limitations are caused by bug, that is going to get fixed eventually ;) > Ali |
May 02, 2011 Re: Polymorphic ranges? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrej Mitrovic | On 05/01/2011 09:09 AM, Andrej Mitrovic wrote: > Yeah it seems a common interface is what I should have used. I've > tried it in numerous ways but I got the interface type wrong > apparently. Thanks Dmitry. > > Here's a quick example: > http://codepad.org/RhNiUHU2 To make it more convenient to others, I paste Andrej Mitrovic's code: module cyclicBuffer; import std.stdio; import std.range; import core.thread; import std.random; enum BufferSize = 10; struct Work { private float[BufferSize] _buffer; InputRange!(float) buffer; this(T)(T unused) { _buffer[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; buffer = inputRangeObject(cycle(_buffer[])); } void setNewRange(size_t min, size_t max) { buffer = inputRangeObject(cycle(_buffer[min..max])); } void setStep(size_t newStep) { buffer = inputRangeObject(stride(buffer, newStep)); } } void main() { writeln(); auto work = Work(1); size_t count; int min; int max; size_t step; while (!work.buffer.empty) { write(work.buffer.front); stdout.flush(); work.buffer.popFront; if (++count == 20) { min = uniform(0, BufferSize / 2); max = uniform(BufferSize / 2, BufferSize); step = uniform(1, 5); work.setNewRange(min, max); work.setStep(step); writefln("\nmin: %s, max: %s, step: %s", min, max-1, step); count = 0; } Thread.sleep( dur!("msecs")(100) ); } } > > I hope those bugs get squashed so I can have more fun with these ranges. :) Ali |
May 02, 2011 Re: Polymorphic ranges? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | The reason I've posted them online is because they snippets are not that short. And it's much easier to read them from a syntax-highlighted website than from a plaintext newsgroup reader. |
May 02, 2011 Re: Polymorphic ranges? | ||||
---|---|---|---|---|
| ||||
s/they/the |
Copyright © 1999-2021 by the D Language Foundation