Another project
1use std::sync::atomic::{AtomicBool, Ordering};
2
3static NEVER: AtomicBool = AtomicBool::new(false);
4
5pub trait Cancel {
6 fn is_canceled(&self) -> bool;
7}
8
9impl Cancel for AtomicBool {
10 fn is_canceled(&self) -> bool {
11 self.load(Ordering::Relaxed)
12 }
13}
14
15#[derive(Copy, Clone)]
16pub struct CancelFlag<'a>(&'a (dyn Cancel + Sync));
17
18impl<'a> CancelFlag<'a> {
19 #[must_use]
20 pub fn new(source: &'a (dyn Cancel + Sync)) -> Self {
21 Self(source)
22 }
23
24 #[must_use]
25 pub fn is_canceled(self) -> bool {
26 self.0.is_canceled()
27 }
28}
29
30impl CancelFlag<'static> {
31 #[must_use]
32 pub fn never() -> Self {
33 Self(&NEVER)
34 }
35}