Crate indexlist[][src]

A doubly linked list, backed by a vector.

This crate provides a struct, IndexList<T>, which is a doubly-linked list. However, unlike a traditional linked list, which heap allocates each of its nodes individually, all nodes are stored in a vector. Rather than provide pointers to nodes, an Index struct can be used to access a particular elemnt in the middle of the list.

Safety

This crate uses #![deny(unsafe_code)] to ensure everything is implemented in 100% Safe Rust.

Generational indexes

Index uses a generations scheme, so that if you hold an Index to a node, and it's removed, and a new node is allocated in its place, you do not access the new node.

Performance

In general, performance is quite good. Benchmarks against the standard library's LinkedList<T> are provided. But some other details:

  • The list keeps track of its head and tail for efficient insertion.
  • The underlying vector only grows, never shrinks. When a node is removed, its entry is marked as free for future insertions.
  • Free entries are themselves kept as a singly-linked list, meaning that they can be re-used efficiently.

Missing features

Right now, I've only implemented a minimal number of features; there's iter but no into_iter and iter_mut. This is on the to-do list. PRs welcome!

Examples

Creating a list, appending nodes, and printing them out:

extern crate indexlist;
 
use indexlist::IndexList;
 
let mut list = IndexList::new();
 
list.push_back(5);
list.push_back(10);
list.push_back(15);
 
// This prints 5, 10, and then 15, each on its own line
for element in list.iter() {
    println!("{}", element);
}

Removing an item from the list:

extern crate indexlist;
 
use indexlist::IndexList;
 
let mut list = IndexList::new();
 
let five = list.push_back(5);
list.push_back(10);
 
list.remove(five);
 
// 5 is no longer in the list
assert!(list.get(five).is_none());

Generational indexes:

extern crate indexlist;
 
use indexlist::IndexList;
 
let mut list = IndexList::new();
 
let five = list.push_back(5);
list.push_back(10);
 
list.remove(five);
 
// since we have a free spot, this will go where 5 was
list.push_back(15);
 
// our index is out of date, and so will not return 15 here
assert!(list.get(five).is_none());

Structs

Index

A reference to an element in the list.

IndexList

A doubly linked list, backed by a vector.