From 1c0c0c35f3dff0abc8ac24ec90dedf554697cec5 Mon Sep 17 00:00:00 2001 From: Jonas Maier Date: Sat, 6 Jun 2026 12:57:25 +0200 Subject: fix byterange bug, stuff is somehow slow suddenly --- src/regex/byte_range.rs | 48 +++++++++++++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 17 deletions(-) (limited to 'src/regex/byte_range.rs') diff --git a/src/regex/byte_range.rs b/src/regex/byte_range.rs index b7642c1..5123da5 100644 --- a/src/regex/byte_range.rs +++ b/src/regex/byte_range.rs @@ -36,45 +36,43 @@ impl ByteRange { if ranges.is_empty() { return vec![]; } - - let mut points: Vec = Vec::new(); + + let mut points: Vec = Vec::new(); for r in &ranges { - points.push(r.from); - if r.to != u8::MAX { - points.push(r.to + 1); - } + points.push(r.from as u16); + points.push((r.to as u16) + 1); } - + points.sort_unstable(); points.dedup(); - + let mut out = Vec::new(); - + for window in points.windows(2) { let start = window[0]; let end_exclusive = window[1]; - + if start >= end_exclusive { continue; } - + let mut active = false; - + for r in &ranges { - if r.from <= start && start <= r.to { + if r.from as u16 <= start && start <= r.to as u16 { active = true; break; } } - + if active { out.push(ByteRange { - from: start, - to: end_exclusive - 1, + from: start as u8, + to: (end_exclusive - 1) as u8, }); } } - + out } } @@ -94,6 +92,22 @@ fn byterange_test() { ); } +#[test] +fn byterange_test_0_128() { + assert_eq!( + ByteRange::split_to_disjoint(vec![ByteRange::new_range(0, 128)]), + vec![ByteRange::new_range(0, 128)] + ); +} + +#[test] +fn byterange_test_0_255() { + assert_eq!( + ByteRange::split_to_disjoint(vec![ByteRange::new_range(0, 255)]), + vec![ByteRange::new_range(0, 255)] + ); +} + impl std::fmt::Debug for ByteRange { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { if self.from == self.to { -- cgit v1.2.3