rt_own/
holder.rs

1use std::fmt::Debug;
2use std::fmt::Formatter;
3use std::hash::Hash;
4use std::hash::Hasher;
5
6use crate::Owner;
7use crate::OwnerRef;
8use crate::State;
9use crate::Viewer;
10use crate::ViewerRef;
11use crate::ptr::Ptr;
12
13pub struct Holder<D: ?Sized> {
14    ptr: Ptr<D>,
15}
16
17impl<D: ?Sized> Holder<D> {
18    pub fn new(data: D) -> Self
19    where D: Sized {
20        Self { ptr: Ptr::new_holder(data) }
21    }
22
23    pub fn state(holder: &Self) -> State {
24        holder.ptr.cell().state()
25    }
26
27    pub fn reinit(holder: &Self, data: D) -> Result<(), State>
28    where D: Sized {
29        let state = holder.ptr.cell().state();
30        if state.is_dropped() {
31            // SAFETY: data is dropped
32            unsafe {
33                holder.ptr.cell().reinit_data(data);
34            }
35            Ok(())
36        } else {
37            Err(state)
38        }
39    }
40
41    pub(crate) fn ptr(holder: &Self) -> &Ptr<D> {
42        &holder.ptr
43    }
44}
45
46impl<D: ?Sized> Clone for Holder<D> {
47    fn clone(&self) -> Self {
48        Self { ptr: self.ptr.clone_to_holder() }
49    }
50}
51
52impl<D: ?Sized> Drop for Holder<D> {
53    fn drop(&mut self) {
54        self.ptr.drop_from_holder();
55    }
56}
57
58impl<D: ?Sized> From<&Viewer<D>> for Holder<D> {
59    fn from(value: &Viewer<D>) -> Self {
60        Self { ptr: Viewer::ptr(value).clone_to_holder() }
61    }
62}
63
64impl<D: ?Sized> From<Viewer<D>> for Holder<D> {
65    fn from(value: Viewer<D>) -> Self {
66        Self { ptr: Viewer::ptr(&value).clone_to_holder() }
67    }
68}
69
70impl<D: ?Sized> From<&Owner<D>> for Holder<D> {
71    fn from(value: &Owner<D>) -> Self {
72        Self { ptr: Owner::ptr(value).clone_to_holder() }
73    }
74}
75
76impl<D: ?Sized> From<Owner<D>> for Holder<D> {
77    fn from(value: Owner<D>) -> Self {
78        Self { ptr: Owner::ptr(&value).clone_to_holder() }
79    }
80}
81
82impl<Source: ?Sized, Target: ?Sized> From<&ViewerRef<Source, Target>> for Holder<Source> {
83    fn from(value: &ViewerRef<Source, Target>) -> Self {
84        Self { ptr: ViewerRef::source(value).clone_to_holder() }
85    }
86}
87
88impl<Source: ?Sized, Target: ?Sized> From<ViewerRef<Source, Target>> for Holder<Source> {
89    fn from(value: ViewerRef<Source, Target>) -> Self {
90        Self { ptr: ViewerRef::source(&value).clone_to_holder() }
91    }
92}
93
94impl<Source: ?Sized, Target: ?Sized> From<&OwnerRef<Source, Target>> for Holder<Source> {
95    fn from(value: &OwnerRef<Source, Target>) -> Self {
96        Self { ptr: OwnerRef::source(value).clone_to_holder() }
97    }
98}
99
100impl<Source: ?Sized, Target: ?Sized> From<OwnerRef<Source, Target>> for Holder<Source> {
101    fn from(value: OwnerRef<Source, Target>) -> Self {
102        Self { ptr: OwnerRef::source(&value).clone_to_holder() }
103    }
104}
105
106impl<D: ?Sized> Debug for Holder<D> {
107    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
108        f.debug_tuple("Holder").field(&self.ptr).finish()
109    }
110}
111
112impl<D: Default> Default for Holder<D> {
113    fn default() -> Self {
114        Self::new(D::default())
115    }
116}
117
118impl<D: ?Sized> PartialEq for Holder<D> {
119    fn eq(&self, other: &Self) -> bool {
120        self.ptr == other.ptr
121    }
122}
123
124impl<D: ?Sized> Eq for Holder<D> {}
125
126impl<D: ?Sized> Hash for Holder<D> {
127    fn hash<H: Hasher>(&self, state: &mut H) {
128        self.ptr.hash(state);
129    }
130}