"the last change" for ranges
Denis Koroskin
2korden at gmail.com
Wed May 20 09:23:27 PDT 2009
On Wed, 20 May 2009 20:19:30 +0400, Andrei Alexandrescu <SeeWebsiteForEmail at erdani.org> 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.
Why not r.dup?
More information about the Digitalmars-d
mailing list