use pastey::paste;
#[allow_internal_unstable(super_let)]
pub macro own {
($e:expr) => {
{
#[allow(non_snake_case)]
super let mut __OWN_REF_TEMP = ::core::mem::ManuallyDrop::new($e);
unsafe { $crate::Own::new(&mut __OWN_REF_TEMP) }
}
},
}
#[allow_internal_unstable(super_let)]
pub macro deref_own {
($e:expr) => {
{
super let mut __FORGET = $crate::DerefOwnGuard::new($e);
__FORGET.make_own_ref()
}
},
}
#[macro_export]
macro_rules! deconstruct {
{
let $($base:ident)?$(::$next:ident)* (
$(
own $fld:tt
),*$(,)?
) = $expr:expr;
} => {
::pastey::paste! {
let __INNER = $crate::Own::into_inner($expr);
let __BORROW = &mut **__INNER;
let ($($fld,)*);
let $($base)?$($next)* ( $([<$fld>]: [<__BORROW_ $fld>]),*) = __BORROW;
($($fld,)*) = ($(unsafe { $crate::Own::from_mut([<__BORROW_ $fld>]) },)*);
}
};
{
let $ty:ty {
$(
own $fld:tt
),*$(,)?
} = $expr:expr;
} => {
::pastey::paste! {
let __INNER = $crate::Own::into_inner($expr);
let __BORROW = &mut **__INNER;
let ($($fld,)*);
let $ty { $([<$fld>]: [<__BORROW_ $fld>]),* } = __BORROW;
($($fld,)*) = ($(unsafe { $crate::Own::from_mut([<__BORROW_ $fld>]) },)*);
}
};
}