use std::num::NonZeroU32;
use std::sync::atomic::{AtomicU32, Ordering};
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct UpdateHandle(NonZeroU32);
impl UpdateHandle {
pub fn new() -> UpdateHandle {
static COUNT: AtomicU32 = AtomicU32::new(0);
loop {
let c = COUNT.load(Ordering::Relaxed);
let h = c.wrapping_add(1);
let nz = NonZeroU32::new(h).unwrap_or_else(|| {
panic!("UpdateHandle::new: all available handles have been issued")
});
if COUNT.compare_and_swap(c, h, Ordering::Relaxed) == c {
break UpdateHandle(nz);
}
}
}
}