Skip to main content

Crate genarena

Crate genarena 

Source
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§

key

Macros§

key_newtype_impls
Makes a newtype usable as an Arena key.

Structs§

Arena
A slot-reservable arena with generational keys.
IntoIter
IntoValues
Iter
IterMut
Keys
Values
ValuesMut