pin-weak
This create provides weak pointers for Pin<std::rc::Rc<T>> and Pin<std::rc::Arc<T>>
Motivation
Pin<std::rc::Rc<T>> and Pin<std::rc::Arc<T>> cannot be converted safely to
their Weak<T> equivalent if T does not implement Unpin.
That's because it would otherwise be possible to do something like this:
;
let pinned = pin;
// This is unsafe ...
let weak = unsafe ;
// ... because otherwise it would be possible to move the content of pinned:
let mut unpinned_rc = weak.upgrade.unwrap;
drop;
// unpinned_rc is now the only reference so this will work:
let x = replace;
In that example, x is the original SomeStruct which we moved in memory,
that is undefined behavior, do not do that at home.
PinWeak
This crate simply provide a rc::PinWeak and sync::PinWeak which allow to
get weak pointer from Pin<std::rc::Rc> and Pin<srd::sync::Arc>.
This is safe because you can one can only get back a Pin out of it when
trying to upgrade the weak pointer.
PinWeak can be created using the PinWeak downgrade function.
Example
use *;
;
let pinned = pin;
let weak = downgrade;
assert_eq!;
drop;
assert!;
License
MIT