Introduce bitf index configuration, noop, BREAKS_BISECT

For cases where we do not need FFS, we do not need the index.

This does not change anything yet.

This patch only works together with the next (so git bisect is expected
to break here). The split is to separate manual changes from automated
patching.
parent 54b42bc0
......@@ -57,12 +57,14 @@ struct bitf {
#define divceil(n, d) (((n) + ((d) - 1)) / (d))
#define wsz sizeof(bitf_word_t)
#define wbits (wsz * 8)
#define index_thr (wbits * 8)
#define bitf_words(bits) (divceil(bits, wbits))
#define bitf_sz1(bits) (sizeof(struct bitf) + bitf_words(bits) * wsz)
#define BITF_INDEX (wbits * 8)
#define BITF_NOIDX SIZE_MAX
static inline size_t
bitf_sz(size_t bits)
bitf_sz(size_t bits, size_t index_thr)
{
size_t sz;
......@@ -124,7 +126,7 @@ sz_nbits_est(size_t sz) {
* this isually hits the right result after 5 iterations
*/
static inline size_t
sz_nbits(const size_t sz)
sz_nbits(const size_t sz, const size_t index_thr)
{
size_t trysz;
size_t d, hi, lo; // in units of bitf_words() / bitf_word_t
......@@ -133,7 +135,7 @@ sz_nbits(const size_t sz)
assert(sz < (size_t)1 << 62); // otherwise overflow
lo = sz_nbits_est(sz) / wbits;
trysz = bitf_sz(lo * wbits);
trysz = bitf_sz(lo * wbits, index_thr);
if (trysz > sz) {
d = bitf_words((trysz - sz) * 8);
......@@ -150,24 +152,24 @@ sz_nbits(const size_t sz)
}
// opportunistic: right at first shot
if (bitf_sz(lo * wbits) <= sz &&
bitf_sz(lo * wbits + 1) > sz)
if (bitf_sz(lo * wbits, index_thr) <= sz &&
bitf_sz(lo * wbits + 1, index_thr) > sz)
goto out;
while (bitf_sz(lo * wbits) <= sz &&
bitf_sz(hi * wbits) > sz &&
while (bitf_sz(lo * wbits, index_thr) <= sz &&
bitf_sz(hi * wbits, index_thr) > sz &&
hi - lo > 1) {
d = (hi + lo) / 2;
if (bitf_sz(d * wbits) <= sz)
if (bitf_sz(d * wbits, index_thr) <= sz)
lo = d;
else if (bitf_sz(d * wbits) > sz)
else if (bitf_sz(d * wbits, index_thr) > sz)
hi = d;
else
assert(0); //lint !e506 const val
}
out:
assert(bitf_sz(lo * wbits) <= sz);
assert(bitf_sz(lo * wbits + 1) > sz);
assert(bitf_sz(lo * wbits, index_thr) <= sz);
assert(bitf_sz(lo * wbits + 1, index_thr) > sz);
return (lo * wbits);
}
......@@ -182,7 +184,7 @@ sz_nbits(const size_t sz)
#define bitf_bit(bit) ((bitf_word_t)1 << (bit % wbits))
static inline struct bitf *
bitf_init(void *p, size_t bits, size_t space)
bitf_init(void *p, size_t bits, size_t space, size_t index_thr)
{
struct bitf *bitf;
size_t sz = bitf_sz1(bits);
......@@ -201,7 +203,7 @@ bitf_init(void *p, size_t bits, size_t space)
pp += sz;
space -= sz;
bitf->idxoff = sz;
p = bitf_init(pp, bits, space);
p = bitf_init(pp, bits, space, index_thr);
assert(p);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment