//{{{void wah_uniq_append(uint8_t **w, uint32_t id) void wah_uniq_append(uint8_t **w, uint32_t id) { uint8_t *w_id = wah_init(id); if (*w == NULL) { *w = w_id; } else { uint8_t *r = NULL; uint32_t r_size = 0; uint32_t resize = wah_or(*w, w_id, &r, &r_size); free(*w); free(w_id); *w = r; } }
//{{{void wah_non_leading_union_with_SA(void **R, void *d) void wah_non_leading_union_with_SA(uint32_t domain, void **R, void *d) { struct wah_bpt_non_leading_data *nld = (struct wah_bpt_non_leading_data *) d; if (nld != NULL) { if ((nld->SA != NULL)) { uint8_t **w = (uint8_t **)R; if (*w == NULL) *w = wah_init(0); uint8_t *r = NULL; uint32_t r_size = 0; uint32_t resize = wah_or(*w, nld->SA, &r, &r_size); free(*w); *w = r; } } }
//{{{void wah_leading_union_with_B(void **R, void *leading) void wah_leading_union_with_B(uint32_t domain, void **R, void *leading) { struct wah_bpt_leading_data *ld = (struct wah_bpt_leading_data *)leading; if ((ld != NULL) && (ld->B != NULL)) { uint8_t **w = (uint8_t **)R; if (*w == NULL) *w = wah_init(0); uint8_t *r = NULL; uint32_t r_size = 0; uint32_t resize = wah_or(*w, ld->B, &r, &r_size); free(*w); *w = r; } }
int main(int argc, char **argv) { WAH_SIZE = 32; WAH_MAX_FILL_WORDS = (1<<(WAH_SIZE-1)) - 1; uint32_t size = atoi(argv[1]); uint32_t *W_1 = (uint32_t *)calloc(size, sizeof(uint32_t)); uint32_t *W_2 = (uint32_t *)calloc(size, sizeof(uint32_t)); uint32_t i; if (argv[2][0] == 'w') { uint8_t *w_2 = NULL; uint8_t *w_1 = NULL; start(); for (i = 0; i < size; ++i) { W_1[i] = rand(); wah_uniq_append(&w_1, W_1[i]); } stop(); fprintf(stderr, "%lu\t", report()); start(); for (i = 0; i < size; ++i) { W_2[i] = rand(); wah_uniq_append(&w_2, W_2[i]); } stop(); fprintf(stderr, "%lu\t", report()); uint8_t *r = NULL; uint32_t r_size = 0; start(); uint32_t resize = wah_or(w_1, w_2, &r, &r_size); stop(); fprintf(stderr, "%lu\n", report()); } else if (argv[2][0] == 'l') { struct uint32_t_ll *l_1 = NULL; struct uint32_t_ll *l_2 = NULL; start(); for (i = 0; i < size; ++i) { W_1[i] = rand(); uint32_t_ll_append(&l_1, W_1[i]); } stop(); fprintf(stderr, "%lu\t", report()); start(); for (i = 0; i < size; ++i) { W_2[i] = rand(); uint32_t_ll_append(&l_2, W_2[i]); } stop(); fprintf(stderr, "%lu\t", report()); start(); struct uint32_t_ll_node *curr = l_1->head; while (curr != NULL) { uint32_t_ll_uniq_append(&l_2, curr->val); curr = curr->next; } stop(); fprintf(stderr, "%lu\n", report()); } }