static void bitset_iterator_prepare_page(struct bitset_iterator *it) { qsort(it->conjs, it->size, sizeof(*it->conjs), bitset_iterator_conj_cmp); bitset_page_set_zeros(it->page); if (it->size > 0) { it->page->first_pos = it->conjs[0].page_first_pos; } else { it->page->first_pos = SIZE_MAX; } /* There is no more conjunctions that can be ORed */ if (it->page->first_pos == SIZE_MAX) return; /* For each conj where conj->page_first_pos == pos */ for (size_t c = 0; c < it->size; c++) { if (it->conjs[c].page_first_pos > it->page->first_pos) break; /* Get result from conj */ bitset_iterator_conj_prepare_page(&it->conjs[c], it->page_tmp); /* OR page from conjunction with it->page */ bitset_page_or(it->page, it->page_tmp); } /* Init the bit iterator on it->page */ bit_iterator_init(&it->page_it, bitset_page_data(it->page), BITSET_PAGE_DATA_SIZE, true); }
void bitset_page_dump(struct bitset_page *page, FILE *stream) { fprintf(stream, "Page %zu:\n", page->first_pos); char *d = bitset_page_data(page); for (int i = 0; i < BITSET_PAGE_DATA_SIZE; i++) { fprintf(stream, "%x ", *d); d++; } fprintf(stream, "\n--\n"); }