use std::ffi::{CString, OsString};
use std::marker::PhantomData;
use std::ops::{Deref, DerefMut};
use std::path::PathBuf;
use std::rc::Rc;
use std::sync::Arc;
pub unsafe trait StableDeref: Deref { }
unsafe impl<T> StableDeref for Box<T> { }
unsafe impl<T> StableDeref for Vec<T> { }
unsafe impl<T> StableDeref for Rc<T> { }
unsafe impl<T> StableDeref for Arc<T> { }
unsafe impl StableDeref for String { }
unsafe impl StableDeref for PathBuf { }
unsafe impl StableDeref for OsString { }
unsafe impl StableDeref for CString { }
pub unsafe trait StableDerefMut: DerefMut { }
unsafe impl<T> StableDerefMut for Box<T> { }
unsafe impl<T> StableDerefMut for Vec<T> { }
pub struct Pin<'a, T: ?Sized> {
_marker: PhantomData<&'a mut &'a ()>,
data: T,
}
pub fn pin<'a, T>(data: T) -> Pin<'a, T> {
Pin {
_marker: PhantomData,
data
}
}
pub struct Anchor<Ptr: ?Sized> {
ptr: Ptr,
}
impl<Ptr: StableDeref> Anchor<Ptr> {
pub fn new(ptr: Ptr) -> Anchor<Ptr> {
Anchor { ptr }
}
pub fn as_ref<'a>(&'a self) -> Anchor<&'a Ptr::Target> {
Anchor {
ptr: &*self.ptr
}
}
}
impl<Ptr: StableDerefMut> Anchor<Ptr> {
pub fn as_mut<'a>(&'a mut self) -> Anchor<&'a mut Ptr::Target> {
Anchor {
ptr: &mut *self.ptr
}
}
}
impl<'a, T> Anchor<&'a mut T> {
pub fn pinned(data: &'a mut Pin<'a, T>) -> Anchor<&'a mut T> {
Anchor {
ptr: &mut data.data
}
}
}
impl<'a, T> Anchor<&'a T> {
pub fn pinned(data: &'a Pin<'a, T>) -> Anchor<&'a T> {
Anchor {
ptr: &data.data
}
}
}
impl<Ptr> Anchor<Ptr> {
pub unsafe fn get_mut(&mut self) -> &mut Ptr {
&mut self.ptr
}
}
impl<Ptr> Deref for Anchor<Ptr> {
type Target = Ptr;
fn deref(&self) -> &Ptr {
&self.ptr
}
}