This commit is contained in:
Paul Eggert
2003-06-02 10:19:37 +00:00
parent ac695f7df5
commit eaef5507fc
3 changed files with 86 additions and 39 deletions

View File

@@ -31,16 +31,18 @@
#define ABITSET_N_WORDS(N) (((N) + BITSET_WORD_BITS - 1) / BITSET_WORD_BITS) #define ABITSET_N_WORDS(N) (((N) + BITSET_WORD_BITS - 1) / BITSET_WORD_BITS)
#define ABITSET_WORDS(X) ((X)->a.words) #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 static bitset_bindex
abitset_size (bitset src) abitset_resize (bitset src ATTRIBUTE_UNUSED,
bitset_bindex size ATTRIBUTE_UNUSED)
{ {
return ABITSET_N_BITS (src); if (BITSET_SIZE_ (src) == size)
} return size;
/* These bitsets have a fixed size. */
abort ();
}
/* Find list of up to NUM bits set in BSET starting from and including /* 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 *NEXT and store in array LIST. Return with actual number of bits
@@ -60,7 +62,7 @@ abitset_small_list (bitset src, bitset_bindex *list,
if (!word) if (!word)
return 0; return 0;
size = ABITSET_N_BITS (src); size = BITSET_SIZE_ (src);
bitno = *next; bitno = *next;
if (bitno >= size) if (bitno >= size)
return 0; return 0;
@@ -105,8 +107,9 @@ abitset_small_list (bitset src, bitset_bindex *list,
static void static void
abitset_set (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 /* This should never occur for abitsets since we should always hit
hit the cache. */ the cache. It is likely someone is trying to access outside the
bounds of the bitset. */
abort (); abort ();
} }
@@ -116,9 +119,9 @@ static void
abitset_reset (bitset dst ATTRIBUTE_UNUSED, abitset_reset (bitset dst ATTRIBUTE_UNUSED,
bitset_bindex bitno ATTRIBUTE_UNUSED) bitset_bindex bitno ATTRIBUTE_UNUSED)
{ {
/* This should never occur for abitsets since we should always /* This should never occur for abitsets since we should always hit
hit the cache. */ the cache. It is likely someone is trying to access outside the
abort (); bounds of the bitset. Since the bit is zero anyway, let it pass. */
} }
@@ -129,7 +132,6 @@ abitset_test (bitset src ATTRIBUTE_UNUSED,
{ {
/* This should never occur for abitsets since we should always /* This should never occur for abitsets since we should always
hit the cache. */ hit the cache. */
abort ();
return false; return false;
} }
@@ -149,7 +151,7 @@ abitset_list_reverse (bitset src, bitset_bindex *list,
unsigned int bitcnt; unsigned int bitcnt;
bitset_bindex bitoff; bitset_bindex bitoff;
bitset_word *srcp = ABITSET_WORDS (src); bitset_word *srcp = ABITSET_WORDS (src);
bitset_bindex n_bits = ABITSET_N_BITS (src); bitset_bindex n_bits = BITSET_SIZE_ (src);
rbitno = *next; rbitno = *next;
@@ -228,7 +230,7 @@ abitset_list (bitset src, bitset_bindex *list,
} }
else else
{ {
if (bitno >= ABITSET_N_BITS (src)) if (bitno >= BITSET_SIZE_ (src))
return 0; return 0;
windex = bitno / BITSET_WORD_BITS; windex = bitno / BITSET_WORD_BITS;
@@ -304,7 +306,7 @@ abitset_unused_clear (bitset dst)
{ {
unsigned int last_bit; unsigned int last_bit;
last_bit = ABITSET_N_BITS (dst) % BITSET_WORD_BITS; last_bit = BITSET_SIZE_ (dst) % BITSET_WORD_BITS;
if (last_bit) if (last_bit)
ABITSET_WORDS (dst)[dst->b.csize - 1] &= ABITSET_WORDS (dst)[dst->b.csize - 1] &=
((bitset_word) 1 << last_bit) - 1; ((bitset_word) 1 << last_bit) - 1;
@@ -711,7 +713,8 @@ struct bitset_vtable abitset_small_vtable = {
abitset_reset, abitset_reset,
bitset_toggle_, bitset_toggle_,
abitset_test, abitset_test,
abitset_size, abitset_resize,
bitset_size_,
bitset_count_, bitset_count_,
abitset_empty_p, abitset_empty_p,
abitset_ones, abitset_ones,
@@ -748,7 +751,8 @@ struct bitset_vtable abitset_vtable = {
abitset_reset, abitset_reset,
bitset_toggle_, bitset_toggle_,
abitset_test, abitset_test,
abitset_size, abitset_resize,
bitset_size_,
bitset_count_, bitset_count_,
abitset_empty_p, abitset_empty_p,
abitset_ones, abitset_ones,
@@ -809,7 +813,7 @@ abitset_init (bitset bset, bitset_bindex n_bits)
bitset_windex size; bitset_windex size;
size = ABITSET_N_WORDS (n_bits); 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. /* Use optimized routines if bitset fits within a single word.
There is probably little merit if using caching since There is probably little merit if using caching since

View File

@@ -21,10 +21,12 @@
#endif #endif
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include "bitset.h" #include "bitset.h"
#include "abitset.h" #include "abitset.h"
#include "lbitset.h" #include "lbitset.h"
#include "ebitset.h" #include "ebitset.h"
#include "vbitset.h"
#include "bitset_stats.h" #include "bitset_stats.h"
#include "obstack.h" #include "obstack.h"
@@ -55,6 +57,10 @@ bitset_bytes (enum bitset_type type, bitset_bindex n_bits)
bytes = ebitset_bytes (n_bits); bytes = ebitset_bytes (n_bits);
break; break;
case BITSET_VARRAY:
bytes = vbitset_bytes (n_bits);
break;
default: default:
abort (); abort ();
} }
@@ -81,6 +87,9 @@ bitset_init (bitset bset, bitset_bindex n_bits, enum bitset_type type)
case BITSET_TABLE: case BITSET_TABLE:
return ebitset_init (bset, n_bits); return ebitset_init (bset, n_bits);
case BITSET_VARRAY:
return vbitset_init (bset, n_bits);
default: default:
abort (); abort ();
} }
@@ -93,27 +102,30 @@ bitset_init (bitset bset, bitset_bindex n_bits, enum bitset_type type)
enum bitset_type enum bitset_type
bitset_type_choose (bitset_bindex n_bits ATTRIBUTE_UNUSED, unsigned int attr) bitset_type_choose (bitset_bindex n_bits ATTRIBUTE_UNUSED, unsigned int attr)
{ {
enum bitset_type type;
/* Check attributes. */ /* Check attributes. */
if (attr & BITSET_FIXED && attr & BITSET_VARIABLE) if (attr & BITSET_FIXED && attr & BITSET_VARIABLE)
abort (); abort ();
if (attr & BITSET_SPARSE && attr & BITSET_DENSE) if (attr & BITSET_SPARSE && attr & BITSET_DENSE)
abort (); abort ();
/* Choose the type of bitset. Note that sometimes we will be asked /* Choose the type of bitset. Note that sometimes we will be asked
for a zero length fixed size bitset. */ for a zero length fixed size bitset. */
type = BITSET_ARRAY;
/* Currently, the simple bitsets do not support a variable size. */
if (attr & BITSET_VARIABLE || attr & BITSET_SPARSE)
{
type = BITSET_LIST;
if (attr & BITSET_DENSE || attr & BITSET_GREEDY)
type = BITSET_TABLE;
}
return type; /* If no attributes selected, choose a good compromise. */
if (!attr)
return BITSET_VARRAY;
if (attr & BITSET_SPARSE)
return BITSET_LIST;
if (attr & BITSET_FIXED)
return BITSET_ARRAY;
if (attr & BITSET_GREEDY)
return BITSET_TABLE;
return BITSET_VARRAY;
} }
@@ -223,6 +235,14 @@ bitset_next (bitset src, bitset_bindex bitno)
} }
/* Return true if both bitsets are of the same type and size. */
extern bool
bitset_compatible_p (bitset bset1, bitset bset2)
{
return BITSET_COMPATIBLE_ (bset1, bset2);
}
/* Find previous bit set in SRC starting from and including BITNO. /* Find previous bit set in SRC starting from and including BITNO.
Return BITSET_BINDEX_MAX if SRC empty. */ Return BITSET_BINDEX_MAX if SRC empty. */
bitset_bindex bitset_bindex
@@ -304,7 +324,6 @@ bitset_dump (FILE *file, bitset bset)
} }
/* Release memory associated with bitsets. */ /* Release memory associated with bitsets. */
void void
bitset_release_memory (void) bitset_release_memory (void)
@@ -314,7 +333,6 @@ bitset_release_memory (void)
} }
/* Toggle bit BITNO in bitset BSET and the new value of the bit. */ /* Toggle bit BITNO in bitset BSET and the new value of the bit. */
bool bool
bitset_toggle_ (bitset bset, bitset_bindex bitno) bitset_toggle_ (bitset bset, bitset_bindex bitno)
@@ -334,6 +352,14 @@ bitset_toggle_ (bitset bset, bitset_bindex bitno)
} }
/* Return number of bits in bitset SRC. */
bitset_bindex
bitset_size_ (bitset src)
{
return BITSET_NBITS_ (src);
}
/* Return number of bits set in bitset SRC. */ /* Return number of bits set in bitset SRC. */
bitset_bindex bitset_bindex
bitset_count_ (bitset src) bitset_count_ (bitset src)

