[RFC] I/O and Buffer Range

Marco Leise Marco.Leise at gmx.de
Sun Dec 29 21:29:04 PST 2013


Am Sun, 29 Dec 2013 22:45:35 +0000
schrieb "Vladimir Panteleev" <vladimir at thecybershadow.net>:

> [snip]
> 
> 2. I don't understand the rationale behind the current semantics 
> of lookahead/lookbehind. If you want to e.g. peek ahead/behind to 
> find the first whitespace char, you don't know how many chars to 
> request. Wouldn't it be better to make these functions return the 
> ENTIRE available buffer in O(1)?

Yeah, been there too. I guess after X years of programming
chances are good you implemented some buffer with
look-ahead. :) 

I use those primitives:

   ubyte[] mapAvailable() pure nothrow
   ubyte[] mapAtLeast(in ℕ count)

See: https://github.com/mleise/piped/blob/master/src/piped/circularbuffer.d#L400

Both return a slice over all the available buffered data.
mapAtLeast() also waits till enough data is available from the
producer thread. The circular buffer is automatically extended
if the producer wants to write a larger chunk or the consumer
needs a larger window.
(I was mostly focused on lock-free operation in not-starved
situations and minimal bounds checking, so the code is a bit
more sophisticated than the average circular buffer.)

-- 
Marco



More information about the Digitalmars-d mailing list