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