document generational box
This commit is contained in:
1 parent
cfd68bf7d9
commit
280d094f67
2 files changed
+37
No files matched your search
@@ -0,0 +1,34 @@
|
|||||||
|
# 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 contains no `unsafe` code.
|
||||||
|
|
||||||
|
There are three main types that 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:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
// Create a store for this thread
|
||||||
|
let store = Store::default();
|
||||||
|
|
||||||
|
{
|
||||||
|
// Create an owner for some state for a scope
|
||||||
|
let owner = store.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");
|
||||||
|
}
|
||||||
|
// Reading value at this point will cause a panic
|
||||||
|
```
|
||||||
|
|
||||||
|
## How it works
|
||||||
|
|
||||||
|
Internally
|
||||||
@@ -145,6 +145,7 @@ fn fuzz() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The core Copy state type. The generational box will be dropped when the [Owner] is dropped.
|
||||||
pub struct GenerationalBox<T> {
|
pub struct GenerationalBox<T> {
|
||||||
raw: MemoryLocation,
|
raw: MemoryLocation,
|
||||||
#[cfg(any(debug_assertions, feature = "check_generation"))]
|
#[cfg(any(debug_assertions, feature = "check_generation"))]
|
||||||
@@ -268,6 +269,7 @@ impl MemoryLocation {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Handles recycling generational boxes that have been dropped. Your application should have one store or one store per thread.
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct Store {
|
pub struct Store {
|
||||||
bump: &'static Bump,
|
bump: &'static Bump,
|
||||||
@@ -310,6 +312,7 @@ impl Store {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 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.
|
||||||
pub struct Owner {
|
pub struct Owner {
|
||||||
store: Store,
|
store: Store,
|
||||||
owned: Rc<RefCell<Vec<MemoryLocation>>>,
|
owned: Rc<RefCell<Vec<MemoryLocation>>>,
|
||||||
|
|||||||
Reference in new issue
Block a user