Skip to content

Commit 7575db3

Browse files
committed
Much faster OverlapIterator
1 parent 2f87032 commit 7575db3

File tree

2 files changed

+9
-11
lines changed

2 files changed

+9
-11
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
88
## Unreleased
99

1010
- Add `start()` and `end()` method to the `Region` trait.
11+
- Much faster `OverlapIterator`.
1112

1213
## [0.3.1] - 2023-12-04
1314

src/iter.rs

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,15 @@ where
3030
type Item = (&'a [u8], R, u32);
3131

3232
fn next(&mut self) -> Option<Self::Item> {
33+
let mem_start = self.base_address;
34+
let mem_end = self.base_address + self.memory.len() as u32;
3335
while let Some(region) = self.regions.next() {
34-
// TODO: This might be possible to do in a smarter way?
35-
let mut block_range = (0..self.memory.len())
36-
.skip_while(|index| !region.contains(self.base_address + *index as u32))
37-
.take_while(|index| region.contains(self.base_address + *index as u32));
38-
if let Some(start) = block_range.next() {
39-
let end = block_range.last().unwrap_or(start) + 1;
40-
return Some((
41-
&self.memory[start..end],
42-
region,
43-
self.base_address + start as u32,
44-
));
36+
if mem_start < region.end() && mem_end >= region.start() {
37+
let addr_start = core::cmp::max(mem_start, region.start());
38+
let addr_end = core::cmp::min(mem_end, region.end());
39+
let start = (addr_start - self.base_address) as usize;
40+
let end = (addr_end - self.base_address) as usize;
41+
return Some((&self.memory[start..end], region, addr_start));
4542
}
4643
}
4744
None

0 commit comments

Comments
 (0)