1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
use std::rc::{Rc, Weak};
use std::fmt::Debug;
#[derive(Debug)]
pub struct Share<T: Debug>(Inner<T>);
#[derive(Debug)]
pub(crate) enum Inner<T: Debug> {
Strong(Rc<T>),
Weak(Weak<T>),
}
impl<T: Debug> From<Rc<T>> for Share<T> {
fn from(s: Rc<T>) -> Share<T> {
Share(Inner::Strong(s))
}
}
impl<T: Debug> From<Weak<T>> for Share<T> {
fn from(s: Weak<T>) -> Share<T> {
Share(Inner::Weak(s))
}
}
impl<T: Debug> Share<T> {
pub fn transfer(&mut self) -> Option<Rc<T>> {
match self.0 {
Inner::Strong(ref strong) => {
let rc = strong.clone();
self.0 = Inner::Weak(Rc::downgrade(&strong));
Some(rc)
}
_ => None,
}
}
pub fn upgrade(&self) -> Option<Rc<T>> {
match self.0 {
Inner::Weak(ref weak) => weak.upgrade(),
Inner::Strong(ref strong) => Some(strong.clone()),
}
}
pub fn downgrade(&self) -> Weak<T> {
match self.0 {
Inner::Strong(ref strong) => Rc::downgrade(strong),
Inner::Weak(ref weak) => weak.clone(),
}
}
}