View File

@@ -1,5 +1,5 @@
/* Bitset statistics. /* Bitset statistics.
Copyright (C) 2002, 2003 Free Software Foundation, Inc. Copyright (C) 2002 Free Software Foundation, Inc.
Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz). 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
@@ -33,13 +33,18 @@
#include "abitset.h" #include "abitset.h"
#include "ebitset.h" #include "ebitset.h"
#include "lbitset.h" #include "lbitset.h"
#include "vbitset.h"
#include "bitset_stats.h" #include "bitset_stats.h"
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#ifdef HAVE_GETTEXT_H
#include "gettext.h" #include "gettext.h"
#define _(Msgid) gettext (Msgid) #define _(Msgid) gettext (Msgid)
#else
#define _(Msgid) Msgid
#endif
/* Configuration macros. */ /* Configuration macros. */
#define BITSET_STATS_FILE "bitset.dat" #define BITSET_STATS_FILE "bitset.dat"
@@ -375,6 +380,13 @@ bitset_stats_test (bitset src, bitset_bindex bitno)
} }
static bitset_bindex
bitset_stats_resize (bitset src, bitset_bindex size)
{
return BITSET_RESIZE_ (src->s.bset, size);
}
static bitset_bindex static bitset_bindex
bitset_stats_size (bitset src) bitset_stats_size (bitset src)
{ {
@@ -518,7 +530,6 @@ static void
bitset_stats_and_or (bitset dst, bitset src1, bitset src2, bitset src3) bitset_stats_and_or (bitset dst, bitset src1, bitset src2, bitset src3)
{ {
BITSET_CHECK4_ (dst, src1, src2, src3); BITSET_CHECK4_ (dst, src1, src2, src3);
BITSET_AND_OR_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset); BITSET_AND_OR_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset);
} }
@@ -527,7 +538,6 @@ static bool
bitset_stats_and_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3) bitset_stats_and_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
{ {
BITSET_CHECK4_ (dst, src1, src2, src3); BITSET_CHECK4_ (dst, src1, src2, src3);
return BITSET_AND_OR_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset); return BITSET_AND_OR_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset);
} }
@@ -536,7 +546,6 @@ static void
bitset_stats_andn_or (bitset dst, bitset src1, bitset src2, bitset src3) bitset_stats_andn_or (bitset dst, bitset src1, bitset src2, bitset src3)
{ {
BITSET_CHECK4_ (dst, src1, src2, src3); BITSET_CHECK4_ (dst, src1, src2, src3);
BITSET_ANDN_OR_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset); BITSET_ANDN_OR_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset);
} }
@@ -545,7 +554,6 @@ static bool
bitset_stats_andn_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3) bitset_stats_andn_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
{ {
BITSET_CHECK4_ (dst, src1, src2, src3); BITSET_CHECK4_ (dst, src1, src2, src3);
return BITSET_ANDN_OR_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset); return BITSET_ANDN_OR_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset);
} }
@@ -554,7 +562,6 @@ static void
bitset_stats_or_and (bitset dst, bitset src1, bitset src2, bitset src3) bitset_stats_or_and (bitset dst, bitset src1, bitset src2, bitset src3)
{ {
BITSET_CHECK4_ (dst, src1, src2, src3); BITSET_CHECK4_ (dst, src1, src2, src3);
BITSET_OR_AND_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset); BITSET_OR_AND_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset);
} }
@@ -563,7 +570,6 @@ static bool
bitset_stats_or_and_cmp (bitset dst, bitset src1, bitset src2, bitset src3) bitset_stats_or_and_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
{ {
BITSET_CHECK4_ (dst, src1, src2, src3); BITSET_CHECK4_ (dst, src1, src2, src3);
return BITSET_OR_AND_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset); return BITSET_OR_AND_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset);
} }
@@ -576,9 +582,11 @@ bitset_stats_list (bitset bset, bitset_bindex *list,
bitset_bindex tmp; bitset_bindex tmp;
bitset_bindex size; bitset_bindex size;
bitset_bindex i; bitset_bindex i;
enum bitset_type type;
count = BITSET_LIST_ (bset->s.bset, list, num, next); count = BITSET_LIST_ (bset->s.bset, list, num, next);
type = BITSET_TYPE_ (bset->s.bset);
BITSET_STATS_LISTS_INC (bset->s.bset); BITSET_STATS_LISTS_INC (bset->s.bset);
/* Log histogram of number of set bits. */ /* Log histogram of number of set bits. */
@@ -626,6 +634,7 @@ struct bitset_vtable bitset_stats_vtable = {
bitset_stats_reset, bitset_stats_reset,
bitset_stats_toggle, bitset_stats_toggle,
bitset_stats_test, bitset_stats_test,
bitset_stats_resize,
bitset_stats_size, bitset_stats_size,
bitset_stats_count, bitset_stats_count,
bitset_stats_empty_p, bitset_stats_empty_p,
@@ -685,6 +694,8 @@ bitset_stats_init (bitset bset, bitset_bindex n_bits, enum bitset_type type)
bset->b.csize = 0; bset->b.csize = 0;
bset->b.cdata = 0; bset->b.cdata = 0;
BITSET_NBITS_ (bset) = n_bits;
/* Set up the actual bitset implementation that /* Set up the actual bitset implementation that
we are a wrapper over. */ we are a wrapper over. */
switch (type) switch (type)
@@ -707,6 +718,12 @@ bitset_stats_init (bitset bset, bitset_bindex n_bits, enum bitset_type type)
ebitset_init (sbset, n_bits); ebitset_init (sbset, n_bits);
break; break;
case BITSET_VARRAY:
bytes = vbitset_bytes (n_bits);
sbset = (bitset) xcalloc (1, bytes);
vbitset_init (sbset, n_bits);
break;
default: default:
abort (); abort ();
} }