use crate::id::{OpId, ReplicaId};
use std::collections::BTreeMap;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[derive(Clone, Default, Debug, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct VersionVector {
inner: BTreeMap<ReplicaId, u64>,
}
impl VersionVector {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn contains(&self, id: OpId) -> bool {
self.inner
.get(&id.replica)
.is_some_and(|&v| v >= id.counter)
}
#[must_use]
pub fn replica_count(&self) -> usize {
self.inner.len()
}
#[must_use]
pub fn get(&self, replica: ReplicaId) -> u64 {
self.inner.get(&replica).copied().unwrap_or(0)
}
pub fn observe(&mut self, id: OpId) {
let entry = self.inner.entry(id.replica).or_insert(0);
*entry = (*entry).max(id.counter);
}
pub fn iter_clocks(&self) -> impl Iterator<Item = (ReplicaId, u64)> + '_ {
self.inner.iter().map(|(&r, &c)| (r, c))
}
}