Skip to main content

ps_ecc/long/header/methods/
segment_distance.rs

1use crate::long::LongEccHeader;
2
3impl LongEccHeader {
4    /// Stride between consecutive segment starts: `segment_length` divided
5    /// by the overlap count, rounded down, so segments cover each byte
6    /// approximately `overlap_factor` times.
7    #[inline]
8    #[must_use]
9    pub const fn segment_distance(&self) -> u8 {
10        self.segment_length() / self.overlap_factor().count()
11    }
12}
13
14#[cfg(test)]
15mod tests {
16    use crate::long::{LongEccHeader, OverlapFactor};
17
18    type TestError = Box<dyn std::error::Error>;
19
20    #[test]
21    fn test_segment_distance_divides_by_overlap_count() -> Result<(), TestError> {
22        // With parity 2, the segment length is 251; the stride is 251 divided
23        // by the overlap count, rounded down.
24        let cases = [
25            (OverlapFactor::Simple, 251),
26            (OverlapFactor::Double, 125),
27            (OverlapFactor::Triple, 83),
28            (OverlapFactor::Quadruple, 62),
29        ];
30
31        for (factor, expected) in cases {
32            let header = LongEccHeader::new(2, factor, 86, 50, 0)?;
33
34            assert_eq!(header.segment_distance(), expected);
35        }
36
37        Ok(())
38    }
39
40    #[test]
41    fn test_segment_distance_equals_segment_length_without_overlap() -> Result<(), TestError> {
42        let header = LongEccHeader::new(4, OverlapFactor::Simple, 90, 50, 0)?;
43
44        assert_eq!(header.segment_distance(), header.segment_length());
45
46        Ok(())
47    }
48}