use std::{
convert::{AsMut, AsRef},
fmt::{Display, Formatter, Result as FmtResult},
};
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct SyncPtr<T> {
ptr: *mut T,
}
impl<T> SyncPtr<T> {
pub fn as_ptr(&self) -> *mut T {
self.ptr
}
}
impl<T> AsRef<T> for SyncPtr<T> {
fn as_ref(&self) -> &T {
unsafe { &*self.ptr }
}
}
impl<T> AsMut<T> for SyncPtr<T> {
fn as_mut(&mut self) -> &mut T {
unsafe { &mut *self.ptr }
}
}
unsafe impl<T> Send for SyncPtr<T> {}
unsafe impl<T> Sync for SyncPtr<T> {}
impl<T: Display> Display for SyncPtr<T> {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
self.as_ref().fmt(f)
}
}
impl<T> From<*mut T> for SyncPtr<T> {
fn from(ptr: *mut T) -> Self {
if ptr.is_null() {
panic!("Attempted to create a SyncPtr from a null pointer");
}
Self {
ptr,
}
}
}
impl<T> From<SyncPtr<T>> for *mut T {
fn from(sync_ptr: SyncPtr<T>) -> Self {
sync_ptr.ptr
}
}
impl<T> From<&SyncPtr<T>> for *mut T {
fn from(sync_ptr: &SyncPtr<T>) -> Self {
sync_ptr.ptr
}
}