grift_arena 0.1.1

A minimal no_std, no_alloc arena allocator with garbage collection
Documentation

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 Copy type
  • 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
  • Pluggable storage: Use fixed-size arrays (no-std) or Vec (std feature)

Module Organization

The arena allocator is organized into the following modules:

  • [types] - Core types: ArenaIndex, ArenaError, ArenaResult
  • [arena] - Main Arena struct and core operations
  • [storage] - Storage backends: ArenaStorage trait, ArrayStorage, VecStorage
  • [generic_arena] - Generic arena that works with any storage backend
  • [traits] - Extension traits: ArenaDelete, ArenaCopy, Trace
  • [gc] - Garbage collection implementation
  • [iter] - Iterator support
  • [stats] - Statistics types: ArenaStats, GcStats

Storage Backends

The arena supports different storage backends via the [ArenaStorage] trait:

  • ArrayStorage<T, N>: Fixed-size array storage (default, no-std compatible)
  • VecStorage<T>: Vector-based storage (requires std feature)

The original Arena<T, N> type is a convenience alias for the fixed-size case. For dynamic storage, use GenericArena<T, VecStorage<T>>.

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();