Bitsets
=======

The module bitset provides a common interface to several implementations of bitsets.  It also provides routines for vectors of bitsets.

To look at an existing use, see GNU Bison.

Currently it supports five flavours of bitsets:

BITSET_ARRAY
Array of bits (fixed size, fast for dense bitsets). Memory for bit array
and bitset structure allocated contiguously.
BITSET_LIST
Linked list of arrays of bits (variable size, least storage for large
very sparse sets).
BITSET_TABLE
Expandable table of pointers to arrays of bits (variable size, less
storage for large sparse sets).  Faster than BITSET_LIST for
random access.
BITSET_VECTOR
Variable array of bits (variable size, fast for dense bitsets).
BITSET_STATS
Wrapper bitset for internal use only.  Used for gathering statistics
and/or better run-time checking.

However, the choice of the actual implementation is performed by the library, based on the user provided attributes:

BITSET_FIXED
Bitset size fixed.
BITSET_VARIABLE
Bitset size variable.
BITSET_DENSE
Bitset dense.
BITSET_SPARSE
Bitset sparse.
BITSET_FRUGAL
Prefer most compact.
BITSET_GREEDY
Prefer fastest at memory expense.

     enum { nbits = 32 };

     bitset bs0 = bitset_create (nbits, BITSET_FIXED);
     bitset_set (bs0, 1);
     bitset_set (bs0, 3);
     bitset_set (bs0, 5);

     bitset bs1 = bitset_create (nbits, BITSET_FIXED);
     bitset_set (bs1, 0);
     bitset_set (bs1, 2);
     bitset_set (bs1, 4);

     bitset bs = bitset_create (nbits, BITSET_FIXED);
     bitset_or (bs, bs0, bs1);
     ASSERT (bitset_count (bs) == 6);

     bitset_free (bs);
     bitset_free (bs1);
     bitset_free (bs0);