From bfce3a0746a328a6c9d28176fddd382a148ee007 Mon Sep 17 00:00:00 2001 From: Alan Bernstein Date: Thu, 15 Jun 2017 14:50:27 -0500 Subject: [PATCH] Update test, cleanup --- roaring/roaring.go | 7 +++---- roaring/roaring_internal_test.go | 6 ++++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/roaring/roaring.go b/roaring/roaring.go index 233c83cb4..711d45994 100644 --- a/roaring/roaring.go +++ b/roaring/roaring.go @@ -1518,7 +1518,7 @@ func (c *container) runToBitmap() { } for _, r := range c.runs { - // TODO is there a faster way ?!?!! + // TODO this can be ~64x faster for long runs by setting maxBitmap instead of single bits for v := r.start; v <= r.last; v++ { c.bitmap[int(v)/64] |= (uint64(1) << uint(v%64)) } @@ -1564,10 +1564,9 @@ func (c *container) bitmapToRun() { current = c.bitmap[i] } - last = 0 if current == maxBitmap { - last = 64*i + 64 // TODO verify - c.runs = append(c.runs, interval32{start, last - 1}) + // bitmap[1023] == maxBitmap + c.runs = append(c.runs, interval32{start, 65535}) break } currentLast := uint32(trailingZeroN(^current)) diff --git a/roaring/roaring_internal_test.go b/roaring/roaring_internal_test.go index ecc87c786..68485bb49 100644 --- a/roaring/roaring_internal_test.go +++ b/roaring/roaring_internal_test.go @@ -895,7 +895,13 @@ func TestBitmapToRun(t *testing.T) { bitmap: []uint64{0xF000000000000000, 0xFFFFFFFFFFFFFFFF, 0xF}, exp: []interval32{{start: 60, last: 131}}, }, + { + bitmap: make([]uint64, bitmapN), + exp: []interval32{{start: 65408, last: 65535}}, + }, } + tests[8].bitmap[1022] = 0xFFFFFFFFFFFFFFFF + tests[8].bitmap[1023] = 0xFFFFFFFFFFFFFFFF for i, test := range tests { a.bitmap = make([]uint64, bitmapN)