This crate implements a ValuePool struct that makes the creation of self-referential data structures easier and safer.
Take a look at the examples/ folder.
Features
unsafe - uses unsafe code for (potential) speed improvements. This should not create UB or change the behavior of your code.
Todo
Example
use value_pool::{ValuePool, ValueRef};
#[derive(Debug, Clone)]
struct Node<T> {
value: T,
next: Option<ValueRef<Node<T>>>,
}
impl<T> Node<T> {
fn new(value: T, next: Option<ValueRef<Node<T>>>) -> Node<T> {
Node { value, next }
}
}
#[derive(Debug, Clone)]
struct LinkedList<T> {
start: ValueRef<Node<T>>,
end: ValueRef<Node<T>>,
store: ValuePool<Node<T>>,
}
impl<T> LinkedList<T> {
pub fn new() -> LinkedList<T> {
LinkedList {
start: (ValueRef::default()),
end: (ValueRef::default()),
store: (ValuePool::new()),
}
}
pub fn push_back(&mut self, value: T) -> Option<()> {
let reference = self.store.push(Node::new(value, None));
if self.store.element_count() == 1 { self.start = reference;
self.end = reference;
}
self.store.get_mut(self.end)?.next = Some(reference);
self.end = reference;
Some(())
}
pub fn pop_front(&mut self) -> Option<T> {
if self.store.is_empty() {
return None;
}
let first_node = self.store.take(self.start)?;
self.start = first_node.next.unwrap_or_default();
Some(first_node.value)
}
}