Remove code repetition in the doc ID bitmap code.

Remove the repeated "sizeof (doc_ids->bitmap[0])" that bothered cworth
by instead defining macros to compute the word and bit offset of a
given bit in the doc ID set bitmap.
This commit is contained in:
Austin Clements 2011-01-30 20:58:27 -05:00
parent 15d8928f41
commit e04e72f9dd

View file

@ -41,6 +41,9 @@ struct _notmuch_doc_id_set {
unsigned int bound; unsigned int bound;
}; };
#define DOCIDSET_WORD(bit) ((bit) / sizeof (unsigned int))
#define DOCIDSET_BIT(bit) ((bit) % sizeof (unsigned int))
struct _notmuch_threads { struct _notmuch_threads {
notmuch_query_t *query; notmuch_query_t *query;
@ -270,9 +273,8 @@ _notmuch_doc_id_set_init (void *ctx,
doc_ids->bound = bound; doc_ids->bound = bound;
for (unsigned int i = 0; i < arr->len; i++) { for (unsigned int i = 0; i < arr->len; i++) {
unsigned int doc_id = g_array_index(arr, unsigned int, i); unsigned int doc_id = g_array_index (arr, unsigned int, i);
bitmap[doc_id / sizeof (bitmap[0])] |= bitmap[DOCIDSET_WORD(doc_id)] |= 1 << DOCIDSET_BIT(doc_id);
1 << (doc_id % sizeof (bitmap[0]));
} }
return TRUE; return TRUE;
@ -284,8 +286,7 @@ _notmuch_doc_id_set_contains (notmuch_doc_id_set_t *doc_ids,
{ {
if (doc_id >= doc_ids->bound) if (doc_id >= doc_ids->bound)
return FALSE; return FALSE;
return (doc_ids->bitmap[doc_id / sizeof (doc_ids->bitmap[0])] & return doc_ids->bitmap[DOCIDSET_WORD(doc_id)] & (1 << DOCIDSET_BIT(doc_id));
(1 << (doc_id % sizeof (doc_ids->bitmap[0])))) != 0;
} }
void void
@ -293,8 +294,7 @@ _notmuch_doc_id_set_remove (notmuch_doc_id_set_t *doc_ids,
unsigned int doc_id) unsigned int doc_id)
{ {
if (doc_id < doc_ids->bound) if (doc_id < doc_ids->bound)
doc_ids->bitmap[doc_id / sizeof (doc_ids->bitmap[0])] &= doc_ids->bitmap[DOCIDSET_WORD(doc_id)] &= ~(1 << DOCIDSET_BIT(doc_id));
~(1 << (doc_id % sizeof (doc_ids->bitmap[0])));
} }
/* Glib objects force use to use a talloc destructor as well, (but not /* Glib objects force use to use a talloc destructor as well, (but not