From 38e3ce10fe626a257c4b9fcfa2ffe421923a5c71 Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Fri, 31 Aug 2018 10:32:33 -0500 Subject: [PATCH] removing bounds check --- roaring/roaring.go | 103 +++++++++++++++++++++++-------- roaring/roaring_internal_test.go | 4 +- 2 files changed, 78 insertions(+), 29 deletions(-) diff --git a/roaring/roaring.go b/roaring/roaring.go index e7333325c..c39c8b2e0 100644 --- a/roaring/roaring.go +++ b/roaring/roaring.go @@ -2136,15 +2136,26 @@ func intersectArrayBitmap(a, b *Container) *Container { } func intersectBitmapBitmap(a, b *Container) *Container { - output := &Container{bitmap: make([]uint64, bitmapN), containerType: containerBitmap} + var ( - for i := range a.bitmap { - v := a.bitmap[i] & b.bitmap[i] - output.bitmap[i] = v - output.n += int(popcount(v)) + ab = a.bitmap[:bitmapN] + bb = b.bitmap[:bitmapN] + buf = make([]uint64, bitmapN) + ob =buf[:bitmapN] + n int +) + for i := 0; i < bitmapN; i++ { + v := ab[i] & bb[i] + ob[i] = v + n += int(popcount(v)) + } + + output := &Container{ + bitmap: ob, + n: n, + containerType: containerBitmap, } - output.optimize() return output } @@ -2434,17 +2445,26 @@ func unionArrayBitmap(a, b *Container) *Container { } func unionBitmapBitmap(a, b *Container) *Container { - output := &Container{ - bitmap: make([]uint64, bitmapN), - containerType: containerBitmap, - } + var ( + ab = a.bitmap[:bitmapN] + bb = b.bitmap[:bitmapN] + buf = make([]uint64, bitmapN) + ob =buf[:bitmapN] + + n int + ) for i := 0; i < bitmapN; i++ { - v := a.bitmap[i] | b.bitmap[i] - output.bitmap[i] = v - output.n += int(popcount(v)) + v := ab[i] | bb[i] + ob[i] = v + n += int(popcount(v)) } + output := &Container{ + bitmap: ob, + n: n, + containerType: containerBitmap, + } return output } @@ -2780,13 +2800,25 @@ func differenceBitmapArray(a, b *Container) *Container { } func differenceBitmapBitmap(a, b *Container) *Container { - output := &Container{bitmap: make([]uint64, bitmapN), containerType: containerBitmap} + var ( + ab = a.bitmap[:bitmapN] + bb = b.bitmap[:bitmapN] + buf = make([]uint64, bitmapN) + ob =buf[:bitmapN] - for i := range a.bitmap { - v := a.bitmap[i] & (^b.bitmap[i]) - output.bitmap[i] = v - output.n += int(popcount(v)) + n int + ) + for i := 0; i < bitmapN; i++ { + v := ab[i] & (^bb[i]) + ob[i] = v + n += int(popcount(v)) + } + + output := &Container{ + bitmap: ob, + n: n, + containerType: containerBitmap, } if output.n < ArrayMaxSize { output.bitmapToArray() @@ -2871,16 +2903,26 @@ func xorArrayBitmap(a, b *Container) *Container { } func xorBitmapBitmap(a, b *Container) *Container { - output := &Container{ - bitmap: make([]uint64, bitmapN), - containerType: containerBitmap, - } + var ( + ab = a.bitmap[:bitmapN] + bb = b.bitmap[:bitmapN] + buf = make([]uint64, bitmapN) + ob =buf[:bitmapN] + + n int + ) + for i := 0; i < bitmapN; i++ { - v := a.bitmap[i] ^ b.bitmap[i] - output.bitmap[i] = v - output.n += int(popcount(v)) + v := ab[i] ^ bb[i] + ob[i] = v + n += int(popcount(v)) } + output := &Container{ + bitmap: ob, + n: n, + containerType: containerBitmap, + } if output.count() < ArrayMaxSize { output.bitmapToArray() } @@ -3333,9 +3375,16 @@ func popcount(x uint64) uint64 { } func popcountAndSlice(s, m []uint64) uint64 { + var ( + a=s[:bitmapN] + b=m[:bitmapN] + ) + _ = a[bitmapN-1] + _ = b[bitmapN-1] + cnt := uint64(0) - for i := range s { - cnt += popcount(s[i] & m[i]) + for i:=0;i