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