summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkim Demaille <akim.demaille@gmail.com>2018-11-25 09:49:09 +0100
committerAkim Demaille <akim.demaille@gmail.com>2018-11-25 19:43:57 +0100
commit7c0d555aa341d7d5b8ab2fa8a94ee580636cc1c2 (patch)
tree97915e3c958e3e5795e13b984cd8e0ba52c66322
parentde7956e9d91c826855b664867fb6e1ce35988020 (diff)
downloadgnulib-7c0d555aa341d7d5b8ab2fa8a94ee580636cc1c2.tar.gz
bitset: add tests and doc
First stabs at providing a documentation and test for the bitset module. * doc/bitset.texi, modules/test-bitset, tests/bitset-tests.c: New.
-rw-r--r--ChangeLog7
-rw-r--r--doc/bitset.texi63
-rw-r--r--modules/bitset-tests11
-rw-r--r--tests/test-bitset.c66
4 files changed, 147 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 9fae7910fa..24bcccb44e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
2018-11-25 Akim Demaille <akim@lrde.epita.fr>
+ bitset: add tests and doc
+ First stabs at providing a documentation and test for the bitset
+ module.
+ * doc/bitset.texi, modules/test-bitset, tests/bitset-tests.c: New.
+
+2018-11-25 Akim Demaille <akim@lrde.epita.fr>
+
bitset: new module
* lib/bitset.c, lib/bitset.h, lib/bitset/array.c,
* lib/bitset/array.h, lib/bitset/base.h, lib/bitset/expandable.c,
diff --git a/doc/bitset.texi b/doc/bitset.texi
new file mode 100644
index 0000000000..614961b954
--- /dev/null
+++ b/doc/bitset.texi
@@ -0,0 +1,63 @@
+@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
diff --git a/modules/bitset-tests b/modules/bitset-tests
new file mode 100644
index 0000000000..4a7b8b32bb
--- /dev/null
+++ b/modules/bitset-tests
@@ -0,0 +1,11 @@
+Files:
+tests/test-bitset.c
+tests/macros.h
+
+Depends-on:
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-bitset
+check_PROGRAMS += test-bitset
diff --git a/tests/test-bitset.c b/tests/test-bitset.c
new file mode 100644
index 0000000000..b673d188c3
--- /dev/null
+++ b/tests/test-bitset.c
@@ -0,0 +1,66 @@
+/* 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;
+}