1use crate::{Slot, WriteId, WritePast};
4
5#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
8pub enum ClaimOrder {
9 Published {
11 slot: Slot,
13 number: u64,
15 },
16 Local {
18 number: u64,
20 },
21}
22
23pub fn had_read(reader: WriteId, read_through: u64, earlier: WriteId, slot: Option<Slot>) -> bool {
26 (reader.device == earlier.device && earlier.number < reader.number)
27 || slot.is_some_and(|slot| slot.get() <= read_through)
28}
29
30pub struct SlotPast<F> {
34 reader: WriteId,
35 read_through: u64,
36 slot: F,
37 latest: Option<WriteId>,
38}
39
40impl<F: Fn(&WriteId) -> Option<Slot>> SlotPast<F> {
41 pub fn new(reader: WriteId, read_through: u64, slot: F, latest: Option<WriteId>) -> Self {
43 Self { reader, read_through, slot, latest }
44 }
45}
46
47impl<F: Fn(&WriteId) -> Option<Slot>> WritePast for SlotPast<F> {
48 fn contains(&self, write: &WriteId) -> bool {
49 had_read(self.reader, self.read_through, *write, (self.slot)(write))
50 }
51
52 fn frontier(&self) -> impl Iterator<Item = &WriteId> {
53 self.latest.iter()
54 }
55}
56
57#[cfg(test)]
58#[path = "sequence_tests.rs"]
59mod tests;