use std::sync::{ Arc, atomic::{AtomicU32, Ordering}, }; pub struct RefCounter(Arc); impl RefCounter { pub fn new() -> Self { Self(Arc::new(0.into())) } pub fn refs(&self) -> u32 { self.0.load(Ordering::Acquire) } pub fn drop(&mut self) -> bool { let refs = self.0.fetch_sub(1, Ordering::Release); refs == 0 } } impl Clone for RefCounter { fn clone(&self) -> Self { self.0.fetch_add(1, Ordering::Release); Self(self.0.clone()) } }