use std::sync::{
Arc,
atomic::{AtomicBool, Ordering},
};
#[macro_export]
macro_rules! check_if_cancelled {
($state:expr) => {
if $state.is_cancelled() {
return None;
}
};
}
pub struct State {
is_canceled: Arc<AtomicBool>,
}
impl State {
pub(crate) fn new() -> State {
State {
is_canceled: Arc::new(AtomicBool::new(false)),
}
}
pub(crate) fn set_running(&self) {
self.is_canceled.store(false, Ordering::Release);
}
pub(crate) fn cancel(&self) {
self.is_canceled.store(true, Ordering::Release);
}
pub fn is_cancelled(&self) -> bool {
self.is_canceled.load(Ordering::Acquire)
}
}
impl Clone for State {
fn clone(&self) -> State {
State {
is_canceled: self.is_canceled.clone(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_state() {
let state = State::new();
assert!(!state.is_cancelled());
state.set_running();
assert!(!state.is_cancelled());
state.cancel();
assert!(state.is_cancelled());
state.cancel();
assert!(state.is_cancelled());
state.set_running();
assert!(!state.is_cancelled());
state.set_running();
assert!(!state.is_cancelled());
}
}