Пример #1
0
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);
}
Пример #2
0
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");
}