Does the currently proposed streaming (on digitalmars.d) work for such needs?

Andrei

On 9/27/10 1:34 AM, Shin Fujishiro wrote:
Thus I think we need a buffering layer that exposes a randomly
accessible array to upper layers.  ByLine() can be easily and
efficiently implemented with the following primitives defined:

Buffer
{
     // The entire buffer.
     ubyte[] buffer();

     // Slice of buffer() where data is available.
     ubyte[] available();

     // Moves the beginning of available() by n in buffer().
     void bump(sizediff_t n);

     // Reads next blob from a source.
     bool fetch();
}

Yes, cstdio-esque rawRead() is no good for high-level ByLine.  What
high-level I/O entities want is:  A randomly accessible buffer. Device
handles may expose block-oriented streaming primitives, but they
must be made "partially random accessible" by the buffering layer.


Shin

Andrei Alexandrescu<[email protected]>  wrote:
This is a good point. Allow me to expand it a bit and say that we need a
collection of solid use cases that we want to support. Without them, we
come up with a design that might not work well with certain use patterns.

Example of a requirement: "Given a block-oriented stream, define a
line-oriented range on top of it."

Do we need such a thing? Probably. Can it be implemented efficiently
with the rawRead(ubyte[]) primitive? NO.

struct ByLine(BlockRange) {
      private BlockRange _input;
      private char[] store;
      ...
      void popFront() {
          // read one line from _input
      }
}

The problem is that the line reader must sometimes _append_ data to its
buffer (in situations when it has read a long line that doesn't fit in
one buffer). But the input stream does not support appending.

BTW this has been a long source of irritation with C's stdio: the only
ways to read a line has been by reading one character at a time with
fgetc() (pig slow) or by using fgets() (unsafe) or fgetsn() (inefficient
for long lines) or by using getline() (nonportable, see
http://www.gnu.org/s/libc/manual/html_node/Line-Input.html).

Moral of the story? We need to have a number of well-defined scenarios
in mind when defining a streaming interface.


Andrei

On 9/23/10 8:37 CDT, SHOO wrote:
Hmm... Does it mean to have to relay three classes to do I/O processing?

auto handle = FileHandle("file");
scope (exit) handle.close();
auto buf = MemoryBuffer();
auto range = byLine(range);

I think it is slightly complicatedly. What is the reason why it must
come to look like it?

BTW, I don't know well what buffers must do. What is the requirement of
buffers?

(2010/09/21 14:05), Shin Fujishiro wrote:
SHOO<[email protected]>  wrote:
I think that there are two problems about I/O operation.
- Location of buffering layers.
- Direction of seeking.

...snip...

It is necessary for the concept to be divided in two at least to realize
them. (Handles and Ranges) Or more(+ Port or Stream).
The opening difficult item appears when I think about this.

How about putting a buffering layer between the two you said? Not
only it just solves the who-does-buffering problem, but also opens a
bit of freedom in the lowermost I/O device layer.


Shin
_______________________________________________
phobos mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/phobos
_______________________________________________
phobos mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/phobos


Shin
_______________________________________________
phobos mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/phobos
_______________________________________________
phobos mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/phobos

Reply via email to