2024-05-09 15:59:08 -07:00
|
|
|
#[macro_export]
|
|
|
|
|
macro_rules! defer {
|
|
|
|
|
($body:block) => {
|
2024-07-05 08:48:24 +00:00
|
|
|
struct _Defer_<F: FnMut()> {
|
2024-05-09 15:59:08 -07:00
|
|
|
closure: F,
|
|
|
|
|
}
|
|
|
|
|
|
2024-07-05 08:48:24 +00:00
|
|
|
impl<F: FnMut()> Drop for _Defer_<F> {
|
2024-05-09 15:59:08 -07:00
|
|
|
fn drop(&mut self) { (self.closure)(); }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let _defer_ = _Defer_ {
|
|
|
|
|
closure: || $body,
|
|
|
|
|
};
|
|
|
|
|
};
|
2024-08-09 02:58:10 +00:00
|
|
|
|
|
|
|
|
($body:expr) => {
|
2024-09-29 04:18:47 +00:00
|
|
|
$crate::defer! {{ $body }}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[macro_export]
|
|
|
|
|
macro_rules! scope_restore {
|
|
|
|
|
($val:ident, $ours:expr) => {
|
|
|
|
|
let theirs = $crate::utils::exchange($val, $ours);
|
|
|
|
|
$crate::defer! {{ *$val = theirs; }};
|
2024-08-09 02:58:10 +00:00
|
|
|
};
|
2024-05-09 15:59:08 -07:00
|
|
|
}
|