refs 0.51.0

My vision of reference counting and resources management designed for GUI applications.
Documentation
use core::ptr::from_ref;

use crate::{Weak, ref_counter::RefCounter};

pub fn weak_from_ref<T: ?Sized>(rf: &T) -> Weak<T> {
    let ptr = from_ref::<T>(rf).cast_mut();
    assert!(!ptr.is_null(), "Failed to get ptr from ref");

    let address = ptr.cast::<u8>() as usize;

    let Some(stamp) = RefCounter::stamp_for_address(address) else {
        panic!("Trying to get weak pointer for object which is not managed by reference counter.")
    };

    Weak {
        ptr,
        stamp,
        type_name: std::any::type_name::<T>(),
    }
}

#[cfg(test)]
mod test {
    use std::ops::Deref;

    use hreads::set_current_thread_as_main;
    use serial_test::serial;

    use crate::{Own, weak_from_ref};

    #[test]
    #[serial]
    #[should_panic(
        expected = "Trying to get weak pointer for object which is not managed by reference counter."
    )]
    fn test() {
        set_current_thread_as_main();
        let five = Own::new(5);
        let five = five.deref();

        let weak = weak_from_ref(five);

        assert_eq!(*weak.deref(), 5);

        let five = 5;
        let five = &five;

        let _ = weak_from_ref(five);
    }
}