| @node Bitsets | |
| @section Bitsets | |
| @mindex bitset | |
| The module @samp{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: | |
| @description @code | |
| @item BITSET_ARRAY | |
| Array of bits (fixed size, fast for dense bitsets). Memory for bit array | |
| and bitset structure allocated contiguously. | |
| @item BITSET_LIST | |
| Linked list of arrays of bits (variable size, least storage for large | |
| very sparse sets). | |
| @item BITSET_TABLE | |
| Expandable table of pointers to arrays of bits (variable size, less | |
| storage for large sparse sets). Faster than @code{BITSET_LIST} for | |
| random access. | |
| @item BITSET_VECTOR | |
| Variable array of bits (variable size, fast for dense bitsets). | |
| @item BITSET_STATS | |
| Wrapper bitset for internal use only. Used for gathering statistics | |
| and/or better run-time checking. | |
| @end description | |
| However, the choice of the actual implementation is performed by the | |
| library, based on the user provided attributes: | |
| @description @code | |
| @code BITSET_FIXED | |
| Bitset size fixed. | |
| @code BITSET_VARIABLE | |
| Bitset size variable. | |
| @code BITSET_DENSE | |
| Bitset dense. | |
| @code BITSET_SPARSE | |
| Bitset sparse. | |
| @code BITSET_FRUGAL | |
| Prefer most compact. | |
| @code BITSET_GREEDY | |
| Prefer fastest at memory expense. | |
| @end description | |
| @smallexample | |
| 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); | |
| @end smallexample | |