--- /dev/null
+@node Bitsets
+@section Bitsets
+
+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_VARRAY
+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 (bs1, 1);
+bitset_set (bs1, 3);
+bitset_set (bs1, 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, b1, b2);
+ASSERT (bitset_count (bs) == 6);
+@end smallexample
--- /dev/null
+/* Test of bitset.
+ Copyright (C) 2018 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "bitset.h"
+
+#include "macros.h"
+
+void check_attributes (enum bitset_attr attr)
+{
+ enum { nbits = 32 };
+
+ bitset bs0 = bitset_create (nbits, attr);
+ ASSERT (bitset_size (bs0) == 32);
+ ASSERT (bitset_count (bs0) == 0);
+ ASSERT (bitset_empty_p (bs0));
+
+ bitset bs1 = bitset_create (nbits, attr);
+ bitset_set (bs1, 1);
+ bitset_set (bs1, 3);
+ bitset_set (bs1, 5);
+ ASSERT (bitset_count (bs1) == 3);
+ ASSERT (!bitset_empty_p (bs1));
+
+ bitset bs2 = bitset_create (nbits, attr);
+ bitset_set (bs2, 0);
+ bitset_set (bs2, 2);
+ bitset_set (bs2, 4);
+
+ /* disjoint_p */
+ ASSERT (bitset_disjoint_p (bs1, bs2));
+
+ /* and */
+ bitset bs = bitset_create (nbits, attr);
+ bitset_and (bs, bs1, bs2);
+ ASSERT (bitset_count (bs) == 0);
+
+ /* or */
+ bitset_or (bs, bs1, bs2);
+ ASSERT (bitset_count (bs) == 6);
+}
+
+int main (void)
+{
+ check_attributes (BITSET_FIXED);
+ check_attributes (BITSET_VARIABLE);
+ check_attributes (BITSET_DENSE);
+ check_attributes (BITSET_SPARSE);
+ check_attributes (BITSET_FRUGAL);
+ check_attributes (BITSET_GREEDY);
+ return 0;
+}