14 unstable releases (3 breaking)

new 0.6.0-alpha.5 Nov 16, 2024
0.6.0-alpha.3 Oct 14, 2024
0.5.6 Jul 18, 2024
0.5.0 Mar 28, 2024
0.4.3 Dec 7, 2023

#140 in Memory management

Download history 3567/week @ 2024-07-27 3143/week @ 2024-08-03 2958/week @ 2024-08-10 2951/week @ 2024-08-17 3374/week @ 2024-08-24 3782/week @ 2024-08-31 2874/week @ 2024-09-07 3175/week @ 2024-09-14 3374/week @ 2024-09-21 2779/week @ 2024-09-28 2568/week @ 2024-10-05 3375/week @ 2024-10-12 3575/week @ 2024-10-19 3009/week @ 2024-10-26 2713/week @ 2024-11-02 1884/week @ 2024-11-09

11,639 downloads per month
Used in 86 crates (12 directly)

MIT/Apache

59KB
1.5K SLoC

Generational Box

Generational Box is a runtime for Rust that allows any static type to implement Copy. It can be combined with a global runtime to create an ergonomic state solution like dioxus-signals. This crate doesn't have any unsafe code.

Three main types manage state in Generational Box:

  • Store: Handles recycling generational boxes that have been dropped. Your application should have one store or one store per thread.
  • Owner: Handles dropping generational boxes. The owner acts like a runtime lifetime guard. Any states that you create with an owner will be dropped when that owner is dropped.
  • GenerationalBox: The core Copy state type. The generational box will be dropped when the owner is dropped.

Example:

use generational_box::{UnsyncStorage, AnyStorage};

// Create an owner for some state for a scope
let owner = UnsyncStorage::owner();

// Create some non-copy data, move it into a owner, and work with copy data
let data: String = "hello world".to_string();
let key = owner.insert(data);

// The generational box can be read from and written to like a RefCell
let value = key.read();
assert_eq!(*value, "hello world");

How it works

Internally, generational-box creates an arena of generational RefCells that are recycled when the owner is dropped. You can think of the cells as something like &'static RefCell<Box<dyn Any>> with a generational check to make recycling a cell easier to debug. Then GenerationalBoxes are Copy because the &'static pointer is Copy.

Dependencies

~0.7–5MB
~17K SLoC