kmp_application/memory/
write_clock_coverage.rs1use std::collections::BTreeSet;
2
3use super::{MemoryCoordinateData, MemoryData};
4
5#[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}