size_t rlwit_discharge( struct rlw_iterator *it, struct ewah_bitmap *out, size_t max, bool negate) { size_t index = 0; while (index < max && rlwit_word_size(it) > 0) { size_t pd, pl = it->rlw.running_len; if (index + pl > max) { pl = max - index; } ewah_add_empty_words(out, it->rlw.running_bit ^ negate, pl); index += pl; pd = it->rlw.literal_words; if (pd + index > max) { pd = max - index; } ewah_add_dirty_words(out, it->buffer + it->literal_word_start, pd, negate); rlwit_discard_first_words(it, pd + pl); index += pd; } return index; }
void rlwit_discharge_empty(struct rlw_iterator *it, struct ewah_bitmap *out) { while (rlwit_word_size(it) > 0) { ewah_add_empty_words(out, false, rlwit_word_size(it)); rlwit_discard_first_words(it, rlwit_word_size(it)); } }
void ewah_or( struct ewah_bitmap *ewah_i, struct ewah_bitmap *ewah_j, struct ewah_bitmap *out) { struct rlw_iterator rlw_i; struct rlw_iterator rlw_j; size_t literals; rlwit_init(&rlw_i, ewah_i); rlwit_init(&rlw_j, ewah_j); while (rlwit_word_size(&rlw_i) > 0 && rlwit_word_size(&rlw_j) > 0) { while (rlw_i.rlw.running_len > 0 || rlw_j.rlw.running_len > 0) { struct rlw_iterator *prey, *predator; if (rlw_i.rlw.running_len < rlw_j.rlw.running_len) { prey = &rlw_i; predator = &rlw_j; } else { prey = &rlw_j; predator = &rlw_i; } if (predator->rlw.running_bit) { ewah_add_empty_words(out, 0, predator->rlw.running_len); rlwit_discard_first_words(prey, predator->rlw.running_len); rlwit_discard_first_words(predator, predator->rlw.running_len); } else { size_t index = rlwit_discharge(prey, out, predator->rlw.running_len, 0); ewah_add_empty_words(out, 0, predator->rlw.running_len - index); rlwit_discard_first_words(predator, predator->rlw.running_len); } } literals = min_size( rlw_i.rlw.literal_words, rlw_j.rlw.literal_words); if (literals) { size_t k; for (k = 0; k < literals; ++k) { ewah_add(out, rlw_i.buffer[rlw_i.literal_word_start + k] | rlw_j.buffer[rlw_j.literal_word_start + k] ); } rlwit_discard_first_words(&rlw_i, literals); rlwit_discard_first_words(&rlw_j, literals); } } if (rlwit_word_size(&rlw_i) > 0) rlwit_discharge(&rlw_i, out, ~0, 0); else rlwit_discharge(&rlw_j, out, ~0, 0); out->bit_size = max_size(ewah_i->bit_size, ewah_j->bit_size); }