unsafe_ref/
lib.rs

1use std::ops::{Deref, DerefMut};
2
3pub struct UnsafeRef<T: ?Sized> {
4    x: *const T,
5}
6
7impl<T: ?Sized> Deref for UnsafeRef<T> {
8    type Target = T;
9    fn deref(&self) -> &Self::Target {
10        unsafe {
11            return &*self.x;
12        }
13    }
14}
15
16impl<T: ?Sized> UnsafeRef<T> {
17    pub fn new<'a>(x: &'a T) -> Self {
18        return UnsafeRef { x };
19    }
20}
21
22pub struct UnsafeMutRef<T: ?Sized> {
23    x: *mut T,
24}
25
26impl<T: ?Sized> Deref for UnsafeMutRef<T> {
27    type Target = T;
28    fn deref(&self) -> &Self::Target {
29        unsafe {
30            return &*self.x;
31        }
32    }
33}
34
35impl<T: ?Sized> DerefMut for UnsafeMutRef<T> {
36    fn deref_mut(&mut self) -> &mut Self::Target {
37        unsafe {
38            return &mut *self.x;
39        }
40    }
41}
42
43impl<T: ?Sized> UnsafeMutRef<T> {
44    pub fn new<'a>(x: &'a mut T) -> Self {
45        return UnsafeMutRef { x };
46    }
47}
48
49#[cfg(test)]
50mod tests {
51    use crate::{UnsafeMutRef, UnsafeRef};
52
53    trait Foo {
54        fn set(&mut self, v: i32);
55        fn get(&self) -> i32;
56    }
57    struct A(i32);
58    impl Foo for A {
59        fn set(&mut self, v: i32) {
60            self.0 = v;
61        }
62        fn get(&self) -> i32 {
63            self.0
64        }
65    }
66
67    #[test]
68    fn it_works() {
69        let mut a = A(0);
70        let mut x: UnsafeMutRef<dyn Foo> = UnsafeMutRef::new(&mut a);
71        let mut y: UnsafeMutRef<dyn Foo> = UnsafeMutRef::new(&mut a);
72        let z: UnsafeRef<dyn Foo> = UnsafeRef::new(&a);
73        x.set(42);
74        y.set(z.get() + 10);
75        if z.get() != 52 {
76            panic!();
77        }
78    }
79}