From fd57eccc72edc81e5f434ae5826a3b3d91113806 Mon Sep 17 00:00:00 2001 From: Seif Lotfy Date: Mon, 25 Jan 2021 16:41:49 +0100 Subject: [PATCH] change bitmap NextSetBit iterator signature to use uint instead of int --- bitmapcontainer.go | 19 +++++++++++-------- bitmapcontainer_test.go | 5 +++-- roaring_test.go | 2 +- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/bitmapcontainer.go b/bitmapcontainer.go index cbf49b07..b576c2ac 100644 --- a/bitmapcontainer.go +++ b/bitmapcontainer.go @@ -113,7 +113,7 @@ type bitmapContainerShortIterator struct { func (bcsi *bitmapContainerShortIterator) next() uint16 { j := bcsi.i - bcsi.i = bcsi.ptr.NextSetBit(bcsi.i + 1) + bcsi.i = bcsi.ptr.NextSetBit(uint(bcsi.i) + 1) return uint16(j) } func (bcsi *bitmapContainerShortIterator) hasNext() bool { @@ -126,7 +126,7 @@ func (bcsi *bitmapContainerShortIterator) peekNext() uint16 { func (bcsi *bitmapContainerShortIterator) advanceIfNeeded(minval uint16) { if bcsi.hasNext() && bcsi.peekNext() < minval { - bcsi.i = bcsi.ptr.NextSetBit(int(minval)) + bcsi.i = bcsi.ptr.NextSetBit(uint(minval)) } } @@ -1007,20 +1007,23 @@ func (bc *bitmapContainer) fillArray(container []uint16) { } } -func (bc *bitmapContainer) NextSetBit(i int) int { - x := i / 64 - if x >= len(bc.bitmap) { +func (bc *bitmapContainer) NextSetBit(i uint) int { + var ( + x = i / 64 + length = uint(len(bc.bitmap)) + ) + if x >= length { return -1 } w := bc.bitmap[x] w = w >> uint(i%64) if w != 0 { - return i + countTrailingZeros(w) + return int(i) + countTrailingZeros(w) } x++ - for ; x < len(bc.bitmap); x++ { + for ; x < length; x++ { if bc.bitmap[x] != 0 { - return (x * 64) + countTrailingZeros(bc.bitmap[x]) + return int(x*64) + countTrailingZeros(bc.bitmap[x]) } } return -1 diff --git a/bitmapcontainer_test.go b/bitmapcontainer_test.go index aa7d434b..7ee15fbb 100644 --- a/bitmapcontainer_test.go +++ b/bitmapcontainer_test.go @@ -1,9 +1,10 @@ package roaring import ( - "github.com/stretchr/testify/assert" "math/rand" "testing" + + "github.com/stretchr/testify/assert" ) // bitmapContainer's numberOfRuns() function should be correct against the runContainer equivalent @@ -169,7 +170,7 @@ func TestBitmapNextSet(t *testing.T) { m := 0 - for n := 0; m < testSize; n, m = bc.NextSetBit(n+1), m+1 { + for n := 0; m < testSize; n, m = bc.NextSetBit(uint(n)+1), m+1 { assert.Equal(t, m, n) } diff --git a/roaring_test.go b/roaring_test.go index 15eb06f0..5042e1c8 100644 --- a/roaring_test.go +++ b/roaring_test.go @@ -1744,7 +1744,7 @@ func validate(bc *bitmapContainer, ac *arrayContainer) bool { // Checking that the two containers contain the same values counter := 0 - for i := bc.NextSetBit(0); i >= 0; i = bc.NextSetBit(i + 1) { + for i := bc.NextSetBit(0); i >= 0; i = bc.NextSetBit(uint(i) + 1) { counter++ if !ac.contains(uint16(i)) { log.Println("content differs")