Skip to main content

lv_std/unsafe_std/ptrs/
unsafe_shared.rs

1use std::cell::UnsafeCell;
2use std::marker::PhantomData;
3use std::mem::{transmute, ManuallyDrop};
4use std::ops::{Deref, DerefMut};
5use std::ptr::NonNull;
6use crate::unsafe_std::ptrs::raw_ptr::RawPtr;
7
8#[repr(transparent)]
9#[derive(Copy, Clone)]
10pub struct UnsafeShared<T> {
11    value: T
12}
13
14impl<T> UnsafeShared<T> {
15    #[inline(always)]
16    pub unsafe fn new(value: T) -> Self {
17        Self {
18            value
19        }
20    }
21
22    #[inline(always)]
23    pub unsafe fn take_ref(&mut self) -> UnsafeSharedRef<T> {
24        UnsafeSharedRef{ptr: NonNull::<UnsafeCell<T>>::from_mut( transmute(UnsafeCell::new(&mut self.value)))  }
25    }
26}
27
28impl<T> Deref for UnsafeShared<T> {
29    type Target = T;
30
31    #[inline(always)]
32    fn deref(&self) -> &Self::Target {
33        &self.value
34    }
35}
36
37impl<T> DerefMut for UnsafeShared<T> {
38    #[inline(always)]
39    fn deref_mut(&mut self) -> &mut Self::Target {
40        &mut self.value
41    }
42}
43
44
45#[derive(Copy, Clone)]
46pub struct UnsafeSharedRef<T> {
47    ptr: NonNull<UnsafeCell<T>>,
48}
49
50impl<T> Deref for UnsafeSharedRef<T> {
51    type Target = T;
52
53    #[inline(always)]
54    fn deref(&self) -> &Self::Target {
55        unsafe { transmute(self.ptr.as_ref().get())}
56    }
57}
58
59impl<T> DerefMut for UnsafeSharedRef<T> {
60
61    #[inline(always)]
62    fn deref_mut(&mut self) -> &mut Self::Target {
63        unsafe { transmute(self.ptr.as_ref().get())}
64    }
65}