tuwunel_core/utils/
defer.rs1#[macro_export]
2macro_rules! defer {
3 ($body:block) => {
4 struct _Defer_<F: FnMut()> {
5 closure: F,
6 }
7
8 impl<F: FnMut()> Drop for _Defer_<F> {
9 fn drop(&mut self) { (self.closure)(); }
10 }
11
12 let _defer_ = _Defer_ { closure: || $body };
13 };
14
15 ($body:expr_2021) => {
16 $crate::defer! {{ $body }}
17 };
18}
19
20#[macro_export]
21macro_rules! scope_restore {
22 ($val:ident, $ours:expr_2021) => {
23 let theirs = $crate::utils::exchange($val, $ours);
24 $crate::defer! {{ *$val = theirs; }};
25 };
26}