Expand description
A slot-reservable arena with generational keys.
This crate provides an Arena that stores values and returns stable,
copyable keys. Keys remain valid across insertions and removals, and are
protected against accidental reuse via generations.
In addition to a standard insert/remove API, the arena supports a reservation workflow, allowing you to obtain a key before constructing its value.
§Overview
The arena stores elements in a contiguous Vec, reusing freed slots.
Each slot is tagged with a generation counter. A key consists of:
- an index into the arena
- a generation
When a slot is reused, its generation is incremented, ensuring that stale keys no longer access the new value.
§Features
- O(1) insertion and removal
- Stable keys using generational indices
- No ABA problem: stale keys are detected via generation mismatch
- Reservation API enables constructing self-referential or cyclic data
§Examples
Basic usage:
use genarena::Arena;
let mut arena = Arena::new_with_default();
let key = arena.insert("hello");
assert_eq!(arena.get(key), Some(&"hello"));
arena.remove(key);
assert_eq!(arena.get(key), None);Keys are invalidated after removal:
use genarena::Arena;
let mut arena = Arena::new_with_default();
let k1 = arena.insert(1);
arena.remove(k1);
// The slot of the removed element is reused here.
let k2 = arena.insert(2);
assert_ne!(k1, k2);
assert!(!arena.contains_key(k1));
assert_eq!(arena.get(k2), Some(&2));§Reservations
A reservation allows obtaining a key before the value is available.
use genarena::Arena;
let mut arena = Arena::new_with_default();
let reservation = arena.reserve();
let key = reservation.key();
// key is known, but no value yet
assert!(!arena.contains_key(key));
let key2 = arena.claim(reservation, 42);
assert_eq!(key, key2);
assert_eq!(arena.get(key), Some(&42));Reservations can also be canceled, which allows reusing the reserved slot for later insertions:
use genarena::Arena;
let mut arena = Arena::new_with_default();
let reservation = arena.reserve();
let key = reservation.key();
arena.cancel(reservation);
let new_key = arena.insert(1);
assert!(!arena.contains_key(key));
assert!(arena.contains_key(new_key));Modules§
Macros§
- key_
newtype_ impls - Makes a newtype usable as an
Arenakey.