Michel Fortin wrote:
On 2010-01-29 12:53:27 -0500, Andrei Alexandrescu <[email protected]> said:

An algorithm can fail in many silent ways if it misuses the range interface. None of std.algorithm algorithms uses front naively.

Easy to say. How did you verify that?

It's simply a mistake I make very seldom if at all (I don't remember any instance). The range interface is narrow, and algorithms are always careful with how they use it.

The problem is very subtle: if you call front after popFront on something like byLine which adds a buffer on top of another range, it'll eat one or more element on the downstream range that will be lost if you dispose of the filtering range. It won't have any effect on algorithms using the filtering range in itself, only on those using both the filtering range and the downstream range in tandem.

Subtle problems could occur with a variety of other ranges if some algorithm messes them up.

So basically, if you have an algorithm that calls front after popFront, that algorithm cannot be used reliably for ranges filtering a stream when that stream is also used directly, or used via other filtering ranges. There's no way to enforce that as it becomes the user's problem.

Whereas if input ranges only define 'take', it's pretty easy for the compiler to tell you an algorithm needs a buffer, so you add an intermediary buffer range yourself and you're now aware of the consequences.

I like take (I actually called it getNext). There was just too much aggravation in defining and using that interface. I've literally lost nights over figuring it out, and couldn't. Searching for getNext on this group will reveal some of the issues.


Andrei

Reply via email to