MCPcopy Create free account
hub / github.com/RoaringBitmap/roaring / advanceUntil

Method advanceUntil

roaring64/roaringarray64.go:346–394  ·  view source on GitHub ↗

** * Find the smallest integer index strictly larger than pos such that array[index].key>=min. If none can * be found, return size. Based on code by O. Kaser. * * @param min minimal value * @param pos index to exceed * @return the smallest index greater than pos such that array[index].key i

(min uint32, pos int)

Source from the content-addressed store, hash-verified

344 * min, or size if it is not possible.
345 */
346func (ra *roaringArray64) advanceUntil(min uint32, pos int) int {
347 lower := pos + 1
348
349 if lower >= len(ra.keys) || ra.keys[lower] >= min {
350 return lower
351 }
352
353 spansize := 1
354
355 for lower+spansize < len(ra.keys) && ra.keys[lower+spansize] < min {
356 spansize *= 2
357 }
358 var upper int
359 if lower+spansize < len(ra.keys) {
360 upper = lower + spansize
361 } else {
362 upper = len(ra.keys) - 1
363 }
364
365 if ra.keys[upper] == min {
366 return upper
367 }
368
369 if ra.keys[upper] < min {
370 // means
371 // array
372 // has no
373 // item
374 // >= min
375 // pos = array.length;
376 return len(ra.keys)
377 }
378
379 // we know that the next-smallest span was too small
380 lower += (spansize >> 1)
381
382 mid := 0
383 for lower+1 != upper {
384 mid = (lower + upper) >> 1
385 if ra.keys[mid] == min {
386 return mid
387 } else if ra.keys[mid] < min {
388 lower = mid
389 } else {
390 upper = mid
391 }
392 }
393 return upper
394}
395
396func (ra *roaringArray64) markAllAsNeedingCopyOnWrite() {
397 for i := range ra.needCopyOnWrite {

Callers 8

AndMethod · 0.45
AndCardinalityMethod · 0.45
IntersectsMethod · 0.45
XorMethod · 0.45
AndNotMethod · 0.45
AndFunction · 0.45
AndNotFunction · 0.45

Calls

no outgoing calls

Tested by 1