macro_rules! extend_lifetime {
($expr:expr, $t:ty) => {
std::mem::transmute::<$t, $t>($expr)
};
}
#[macro_export]
macro_rules! make_slot_wrapper {
($name:ident) => {
$crate::__make_slot_wrapper!((pub(crate)), $name);
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! __make_slot_wrapper {
(($($vis:tt)*), $name:ident) => {
#[repr(transparent)]
$($vis)* struct $name<T>(Option<T>);
impl<T> $name<T> {
pub fn wrap(out: &mut Option<T>) -> &mut Self {
unsafe { &mut *(out as *mut Option<T> as *mut $name<T>) }
}
pub fn make_handle(out: &mut Option<T>) -> $crate::de::SinkHandle<'_> where $name<T>: $crate::de::Sink {
$crate::de::SinkHandle::Borrowed(Self::wrap(out))
}
}
impl<T> std::ops::Deref for $name<T> {
type Target = Option<T>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl<T> std::ops::DerefMut for $name<T> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
};
}