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