use std::marker::PhantomData;
use std::ops::{Deref, DerefMut};
use crate::unsafe_std::lifetimes::{extend_lifetime, extend_lifetime_mut};
use crate::unsafe_std::ptrs::unsafe_shared::{UnsafeShared, UnsafeSharedRef};
#[derive(Copy, Clone)]
pub struct Shared<T> {
value: UnsafeShared<T>,
}
impl<T> Shared<T> {
#[inline]
pub fn new(value: T) -> Self {
Self {
value: unsafe { UnsafeShared::new(value) },
}
}
#[inline]
pub fn take_ref(&mut self) -> SharedRef<'_, T> {
SharedRef {
ptr: unsafe { self.value.take_ref() },
_marker: PhantomData,
}
}
#[inline]
pub fn raw(&self) -> &UnsafeShared<T> {
&self.value
}
}
#[derive(Copy, Clone)]
pub struct SharedRef<'b, T> {
ptr: UnsafeSharedRef<T>,
_marker: PhantomData<&'b T>,
}
impl<'b, T> Deref for SharedRef<'b, T> {
type Target = T;
#[inline]
fn deref(&self) -> &'b T {
unsafe { extend_lifetime(self.ptr.deref()) }
}
}
impl<'b, T> DerefMut for SharedRef<'b, T> {
#[inline]
fn deref_mut(&mut self) -> &'b mut T {
unsafe { extend_lifetime_mut(self.ptr.deref_mut()) }
}
}