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).