expiring_ref 0.8.3

A crate designed to implement a mechanism for owning values, via a destructively-moved equivalent to C++'s xvalues/`T&&`
Documentation
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);
            // SAFETY: value is always inhabited
            unsafe { $crate::Own::new(&mut __OWN_REF_TEMP) }
        }
    },
}

/// &own *x
#[allow_internal_unstable(super_let)]
pub macro deref_own {
    ($e:expr) => {
        {
            super let mut __FORGET = $crate::DerefOwnGuard::new($e);
            __FORGET.make_own_ref()
        }
    },
}

/// Basic macro for field projection
#[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)* ( $([<__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>]) },)*);
        }
    };

}