use std::collections::VecDeque;
use parking_lot_dummy::Mutex;
use crate::divergence::Divergence;
#[derive(Clone, Debug)]
pub struct DivergenceEntry {
pub key: Vec<u8>,
pub divergence: Divergence,
}
#[derive(Debug)]
pub struct DivergenceLog {
capacity: usize,
entries: Mutex<VecDeque<DivergenceEntry>>,
}
impl DivergenceLog {
pub fn new(capacity: usize) -> Self {
Self {
capacity,
entries: Mutex::new(VecDeque::with_capacity(capacity)),
}
}
pub fn push(&self, entry: DivergenceEntry) {
if self.capacity == 0 {
return;
}
let mut g = self.entries.lock();
if g.len() == self.capacity {
g.pop_front();
}
g.push_back(entry);
}
pub fn snapshot(&self) -> Vec<DivergenceEntry> {
let g = self.entries.lock();
g.iter().cloned().collect()
}
pub fn len(&self) -> usize {
self.entries.lock().len()
}
pub fn is_empty(&self) -> bool {
self.entries.lock().is_empty()
}
}
impl Default for DivergenceLog {
fn default() -> Self {
Self::new(128)
}
}
mod parking_lot_dummy {
use std::sync::Mutex as StdMutex;
#[derive(Debug)]
pub struct Mutex<T>(StdMutex<T>);
impl<T> Mutex<T> {
pub fn new(t: T) -> Self {
Self(StdMutex::new(t))
}
pub fn lock(&self) -> std::sync::MutexGuard<'_, T> {
self.0
.lock()
.unwrap_or_else(std::sync::PoisonError::into_inner)
}
}
}