Skip to content

Commit 6e32e86

Browse files
authored
Merge pull request RoaringBitmap#339 from Dr-Emann/push-vovoqlvsypkl
fix: bitmap advance_back_to could violate invariants
2 parents 36afadf + 136b8f1 commit 6e32e86

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

roaring/src/bitmap/store/bitmap_store.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,11 @@ impl<B: Borrow<[u64; BITMAP_LENGTH]>> BitmapIter<B> {
551551
} else if cmp == Ordering::Equal {
552552
(self.value, &mut self.value)
553553
} else {
554-
(0, &mut self.value)
554+
// New key is less than original key and key_back, this iterator is now empty
555+
self.key_back = self.key;
556+
self.value = 0;
557+
self.value_back = 0;
558+
return;
555559
}
556560
}
557561
};

roaring/tests/iter_advance_to.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,3 +298,16 @@ fn advance_bitset_front_and_back_past_each_other() {
298298
iter.advance_to(300);
299299
assert_eq!(iter.next(), None);
300300
}
301+
302+
#[test]
303+
fn combine_with_nth() {
304+
let mut bitmap = RoaringBitmap::new();
305+
bitmap.insert_range(0..=0xFFFF);
306+
bitmap.remove_run_compression();
307+
let mut iter = bitmap.iter();
308+
309+
// Use nth to skip to a specific position
310+
assert_eq!(iter.nth(100), Some(100));
311+
iter.advance_back_to(50);
312+
assert_eq!(iter.next_back(), None);
313+
}

0 commit comments

Comments
 (0)