util: Minor enhancements/corrections to the bitmask logic.
This commit is contained in:
parent
da6a80301b
commit
904917dcc6
|
@ -97,12 +97,12 @@ util_bitmask_resize(struct util_bitmask *bm,
|
||||||
if(!minimum_size)
|
if(!minimum_size)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if(bm->size > minimum_size)
|
if(bm->size >= minimum_size)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
assert(bm->size % UTIL_BITMASK_BITS_PER_WORD == 0);
|
assert(bm->size % UTIL_BITMASK_BITS_PER_WORD == 0);
|
||||||
new_size = bm->size;
|
new_size = bm->size;
|
||||||
while(!(new_size > minimum_size)) {
|
while(new_size < minimum_size) {
|
||||||
new_size *= 2;
|
new_size *= 2;
|
||||||
/* Check integer overflow */
|
/* Check integer overflow */
|
||||||
if(new_size < bm->size)
|
if(new_size < bm->size)
|
||||||
|
@ -136,7 +136,7 @@ util_bitmask_filled_set(struct util_bitmask *bm,
|
||||||
unsigned index)
|
unsigned index)
|
||||||
{
|
{
|
||||||
assert(bm->filled <= bm->size);
|
assert(bm->filled <= bm->size);
|
||||||
assert(index <= bm->size);
|
assert(index < bm->size);
|
||||||
|
|
||||||
if(index == bm->filled) {
|
if(index == bm->filled) {
|
||||||
++bm->filled;
|
++bm->filled;
|
||||||
|
@ -149,7 +149,7 @@ util_bitmask_filled_unset(struct util_bitmask *bm,
|
||||||
unsigned index)
|
unsigned index)
|
||||||
{
|
{
|
||||||
assert(bm->filled <= bm->size);
|
assert(bm->filled <= bm->size);
|
||||||
assert(index <= bm->size);
|
assert(index < bm->size);
|
||||||
|
|
||||||
if(index < bm->filled)
|
if(index < bm->filled)
|
||||||
bm->filled = index;
|
bm->filled = index;
|
||||||
|
@ -198,9 +198,9 @@ unsigned
|
||||||
util_bitmask_set(struct util_bitmask *bm,
|
util_bitmask_set(struct util_bitmask *bm,
|
||||||
unsigned index)
|
unsigned index)
|
||||||
{
|
{
|
||||||
unsigned word = index / UTIL_BITMASK_BITS_PER_WORD;
|
unsigned word;
|
||||||
unsigned bit = index % UTIL_BITMASK_BITS_PER_WORD;
|
unsigned bit;
|
||||||
util_bitmask_word mask = 1 << bit;
|
util_bitmask_word mask;
|
||||||
|
|
||||||
assert(bm);
|
assert(bm);
|
||||||
|
|
||||||
|
@ -208,6 +208,10 @@ util_bitmask_set(struct util_bitmask *bm,
|
||||||
if(!util_bitmask_resize(bm, index))
|
if(!util_bitmask_resize(bm, index))
|
||||||
return UTIL_BITMASK_INVALID_INDEX;
|
return UTIL_BITMASK_INVALID_INDEX;
|
||||||
|
|
||||||
|
word = index / UTIL_BITMASK_BITS_PER_WORD;
|
||||||
|
bit = index % UTIL_BITMASK_BITS_PER_WORD;
|
||||||
|
mask = 1 << bit;
|
||||||
|
|
||||||
bm->words[word] |= mask;
|
bm->words[word] |= mask;
|
||||||
|
|
||||||
util_bitmask_filled_set(bm, index);
|
util_bitmask_filled_set(bm, index);
|
||||||
|
@ -220,15 +224,19 @@ void
|
||||||
util_bitmask_clear(struct util_bitmask *bm,
|
util_bitmask_clear(struct util_bitmask *bm,
|
||||||
unsigned index)
|
unsigned index)
|
||||||
{
|
{
|
||||||
unsigned word = index / UTIL_BITMASK_BITS_PER_WORD;
|
unsigned word;
|
||||||
unsigned bit = index % UTIL_BITMASK_BITS_PER_WORD;
|
unsigned bit;
|
||||||
util_bitmask_word mask = 1 << bit;
|
util_bitmask_word mask;
|
||||||
|
|
||||||
assert(bm);
|
assert(bm);
|
||||||
|
|
||||||
if(index >= bm->size)
|
if(index >= bm->size)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
word = index / UTIL_BITMASK_BITS_PER_WORD;
|
||||||
|
bit = index % UTIL_BITMASK_BITS_PER_WORD;
|
||||||
|
mask = 1 << bit;
|
||||||
|
|
||||||
bm->words[word] &= ~mask;
|
bm->words[word] &= ~mask;
|
||||||
|
|
||||||
util_bitmask_filled_unset(bm, index);
|
util_bitmask_filled_unset(bm, index);
|
||||||
|
@ -250,7 +258,7 @@ util_bitmask_get(struct util_bitmask *bm,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(index > bm->size)
|
if(index >= bm->size)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if(bm->words[word] & mask) {
|
if(bm->words[word] & mask) {
|
||||||
|
|
Loading…
Reference in New Issue