Second part: doc and tests. commit 52342213a42a77b639174e3fc7f2c586f6fc2422 Author: Akim Demaille <akim.demai...@gmail.com> Date: Sun Nov 25 09:49:09 2018 +0100
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. diff --git a/ChangeLog b/ChangeLog index 420e9941e..44db76e07 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2018-11-25 Akim Demaille <a...@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 <a...@lrde.epita.fr> bitset: new module diff --git a/doc/bitset.texi b/doc/bitset.texi new file mode 100644 index 000000000..614961b95 --- /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 000000000..4a7b8b32b --- /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 000000000..1e1e92af6 --- /dev/null +++ b/tests/test-bitset.c @@ -0,0 +1,63 @@ +/* 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, BITSET_FIXED); + ASSERT (bitset_size (bs0) == 32); + ASSERT (bitset_count (bs0) == 0); + ASSERT (bitset_empty_p (bs0)); + + bitset bs1 = bitset_create (nbits, BITSET_FIXED); + 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, BITSET_FIXED); + bitset_set (bs2, 0); + bitset_set (bs2, 2); + bitset_set (bs2, 4); + + ASSERT (bitset_disjoint_p (bs1, bs2)); + + bitset bs = bitset_create (nbits, BITSET_FIXED); + bitset_and (bs, bs1, bs2); + ASSERT (bitset_count (bs) == 0); + + 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; +}