** * 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)
| 344 | * min, or size if it is not possible. |
| 345 | */ |
| 346 | func (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 | |
| 396 | func (ra *roaringArray64) markAllAsNeedingCopyOnWrite() { |
| 397 | for i := range ra.needCopyOnWrite { |
no outgoing calls