Skip to content

Commit 61a2788

Browse files
committed
fix: run iterators need to respect the back_offset when only one interval remains
1 parent 3116bcc commit 61a2788

File tree

2 files changed

+22
-6
lines changed

2 files changed

+22
-6
lines changed

roaring/src/bitmap/store/interval_store.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -659,9 +659,13 @@ impl<I: SliceIterator<Interval>> RunIter<I> {
659659
self.intervals.next();
660660
return;
661661
}
662-
if Some(self.forward_offset as u64)
663-
>= self.intervals.as_slice().first().map(|f| f.run_len())
664-
{
662+
let total_offset = u64::from(self.forward_offset)
663+
+ if self.intervals.as_slice().len() == 1 {
664+
u64::from(self.backward_offset)
665+
} else {
666+
0
667+
};
668+
if Some(total_offset) >= self.intervals.as_slice().first().map(|f| f.run_len()) {
665669
self.intervals.next();
666670
self.forward_offset = 0;
667671
}
@@ -674,9 +678,9 @@ impl<I: SliceIterator<Interval>> RunIter<I> {
674678
self.intervals.next_back();
675679
return;
676680
}
677-
if Some(self.backward_offset as u64)
678-
>= self.intervals.as_slice().last().map(|f| f.run_len())
679-
{
681+
let total_offset = u64::from(self.backward_offset)
682+
+ if self.intervals.as_slice().len() == 1 { u64::from(self.forward_offset) } else { 0 };
683+
if Some(total_offset) >= self.intervals.as_slice().last().map(|f| f.run_len()) {
680684
self.intervals.next_back();
681685
self.backward_offset = 0;
682686
}

roaring/tests/iter_advance_to.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,3 +224,15 @@ fn advance_run_back_before_start() {
224224
iter.advance_back_to(499);
225225
assert_eq!(iter.next_back(), None);
226226
}
227+
228+
#[test]
229+
fn advance_run_back_reduces_forward_iter() {
230+
let mut bitmap = RoaringBitmap::new();
231+
bitmap.insert_range(0..=0x4000);
232+
let mut iter = bitmap.iter();
233+
iter.advance_back_to(1);
234+
235+
assert_eq!(iter.next(), Some(0));
236+
assert_eq!(iter.next(), Some(1));
237+
assert_eq!(iter.next(), None);
238+
}

0 commit comments

Comments
 (0)