stream == range ? [Sliding window]

Dragos Carp via Digitalmars-d digitalmars-d at puremagic.com
Sun May 31 15:05:59 PDT 2015


On Sunday, 31 May 2015 at 17:50:41 UTC, Dmitry Olshansky wrote:
> On 31-May-2015 18:58, Andrei Alexandrescu wrote:
>> On 5/31/15 8:44 AM, Nick Sabalausky wrote:
>>> On 05/30/2015 07:06 AM, short2cave wrote:
>>>> Do the classic streams still make sense when we have Ranges ?
>>>>
>>>
>>> I've been thinking the same thing lately. In fact, I'd been 
>>> meaning to
>>> make a post regarding that.
>>>
>>> Phobos's std.stream has been slated for an overhaul for 
>>> awhile now, but
>>> it seems to me that ranges are already 90% of the way to 
>>> BEING a total
>>> std.stream replacement:
>>>
>>> Output Streams: AFAICT, 100% covered by output ranges. Output 
>>> streams
>>> exist as a place for sticking arbitrary amounts of sequential 
>>> data.
>>> Output range's "put" does exactly that.
>>>
>>> Input Streams: Input ranges are very nearly a match for this. 
>>> AFAICT,
>>> The only thing missing here is the ability to "read" not just 
>>> the one
>>> "front" value, but to read the front N values as a chunk, 
>>> without an
>>> O(n) sequence of front/popFront. So we'd just need another 
>>> "optional"
>>> range characteristic: hasFrontN (or some such).
>>
>> Given that it seems Design by Introspection has been working 
>> well for us
>> and we're continuing to enhance its use in Phobos, it seems to 
>> me that
>> optional methods for ranges are the way to go.
>>
>> An optional method for any range is
>>
>> size_t bulkRead(T[] target);
>>
>> which fills as much as possible from target and returns the 
>> number of
>> items copied.
>>
>> Another good candidate for optional methods is lookahead.
>
> Hardly. In fact, I've spent quite some time trying to figure 
> this out.
>
> Doing bulk read to some array is the pushing burden of 
> maintaining some buffer on the user and adding the overhead of 
> extra copy on buffered streams. Not to mention that the more 
> methods we put in range API the more if/else forests we produce 
> in our algorithms.

LinearBuffer tries to address this problem in:
https://github.com/D-Programming-Language/phobos/pull/2928
This simply extends the existing std.array.Appender with 
popFrontN operations.

The use case would be like this:
1. accumulate data in the LiniearBuffer by appending to the buffer
2. try to identify the next token
3. if a token is identified popFontN the length of the token
4. otherwise acumulate some more (go to 1.)

I was also thinking about adding a new method:
ptrdiff_t putFrom(ptrdiff_t delegate(T[]) read);
meant to be used together with file read or socket receive 
functions. In this way the read/recv system functions can write 
directly into the input buffer without intermediate copies.

Dragos


More information about the Digitalmars-d mailing list