aboutsummaryrefslogtreecommitdiffstats
path: root/src/defer.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/defer.rs')
-rw-r--r--src/defer.rs16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/defer.rs b/src/defer.rs
new file mode 100644
index 0000000..362c7d1
--- /dev/null
+++ b/src/defer.rs
@@ -0,0 +1,16 @@
+pub struct Defer<T: FnOnce()>(pub Option<T>);
+
+impl<T: FnOnce()> Drop for Defer<T> {
+ fn drop(&mut self) {
+ if let Some(f) = self.0.take() {
+ f();
+ }
+ }
+}
+
+#[macro_export]
+macro_rules! defer {
+ ($($x:tt)*) => {
+ let _defer = crate::defer::Defer(Some(move || {$($x)*}));
+ };
+}