Iterator over coverage
This commit is contained in:
parent
29b31c4a5a
commit
2589692b00
@ -418,6 +418,18 @@ impl Coverage {
|
||||
|
||||
false
|
||||
}
|
||||
|
||||
/// Iterate over all covered codepoints.
|
||||
pub fn iter(&self) -> impl Iterator<Item = u32> + '_ {
|
||||
let mut inside = false;
|
||||
let mut cursor = 0;
|
||||
self.0.iter().flat_map(move |run| {
|
||||
let range = if inside { cursor..cursor + run } else { 0..0 };
|
||||
inside = !inside;
|
||||
cursor += run;
|
||||
range
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
@ -466,4 +478,11 @@ mod tests {
|
||||
&[2, 3, 4, 3, 3, 1, 2, 2],
|
||||
)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_coverage_iter() {
|
||||
let codepoints = vec![2, 3, 7, 8, 9, 14, 15, 19, 21];
|
||||
let coverage = Coverage::from_vec(codepoints.clone());
|
||||
assert_eq!(coverage.iter().collect::<Vec<_>>(), codepoints);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user