"the last change" for ranges
BLS
windevguy at hotmail.de
Wed May 20 09:43:44 PDT 2009
Andrei Alexandrescu wrote:
> In wake of a few discussion I've witnessed, I'm thinking of a last
> change for ranges. (In fact there's one more, but that's minor.)
>
> The problem is that input ranges and forward ranges have the same
> syntactic interface, but different semantic interfaces. Consider the
> problem of finding the first two identical adjacent items in a range:
>
> R adjacentFind(R)(R r)
> {
> if (r,empty) return r;
> R last = r;
> r.popFront;
> for (; !r.empty && last.front != r.front; last.popFront, r.popFront)
> {
> }
> return r;
> }
>
> This will work properly on lists and vectors, but horrendously on files
> and sockets. This is because input ranges can't be saved for later use:
> incrementing r also increments popFront and essentially forces both to
> look at the same current value.
>
> I'm thinking a better design is to require any range that's forward or
> better to define a function save(). Ranges that don't implement it are
> input ranges; those that do, will guarantee a brand new range is
> returned from save(). So then adjacentFind would look like this:
>
> R adjacentFind(R)(R r)
> {
> if (r,empty) return r;
> R last = r.save;
> r.popFront;
> for (; !r.empty && last.front != r.front; last.popFront, r.popFront)
> {
> }
> return r;
> }
>
> Obviously, when you pass a range that doesn't support save, adjacentFind
> will not compile, which is what we want.
>
> Andrei
>
> P.S. There is a way to implement adjacentFind for forward ranges by
> saving data instead of ranges. I've used a limited version above for
> illustration purposes.
I REALLY hope that ranges will have some room for a "Let's have a
closer look" chapter in your book. Sometimes I found them quite hard to
understand:
Björn
More information about the Digitalmars-d
mailing list