util: Minor enhancements/corrections to the bitmask logic.

This commit is contained in:
José Fonseca 2010-01-03 00:41:01 +00:00
parent da6a80301b
commit 904917dcc6
1 changed files with 20 additions and 12 deletions

View File

@ -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) {