On Fri, 15 Oct 2010 08:37:24 +0400, Brad Roberts <bra...@puremagic.com> wrote:

On 10/14/2010 8:34 AM, Andrei Alexandrescu wrote:
Starting a new thread from Denis' question:

Can we outline basic Stream interface now so that we could move on?

Here's the input transport layer. Transport has no concern for formatting - it
just moves stuff around.


I suggest having read and write with offset style apis. See also: man pread

The value here is that you can safely concurrently access a file descriptor and not have to worry about atomicity of seek+read or seek+write at the app layer.


In my original API proposal I included reading from offsets:

interface SeekableInputStream : SeekableStream, InputStream
{
        ...

        // reads up to buffer.length bytes from a stream
        // returns number of bytes read
        // throws on error
        size_t read(ubyte[] buffer, long offset);

        // reads up to buffer.length bytes from a specified offset
AsyncReadFromOffsetRequest readAsync(ubyte[] buffer, long offset, Mailbox* mailbox = null);
        
        ...
}

interface SeekableOutputStream : SeekableStream, OutputStream
{
        ...

        // returns number of bytes written
        // throws on error
        size_t write(const(ubyte)[] buffer, long offset);

        // writes from from a specified offset
AsyncWriteFromOffsetRequest writeAsync(const(ubyte)[] buffer, long offset, Mailbox* mailbox = null);

        ...
}

Although it complicates an API quite a bit, it has its advantages, too. However, not all Stream types support reading/writing from an offset (e.g. SocketStream doesn't).

Reply via email to