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}