#![allow(dead_code)] use std::fmt; use std::marker::PhantomData; use std::ops::Deref; pub struct Unique { pointer: *const T, _marker: PhantomData, } unsafe impl Send for Unique {} unsafe impl Sync for Unique {} impl Unique { pub unsafe fn new(ptr: *mut T) -> Unique { Unique { pointer: ptr, _marker: PhantomData, } } pub unsafe fn get(&self) -> &T { &*self.pointer } pub unsafe fn get_mut(&mut self) -> &mut T { &mut ***self } } impl Deref for Unique { type Target = *mut T; #[inline] fn deref(&self) -> &*mut T { unsafe { &*(&self.pointer as *const *const T as *const *mut T) } } } impl fmt::Pointer for Unique { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fmt::Pointer::fmt(&self.pointer, f) } }