use std::collections::HashSet;
#[derive(Debug, Default, Clone)]
pub struct AbortedWrites {
lsns: HashSet<u64>,
}
impl AbortedWrites {
pub fn new() -> Self {
Self::default()
}
pub fn insert(&mut self, lsn: u64) {
self.lsns.insert(lsn);
}
pub fn contains(&self, lsn: u64) -> bool {
self.lsns.contains(&lsn)
}
pub fn len(&self) -> usize {
self.lsns.len()
}
pub fn is_empty(&self) -> bool {
self.lsns.is_empty()
}
pub fn iter(&self) -> impl Iterator<Item = u64> + '_ {
self.lsns.iter().copied()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn contains_only_inserted_lsns() {
let mut set = AbortedWrites::new();
set.insert(42);
assert!(set.contains(42));
assert!(!set.contains(41));
assert!(!set.contains(43));
assert_eq!(set.len(), 1);
}
#[test]
fn duplicate_inserts_collapse() {
let mut set = AbortedWrites::new();
set.insert(7);
set.insert(7);
assert_eq!(set.len(), 1);
}
}