re-init-rc

Crates.iore-init-rc
lib.rsre-init-rc
version0.1.0
sourcesrc
created_at2023-01-23 14:26:26.775351
updated_at2023-01-23 14:26:26.775351
descriptionWrappers for Rc and Arc weak pointers for auto re-initialization of inner value on access when it is already dropped.
homepage
repositoryhttps://github.com/crsov/re-init-rc/
max_upload_size
id765855
size3,859
(svblsvljb)

documentation

README

re-init-rc

This crate provides two wrappers for Rc and Arc weak pointers - ReInitRc and ReInitArc, both types provides an API to get a pointer (Rc or Arc) from inner weak pointer (upgrade) or re-create the value using the provided function (if inner weak pointer points to a dropped value).

The API is:

impl ReInitRc<T, F: FnMut() -> T> {
    fn new(init_fn: F) -> Self { ... }
    fn get(&mut self) -> Rc<T> { ... }
}

And same for ReInitArc but ReInitArc::get returns Arc<T>

Example with ReInitRc (ReInitArc works the same way)

The code:

use re_init_rc::ReInitRc;

struct PrintOnDrop;

impl Drop for PrintOnDrop {
    fn drop(&mut self) {
        println!("Printing on drop")
    }
}

fn main() {
    let mut x = ReInitRc::new(|| {
        println!("Initializing new PrintOnDrop...");
        PrintOnDrop
    });
    let x1 = x.get(); // Initializing new PrintOnDrop...
    let x2 = x.get();
    drop(x1);
    drop(x2); // Printing on drop
    let x3 = x.get(); // Initializing new PrintOnDrop...
    // As `x3` is just a `Rc<PrintOnDrop>` we can also clone it
    let x4 = x3.clone();
    drop(x3);
    drop(x4); // Print on drop
}

Outputs:

Initializing new PrintOnDrop...
Printing on drop
Initializing new PrintOnDrop...
Printing on drop
Commit count: 5

cargo fmt