Can't recreate a range?

Casey noman at
Thu Apr 30 18:03:02 UTC 2020

On Thursday, 30 April 2020 at 16:21:05 UTC, Steven Schveighoffer 
> I would say part of the issue is that you are doing all your 
> work in front and not popFront.
> What happens is that Appender is a pointer-to-implementation 
> struct, and the compiler will allocate the first one shared 
> amongst all initial StreamRange instances.
> On your first call to front, it's going to utilize that shared 
> one. Then on the call to popFront, it will reset it to another 
> one.
> For the second unittest, in your first call to front, it 
> notices that it's already been filled, so it doesn't do any 
> work (and returns the existing buffer).

Interesting.  I'll take this into account.  I was putting the 
work into front because I didn't want to do the work until it was 
requested.  Putting the work in popFront makes more sense in some 
ways, but the fact you have to call it before getting any records 
seems like it would break normal range algorithms.  (Please 
correct me if I'm wrong)  I'm wondering if putting the work into 
it's own method and calling it one from the constructor and from 
popFront the rest of the way.

> another problem, your empty condition is based on the input, 
> which violates range expectations. indeed, on the first call to 
> front, the range all of a sudden becomes empty.

I was about to argue the point, but after thinking about the use 
of popFront to execute the work, that would work.

> 3. You don't need a further Range parameter for the nested 
> struct, it can use the template parameter from the containing 
> function.
> 4. Make it a static struct, or else it will retain a pointer to 
> the function stack frame needlessly.

I'll definitely try that out.  Regarding 3, I think that was in 
the example code I used, so I just went with it.

More information about the Digitalmars-d-learn mailing list