drop_box/
lib.rs

1use std::ops::{Deref, DerefMut};
2
3pub struct DropBox<T, F>
4where
5    F: Fn(&mut T),
6{
7    item: T,
8    f: F,
9}
10
11impl<T, F> DropBox<T, F>
12where
13    F: Fn(&mut T),
14{
15    pub fn new(item: T, f: F) -> Self
16where {
17        Self { item, f }
18    }
19}
20
21impl<T, F> Deref for DropBox<T, F>
22where
23    F: Fn(&mut T),
24{
25    type Target = T;
26
27    fn deref(&self) -> &Self::Target {
28        &self.item
29    }
30}
31
32impl<T, F> DerefMut for DropBox<T, F>
33where
34    F: Fn(&mut T),
35{
36    fn deref_mut(&mut self) -> &mut Self::Target {
37        &mut self.item
38    }
39}
40
41impl<T, F> Drop for DropBox<T, F>
42where
43    F: Fn(&mut T),
44{
45    fn drop(&mut self) {
46        (self.f)(&mut self.item);
47    }
48}