Crates.io | lifetime-guard |
lib.rs | lifetime-guard |
version | 0.0.1 |
created_at | 2025-08-16 06:11:06.702751+00 |
updated_at | 2025-08-16 06:21:14.712511+00 |
description | create weak/strong reference pairs to interior mutable data on the stack |
homepage | https://github.com/AngleSideAngle/bcsc |
repository | https://github.com/AngleSideAngle/bcsc |
max_upload_size | |
id | 1798053 |
size | 11,208 |
lifetime-guard
provides ValueGuard
and RefGuard
structs to allow for
weak references to interior mutable values, similar to a singular pair of
Rc
and Weak
, but without heap allocation.
use std::pin;
use lifetime_guard::{ ValueGuard, RefGuard };
let weak = pin::pin!(RefGuard::new());
{
let strong = pin::pin!(ValueGuard::new(0));
strong.as_ref().registration().register(weak.as_ref());
assert_eq!(strong.get(), 0);
assert_eq!(weak.get(), Some(0));
strong.as_ref().set(1);
assert_eq!(strong.get(), 1);
assert_eq!(weak.get(), Some(1));
}
assert_eq!(weak.get(), None);
You may not leak any instance of either ValueGuard
or RefGuard
to the
stack using mem::forget()
or any other mechanism that causes thier
contents to be overwritten without Drop::drop()
running.
Doing so creates unsoundness that likely will lead to dereferencing a null
pointer.
Doing so creates unsoundness that likely will lead to dereferencing a null pointer. See the Forget marker trait rfc for progress on making interfaces that rely on not being leaked sound.
Note that it is sound to leak ValueGuard
and RefGuard
to the heap using
methods including Box::leak()
because heap allocated data will never be
overwritten if it is never freed.