stream == range ? [Sliding window]

Dmitry Olshansky via Digitalmars-d digitalmars-d at puremagic.com
Mon Jun 1 03:08:10 PDT 2015


On 01-Jun-2015 02:54, Dragos Carp wrote:
>>>> Hardly. In fact, I've spent quite some time trying to figure this out.
>>>>
>> 2. As it stands it would require first copying into appender which is
>> slow. The opposite direction is usually a better match - assume
>> appender (or rather buffer) is filled to its capacity with data from
>> the file and keeping this invariant true.
>
> This would function differently if the data comes over the socket,
> usually you cannot fill the buffer.

Agreed, with sockets it's not going to work like that.

>>
>> Otherwise it looks quite similar to the sliding window interface and
>> that is great.
>>
>> data --> window
>> popFrontN --> skip
>> put ~~> extend (probably should be just called 'more')
>
> Sometimes (socket recv) you don't know how much extend.
>
That's still OK, if extend is "try to load at least this much". That is 
it attempts a read of max(capacity_left, bytes_to_extend) and adjusts 
the visible window.

[snip]
>>
>> Parser or any other component down the line shouldn't concern itself
>> with reading, just using some "more" primitive to auto-magically
>> extend the window by at least X bytes. That would shrink-extend
>> buffer  and load it behind the scenes.
>
> As I sad, LinearBuffer is meant to be used "behind the scenes".
>

Okay, then we are on the same page.

I think we need to define a set of primitives and semantics that define 
a buffer concept, it's seems that 3 primitives outlined is enough 
plus/minus some traits.

> I find Andrei's bulkRead, maybe combined with a matcher a la boost::asio
> read_until, the simplest high level interface.

For unbuffered streams - read_until is probably too much, a bulkRead 
would be the minimum.

For buffered streams - should be easily defined as stand-alone:

bool readUntil(alias matcher, BufStream)(BufStream buf){
	for(;;){
		auto pos = matcher(buf.window);
		if(pos < 0)
			buf.skip(buf.window.length);
			if(!buf.more()) return false;
		}
		else{
			buf.skip(pos);
			return true;
		}
	}
}

-- 
Dmitry Olshansky


More information about the Digitalmars-d mailing list