rt_own/
viewer.rs

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