lv_std/unsafe_std/ptrs/
unsafe_shared.rs1use 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}