use std::sync::atomic::AtomicBool;
use std::sync::atomic::Ordering;
#[derive(Debug, Default)]
pub struct AtomicFlag(AtomicBool);
impl AtomicFlag {
pub const fn lowered() -> AtomicFlag {
Self(AtomicBool::new(false))
}
pub const fn raised() -> AtomicFlag {
Self(AtomicBool::new(true))
}
pub fn raise(&self) -> bool {
!self.0.swap(true, Ordering::SeqCst)
}
pub fn lower(&self) -> bool {
self.0.swap(false, Ordering::SeqCst)
}
pub fn is_raised(&self) -> bool {
self.0.load(Ordering::SeqCst)
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn atomic_flag_raises_lowers() {
let flag = AtomicFlag::default();
assert!(!flag.is_raised()); assert!(flag.raise());
assert!(flag.is_raised());
assert!(!flag.raise());
assert!(flag.is_raised());
assert!(flag.lower());
assert!(flag.raise());
assert!(flag.lower());
assert!(!flag.lower());
let flag = AtomicFlag::raised();
assert!(flag.is_raised());
assert!(flag.lower());
}
}