#[path="support/slot_pool.rs"] mod slot_pool; use slot_pool::SlotPool; struct Node { val:i64, prev:usize, next:usize } fn insert_after(pool: &mut SlotPool, p: usize, v: i64) -> usize { let next = pool.items[p].next; let n = pool.alloc(Node { val: v, prev: p, next }); pool.items[next].prev = n; pool.items[p].next = n; n } fn remove(pool: &mut SlotPool, n: usize) { let (prev, next) = (pool.items[n].prev, pool.items[n].next); pool.items[prev].next = next; pool.items[next].prev = prev; pool.free(n); } fn is_end(n: usize, head: usize) -> bool { n == head } fn values(pool:&SlotPool,head:usize)->Vec { let mut out=vec![]; let mut at=pool.items[head].next; while !is_end(at,head) { out.push(pool.items[at].val); at=pool.items[at].next; assert!(out.len()<100); } out } fn main() { let mut pool=SlotPool::new();let head=pool.alloc(Node {val:0,prev:0,next:0}); let mut tail=head;let mut handles=vec![]; for v in [10,20,30,40,50] { tail=insert_after(&mut pool,tail,v);handles.push(tail); } assert_eq!(values(&pool,head),[10,20,30,40,50]); assert_eq!(pool.items.len(),6); remove(&mut pool,handles[1]); remove(&mut pool,handles[3]); assert_eq!(values(&pool,head),[10,30,50]); tail=insert_after(&mut pool,tail,7); insert_after(&mut pool,tail,8); assert_eq!(values(&pool,head),[10,30,50,7,8]);assert_eq!(pool.items.len(),6); }