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.