** * Find the smallest integer index 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 is at leas
(min uint16, pos int)
| 722 | * min, or size if it is not possible. |
| 723 | */ |
| 724 | func (ra *roaringArray) advanceUntil(min uint16, pos int) int { |
| 725 | lower := pos + 1 |
| 726 | |
| 727 | if lower >= len(ra.keys) || ra.keys[lower] >= min { |
| 728 | return lower |
| 729 | } |
| 730 | |
| 731 | spansize := 1 |
| 732 | |
| 733 | for lower+spansize < len(ra.keys) && ra.keys[lower+spansize] < min { |
| 734 | spansize *= 2 |
| 735 | } |
| 736 | var upper int |
| 737 | if lower+spansize < len(ra.keys) { |
| 738 | upper = lower + spansize |
| 739 | } else { |
| 740 | upper = len(ra.keys) - 1 |
| 741 | } |
| 742 | |
| 743 | if ra.keys[upper] == min { |
| 744 | return upper |
| 745 | } |
| 746 | |
| 747 | if ra.keys[upper] < min { |
| 748 | // means |
| 749 | // array |
| 750 | // has no |
| 751 | // item |
| 752 | // >= min |
| 753 | // pos = array.length; |
| 754 | return len(ra.keys) |
| 755 | } |
| 756 | |
| 757 | // we know that the next-smallest span was too small |
| 758 | lower += (spansize >> 1) |
| 759 | |
| 760 | mid := 0 |
| 761 | for lower+1 != upper { |
| 762 | mid = (lower + upper) >> 1 |
| 763 | if ra.keys[mid] == min { |
| 764 | return mid |
| 765 | } else if ra.keys[mid] < min { |
| 766 | lower = mid |
| 767 | } else { |
| 768 | upper = mid |
| 769 | } |
| 770 | } |
| 771 | return upper |
| 772 | } |
| 773 | |
| 774 | func (ra *roaringArray) markAllAsNeedingCopyOnWrite() { |
| 775 | for i := range ra.needCopyOnWrite { |
no outgoing calls