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::State;
8use crate::Viewer;
9use crate::ptr::Ptr;
10use crate::ptr::Role;
11
12pub struct Holder<D: ?Sized> {
13    pub(crate) ptr: Ptr<D>,
14}
15
16impl<D: ?Sized> Holder<D> {
17    pub fn new(d: D) -> Self
18    where D: Sized {
19        Holder { ptr: Ptr::new(d, Role::Holder) }
20    }
21
22    pub fn state(h: &Holder<D>) -> State {
23        h.ptr.cell().state()
24    }
25
26    pub fn reinit(h: &Holder<D>, d: D) -> Result<(), State>
27    where D: Sized {
28        let state = h.ptr.cell().state();
29        if state.is_dropped() {
30            // SAFETY: data is dropped
31            unsafe {
32                h.ptr.cell().reinit_data(d);
33            }
34            Ok(())
35        } else {
36            Err(state)
37        }
38    }
39}
40
41impl<D: ?Sized> Clone for Holder<D> {
42    fn clone(&self) -> Self {
43        Holder { ptr: Ptr::clone_to(&self.ptr, Role::Holder).unwrap() }
44    }
45}
46
47impl<D: ?Sized> From<&Viewer<D>> for Holder<D> {
48    fn from(value: &Viewer<D>) -> Self {
49        Holder { ptr: Ptr::clone_to(&value.ptr, Role::Holder).unwrap() }
50    }
51}
52
53impl<D: ?Sized> From<Viewer<D>> for Holder<D> {
54    fn from(value: Viewer<D>) -> Self {
55        Holder { ptr: Ptr::clone_to(&value.ptr, Role::Holder).unwrap() }
56    }
57}
58
59impl<D: ?Sized> From<&Owner<D>> for Holder<D> {
60    fn from(value: &Owner<D>) -> Self {
61        Holder { ptr: Ptr::clone_to(&value.ptr, Role::Holder).unwrap() }
62    }
63}
64
65impl<D: ?Sized> From<Owner<D>> for Holder<D> {
66    fn from(value: Owner<D>) -> Self {
67        Holder { ptr: Ptr::clone_to(&value.ptr, Role::Holder).unwrap() }
68    }
69}
70
71impl<D: ?Sized> Drop for Holder<D> {
72    fn drop(&mut self) {
73        self.ptr.drop_from(Role::Holder);
74    }
75}
76
77impl<D: ?Sized> Debug for Holder<D> {
78    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
79        f.debug_tuple("Holder").field(&self.ptr).finish()
80    }
81}
82
83impl<D: Default> Default for Holder<D> {
84    fn default() -> Self {
85        Holder::new(D::default())
86    }
87}
88
89impl<D: ?Sized> PartialEq for Holder<D> {
90    fn eq(&self, other: &Self) -> bool {
91        self.ptr == other.ptr
92    }
93}
94
95impl<D: ?Sized> Eq for Holder<D> {}
96
97impl<D: ?Sized> Hash for Holder<D> {
98    fn hash<H: Hasher>(&self, state: &mut H) {
99        self.ptr.hash(state);
100    }
101}