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}