May 02, 2011
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
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
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
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
s/they/the
1 2
Next ›   Last »