( array []uint16, pos int, length int, min uint16, )
| 403 | } |
| 404 | |
| 405 | func advanceUntil( |
| 406 | array []uint16, |
| 407 | pos int, |
| 408 | length int, |
| 409 | min uint16, |
| 410 | ) int { |
| 411 | lower := pos + 1 |
| 412 | |
| 413 | if lower >= length || array[lower] >= min { |
| 414 | return lower |
| 415 | } |
| 416 | |
| 417 | spansize := 1 |
| 418 | |
| 419 | for lower+spansize < length && array[lower+spansize] < min { |
| 420 | spansize *= 2 |
| 421 | } |
| 422 | var upper int |
| 423 | if lower+spansize < length { |
| 424 | upper = lower + spansize |
| 425 | } else { |
| 426 | upper = length - 1 |
| 427 | } |
| 428 | |
| 429 | if array[upper] == min { |
| 430 | return upper |
| 431 | } |
| 432 | |
| 433 | if array[upper] < min { |
| 434 | // means |
| 435 | // array |
| 436 | // has no |
| 437 | // item |
| 438 | // >= min |
| 439 | // pos = array.length; |
| 440 | return length |
| 441 | } |
| 442 | |
| 443 | // we know that the next-smallest span was too small |
| 444 | lower += (spansize >> 1) |
| 445 | |
| 446 | mid := 0 |
| 447 | for lower+1 != upper { |
| 448 | mid = (lower + upper) >> 1 |
| 449 | if array[mid] == min { |
| 450 | return mid |
| 451 | } else if array[mid] < min { |
| 452 | lower = mid |
| 453 | } else { |
| 454 | upper = mid |
| 455 | } |
| 456 | } |
| 457 | return upper |
| 458 | } |
| 459 | |
| 460 | func onesidedgallopingintersect2by2( |
| 461 | smallset []uint16, |
no outgoing calls
no test coverage detected
searching dependent graphs…