In general, who should do more work: popFront or front?

Steven Schveighoffer schveiguy at gmail.com
Tue Jun 15 17:22:56 UTC 2021


On 6/15/21 12:24 AM, surlymoor wrote:
> All my custom range types perform all their meaningful work in their 
> respective popFront methods, in addition to its expected source data 
> iteration duties. The reason I do this is because I swear I read in a 
> github discussion that front is expected to be O(1), and the only way I 
> can think to achieve this is to stash the front element of a range in a 
> private field; popFront would thus also set this field to a new value 
> upon every call, and front would forward to it. (Or front would be the 
> cache itself.)
> At the moment, I feel that as long as the stashed front element isn't 
> too "big" (For some definition of big, I guess.), that built-in caching 
> should be fine. But is this acceptable? What's the best practice for 
> determining which range member should perform what work? (Other than 
> iterating, of course.)

IMO, `front` should not be figuring out which element is next. That is 
the job of `popFront`.

But that doesn't mean `front` cannot do work. map is a prime example. If 
you use `map` though, you know what you are signing up for.

`front` is expected to be called multiple times to get the same data. 
One thing to think about is that there is a `cache` wrapper range which 
can store it for you. This way, you give your users the option of 
caching or not.

Each situation is different, and depends on the underlying mechanisms 
needed to make the range operate.

-Steve


More information about the Digitalmars-d-learn mailing list