diff options
Diffstat (limited to 'lib/bitfield.h')
| -rw-r--r-- | lib/bitfield.h | 84 | 
1 files changed, 47 insertions, 37 deletions
diff --git a/lib/bitfield.h b/lib/bitfield.h index 7062796a99..e6020f0238 100644 --- a/lib/bitfield.h +++ b/lib/bitfield.h @@ -63,27 +63,27 @@ typedef unsigned int word_t;   * @N: number of bits to start with, which equates to how many   *     IDs can be allocated.   */ -#define bf_init(v, N)				    \ -  do {						    \ -    (v).n = 0;					    \ -    (v).m = ((N) / WORD_SIZE + 1);		    \ -    (v).data = calloc(1, ((v).m * sizeof(word_t))); \ -  } while (0) +#define bf_init(v, N)                                                          \ +	do {                                                                   \ +		(v).n = 0;                                                     \ +		(v).m = ((N) / WORD_SIZE + 1);                                 \ +		(v).data = calloc(1, ((v).m * sizeof(word_t)));                \ +	} while (0)  /**   * allocate and assign an id from bitfield v.   */ -#define bf_assign_index(v, id)				\ -  do {							\ -    bf_find_bit(v, id);					\ -    bf_set_bit(v, id);					\ -  } while (0) +#define bf_assign_index(v, id)                                                 \ +	do {                                                                   \ +		bf_find_bit(v, id);                                            \ +		bf_set_bit(v, id);                                             \ +	} while (0)  /**   * return an id to bitfield v   */ -#define bf_release_index(v, id)			\ -  (v).data[bf_index(id)] &= ~(1 << (bf_offset(id))) +#define bf_release_index(v, id)                                                \ +	(v).data[bf_index(id)] &= ~(1 << (bf_offset(id)))  #define bf_index(b) ((b) / WORD_SIZE)  #define bf_offset(b) ((b) % WORD_SIZE) @@ -92,31 +92,41 @@ typedef unsigned int word_t;   * Set a bit in the array. If it fills up that word and we are   * out of words, extend it by one more word.   */ -#define bf_set_bit(v, b)					\ -  do {								\ -    size_t w = bf_index(b);					\ -    (v).data[w] |= 1 << (bf_offset(b));				\ -    (v).n += ((v).data[w] == WORD_MAX);				\ -    if ((v).n == (v).m) {					\ -      (v).m = (v).m + 1;					\ -      (v).data = realloc((v).data, (v).m * sizeof(word_t));	\ -    }								\ -  } while (0) +#define bf_set_bit(v, b)                                                       \ +	do {                                                                   \ +		size_t w = bf_index(b);                                        \ +		(v).data[w] |= 1 << (bf_offset(b));                            \ +		(v).n += ((v).data[w] == WORD_MAX);                            \ +		if ((v).n == (v).m) {                                          \ +			(v).m = (v).m + 1;                                     \ +			(v).data = realloc((v).data, (v).m * sizeof(word_t));  \ +		}                                                              \ +	} while (0)  /* Find a clear bit in v and assign it to b. */ -#define bf_find_bit(v, b)					\ -  do {								\ -    word_t word = 0;						\ -    unsigned int w, sh;						\ -    for (w = 0; w <= (v).n; w++) {				\ -      if ((word = (v).data[w]) != WORD_MAX) break;		\ -    }								\ -    (b) = ((word & 0xFFFF) == 0xFFFF) << 4; word >>= (b);	\ -    sh = ((word & 0xFF) == 0xFF) << 3; word >>= sh; (b) |= sh;	\ -    sh = ((word & 0xF) == 0xF) << 2; word >>= sh; (b) |= sh;	\ -    sh = ((word & 0x3) == 0x3) << 1; word >>= sh; (b) |= sh;	\ -    sh = ((word & 0x1) == 0x1) << 0; word >>= sh; (b) |= sh;	\ -    (b) += (w * WORD_SIZE);					\ -  } while (0) +#define bf_find_bit(v, b)                                                      \ +	do {                                                                   \ +		word_t word = 0;                                               \ +		unsigned int w, sh;                                            \ +		for (w = 0; w <= (v).n; w++) {                                 \ +			if ((word = (v).data[w]) != WORD_MAX)                  \ +				break;                                         \ +		}                                                              \ +		(b) = ((word & 0xFFFF) == 0xFFFF) << 4;                        \ +		word >>= (b);                                                  \ +		sh = ((word & 0xFF) == 0xFF) << 3;                             \ +		word >>= sh;                                                   \ +		(b) |= sh;                                                     \ +		sh = ((word & 0xF) == 0xF) << 2;                               \ +		word >>= sh;                                                   \ +		(b) |= sh;                                                     \ +		sh = ((word & 0x3) == 0x3) << 1;                               \ +		word >>= sh;                                                   \ +		(b) |= sh;                                                     \ +		sh = ((word & 0x1) == 0x1) << 0;                               \ +		word >>= sh;                                                   \ +		(b) |= sh;                                                     \ +		(b) += (w * WORD_SIZE);                                        \ +	} while (0)  #endif  | 
