/* Array bitsets.
- Copyright (C) 2002 Free Software Foundation, Inc.
+
+ Copyright (C) 2002-2003, 2006, 2009-2012 Free Software Foundation,
+ Inc.
+
Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
- This program is free software; you can redistribute it and/or modify
+ 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 2 of the License, or
+ 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,
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, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
+#include <config.h>
#include "abitset.h"
#include <stddef.h>
/* This file implements fixed size bitsets stored as an array
of words. Any unused bits in the last word must be zero. */
-static void abitset_unused_clear PARAMS ((bitset));
-static void abitset_ones PARAMS ((bitset));
-static void abitset_zero PARAMS ((bitset));
-static int abitset_empty_p PARAMS ((bitset));
-static void abitset_copy1 PARAMS ((bitset, bitset));
-static void abitset_not PARAMS ((bitset, bitset));
-static int abitset_equal_p PARAMS ((bitset, bitset));
-static int abitset_subset_p PARAMS ((bitset, bitset));
-static int abitset_disjoint_p PARAMS ((bitset, bitset));
-static void abitset_and PARAMS ((bitset, bitset, bitset));
-static int abitset_and_cmp PARAMS ((bitset, bitset, bitset));
-static void abitset_andn PARAMS ((bitset, bitset, bitset));
-static int abitset_andn_cmp PARAMS ((bitset, bitset, bitset));
-static void abitset_or PARAMS ((bitset, bitset, bitset));
-static int abitset_or_cmp PARAMS ((bitset, bitset, bitset));
-static void abitset_xor PARAMS ((bitset, bitset, bitset));
-static int abitset_xor_cmp PARAMS ((bitset, bitset, bitset));
-static void abitset_and_or PARAMS ((bitset, bitset, bitset, bitset));
-static int abitset_and_or_cmp PARAMS ((bitset, bitset, bitset, bitset));
-static void abitset_andn_or PARAMS ((bitset, bitset, bitset, bitset));
-static int abitset_andn_or_cmp PARAMS ((bitset, bitset, bitset, bitset));
-static void abitset_or_and PARAMS ((bitset, bitset, bitset, bitset));
-static int abitset_or_and_cmp PARAMS ((bitset, bitset, bitset, bitset));
-static void abitset_copy PARAMS ((bitset, bitset));
-
-static bitset_bindex abitset_small_list PARAMS ((bitset, bitset_bindex *,
- bitset_bindex,
- bitset_bindex *));
-
-static void abitset_set PARAMS ((bitset, bitset_bindex));
-static void abitset_reset PARAMS ((bitset, bitset_bindex));
-static int abitset_test PARAMS ((bitset, bitset_bindex));
-static bitset_bindex abitset_size PARAMS ((bitset));
-static bitset_bindex abitset_list PARAMS ((bitset, bitset_bindex *,
- bitset_bindex, bitset_bindex *));
-static bitset_bindex abitset_list_reverse
-PARAMS ((bitset, bitset_bindex *, bitset_bindex, bitset_bindex *));
-
#define ABITSET_N_WORDS(N) (((N) + BITSET_WORD_BITS - 1) / BITSET_WORD_BITS)
#define ABITSET_WORDS(X) ((X)->a.words)
-#define ABITSET_N_BITS(X) ((X)->a.n_bits)
-/* Return size in bits of bitset SRC. */
static bitset_bindex
-abitset_size (src)
- bitset src;
+abitset_resize (bitset src, bitset_bindex size)
{
- return ABITSET_N_BITS (src);
-}
+ /* These bitsets have a fixed size. */
+ if (BITSET_SIZE_ (src) != size)
+ abort ();
+ return size;
+}
/* Find list of up to NUM bits set in BSET starting from and including
*NEXT and store in array LIST. Return with actual number of bits
found and with *NEXT indicating where search stopped. */
static bitset_bindex
-abitset_small_list (src, list, num, next)
- bitset src;
- bitset_bindex *list;
- bitset_bindex num;
- bitset_bindex *next;
+abitset_small_list (bitset src, bitset_bindex *list,
+ bitset_bindex num, bitset_bindex *next)
{
bitset_bindex bitno;
bitset_bindex count;
if (!word)
return 0;
- size = ABITSET_N_BITS (src);
+ size = BITSET_SIZE_ (src);
bitno = *next;
if (bitno >= size)
return 0;
/* Set bit BITNO in bitset DST. */
static void
-abitset_set (dst, bitno)
- bitset dst ATTRIBUTE_UNUSED;
- bitset_bindex bitno ATTRIBUTE_UNUSED;
+abitset_set (bitset dst ATTRIBUTE_UNUSED, bitset_bindex bitno ATTRIBUTE_UNUSED)
{
- /* This should never occur for abitsets since we should always
- hit the cache. */
+ /* This should never occur for abitsets since we should always hit
+ the cache. It is likely someone is trying to access outside the
+ bounds of the bitset. */
abort ();
}
/* Reset bit BITNO in bitset DST. */
static void
-abitset_reset (dst, bitno)
- bitset dst ATTRIBUTE_UNUSED;
- bitset_bindex bitno ATTRIBUTE_UNUSED;
+abitset_reset (bitset dst ATTRIBUTE_UNUSED,
+ bitset_bindex bitno ATTRIBUTE_UNUSED)
{
- /* This should never occur for abitsets since we should always
- hit the cache. */
- abort ();
+ /* This should never occur for abitsets since we should always hit
+ the cache. It is likely someone is trying to access outside the
+ bounds of the bitset. Since the bit is zero anyway, let it pass. */
}
/* Test bit BITNO in bitset SRC. */
-static int
-abitset_test (src, bitno)
- bitset src ATTRIBUTE_UNUSED;
- bitset_bindex bitno ATTRIBUTE_UNUSED;
+static bool
+abitset_test (bitset src ATTRIBUTE_UNUSED,
+ bitset_bindex bitno ATTRIBUTE_UNUSED)
{
/* This should never occur for abitsets since we should always
hit the cache. */
- abort ();
- return 0;
+ return false;
}
actual number of bits found and with *NEXT indicating where search
stopped. */
static bitset_bindex
-abitset_list_reverse (src, list, num, next)
- bitset src;
- bitset_bindex *list;
- bitset_bindex num;
- bitset_bindex *next;
+abitset_list_reverse (bitset src, bitset_bindex *list,
+ bitset_bindex num, bitset_bindex *next)
{
bitset_bindex bitno;
bitset_bindex rbitno;
unsigned int bitcnt;
bitset_bindex bitoff;
bitset_word *srcp = ABITSET_WORDS (src);
- bitset_bindex n_bits = ABITSET_N_BITS (src);
+ bitset_bindex n_bits = BITSET_SIZE_ (src);
rbitno = *next;
*NEXT and store in array LIST. Return with actual number of bits
found and with *NEXT indicating where search stopped. */
static bitset_bindex
-abitset_list (src, list, num, next)
- bitset src;
- bitset_bindex *list;
- bitset_bindex num;
- bitset_bindex *next;
+abitset_list (bitset src, bitset_bindex *list,
+ bitset_bindex num, bitset_bindex *next)
{
bitset_bindex bitno;
bitset_bindex count;
}
else
{
- if (bitno >= ABITSET_N_BITS (src))
+ if (bitno >= BITSET_SIZE_ (src))
return 0;
windex = bitno / BITSET_WORD_BITS;
/* Ensure that any unused bits within the last word are clear. */
static inline void
-abitset_unused_clear (dst)
- bitset dst;
+abitset_unused_clear (bitset dst)
{
unsigned int last_bit;
- last_bit = ABITSET_N_BITS (dst) % BITSET_WORD_BITS;
+ last_bit = BITSET_SIZE_ (dst) % BITSET_WORD_BITS;
if (last_bit)
ABITSET_WORDS (dst)[dst->b.csize - 1] &=
((bitset_word) 1 << last_bit) - 1;
static void
-abitset_ones (dst)
- bitset dst;
+abitset_ones (bitset dst)
{
bitset_word *dstp = ABITSET_WORDS (dst);
size_t bytes;
static void
-abitset_zero (dst)
- bitset dst;
+abitset_zero (bitset dst)
{
bitset_word *dstp = ABITSET_WORDS (dst);
size_t bytes;
}
-static int
-abitset_empty_p (dst)
- bitset dst;
+static bool
+abitset_empty_p (bitset dst)
{
bitset_windex i;
bitset_word *dstp = ABITSET_WORDS (dst);
for (i = 0; i < dst->b.csize; i++)
if (dstp[i])
- return 0;
+ return false;
- return 1;
+ return true;
}
static void
-abitset_copy1 (dst, src)
- bitset dst;
- bitset src;
+abitset_copy1 (bitset dst, bitset src)
{
bitset_word *srcp = ABITSET_WORDS (src);
bitset_word *dstp = ABITSET_WORDS (dst);
static void
-abitset_not (dst, src)
- bitset dst;
- bitset src;
+abitset_not (bitset dst, bitset src)
{
bitset_windex i;
bitset_word *srcp = ABITSET_WORDS (src);
abitset_unused_clear (dst);
}
-
-static int
-abitset_equal_p (dst, src)
- bitset dst;
- bitset src;
+
+static bool
+abitset_equal_p (bitset dst, bitset src)
{
bitset_windex i;
bitset_word *srcp = ABITSET_WORDS (src);
for (i = 0; i < size; i++)
if (*srcp++ != *dstp++)
- return 0;
- return 1;
+ return false;
+ return true;
}
-static int
-abitset_subset_p (dst, src)
- bitset dst;
- bitset src;
+static bool
+abitset_subset_p (bitset dst, bitset src)
{
bitset_windex i;
bitset_word *srcp = ABITSET_WORDS (src);
bitset_word *dstp = ABITSET_WORDS (dst);
bitset_windex size = dst->b.csize;
-
+
for (i = 0; i < size; i++, dstp++, srcp++)
if (*dstp != (*srcp | *dstp))
- return 0;
- return 1;
+ return false;
+ return true;
}
-static int
-abitset_disjoint_p (dst, src)
- bitset dst;
- bitset src;
+static bool
+abitset_disjoint_p (bitset dst, bitset src)
{
bitset_windex i;
bitset_word *srcp = ABITSET_WORDS (src);
for (i = 0; i < size; i++)
if (*srcp++ & *dstp++)
- return 0;
+ return false;
- return 1;
+ return true;
}
static void
-abitset_and (dst, src1, src2)
- bitset dst;
- bitset src1;
- bitset src2;
+abitset_and (bitset dst, bitset src1, bitset src2)
{
bitset_windex i;
bitset_word *src1p = ABITSET_WORDS (src1);
}
-static int
-abitset_and_cmp (dst, src1, src2)
- bitset dst;
- bitset src1;
- bitset src2;
+static bool
+abitset_and_cmp (bitset dst, bitset src1, bitset src2)
{
bitset_windex i;
- int changed = 0;
+ bool changed = false;
bitset_word *src1p = ABITSET_WORDS (src1);
bitset_word *src2p = ABITSET_WORDS (src2);
bitset_word *dstp = ABITSET_WORDS (dst);
for (i = 0; i < size; i++, dstp++)
{
bitset_word tmp = *src1p++ & *src2p++;
-
+
if (*dstp != tmp)
{
- changed = 1;
+ changed = true;
*dstp = tmp;
}
}
static void
-abitset_andn (dst, src1, src2)
- bitset dst;
- bitset src1;
- bitset src2;
+abitset_andn (bitset dst, bitset src1, bitset src2)
{
bitset_windex i;
bitset_word *src1p = ABITSET_WORDS (src1);
}
-static int
-abitset_andn_cmp (dst, src1, src2)
- bitset dst;
- bitset src1;
- bitset src2;
+static bool
+abitset_andn_cmp (bitset dst, bitset src1, bitset src2)
{
bitset_windex i;
- int changed = 0;
+ bool changed = false;
bitset_word *src1p = ABITSET_WORDS (src1);
bitset_word *src2p = ABITSET_WORDS (src2);
bitset_word *dstp = ABITSET_WORDS (dst);
bitset_windex size = dst->b.csize;
-
+
for (i = 0; i < size; i++, dstp++)
{
bitset_word tmp = *src1p++ & ~(*src2p++);
-
+
if (*dstp != tmp)
{
- changed = 1;
+ changed = true;
*dstp = tmp;
}
}
static void
-abitset_or (dst, src1, src2)
- bitset dst;
- bitset src1;
- bitset src2;
+abitset_or (bitset dst, bitset src1, bitset src2)
{
bitset_windex i;
bitset_word *src1p = ABITSET_WORDS (src1);
}
-static int
-abitset_or_cmp (dst, src1, src2)
- bitset dst;
- bitset src1;
- bitset src2;
+static bool
+abitset_or_cmp (bitset dst, bitset src1, bitset src2)
{
bitset_windex i;
- int changed = 0;
+ bool changed = false;
bitset_word *src1p = ABITSET_WORDS (src1);
bitset_word *src2p = ABITSET_WORDS (src2);
bitset_word *dstp = ABITSET_WORDS (dst);
for (i = 0; i < size; i++, dstp++)
{
bitset_word tmp = *src1p++ | *src2p++;
-
+
if (*dstp != tmp)
{
- changed = 1;
+ changed = true;
*dstp = tmp;
}
}
static void
-abitset_xor (dst, src1, src2)
- bitset dst;
- bitset src1;
- bitset src2;
+abitset_xor (bitset dst, bitset src1, bitset src2)
{
bitset_windex i;
bitset_word *src1p = ABITSET_WORDS (src1);
}
-static int
-abitset_xor_cmp (dst, src1, src2)
- bitset dst;
- bitset src1;
- bitset src2;
+static bool
+abitset_xor_cmp (bitset dst, bitset src1, bitset src2)
{
bitset_windex i;
- int changed = 0;
+ bool changed = false;
bitset_word *src1p = ABITSET_WORDS (src1);
bitset_word *src2p = ABITSET_WORDS (src2);
bitset_word *dstp = ABITSET_WORDS (dst);
for (i = 0; i < size; i++, dstp++)
{
bitset_word tmp = *src1p++ ^ *src2p++;
-
+
if (*dstp != tmp)
{
- changed = 1;
+ changed = true;
*dstp = tmp;
}
}
static void
-abitset_and_or (dst, src1, src2, src3)
- bitset dst;
- bitset src1;
- bitset src2;
- bitset src3;
+abitset_and_or (bitset dst, bitset src1, bitset src2, bitset src3)
{
bitset_windex i;
bitset_word *src1p = ABITSET_WORDS (src1);
bitset_word *src3p = ABITSET_WORDS (src3);
bitset_word *dstp = ABITSET_WORDS (dst);
bitset_windex size = dst->b.csize;
-
+
for (i = 0; i < size; i++)
*dstp++ = (*src1p++ & *src2p++) | *src3p++;
}
-static int
-abitset_and_or_cmp (dst, src1, src2, src3)
- bitset dst;
- bitset src1;
- bitset src2;
- bitset src3;
+static bool
+abitset_and_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
{
bitset_windex i;
- int changed = 0;
+ bool changed = false;
bitset_word *src1p = ABITSET_WORDS (src1);
bitset_word *src2p = ABITSET_WORDS (src2);
bitset_word *src3p = ABITSET_WORDS (src3);
bitset_word *dstp = ABITSET_WORDS (dst);
bitset_windex size = dst->b.csize;
-
+
for (i = 0; i < size; i++, dstp++)
{
bitset_word tmp = (*src1p++ & *src2p++) | *src3p++;
-
+
if (*dstp != tmp)
{
- changed = 1;
+ changed = true;
*dstp = tmp;
}
}
static void
-abitset_andn_or (dst, src1, src2, src3)
- bitset dst;
- bitset src1;
- bitset src2;
- bitset src3;
+abitset_andn_or (bitset dst, bitset src1, bitset src2, bitset src3)
{
bitset_windex i;
bitset_word *src1p = ABITSET_WORDS (src1);
bitset_word *src3p = ABITSET_WORDS (src3);
bitset_word *dstp = ABITSET_WORDS (dst);
bitset_windex size = dst->b.csize;
-
+
for (i = 0; i < size; i++)
*dstp++ = (*src1p++ & ~(*src2p++)) | *src3p++;
}
-static int
-abitset_andn_or_cmp (dst, src1, src2, src3)
- bitset dst;
- bitset src1;
- bitset src2;
- bitset src3;
+static bool
+abitset_andn_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
{
bitset_windex i;
- int changed = 0;
+ bool changed = false;
bitset_word *src1p = ABITSET_WORDS (src1);
bitset_word *src2p = ABITSET_WORDS (src2);
bitset_word *src3p = ABITSET_WORDS (src3);
bitset_word *dstp = ABITSET_WORDS (dst);
bitset_windex size = dst->b.csize;
-
+
for (i = 0; i < size; i++, dstp++)
{
bitset_word tmp = (*src1p++ & ~(*src2p++)) | *src3p++;
-
+
if (*dstp != tmp)
{
- changed = 1;
+ changed = true;
*dstp = tmp;
}
}
static void
-abitset_or_and (dst, src1, src2, src3)
- bitset dst;
- bitset src1;
- bitset src2;
- bitset src3;
+abitset_or_and (bitset dst, bitset src1, bitset src2, bitset src3)
{
bitset_windex i;
bitset_word *src1p = ABITSET_WORDS (src1);
bitset_word *src3p = ABITSET_WORDS (src3);
bitset_word *dstp = ABITSET_WORDS (dst);
bitset_windex size = dst->b.csize;
-
+
for (i = 0; i < size; i++)
*dstp++ = (*src1p++ | *src2p++) & *src3p++;
}
-static int
-abitset_or_and_cmp (dst, src1, src2, src3)
- bitset dst;
- bitset src1;
- bitset src2;
- bitset src3;
+static bool
+abitset_or_and_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
{
bitset_windex i;
- int changed = 0;
+ bool changed = false;
bitset_word *src1p = ABITSET_WORDS (src1);
bitset_word *src2p = ABITSET_WORDS (src2);
bitset_word *src3p = ABITSET_WORDS (src3);
bitset_word *dstp = ABITSET_WORDS (dst);
bitset_windex size = dst->b.csize;
-
+
for (i = 0; i < size; i++, dstp++)
{
bitset_word tmp = (*src1p++ | *src2p++) & *src3p++;
-
+
if (*dstp != tmp)
{
- changed = 1;
+ changed = true;
*dstp = tmp;
}
}
static void
-abitset_copy (dst, src)
- bitset dst;
- bitset src;
+abitset_copy (bitset dst, bitset src)
{
if (BITSET_COMPATIBLE_ (dst, src))
abitset_copy1 (dst, src);
abitset_reset,
bitset_toggle_,
abitset_test,
- abitset_size,
+ abitset_resize,
+ bitset_size_,
bitset_count_,
abitset_empty_p,
abitset_ones,
abitset_reset,
bitset_toggle_,
abitset_test,
- abitset_size,
+ abitset_resize,
+ bitset_size_,
bitset_count_,
abitset_empty_p,
abitset_ones,
size_t
-abitset_bytes (n_bits)
- bitset_bindex n_bits;
+abitset_bytes (bitset_bindex n_bits)
{
bitset_windex size;
size_t bytes;
bitset
-abitset_init (bset, n_bits)
- bitset bset;
- bitset_bindex n_bits;
+abitset_init (bitset bset, bitset_bindex n_bits)
{
bitset_windex size;
size = ABITSET_N_WORDS (n_bits);
- ABITSET_N_BITS (bset) = n_bits;
+ BITSET_NBITS_ (bset) = n_bits;
/* Use optimized routines if bitset fits within a single word.
There is probably little merit if using caching since