76 releases (49 stable)
4.2.2 | Oct 20, 2024 |
---|---|
4.1.4 | Mar 13, 2024 |
4.1.1 | Sep 23, 2023 |
3.5.1 | Apr 21, 2023 |
0.9.0 | Sep 15, 2020 |
#290 in Rust patterns
261 downloads per month
Used in 4 crates
60KB
1K
SLoC
components-arena
Strong-typed arena. Simple library for creating complex domain-specific self-referential data structures.
This arena does not use generations approach in a strict sense, but it uses some similar technique for avoiding the ABA effect.
Example: circular linked list
use std::mem::replace;
use macro_attr_2018::macro_attr;
use components_arena::{Id, Arena, Component};
macro_attr! {
#[derive(Component!)]
struct Node {
next: Id<Node>,
data: (),
}
}
struct List {
last: Option<Id<Node>>,
nodes: Arena<Node>,
}
impl List {
fn new() -> Self {
List { last: None, nodes: Arena::new() }
}
fn push(&mut self, data: ()) -> Id<Node> {
let id = self.nodes.insert(|id| (Node { next: id, data }, id));
if let Some(last) = self.last {
self.nodes[id].next = replace(&mut self.nodes[last].next, id);
} else {
self.last = Some(id);
}
id
}
}
Dependencies
~0.8–2.1MB
~37K SLoC