staticuint8_tintsetSearch(intset *is, int64_t value, uint32_t *pos) { int min = 0, max = intrev32ifbe(is->length)-1, mid = -1; int64_t cur = -1;
/* The value can never be found when the set is empty */ if (intrev32ifbe(is->length) == 0) { if (pos) *pos = 0; return0; } else { /* Check for the case where we know we cannot find the value, * but do know the insert position. */ if (value > _intsetGet(is,max)) { if (pos) *pos = intrev32ifbe(is->length); return0; } elseif (value < _intsetGet(is,0)) { if (pos) *pos = 0; return0; } }
while(max >= min) { mid = ((unsignedint)min + (unsignedint)max) >> 1; cur = _intsetGet(is,mid); if (value > cur) { min = mid+1; } elseif (value < cur) { max = mid-1; } else { break; } }
if (value == cur) { if (pos) *pos = mid; return1; } else { if (pos) *pos = min; return0; } }