From 22393014cddde40053e8741dcbe5ad8655ba8baf Mon Sep 17 00:00:00 2001 From: Alan Bernstein Date: Wed, 31 May 2017 13:52:17 -0500 Subject: [PATCH] Implement run/array conversion functions --- roaring/roaring.go | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/roaring/roaring.go b/roaring/roaring.go index a10b5463c..ed1bdd317 100644 --- a/roaring/roaring.go +++ b/roaring/roaring.go @@ -1327,12 +1327,33 @@ func (c *container) bitmapToRun() { // TODO } +// arrayToRun converts from array format to RLE format func (c *container) arrayToRun() { - // TODO + c.runs = make([]interval32, 0) + start := c.array[0] + for i, v := range c.array { + if v - c.array[i-1] > 1 { + // if current-previous > 1, one run ends and another begins + c.runs = append(c.runs, interval32{start, c.array[i-1]}) + start = v + } + } + // append final run + c.runs = append(c.runs, interval32{start, c.array[i]}) + c.array = nil + c.mapped = false } +// runToArray converts from RLE format to array format func (c *container) runToArray() { - // TODO + c.array = make([]uint32, 0, c.n) + for _, r := range c.runs { + for v := r.start; v <= r.last; v++ { + c.array = append(c.array, v) + } + } + c.runs = nil + c.mapped = false } // clone returns a copy of c.