refs 0.51.0

My vision of reference counting and resources management designed for GUI applications.
Documentation
use crate::{Own, Weak};

pub type OwnVec<T> = Vec<Own<T>>;
pub type WeakVec<T> = Vec<Weak<T>>;

pub trait RefsVec<T> {
    fn into_own(self) -> OwnVec<T>;
}

impl<T: 'static> RefsVec<T> for Vec<T> {
    fn into_own(self) -> OwnVec<T> {
        self.into_iter().map(|v| Own::new(v)).collect()
    }
}

pub trait WeakVecHelper<T: ?Sized> {
    fn remove_freed(&mut self);
}

impl<T: ?Sized> WeakVecHelper<T> for WeakVec<T> {
    fn remove_freed(&mut self) {
        self.retain(Weak::is_ok);
    }
}

#[cfg(test)]
mod test {
    use hreads::set_current_thread_as_main;
    use serial_test::serial;

    use crate::vec::{OwnVec, RefsVec};

    #[test]
    #[serial]
    fn test_own_vec() {
        set_current_thread_as_main();
        let vec: Vec<u32> = vec![1, 2, 3, 4, 5];
        let mut owned_vec: OwnVec<u32> = vec.clone().into_own();
        let owned_vec2: OwnVec<u32> = vec.into_own();

        assert_eq!(owned_vec, owned_vec2);

        assert_eq!(owned_vec[3], 4);

        assert_eq!(owned_vec.pop().unwrap(), 5);
        set_current_thread_as_main();
    }
}