use std::sync::atomic::{AtomicBool, Ordering};
#[derive(Debug, Default)]
pub(crate) struct PendingInvalidation {
armed: AtomicBool,
}
impl PendingInvalidation {
pub(crate) fn arm(&self) {
self.armed.store(true, Ordering::Release);
}
pub(crate) fn take(&self) -> bool {
self.armed.swap(false, Ordering::AcqRel)
}
}
#[cfg(test)]
#[cfg_attr(coverage_nightly, coverage(off))]
mod tests {
use super::*;
#[test]
fn pending_invalidation_starts_unarmed() {
let pending = PendingInvalidation::default();
assert!(!pending.take(), "a fresh flag is not armed");
}
#[test]
fn pending_invalidation_arms_and_takes_once() {
let pending = PendingInvalidation::default();
pending.arm();
assert!(pending.take(), "an armed flag reports a pending bump");
assert!(
!pending.take(),
"taking clears the flag so a second flush is a no-op"
);
}
#[test]
fn pending_invalidation_arming_is_idempotent() {
let pending = PendingInvalidation::default();
pending.arm();
pending.arm();
assert!(
pending.take(),
"repeated arming still reports one pending bump"
);
assert!(!pending.take());
}
}