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 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}