From 8828ae86dae4d07d18fd642e9d033fdbd56a5ed6 Mon Sep 17 00:00:00 2001 From: bstrausser Date: Mon, 3 Jun 2024 14:50:40 -0400 Subject: [PATCH] bug fix on arraycontainer --- arraycontainer.go | 15 +++++++++++++++ roaringarray.go | 1 + runcontainer_test.go | 1 - 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/arraycontainer.go b/arraycontainer.go index edd158dd..55c27326 100644 --- a/arraycontainer.go +++ b/arraycontainer.go @@ -1100,10 +1100,25 @@ func (ac *arrayContainer) nextAbsentValue(target uint16) int { // Ex: target=5 ac=[1,2,3,4,6,7] returns 6 // Ex: target=6 ac=[1,2,3,4,6,7] returns 6 func (ac *arrayContainer) nextValue(target uint16) int { + cardinality := len(ac.content) + if cardinality == 0 { + return -1 + } + + if target < ac.minimum() { + return -1 + } + if target > ac.maximum() { + return -1 + } + result := binarySearchUntil(ac.content, target) if result.exactMatch { return int(result.value) } + if result.outOfBounds() { + return -1 + } if result.index < len(ac.content)-1 { return int(ac.content[result.index+1]) diff --git a/roaringarray.go b/roaringarray.go index c6f056df..89fb1d72 100644 --- a/roaringarray.go +++ b/roaringarray.go @@ -75,6 +75,7 @@ type container interface { nextValue(x uint16) int previousValue(x uint16) int nextAbsentValue(x uint16) int + previousAbsentValue(x uint16) int } type contype uint8 diff --git a/runcontainer_test.go b/runcontainer_test.go index 05154ae2..09e6aa09 100644 --- a/runcontainer_test.go +++ b/runcontainer_test.go @@ -2337,7 +2337,6 @@ func TestNextPreviousValue(t *testing.T) { assert.Equal(t, 39, runContainer.previousValue(45)) assert.Equal(t, -1, runContainer.previousValue(80)) - assert.Equal(t, 45, runContainer.nextAbsentValue(45)) assert.Equal(t, -1, runContainer.nextAbsentValue(0)) assert.Equal(t, -1, runContainer.nextAbsentValue(1)) assert.Equal(t, 10, runContainer.nextAbsentValue(5))