summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);
+ }
}