joiner and map, strange behavior

H. S. Teoh hsteoh at quickfur.ath.cx
Tue Mar 12 17:31:12 PDT 2013


On Wed, Mar 13, 2013 at 12:22:48AM +0000, Stephan Schiffels wrote:
> Am 12.03.13 20:22, schrieb Timon Gehr:
> >On 03/12/2013 06:51 PM, Stephan Schiffels wrote:
> >>...
> >>
> >>Thanks, I had a brief look at std.algorithm.joiner but couldn't find
> >>anything obvious, maybe I should look deeper into it.
> >>...
> >
> >I guess it is because of the following:
> >
> >Eg (similar code occurs two times):
> >...
> >     if (_sep.empty)
> >     {
> >         // Advance to the next range in the
> >         // input
> >         //_items.popFront();
> >         for (;; _items.popFront())
> >         {
> >             if (_items.empty) return;
> >             if (!_items.front.empty) break; // front called
> >         }
> >         _current = _items.front; // front called again
> >         _items.popFront();
> >     }
> >...
> >
> >The code should only call front once for the first non-empty range.
> >
> >Presumed example fix (though the implementation seems rather clumsy and
> >should probably be replaced completely):
> >
> >...
> >     if (_sep.empty)
> >     {
> >         // Advance to the next range in the
> >         // input
> >         //_items.popFront();
> >         for (;; _items.popFront())
> >         {
> >             if (_items.empty) return;
> >             _current = _items.front;
> >             if (!_current.empty) break;
> >         }
> >         _items.popFront();
> >     }
> >...
> 
> Thanks, that's very clear now. I stumbled over it because the
> function I call loads a lot of data and a factor 2 makes all the
> difference in runtime. Maybe I should file a bug report or at least
> a request to improve this.
[...]

I was the one responsible for the recent rewrite of joiner; I'll think
over how to fix it so that .front is only evaluated once.


T

-- 
Старый друг лучше новых двух.


More information about the Digitalmars-d-learn mailing list