Skip to content

Commit c41bab3

Browse files
committed
fix: when consuming a full run, reset the current offset
1 parent eaccd09 commit c41bab3

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

roaring/src/bitmap/store/interval_store.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -657,6 +657,7 @@ impl<I: SliceIterator<Interval>> RunIter<I> {
657657
self.forward_offset = value;
658658
} else {
659659
self.intervals.next();
660+
self.forward_offset = 0;
660661
return;
661662
}
662663
let total_offset = u64::from(self.forward_offset)
@@ -676,6 +677,7 @@ impl<I: SliceIterator<Interval>> RunIter<I> {
676677
self.backward_offset = value;
677678
} else {
678679
self.intervals.next_back();
680+
self.backward_offset = 0;
679681
return;
680682
}
681683
let total_offset = u64::from(self.backward_offset)

roaring/tests/iter.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,31 @@ fn interleaved_bitmap() {
210210
assert!(outside_in(values).eq(outside_in(bitmap)));
211211
}
212212

213+
#[test]
214+
fn run_nth_max() {
215+
let mut bitmap = RoaringBitmap::new();
216+
bitmap.insert_range(0..0x1_0000);
217+
let mut iter = bitmap.iter();
218+
assert_eq!(iter.nth(0x0_FFFF), Some(0x0_FFFF));
219+
assert_eq!(iter.len(), 0);
220+
#[allow(clippy::iter_nth_zero)]
221+
{
222+
assert_eq!(iter.nth(0), None);
223+
}
224+
assert_eq!(iter.next(), None);
225+
}
226+
227+
#[test]
228+
fn run_nth_back_max() {
229+
let mut bitmap = RoaringBitmap::new();
230+
bitmap.insert_range(0..0x1_0000);
231+
let mut iter = bitmap.iter();
232+
assert_eq!(iter.nth_back(0x0_FFFF), Some(0));
233+
assert_eq!(iter.len(), 0);
234+
assert_eq!(iter.nth_back(0), None);
235+
assert_eq!(iter.next_back(), None);
236+
}
237+
213238
proptest! {
214239
#[test]
215240
fn interleaved_iter(values in btree_set(any::<u32>(), 50_000..=100_000)) {

0 commit comments

Comments
 (0)