rt_own/
viewer_ref.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::Viewer;
12use crate::ptr::Ptr;
13use crate::ref_::Ref;
14
15pub struct ViewerRef<Source: ?Sized, Target: ?Sized> {
16    ref_: Ref<Source, Target>,
17}
18
19impl<Source: ?Sized, Target: ?Sized> ViewerRef<Source, Target> {
20    pub fn state(viewer: &Self) -> State {
21        viewer.ref_.source().cell().state()
22    }
23
24    pub fn map<Target2, Map>(viewer: Self, map: Map) -> ViewerRef<Source, Target2>
25    where
26        Target2: ?Sized + 'static,
27        Map: for<'a> FnOnce(&'a Target) -> &'a Target2, {
28        // SAFETY: when self is alive there is no owner and data hasn't been dropped
29        let target = unsafe { viewer.ref_.map_target(map) };
30        let source = viewer.ref_.source().clone_to_viewer().unwrap();
31        ViewerRef { ref_: Ref::new(source, target) }
32    }
33
34    pub fn try_map<Target2, Err, Map>(
35        viewer: Self, map: Map,
36    ) -> Result<ViewerRef<Source, Target2>, Err>
37    where
38        Target2: ?Sized + 'static,
39        Map: for<'a> FnOnce(&'a Target) -> Result<&'a Target2, Err>, {
40        // SAFETY: when self is alive there is no owner and data hasn't been dropped
41        let target = unsafe { viewer.ref_.try_map_target(map) }?;
42        let source = viewer.ref_.source().clone_to_viewer().unwrap();
43        Ok(ViewerRef { ref_: Ref::new(source, target) })
44    }
45
46    pub(crate) fn source(viewer: &Self) -> &Ptr<Source> {
47        viewer.ref_.source()
48    }
49}
50
51impl<Source: ?Sized, Target: ?Sized> Clone for ViewerRef<Source, Target> {
52    fn clone(&self) -> Self {
53        let source = self.ref_.source().clone_to_viewer().unwrap();
54        let target = self.ref_.target();
55        Self { ref_: Ref::new(source, target) }
56    }
57}
58
59impl<Source: ?Sized, Target: ?Sized> Drop for ViewerRef<Source, Target> {
60    fn drop(&mut self) {
61        self.ref_.source().drop_from_viewer();
62    }
63}
64
65impl<Source: ?Sized, Target: ?Sized> Deref for ViewerRef<Source, Target> {
66    type Target = Target;
67    fn deref(&self) -> &Self::Target {
68        // SAFETY: when self is alive there is no owner and data hasn't been dropped
69        unsafe { self.ref_.deref() }
70    }
71}
72
73impl<Source: ?Sized> TryFrom<&Holder<Source>> for ViewerRef<Source, Source> {
74    type Error = State;
75    fn try_from(holder: &Holder<Source>) -> Result<Self, Self::Error> {
76        let source = Holder::ptr(holder).clone_to_viewer()?;
77        Ok(Self { ref_: Ref::from_source(source) })
78    }
79}
80
81impl<Source: ?Sized> TryFrom<Holder<Source>> for ViewerRef<Source, Source> {
82    type Error = State;
83    fn try_from(holder: Holder<Source>) -> Result<Self, Self::Error> {
84        let source = Holder::ptr(&holder).clone_to_viewer()?;
85        Ok(Self { ref_: Ref::from_source(source) })
86    }
87}
88
89impl<Source: ?Sized> From<&Viewer<Source>> for ViewerRef<Source, Source> {
90    fn from(value: &Viewer<Source>) -> Self {
91        let source = Viewer::ptr(value).clone_to_viewer().unwrap();
92        Self { ref_: Ref::from_source(source) }
93    }
94}
95
96impl<Source: ?Sized> From<Viewer<Source>> for ViewerRef<Source, Source> {
97    fn from(value: Viewer<Source>) -> Self {
98        let source = Viewer::ptr(&value).clone_to_viewer().unwrap();
99        Self { ref_: Ref::from_source(source) }
100    }
101}
102
103impl<Source: ?Sized> From<Owner<Source>> for ViewerRef<Source, Source> {
104    fn from(value: Owner<Source>) -> Self {
105        let holder = Holder::from(value);
106        let source = Holder::ptr(&holder).clone_to_viewer().unwrap();
107        Self { ref_: Ref::from_source(source) }
108    }
109}
110
111impl<Source: ?Sized, Target: ?Sized> From<OwnerRef<Source, Target>> for ViewerRef<Source, Target> {
112    fn from(value: OwnerRef<Source, Target>) -> Self {
113        let target = OwnerRef::target(&value);
114        let holder = Holder::from(value);
115        let source = Holder::ptr(&holder).clone_to_viewer().unwrap();
116        ViewerRef { ref_: Ref::new(source, target) }
117    }
118}
119
120impl<Source: ?Sized, Target: ?Sized> Debug for ViewerRef<Source, Target> {
121    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
122        f.write_str("Viewer")?;
123        self.ref_.fmt(f)
124    }
125}
126
127impl<Source: ?Sized, Target: ?Sized> PartialEq for ViewerRef<Source, Target> {
128    fn eq(&self, other: &Self) -> bool {
129        self.ref_ == other.ref_
130    }
131}
132
133impl<Source: ?Sized, Target: ?Sized> Eq for ViewerRef<Source, Target> {}
134
135impl<Source: ?Sized, Target: ?Sized> Hash for ViewerRef<Source, Target> {
136    fn hash<H: Hasher>(&self, state: &mut H) {
137        self.ref_.hash(state);
138    }
139}