rt_own/
owner.rs

1use std::fmt::Debug;
2use std::fmt::Formatter;
3use std::hash::Hash;
4use std::hash::Hasher;
5use std::ops::Deref;
6use std::ops::DerefMut;
7
8use crate::Holder;
9use crate::State;
10use crate::Viewer;
11use crate::ptr::Ptr;
12use crate::ptr::Role;
13
14pub struct Owner<D: ?Sized> {
15    pub(crate) ptr: Ptr<D>,
16}
17
18impl<D: ?Sized> Owner<D> {
19    pub fn new(d: D) -> Self
20    where D: Sized {
21        Owner { ptr: Ptr::new(d, Role::Owner) }
22    }
23
24    pub fn state(o: &Owner<D>) -> State {
25        o.ptr.cell().state()
26    }
27
28    pub fn move_data(o: Owner<D>) -> D
29    where D: Sized {
30        // SAFETY:
31        // we have exclusive ref
32        // we consume the Owner when taking
33        // we change the state to dropped
34        // so we won't access the data anymore
35        unsafe { o.ptr.cell().move_data() }
36    }
37
38    pub fn drop_data(o: Owner<D>) {
39        // SAFETY:
40        // we have exclusive ref
41        // we consume the Owner when deleting
42        // we change the state to dropped
43        // so we won't access the data anymore
44        unsafe { o.ptr.cell().drop_data() }
45    }
46}
47
48impl<D: ?Sized> Deref for Owner<D> {
49    type Target = D;
50    fn deref(&self) -> &Self::Target {
51        // SAFETY: we have exclusive ref and data hasn't been dropped
52        unsafe { self.ptr.cell().deref() }
53    }
54}
55
56impl<D: ?Sized> DerefMut for Owner<D> {
57    fn deref_mut(&mut self) -> &mut Self::Target {
58        // SAFETY: we have exclusive ref and data hasn't been dropped
59        unsafe { self.ptr.cell().deref_mut() }
60    }
61}
62
63impl<D: ?Sized> TryFrom<&Holder<D>> for Owner<D> {
64    type Error = State;
65    fn try_from(value: &Holder<D>) -> Result<Self, Self::Error> {
66        Ok(Owner { ptr: Ptr::clone_to(&value.ptr, Role::Owner)? })
67    }
68}
69
70impl<D: ?Sized> TryFrom<Holder<D>> for Owner<D> {
71    type Error = State;
72    fn try_from(value: Holder<D>) -> Result<Self, Self::Error> {
73        Ok(Owner { ptr: Ptr::clone_to(&value.ptr, Role::Owner)? })
74    }
75}
76
77impl<D: ?Sized> TryFrom<Viewer<D>> for Owner<D> {
78    type Error = State;
79    fn try_from(value: Viewer<D>) -> Result<Self, Self::Error> {
80        let h = Holder::from(value);
81        Ok(Owner { ptr: Ptr::clone_to(&h.ptr, Role::Owner)? })
82    }
83}
84
85impl<D: ?Sized> Drop for Owner<D> {
86    fn drop(&mut self) {
87        self.ptr.drop_from(Role::Owner);
88    }
89}
90
91impl<D: ?Sized> Debug for Owner<D> {
92    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
93        f.debug_tuple("Owner").field(&self.ptr).finish()
94    }
95}
96
97impl<D: Default> Default for Owner<D> {
98    fn default() -> Self {
99        Owner::new(D::default())
100    }
101}
102
103impl<D: ?Sized> PartialEq for Owner<D> {
104    fn eq(&self, other: &Self) -> bool {
105        self.ptr == other.ptr
106    }
107}
108
109impl<D: ?Sized> Eq for Owner<D> {}
110
111impl<D: ?Sized> Hash for Owner<D> {
112    fn hash<H: Hasher>(&self, state: &mut H) {
113        self.ptr.hash(state);
114    }
115}