1 extern crate maybe_uninit;
2 use maybe_uninit::MaybeUninit;
3 
4 use std::cell::Cell;
5 
6 struct DecrementOnDrop<'a>(&'a Cell<usize>);
7 
8 impl<'a> DecrementOnDrop<'a> {
new(ref_:&'a Cell<usize>) -> Self9     pub fn new(ref_:&'a Cell<usize>) -> Self {
10         ref_.set(1);
11         DecrementOnDrop(ref_)
12     }
13 }
14 
15 impl<'a> Clone for DecrementOnDrop<'a> {
clone(&self) -> Self16     fn clone(&self) -> Self {
17         self.0.set(self.0.get() + 1);
18 
19         DecrementOnDrop(self.0)
20     }
21 }
22 
23 impl<'a> Drop for DecrementOnDrop<'a>{
drop(&mut self)24     fn drop(&mut self) {
25         self.0.set(self.0.get() - 1);
26     }
27 }
28 
29 #[test]
doesnt_drop()30 fn doesnt_drop(){
31     let count = Cell::new(0);
32     let arc = DecrementOnDrop::new(&count);
33     let maybe = MaybeUninit::new(arc.clone());
34     assert_eq!(count.get(), 2);
35     drop(maybe);
36     assert_eq!(count.get(), 2);
37 }
38