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 unsafe { o.ptr.cell().move_data() }
36 }
37
38 pub fn drop_data(o: Owner<D>) {
39 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 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 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}