Lines Matching refs:bm

66    struct util_bitmask *bm;
68 bm = MALLOC_STRUCT(util_bitmask);
69 if (!bm)
72 bm->words = (util_bitmask_word *)
74 if (!bm->words) {
75 FREE(bm);
79 bm->size = UTIL_BITMASK_INITIAL_WORDS * UTIL_BITMASK_BITS_PER_WORD;
80 bm->filled = 0;
82 return bm;
90 util_bitmask_resize(struct util_bitmask *bm,
101 if (bm->size >= minimum_size)
104 assert(bm->size % UTIL_BITMASK_BITS_PER_WORD == 0);
105 new_size = bm->size;
109 if (new_size < bm->size)
116 REALLOC((void *)bm->words,
117 bm->size / UTIL_BITMASK_BITS_PER_BYTE,
122 memset(new_words + bm->size/UTIL_BITMASK_BITS_PER_WORD,
124 (new_size - bm->size)/UTIL_BITMASK_BITS_PER_BYTE);
126 bm->size = new_size;
127 bm->words = new_words;
137 util_bitmask_filled_set(struct util_bitmask *bm,
140 assert(bm->filled <= bm->size);
141 assert(index < bm->size);
143 if (index == bm->filled) {
144 ++bm->filled;
145 assert(bm->filled <= bm->size);
154 util_bitmask_filled_unset(struct util_bitmask *bm,
157 assert(bm->filled <= bm->size);
158 assert(index < bm->size);
160 if (index < bm->filled)
161 bm->filled = index;
166 util_bitmask_add(struct util_bitmask *bm)
172 assert(bm);
175 word = bm->filled / UTIL_BITMASK_BITS_PER_WORD;
176 bit = bm->filled % UTIL_BITMASK_BITS_PER_WORD;
178 while (word < bm->size / UTIL_BITMASK_BITS_PER_WORD) {
180 if (!(bm->words[word] & mask))
182 ++bm->filled;
193 if (!util_bitmask_resize(bm, bm->filled))
196 assert(!(bm->words[word] & mask));
197 bm->words[word] |= mask;
199 return bm->filled++;
204 util_bitmask_set(struct util_bitmask *bm,
211 assert(bm);
214 if (!util_bitmask_resize(bm, index))
221 bm->words[word] |= mask;
223 util_bitmask_filled_set(bm, index);
230 util_bitmask_clear(struct util_bitmask *bm,
237 assert(bm);
239 if (index >= bm->size)
246 bm->words[word] &= ~mask;
248 util_bitmask_filled_unset(bm, index);
253 util_bitmask_get(struct util_bitmask *bm,
260 assert(bm);
262 if (index < bm->filled) {
263 assert(bm->words[word] & mask);
267 if (index >= bm->size)
270 if (bm->words[word] & mask) {
271 util_bitmask_filled_set(bm, index);
280 util_bitmask_get_next_index(struct util_bitmask *bm,
287 if (index < bm->filled) {
288 assert(bm->words[word] & mask);
292 if (index >= bm->size) {
297 while (word < bm->size / UTIL_BITMASK_BITS_PER_WORD) {
299 if (bm->words[word] & mask) {
300 if (index == bm->filled) {
301 ++bm->filled;
302 assert(bm->filled <= bm->size);
320 util_bitmask_get_first_index(struct util_bitmask *bm)
322 return util_bitmask_get_next_index(bm, 0);
327 util_bitmask_destroy(struct util_bitmask *bm)
329 if (bm) {
330 FREE(bm->words);
331 FREE(bm);