aboutsummaryrefslogtreecommitdiff
path: root/rtic-common/src/dropper.rs
diff options
context:
space:
mode:
authorEmil Fresk <emil.fresk@gmail.com>2023-01-30 14:49:24 +0100
committerHenrik Tjäder <henrik@tjaders.com>2023-03-01 00:33:38 +0100
commit5c1cefbf4e249c38467e3f6eb4e061e5b8073d6c (patch)
treec0e8ab5b535ec4a192b9f6e83f29da8409c7016a /rtic-common/src/dropper.rs
parente65e532c2a342f77080ac6fc8e5be11aa7d82575 (diff)
Add `rtic-arbiter`
Diffstat (limited to 'rtic-common/src/dropper.rs')
-rw-r--r--rtic-common/src/dropper.rs26
1 files changed, 26 insertions, 0 deletions
diff --git a/rtic-common/src/dropper.rs b/rtic-common/src/dropper.rs
new file mode 100644
index 0000000..a4b4d15
--- /dev/null
+++ b/rtic-common/src/dropper.rs
@@ -0,0 +1,26 @@
+//! A drop implementation runner.
+
+/// Runs a closure on drop.
+pub struct OnDrop<F: FnOnce()> {
+ f: core::mem::MaybeUninit<F>,
+}
+
+impl<F: FnOnce()> OnDrop<F> {
+ /// Make a new droppper given a closure.
+ pub fn new(f: F) -> Self {
+ Self {
+ f: core::mem::MaybeUninit::new(f),
+ }
+ }
+
+ /// Make it not run drop.
+ pub fn defuse(self) {
+ core::mem::forget(self)
+ }
+}
+
+impl<F: FnOnce()> Drop for OnDrop<F> {
+ fn drop(&mut self) {
+ unsafe { self.f.as_ptr().read()() }
+ }
+}