use super::{Gate, ReleaseDrivenGate};
use crate::metis::VersionVector;
#[derive(Debug, Clone, Copy, Default)]
pub struct Causal;
impl Gate for Causal {
type Dep = VersionVector;
type Progress = VersionVector;
fn deliverable(delivered: &VersionVector, sender: u32, deps: &VersionVector) -> bool {
if deps.get(sender) != delivered.get(sender).saturating_add(1) {
return false;
}
deps.iter()
.all(|(station, count)| station == sender || count <= delivered.get(station))
}
fn advance(delivered: &mut VersionVector, _sender: u32, deps: &VersionVector) {
*delivered = delivered.merge(deps);
}
fn stale(delivered: &VersionVector, sender: u32, deps: &VersionVector) -> bool {
deps.get(sender) <= delivered.get(sender)
}
}
impl ReleaseDrivenGate for Causal {}