deprecating std.stream, std.cstream, std.socketstream

Adam D. Ruppe destructionator at gmail.com
Wed May 16 11:31:12 PDT 2012


On Wednesday, 16 May 2012 at 17:48:52 UTC, Andrei Alexandrescu 
wrote:
> This is copiously clear to me, but the way I like to think 
> about it is by extending the notion of range (with notions such 
> as e.g. BufferedRange, LookaheadRange, and such)

I tried this in cgi.d somewhat recently. It ended up
only vaguely looking like a range.

     /**
        A slight difference from regular ranges is you can give it 
the maximum
        number of bytes to consume.

        IMPORTANT NOTE: the default is to consume nothing, so if 
you don't call
        consume() yourself and use a regular foreach, it will 
infinitely loop!
     */
    void popFront(size_t maxBytesToConsume = 0 /*size_t.max*/, 
size_t minBytesToSettleFor = 0) {}


I called that a "slight different" in the comment, but it is
actually a pretty major difference. In practice, it is nothing
like a regular range.

If I defaulted to size_t.max, you could foreach() it, but then
you don't really get to take advantage of the buffer, since it
is cleared out entirely for each iteration.

If it defaults to 0, you can put it in a foreach... but you
have to manually say how much of it is consumed, which no other
range does, meaning it won't work with std.algorithm or anything.


It sorta looks like a range, but isn't actually one at all.




I'm sure something better is possible, but I don't think the range
abstraction is a good fit for this use case.

Of course, providing optional ranges (like how file gives byChunk,
byLine, etc.) is probably a good idea.


More information about the Digitalmars-d mailing list