7 releases (stable)
Uses new Rust 2024
| 1.5.0 | Feb 18, 2026 |
|---|---|
| 1.4.0 | Feb 9, 2026 |
| 1.3.2 | Feb 8, 2026 |
| 1.2.0 | Feb 2, 2026 |
| 0.1.1 | Feb 2, 2026 |
#2201 in Embedded development
Used in 7 crates
(6 directly)
55KB
732 lines
Fixed-Size Arena Allocator
A minimal no-std, no-alloc arena allocator with fixed capacity.
Features
- Fixed-size: All memory pre-allocated at compile time
- No-std, no-alloc: Works in embedded environments with no heap
- Generic: Works with any
Copytype - Interior mutability: Safe access via
Cell(no runtime borrow checking overhead) - O(1) allocation: Free-list based allocation and deallocation
- Mark-and-sweep GC: Trait-based garbage collection via
Trace - Zero dependencies: Only uses
core::cell::Cell
Module Organization
The arena allocator is organized into the following modules:
types- Core types:ArenaIndex,ArenaError,ArenaResultarena- MainArenastruct and core operationstraits- Extension traits:ArenaDelete,ArenaCopy,Trace- [
gc] - Garbage collection implementation iter- Iterator supportstats- Statistics types:ArenaStats,GcStats
Example
use grift_arena::{Arena, ArenaIndex};
#[derive(Clone, Copy, Debug, PartialEq)]
enum Node {
Leaf(isize),
Branch(ArenaIndex, ArenaIndex),
}
let arena: Arena<Node, 1024> = Arena::new(Node::Leaf(0));
// Allocate nodes
let left = arena.alloc(Node::Leaf(1)).unwrap();
let right = arena.alloc(Node::Leaf(2)).unwrap();
let root = arena.alloc(Node::Branch(left, right)).unwrap();
// Access nodes
if let Node::Branch(l, r) = arena.get(root).unwrap() {
println!("Left: {:?}, Right: {:?}", arena.get(l), arena.get(r));
}
// Free when done
arena.free(root).unwrap();