[phobos] Improvement of stream
Shin Fujishiro
rsinfu at gmail.com
Sun Sep 26 23:34:59 PDT 2010
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.
Shin
Andrei Alexandrescu <andrei at erdani.com> wrote:
> This is a good point. Allow me to expand it a bit and say that we need a
> collection of solid use cases that we want to support. Without them, we
> come up with a design that might not work well with certain use patterns.
>
> Example of a requirement: "Given a block-oriented stream, define a
> line-oriented range on top of it."
>
> Do we need such a thing? Probably. Can it be implemented efficiently
> with the rawRead(ubyte[]) primitive? NO.
>
> struct ByLine(BlockRange) {
> private BlockRange _input;
> private char[] store;
> ...
> void popFront() {
> // read one line from _input
> }
> }
>
> The problem is that the line reader must sometimes _append_ data to its
> buffer (in situations when it has read a long line that doesn't fit in
> one buffer). But the input stream does not support appending.
>
> BTW this has been a long source of irritation with C's stdio: the only
> ways to read a line has been by reading one character at a time with
> fgetc() (pig slow) or by using fgets() (unsafe) or fgetsn() (inefficient
> for long lines) or by using getline() (nonportable, see
> http://www.gnu.org/s/libc/manual/html_node/Line-Input.html).
>
> Moral of the story? We need to have a number of well-defined scenarios
> in mind when defining a streaming interface.
>
>
> Andrei
>
> On 9/23/10 8:37 CDT, SHOO wrote:
> > Hmm... Does it mean to have to relay three classes to do I/O processing?
> >
> > auto handle = FileHandle("file");
> > scope (exit) handle.close();
> > auto buf = MemoryBuffer();
> > auto range = byLine(range);
> >
> > I think it is slightly complicatedly. What is the reason why it must
> > come to look like it?
> >
> > BTW, I don't know well what buffers must do. What is the requirement of
> > buffers?
> >
> > (2010/09/21 14:05), Shin Fujishiro wrote:
> >> SHOO<zan77137 at nifty.com> wrote:
> >>> I think that there are two problems about I/O operation.
> >>> - Location of buffering layers.
> >>> - Direction of seeking.
> >>>
> >> ...snip...
> >>>
> >>> It is necessary for the concept to be divided in two at least to realize
> >>> them. (Handles and Ranges) Or more(+ Port or Stream).
> >>> The opening difficult item appears when I think about this.
> >>
> >> How about putting a buffering layer between the two you said? Not
> >> only it just solves the who-does-buffering problem, but also opens a
> >> bit of freedom in the lowermost I/O device layer.
> >>
> >>
> >> Shin
> > _______________________________________________
> > phobos mailing list
> > phobos at puremagic.com
> > http://lists.puremagic.com/mailman/listinfo/phobos
> _______________________________________________
> phobos mailing list
> phobos at puremagic.com
> http://lists.puremagic.com/mailman/listinfo/phobos
Shin
More information about the phobos
mailing list