Streaming library

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Wed Oct 13 13:19:45 PDT 2010


On 10/13/10 14:02 CDT, Denis Koroskin wrote:
> On Wed, 13 Oct 2010 20:55:04 +0400, Andrei Alexandrescu
> <SeeWebsiteForEmail at erdani.org> wrote:
>> http://www.gnu.org/s/libc/manual/html_node/Buffering-Concepts.html
>>
>> I don't think streams must mimic the low-level OS I/O interface.
>>
>
> I in contrast think that Streams should be a lowest-level possible
> platform-independent abstraction.
> No buffering besides what an OS provides, no additional functionality.
> If you need to be able to read something up to some character (besides,
> what should be considered a new-line separator: \r, \n, \r\n?), this
> should be done manually in "byLine".

This aggravates client code for the sake of simplicity in a library that 
was supposed to make streaming easy. I'm not seeing progress.

>>> That's because
>>> most of the steams are binary streams, and there is no such thing as a
>>> "line" in them (e.g. how often do you need to read a line from a
>>> SocketStream?).
>>
>> http://www.opengroup.org/onlinepubs/009695399/functions/isatty.html
>>
>
> These are special cases I don't like. There is no such thing in Windows
> anyway.

I didn't say I like them. Windows has _isatty: 
http://msdn.microsoft.com/en-us/library/f4s0ddew(v=VS.80).aspx

>> You need a line when e.g. you parse a HTML header or a email header or
>> an FTP response. Again, if at a low level the transfer occurs in
>> blocks, that doesn't mean the API must do the same at all levels.
>>
>
> BSD sockets transmits in blocks. If you need to find a special sequence
> in a socket stream, you are forced to fetch a chunk, and manually search
> for a needed sequence. My position is that you should do it with an
> external predicate (e.g. read until whitespace).

Problem is how you set up interfaces to avoid inefficiencies and 
contortions in the client.

>>> I don't think streams should buffer anything either (what an underlying
>>> OS I/O API caches should suffice), buffered streams adapters can do that
>>> in a stream-independent way (why duplicate code when you can do that as
>>> efficiently with external methods?).
>>
>> Most OS primitives don't give access to their own internal buffers.
>> Instead, they ask user code to provide a buffer and transfer data into
>> it.
>
> Right. This is why Stream may not cache.

This is a big misunderstanding. If the interface is:

size_t read(byte[] buffer);

then *I*, the client, need to provide the buffer. It's in client space. 
This means willing or not I need to do buffering, regardless of whatever 
internal buffering is going on under the wraps.

>> So clearly buffering on the client side is a must.
>>
>
> I don't see how is it implied from above.

Please implement an abstraction that given this:

interface InputStream
{
     size_t read(ubyte[] buf);
}

defines a line reader.


Andrei


More information about the Digitalmars-d mailing list