Correctly implementing a bidirectional range on a linked list?

anonymous via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Jul 6 14:58:30 PDT 2015


On Monday, 6 July 2015 at 20:50:19 UTC, Gary Willoughby wrote:
> How do you correctly implement a bidirectional range on a 
> linked list?
>
> I have a linked list implementation and I've added a range 
> interface to it but after a while I've realized it not quite 
> right. The problem is when I call the save method of the 
> forward range interface I don't get a copy I only get another 
> view to the same state. So when i remove nodes from the 
> original list the range becomes invalid.
>
> How can you implement such a range over a type whose state is 
> accessed via pointers?
>
> Here's my implementation:
>
> https://github.com/nomad-software/etcetera/blob/master/source/etcetera/collection/linkedlist.d#L533

There's no requirement for a range to stay valid when the 
underlying container changes. std.container defines "stable" 
variants of the various insertion and removal operations. They 
promise not to invalidate any ranges. When the unstable variants 
are used, it's to be expected that ranges are invalidated.

To make your removal methods stable, it may be enough to not free 
the removed node. That is, don't do this:
https://github.com/nomad-software/etcetera/blob/master/source/etcetera/collection

There's a doubly linked list in phobos: std.container.dlist; 
maybe look how things are done there:
https://github.com/D-Programming-Language/phobos/blob/master/std/container/dlist.d

Off topic: I think `@trusted:` is horrible. It's easy to forget 
that you're in a @trusted environment when editing things later. 
And even worse, you're trusting everything that's passed through 
template parameters.


More information about the Digitalmars-d-learn mailing list