Skip to content

Commit 527e094

Browse files
committed
fix: another case where offsets could be non-zero with no intervals
1 parent 497f5d9 commit 527e094

File tree

2 files changed

+21
-6
lines changed

2 files changed

+21
-6
lines changed

roaring/src/bitmap/store/interval_store.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -660,15 +660,15 @@ impl<I: SliceIterator<Interval>> RunIter<I> {
660660
self.forward_offset = 0;
661661
return;
662662
}
663+
let only_interval = self.intervals.as_slice().len() == 1;
663664
let total_offset = u64::from(self.forward_offset)
664-
+ if self.intervals.as_slice().len() == 1 {
665-
u64::from(self.backward_offset)
666-
} else {
667-
0
668-
};
665+
+ if only_interval { u64::from(self.backward_offset) } else { 0 };
669666
if Some(total_offset) >= self.intervals.as_slice().first().map(|f| f.run_len()) {
670667
self.intervals.next();
671668
self.forward_offset = 0;
669+
if only_interval {
670+
self.backward_offset = 0;
671+
}
672672
}
673673
}
674674

@@ -680,11 +680,15 @@ impl<I: SliceIterator<Interval>> RunIter<I> {
680680
self.backward_offset = 0;
681681
return;
682682
}
683+
let only_interval = self.intervals.as_slice().len() == 1;
683684
let total_offset = u64::from(self.backward_offset)
684-
+ if self.intervals.as_slice().len() == 1 { u64::from(self.forward_offset) } else { 0 };
685+
+ if only_interval { u64::from(self.forward_offset) } else { 0 };
685686
if Some(total_offset) >= self.intervals.as_slice().last().map(|f| f.run_len()) {
686687
self.intervals.next_back();
687688
self.backward_offset = 0;
689+
if only_interval {
690+
self.forward_offset = 0;
691+
}
688692
}
689693
}
690694

roaring/tests/iter_advance_to.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,17 @@ fn advance_run_with_nth() {
267267
assert_eq!(iter.nth(100563), None);
268268
}
269269

270+
#[test]
271+
fn advance_to_with_next_len() {
272+
let mut bitmap = RoaringBitmap::new();
273+
bitmap.insert_range(100..0x4000);
274+
let mut iter = bitmap.iter();
275+
iter.advance_back_to(100);
276+
assert_eq!(iter.next(), Some(100));
277+
assert_eq!(iter.len(), 0);
278+
assert_eq!(iter.nth_back(0), None);
279+
}
280+
270281
#[test]
271282
fn advance_bitset_front_and_back_past_each_other() {
272283
let mut bitmap = RoaringBitmap::new();

0 commit comments

Comments
 (0)