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.