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()30fn 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