use super::{Gate, ReleaseDrivenGate};
use crate::metis::VersionVector;
#[derive(Debug, Clone, Copy, Default)]
pub struct Fifo;
impl Gate for Fifo {
type Dep = u64;
type Progress = VersionVector;
fn deliverable(delivered: &VersionVector, sender: u32, seq: &u64) -> bool {
*seq == delivered.get(sender).saturating_add(1)
}
fn advance(delivered: &mut VersionVector, sender: u32, seq: &u64) {
delivered.observe(sender, *seq);
}
fn stale(delivered: &VersionVector, sender: u32, seq: &u64) -> bool {
*seq <= delivered.get(sender)
}
}
impl ReleaseDrivenGate for Fifo {}