Skip to main content

kmp_application/memory/
write_clock_coverage.rs

1use std::collections::BTreeSet;
2
3use super::{MemoryCoordinateData, MemoryData};
4
5/// Counts entries once even when several memberships carry the same clock.
6#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
7pub struct WriteClockCoverage {
8    pub entries: usize,
9    pub distinct_values: usize,
10    pub single_value: Option<String>,
11}
12
13impl WriteClockCoverage {
14    pub(super) fn for_memory(
15        memory: &MemoryData,
16        clock: impl Fn(&MemoryCoordinateData) -> Option<&str>,
17    ) -> Self {
18        let mut entries = 0;
19        let mut values = BTreeSet::new();
20        for entry in &memory.entries {
21            let mut present = false;
22            for coordinate in &entry.coordinates {
23                if let Some(value) = clock(coordinate) {
24                    present = true;
25                    values.insert(value.to_owned());
26                }
27            }
28            entries += usize::from(present);
29        }
30        Self {
31            entries,
32            distinct_values: values.len(),
33            single_value: (values.len() == 1).then(|| values.pop_first().expect("one value")),
34        }
35    }
36}