[phobos] Improvement of stream
Andrei Alexandrescu
andrei at erdani.com
Fri Sep 24 14:17:54 PDT 2010
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
More information about the phobos
mailing list