ztopic 0.3.18

A topic-based pub/sub library for Rust
Documentation
use std::{fmt::Debug, ops::Deref};

#[derive(Clone)]
pub struct RawRef<T>(*const T);

impl<T: Debug> Debug for RawRef<T> {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        f.debug_tuple("RawRef").field(&self.0).field(unsafe { &*self.0 }).finish()
    }
}

unsafe impl<T> Send for RawRef<T> {}
unsafe impl<T> Sync for RawRef<T> {}

impl<T> Deref for RawRef<T> {
    type Target = T;

    fn deref(&self) -> &Self::Target {
        unsafe { &*self.0 }
    }
}

impl<T> From<&T> for RawRef<T> {
    fn from(value: &T) -> Self {
        Self(value as *const T)
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn it_works() {
        let value = 42;
        let ref_value = RawRef::from(&value);
        assert_eq!(*ref_value, 42);

        println!("{:?}", ref_value);

        println!("{:?}", ref_value.clone())
    }
}