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.

interface TransportBase
{
    /// True if stream has no more data.
    @property bool empty();
    /// True if the position property works
    @property bool positionable();
    /// Gives current position in stream
    @property ulong position();
    /// Moves stream to absolute position pos
    @property void position(ulong pos);
}

interface InputBinaryTransport : TransportBase
{
    /// Reads up to target.length bytes into target,
    /// returns size of data read. If target.length < 1 throws.
    size_t read(ubyte[] target);
    /// Appends to target up until delimiter is found or end of stream.
    /// The delimiter is included in the target. Returns number
    /// of bytes read.
    size_t appendDelim(ref ubyte[] target, in ubyte[] delimiter);
}

interface InputTextTransport : TransportBase
{
    /// Returns the native character size: 1 for UTF-8, 2 for UTF-16,
    /// 4 for UTF-32, 0 for nonstandard native encodings.
    @property size_t nativeUTFWidth();

    /// Reads complete UTF code points into target, without going
    /// beyond target.length. Returns number of code units read.
    /// If target.length < 4 throws.
    size_t read(char[] target);
    /// Appends to target up until delimiter is found or end of stream.
    /// The delimiter is included in the target. Returns number of
    /// code units read.
    size_t appendDelim(ref char[] target, in char[] delimiter);

    /// Reads complete UTF code points into target, without going
    /// beyond target.length. Returns number of code units read.
    /// If target.length < 2 throws.
    size_t read(wchar[] target);
    /// Appends to target up until delimiter is found or end of stream.
    /// The delimiter is included in the target. Returns number of
    /// code units read.
    size_t appendDelim(ref wchar[] target, in wchar[] delimiter);

    /// Reads complete UTF code points into target, without going
    /// beyond target.length. Returns number of code units read.
    /// If target.length < 1 throws.
    size_t read(dchar[] target);
    /// Appends to target up until delimiter is found or end of stream.
    /// The delimiter is included in the target. Returns number of
    /// code units read.
    size_t appendDelim(ref dchar[] target, in dchar[] delimiter);
}

Please destroy.


Andrei

Reply via email to