[phobos] Improvement of stream
Andrei Alexandrescu
andrei at erdani.com
Tue Sep 28 21:52:08 PDT 2010
On 9/26/10 23:34 PDT, Shin Fujishiro wrote:
> Thus I think we need a buffering layer that exposes a randomly
> accessible array to upper layers. ByLine() can be easily and
> efficiently implemented with the following primitives defined:
>
> Buffer
> {
> // The entire buffer.
> ubyte[] buffer();
>
> // Slice of buffer() where data is available.
> ubyte[] available();
>
> // Moves the beginning of available() by n in buffer().
> void bump(sizediff_t n);
>
> // Reads next blob from a source.
> bool fetch();
> }
>
> Yes, cstdio-esque rawRead() is no good for high-level ByLine. What
> high-level I/O entities want is: A randomly accessible buffer. Device
> handles may expose block-oriented streaming primitives, but they
> must be made "partially random accessible" by the buffering layer.
But that's too big an interface. When would one ever need buffer[], when
the beginning and the end of the buffer may be used for different
portions of the input?
A better stream interface, which actually extends the standard input
range interface:
struct Stream(T)
{
@property T[] front();
void munchFront(size_t bytes) in { assert(bytes <= front.length; }
bool empty();
void popFront();
}
This still doesn't allow filling the buffer with a new line, but it does
offer the ability to a client to copy lines into its own buffer.
Andrei
More information about the phobos
mailing list