lending-cell

Crates.iolending-cell
lib.rslending-cell
version0.1.1
sourcesrc
created_at2022-07-09 18:27:55.599896
updated_at2022-07-14 02:36:00.501244
descriptionLike a cell, but make lifetimes dynamic instead of ownership
homepage
repositoryhttps://github.com/njaard/lending-cell
max_upload_size
id622676
size10,087
project-freta (github:microsoft:project-freta)

documentation

https://docs.rs/lending-cell

README

GitHub license Crates.io docs

LendingCell is a mutable container that allows you to get an owned reference to the same object. When the owned reference is dropped, ownership returns to the original container.

As opposed to a std::cell::Cell which moves Rust's ownership rules to runtime, a LendingCell moves Rust's lifetime rules to runtime.

The value of a LendingCell is present at construction-time, but you can convert it to a BorrowedCell<T> by calling LendingCell::to_borrowed. While that BorrowedCell lives (that is, until it is dropped), calling LendingCell::try_get will return None. The BorrowedCell has exclusive access to your type, as though you have a directly owned instance of the T, and so it is Send as long as T is Send. At last, when you drop the BorrowedCell, the T is returned to the LendingCell.

If you drop your LendingCell before dropping the BorrowedCell, then the T is dropped at the time you drop the BorrowedCell.

The invariants that Rust's memory safety rules enforce, like the single-mutable reference rule, are therefor partially ensured at compile time (you can't get two mutable references to the T), but also partially at runtime (while the BorrowedCell is active, the LendingCell behaves as though it is an Option containing None.

Example

let mut lender = LendingCell::new("borrowed");
let borrowed = lender.to_borrowed();
assert!(lender.try_get().is_none()); // `lender` is empty because it was borrowed
assert_eq!(*borrowed, "borrowed"); // it's certain that `borrowed` is valid while in scope
drop(borrowed); // dropping `borrowed` returns its value to `lender`
assert!(lender.try_get().is_some());
Commit count: 2

cargo fmt