index_arena

Crates.ioindex_arena
lib.rsindex_arena
version0.1.3
sourcesrc
created_at2024-08-28 15:49:31.889573
updated_at2024-09-02 11:35:46.403225
descriptionA simple, id-based, heterogeneous arena allocator
homepage
repositoryhttps://github.com/yegorvk/index_arena
max_upload_size
id1354790
size38,758
Yegor Vaskonyan (yegorvk)

documentation

README

A simple, id-based, heterogeneous arena allocator.

Id-based

Uses small unique identifiers instead of references to represent allocations. This leverages the type system to statically assign every identifier to the arena it belongs to, ensuring safety without incurring runtime overhead.

Accessing individual elements is done through the various arena methods, conceptually similar to indexing a Vec.

Heterogeneous

Supports allocating values of all statically sized non-ZST types, which is especially useful in scenarios where you have tree-like data structures with different node types.

Statically guaranteed safety

The implementation leverages the power of the Rust's type system, achieving safety with almost no runtime checks.

No Drop

This design, however, has one downside: the arena does not know about individual objects it contains, which makes it impossible to run their destructors on drop.

Examples

use index_arena::{Id, new_arena};

struct Even<A> {
     next: Option<Id<Odd<A>, A>>,
}

struct Odd<A> {
     next: Option<Id<Even<A>, A>>,
}

let mut arena = new_arena!();

let three = arena.alloc(Odd { next: None });
let two = arena.alloc(Even { next: Some(three) });
let one = arena.alloc(Odd { next: Some(two) });

assert_eq!(&arena[one].next, &Some(two));
Commit count: 0

cargo fmt