Skip to content

Commit 8becb4e

Browse files
committed
fix: another case where we need to use both offsets when only one interval remains
1 parent d25797e commit 8becb4e

File tree

2 files changed

+18
-3
lines changed

2 files changed

+18
-3
lines changed

roaring/src/bitmap/store/interval_store.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -829,9 +829,14 @@ impl<I: SliceIterator<Interval>> Iterator for RunIter<I> {
829829
if let Some(skip) = n.checked_sub(1) {
830830
let mut to_skip = skip as u64;
831831
loop {
832-
let to_remove = (self.intervals.as_slice().first()?.run_len()
833-
- self.forward_offset as u64)
834-
.min(to_skip);
832+
let full_first_interval_len = self.intervals.as_slice().first()?.run_len();
833+
let consumed_len = u64::from(self.forward_offset)
834+
+ if self.intervals.as_slice().len() == 1 {
835+
u64::from(self.backward_offset)
836+
} else {
837+
0
838+
};
839+
let to_remove = (full_first_interval_len - consumed_len).min(to_skip);
835840
to_skip -= to_remove;
836841
self.forward_offset += to_remove as u16;
837842
self.move_next();

roaring/tests/iter_advance_to.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,16 @@ fn advance_to_with_next_len() {
278278
assert_eq!(iter.nth_back(0), None);
279279
}
280280

281+
#[test]
282+
fn tmp() {
283+
let mut bitmap = RoaringBitmap::new();
284+
bitmap.insert_range(196363..=262143);
285+
let mut iter = bitmap.iter();
286+
assert_eq!(iter.next_back(), Some(262143));
287+
iter.advance_to(228960);
288+
assert_eq!(iter.nth(36643), None);
289+
}
290+
281291
#[test]
282292
fn advance_bitset_front_and_back_past_each_other() {
283293
let mut bitmap = RoaringBitmap::new();

0 commit comments

Comments
 (0)