//! Types for controlling when drop is invoked. use core::mem; use core::mem::MaybeUninit; /// A type to delay the drop handler invocation. #[must_use = "to delay the drop handler invocation to the end of the scope"] pub struct OnDrop { f: MaybeUninit, } impl OnDrop { /// Create a new instance. pub fn new(f: F) -> Self { Self { f: MaybeUninit::new(f) } } /// Prevent drop handler from running. pub fn defuse(self) { mem::forget(self) } } impl Drop for OnDrop { fn drop(&mut self) { unsafe { self.f.as_ptr().read()() } } } /// An explosive ordinance that panics if it is improperly disposed of. /// /// This is to forbid dropping futures, when there is absolutely no other choice. /// /// To correctly dispose of this device, call the [defuse](struct.DropBomb.html#method.defuse) /// method before this object is dropped. #[must_use = "to delay the drop bomb invokation to the end of the scope"] pub struct DropBomb { _private: (), } impl DropBomb { /// Create a new instance. pub fn new() -> Self { Self { _private: () } } /// Defuses the bomb, rendering it safe to drop. pub fn defuse(self) { mem::forget(self) } } impl Drop for DropBomb { fn drop(&mut self) { panic!("boom") } }