Lines Matching refs:bm

66    struct util_bitmask *bm;
68 bm = MALLOC_STRUCT(util_bitmask);
69 if(!bm)
72 bm->words = (util_bitmask_word *)CALLOC(UTIL_BITMASK_INITIAL_WORDS, sizeof(util_bitmask_word));
73 if(!bm->words) {
74 FREE(bm);
78 bm->size = UTIL_BITMASK_INITIAL_WORDS * UTIL_BITMASK_BITS_PER_WORD;
79 bm->filled = 0;
81 return bm;
89 util_bitmask_resize(struct util_bitmask *bm,
100 if(bm->size >= minimum_size)
103 assert(bm->size % UTIL_BITMASK_BITS_PER_WORD == 0);
104 new_size = bm->size;
108 if(new_size < bm->size)
114 new_words = (util_bitmask_word *)REALLOC((void *)bm->words,
115 bm->size / UTIL_BITMASK_BITS_PER_BYTE,
120 memset(new_words + bm->size/UTIL_BITMASK_BITS_PER_WORD,
122 (new_size - bm->size)/UTIL_BITMASK_BITS_PER_BYTE);
124 bm->size = new_size;
125 bm->words = new_words;
135 util_bitmask_filled_set(struct util_bitmask *bm,
138 assert(bm->filled <= bm->size);
139 assert(index < bm->size);
141 if(index == bm->filled) {
142 ++bm->filled;
143 assert(bm->filled <= bm->size);
148 util_bitmask_filled_unset(struct util_bitmask *bm,
151 assert(bm->filled <= bm->size);
152 assert(index < bm->size);
154 if(index < bm->filled)
155 bm->filled = index;
160 util_bitmask_add(struct util_bitmask *bm)
166 assert(bm);
169 word = bm->filled / UTIL_BITMASK_BITS_PER_WORD;
170 bit = bm->filled % UTIL_BITMASK_BITS_PER_WORD;
172 while(word < bm->size / UTIL_BITMASK_BITS_PER_WORD) {
174 if(!(bm->words[word] & mask))
176 ++bm->filled;
187 if(!util_bitmask_resize(bm, bm->filled))
190 assert(!(bm->words[word] & mask));
191 bm->words[word] |= mask;
193 return bm->filled++;
198 util_bitmask_set(struct util_bitmask *bm,
205 assert(bm);
208 if(!util_bitmask_resize(bm, index))
215 bm->words[word] |= mask;
217 util_bitmask_filled_set(bm, index);
224 util_bitmask_clear(struct util_bitmask *bm,
231 assert(bm);
233 if(index >= bm->size)
240 bm->words[word] &= ~mask;
242 util_bitmask_filled_unset(bm, index);
247 util_bitmask_get(struct util_bitmask *bm,
254 assert(bm);
256 if(index < bm->filled) {
257 assert(bm->words[word] & mask);
261 if(index >= bm->size)
264 if(bm->words[word] & mask) {
265 util_bitmask_filled_set(bm, index);
274 util_bitmask_get_next_index(struct util_bitmask *bm,
281 if(index < bm->filled) {
282 assert(bm->words[word] & mask);
286 if(index >= bm->size) {
291 while(word < bm->size / UTIL_BITMASK_BITS_PER_WORD) {
293 if(bm->words[word] & mask) {
294 if(index == bm->filled) {
295 ++bm->filled;
296 assert(bm->filled <= bm->size);
314 util_bitmask_get_first_index(struct util_bitmask *bm)
316 return util_bitmask_get_next_index(bm, 0);
321 util_bitmask_destroy(struct util_bitmask *bm)
323 assert(bm);
325 FREE(bm->words);
326 FREE(bm);