1 // Extracted from the scopeguard crate
2 use core::ops::{Deref, DerefMut};
3 
4 pub struct ScopeGuard<T, F>
5 where
6     F: FnMut(&mut T),
7 {
8     dropfn: F,
9     value: T,
10 }
11 
12 #[cfg_attr(feature = "inline-more", inline)]
guard<T, F>(value: T, dropfn: F) -> ScopeGuard<T, F> where F: FnMut(&mut T),13 pub fn guard<T, F>(value: T, dropfn: F) -> ScopeGuard<T, F>
14 where
15     F: FnMut(&mut T),
16 {
17     ScopeGuard { dropfn, value }
18 }
19 
20 impl<T, F> Deref for ScopeGuard<T, F>
21 where
22     F: FnMut(&mut T),
23 {
24     type Target = T;
25     #[cfg_attr(feature = "inline-more", inline)]
deref(&self) -> &T26     fn deref(&self) -> &T {
27         &self.value
28     }
29 }
30 
31 impl<T, F> DerefMut for ScopeGuard<T, F>
32 where
33     F: FnMut(&mut T),
34 {
35     #[cfg_attr(feature = "inline-more", inline)]
deref_mut(&mut self) -> &mut T36     fn deref_mut(&mut self) -> &mut T {
37         &mut self.value
38     }
39 }
40 
41 impl<T, F> Drop for ScopeGuard<T, F>
42 where
43     F: FnMut(&mut T),
44 {
45     #[cfg_attr(feature = "inline-more", inline)]
drop(&mut self)46     fn drop(&mut self) {
47         (self.dropfn)(&mut self.value)
48     }
49 }
50