/* Copy bits from bitset SRC to bitset DST. */ static inline void tbitset_copy_ (bitset dst, bitset src) { if (src == dst) return; tbitset_zero (dst); if (BITSET_NBITS_ (dst) != BITSET_NBITS_ (src)) tbitset_resize (dst, BITSET_NBITS_ (src)); tbitset_elts *selts = EBITSET_ELTS (src); tbitset_elts *delts = EBITSET_ELTS (dst); for (bitset_windex j = 0; j < EBITSET_SIZE (src); j++) { tbitset_elt *selt = selts[j]; if (selt) { tbitset_elt *tmp = tbitset_elt_alloc (); delts[j] = tmp; memcpy (EBITSET_WORDS (tmp), EBITSET_WORDS (selt), sizeof (EBITSET_WORDS (selt))); } } EBITSET_NONZERO_SET (dst); }
/* Weed out the zero elements from the elts. */ static inline bitset_windex ebitset_weed (bitset bset) { ebitset_elts *elts; bitset_windex j; bitset_windex count; if (EBITSET_ZERO_P (bset)) return 0; elts = EBITSET_ELTS (bset); count = 0; for (j = 0; j < EBITSET_SIZE (bset); j++) { ebitset_elt *elt = elts[j]; if (elt) { if (ebitset_elt_zero_p (elt)) { ebitset_elt_remove (bset, j); count++; } } else count++; } count = j - count; if (!count) { /* All the bits are zero. We could shrink the elts. For now just mark BSET as known to be zero. */ EBITSET_ZERO_SET (bset); } else EBITSET_NONZERO_SET (bset); return count; }