On Sunday, 23 June 2013 at 14:47:17 UTC, Andrei Alexandrescu
wrote:
On 6/23/13 7:39 AM, Andrei Alexandrescu wrote:
Again, we can make things work by introducing a primitive for
bidirectional ranges:
R before(R r1, R r2);
Assuming r2 is reachable from r1, returns the portion of r1
that lies
before r2. (Definition: a range r2 is reachable from another
range r1 if
calling r1.popFront() repeatedly will at some point make
r1.front and
r2.front refer to the same value.)
The question is, should we add this primitive? There's
discussion on adding ranges to C++, and discussion inevitably
reaches an impasse when it gets to this particular matter.
I personally think we should and am amazed that we made it so
far without that primitive. However, unlike others, I don't
think it's an essential matter. Some C++ people tend to be
apprehensive when they figure they can do something with
iterators that's not doable with ranges.
Andrei
Just for the record (because I'm the one that usually brings this
up), I think ranges are a big win overall. I just find it
frustrating every time the "always shrink never grow" problem
gets in my way of writing simple and efficient algorithms.
"before" might work, but it would also introduce a new primitve,
as well as a new trait ("isSpliceable?"). There is a real gain to
cost ratio, which I'm not sure is worth it. The semantics for it
would also be kind of complicated: you'd have "before", "after",
"beforeIncluding", "merge"...
I'm wondering if something along the lines of an "iterable" range
might not be much more simple? Probably not :(