summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2023-01-12 17:13:10 +0100
committerLaurenz <laurmaedje@gmail.com>2023-01-12 17:13:10 +0100
commit2589692b00d40fd5094ea2d5b9448e2cfc052045 (patch)
tree948d6e1186c94d33627a1b9442857edf98c0d58b /src
parent29b31c4a5ac4cde311c4d38b3d70130e7d27ba76 (diff)
Iterator over coverage
Diffstat (limited to 'src')
-rw-r--r--src/font/book.rs19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/font/book.rs b/src/font/book.rs
index 38dfee1d..dfc6140c 100644
--- a/src/font/book.rs
+++ b/src/font/book.rs
@@ -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);
+ }
}