std.range.cacheFront proposal&working code: wraps a range to enforce front is called only once

Chris wendlec at tcd.ie
Thu Oct 24 14:10:42 PDT 2013


On Thursday, 24 October 2013 at 17:52:45 UTC, Jonathan M Davis 
wrote:
> On Thursday, October 24, 2013 17:55:22 Chris wrote:
>> On Thursday, 24 October 2013 at 15:40:22 UTC, Dicebot wrote:
>> > On Thursday, 24 October 2013 at 15:36:59 UTC, Chris wrote:
>> >> How do you define side effects? After all ranges manipulate,
>> >> reformat or restructure data.
>> > 
>> > They should do it in popFront. I'd consider any `front` that
>> > does anything but accessing cached value suspicious.
>> 
>> So code like
>> 
>> auto front() {
>> doSomething();
>> return range[0];
>> }
>> 
>> should go into
>> 
>> void popFront() {
>> doSomething();
>> range = range[1..$];
>> }
>
> Yes. front _will_ be called multiple times by many range-based 
> algorithms.
> There are no guarantees whatsoever that front will not be 
> called more than
> once and relying on it being called only once between calls to 
> popFront is
> just plain wrong.
>
> front is the logical equivalent to a public member variable and 
> should be
> treated as such. In general, putting additional work inside of 
> front is just
> asking for trouble. And if you do, it needs to be with the 
> understanding
> that front stands a good chance of being called multiple times 
> per call to
> popFront.
>
> It might make sense to add some debug stuff in there which has 
> side effects
> (like printing something out), but the code's normal semantics 
> should not
> rely on any kind of side effects on front. There should be no 
> logical
> difference if you call front one time or twenty times after a 
> single call to
> popFront.
>
> - Jonathan M Davis

Well, I just had a weird bug due to some stuff being in front. I 
moved everything into popFront and it worked as expected.

It was a linked list where PREVIOUS and CURRENT are checked and 
changed if certain conditions are met. Suddenly I got weird 
behaviour and PREVIOUS and CURRENT where the other way around or 
an old PREVIOUS showed up later. I guess I've learned my lesson.


More information about the Digitalmars-d mailing list