On Saturday, 5 September 2015 at 23:00:43 UTC, BBasile wrote:
On Saturday, 5 September 2015 at 19:59:03 UTC, bitwise wrote:
On Saturday, 5 September 2015 at 06:15:17 UTC, Jonathan M Davis wrote:
[...]

Thanks for the explanation, but could you give an example of how Stream would be rangified?

this was not addressed to me but here is how it should be done:

---
module runnable;

import std.stdio;
import std.stream;
import std.algorithm;

class RangifiedStream: MemoryStream
{
    auto range()
    {
        return Range(this);
    }

    private struct Range
    {
        MemoryStream _str;
        ulong _curr;

        this(MemoryStream str)
        {
            _str = str;
        }

        void popFront()
        {
            _curr += 1;
        }

        @property ubyte front()
        {
            ubyte result;
            _str.position = _curr;
            _str.read(result);
            _str.position = _str.position - 1;
            return result;
        }

        @property bool empty()
        {
            return _curr == _str.size;
        }
    }
}

void main(string[] args)
{

    import std.range;
    assert( isInputRange!(RangifiedStream.Range));

    RangifiedStream str = new RangifiedStream;
    ubyte[] src = [0,1,2,3,4,5,6,7,8,9];
    str.write(src);

    str.range.each!(a => a.writeln);
}
---

The range has a reference to a stream. The range uses its own position and this is important since several ranges may co-exist at the same time. Here you just have a byte InputRange but it works...

For FileStream the performances will be terrible (bad), because the position is hold by a a structure specific to the OS...

I think I'll add this to my iz streams classes.

If all we had was a flat array of bytes(or any uniform type), then we wouldn't need a stream at all.

My typical usage is something like this:

int a = 1;
float b = 2;
string s = "3";

MemoryStream ms = new MemoryStream();
ms.write(a);
ms.write(b);
ms.write(s);

// stash ms in a file, or send/receive over socket..

int a = ms.readInt();
float b = ms.readFloat();
string s = ms.readString();

doSomething(a, b, s);

I'm not sure how you would go about rangifying something like this.

Reply via email to