use std::sync::atomic::AtomicUsize;
use std::sync::atomic::Ordering;
#[derive(Debug, Default)]
pub struct AtomUsz(AtomicUsize);
impl AtomUsz {
pub fn new(v: usize) -> Self {
Self(AtomicUsize::new(v))
}
pub fn set(&self, v: usize) {
self.0.store(v, Ordering::Relaxed);
}
pub fn add(&self, v: usize) -> usize {
let old = self.0.fetch_add(v, Ordering::Relaxed);
old
}
pub fn inc(&self) -> usize {
self.add(1)
}
pub fn sub(&self, v: usize) -> usize {
let old = self.0.fetch_sub(v, Ordering::Relaxed);
old
}
pub fn dec(&self) -> usize {
self.sub(1)
}
pub fn get(&self) -> usize {
self.0.load(Ordering::Relaxed)
}
}
impl From<usize> for AtomUsz {
fn from(v: usize) -> Self {
Self::new(v)
}
}