1 /* Sparse array based bitmaps.
2 Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
25 #define EBITMAP_ELT_BITS ((unsigned) HOST_BITS_PER_WIDEST_FAST_INT)
26 #define EBITMAP_ELT_TYPE unsigned HOST_WIDEST_FAST_INT
28 typedef struct ebitmap_def
30 unsigned int n_elts
; /* number of elements in the array. */
31 sbitmap wordmask
; /* wordmask saying which words are
33 unsigned int numwords
; /* number of nonzero words. */
34 unsigned int cacheindex
; /* which word cache is. */
35 EBITMAP_ELT_TYPE
*elts
; /* nonzero element array. */
36 EBITMAP_ELT_TYPE
*cache
; /* last tested element, or NULL. */
40 #define ebitmap_empty_p(MAP) ((MAP)->numwords == 0)
41 #define ebitmap_free(MAP) (free((MAP)->elts), \
42 sbitmap_free ((MAP)->wordmask), \
45 extern void ebitmap_set_bit (ebitmap
, unsigned int);
46 extern void ebitmap_clear_bit (ebitmap
, unsigned int);
47 extern bool ebitmap_bit_p (ebitmap
, unsigned int);
48 extern void dump_ebitmap (FILE *, ebitmap
);
49 extern void dump_ebitmap_file (FILE *, ebitmap
);
50 extern void dump_ebitmap_vector (FILE *, const char *, const char *, ebitmap
*,
52 extern ebitmap
ebitmap_alloc (unsigned int);
53 extern ebitmap
*ebitmap_vector_alloc (unsigned int, unsigned int);
54 extern void ebitmap_copy (ebitmap
, ebitmap
);
55 extern void ebitmap_and (ebitmap
, ebitmap
, ebitmap
);
56 extern void ebitmap_and_into (ebitmap
, ebitmap
);
57 extern bool ebitmap_and_compl (ebitmap
, ebitmap
, ebitmap
);
58 extern bool ebitmap_and_compl_into (ebitmap
, ebitmap
);
59 extern bool ebitmap_ior_into (ebitmap
, ebitmap
);
60 extern bool ebitmap_ior (ebitmap
, ebitmap
, ebitmap
);
61 extern bool ebitmap_ior_and_compl (ebitmap
, ebitmap
, ebitmap
, ebitmap
);
62 extern bool ebitmap_ior_and_compl_into (ebitmap
, ebitmap
, ebitmap
);
63 extern bool ebitmap_equal_p (ebitmap
, ebitmap
);
64 extern void ebitmap_clear (ebitmap
);
65 extern int ebitmap_last_set_bit (ebitmap
);
66 extern void debug_ebitmap (ebitmap
);
67 extern void dump_ebitmap (FILE *, ebitmap
);
68 extern unsigned long ebitmap_popcount(ebitmap
, unsigned long);
70 /* The iterator for ebitmap. */
72 /* The pointer to the first word of the bitmap. */
73 EBITMAP_ELT_TYPE
*ptr
;
75 /* Element number inside ptr that we are at. */
78 /* The size of the bitmap. */
81 /* Current bit index. */
84 /* The words currently visited. */
85 EBITMAP_ELT_TYPE word
;
87 /* The word mask iterator. */
88 sbitmap_iterator maskiter
;
92 ebitmap_iter_init (ebitmap_iterator
*i
, ebitmap bmp
, unsigned int min
)
94 sbitmap_iter_init (&i
->maskiter
, bmp
->wordmask
,
95 min
/ EBITMAP_ELT_BITS
);
96 i
->size
= bmp
->numwords
;
109 if ((min
/ EBITMAP_ELT_BITS
) >= bmp
->wordmask
->n_bits
)
115 if (TEST_BIT (bmp
->wordmask
, min
/ EBITMAP_ELT_BITS
) == 0)
119 unsigned int wordindex
= min
/ EBITMAP_ELT_BITS
;
120 unsigned int count
= sbitmap_popcount (bmp
->wordmask
, wordindex
);
121 i
->word
= i
->ptr
[count
] >> (i
->bit_num
% (unsigned int)EBITMAP_ELT_BITS
);
122 i
->eltnum
= count
+ 1;
128 ebitmap_iter_cond (ebitmap_iterator
*i
, unsigned int *n
)
130 unsigned int ourn
= 0;
137 sbitmap_iter_next (&i
->maskiter
);
138 if (!sbitmap_iter_cond (&i
->maskiter
, &ourn
))
140 i
->bit_num
= ourn
* EBITMAP_ELT_BITS
;
141 i
->word
= i
->ptr
[i
->eltnum
++];
144 /* Skip bits that are zero. */
146 for (; (i
->word
& 1) == 0; i
->word
>>= 1)
154 ebitmap_iter_next (ebitmap_iterator
*i
)
160 /* Loop over all elements of EBITMAP, starting with MIN. In each
161 iteration, N is set to the index of the bit being visited. ITER is
162 an instance of ebitmap_iterator used to iterate the bitmap. */
164 #define EXECUTE_IF_SET_IN_EBITMAP(EBITMAP, MIN, N, ITER) \
165 for (ebitmap_iter_init (&(ITER), (EBITMAP), (MIN)); \
166 ebitmap_iter_cond (&(ITER), &(N)); \
167 ebitmap_iter_next (&(ITER)))
170 #endif /* ! GCC_EBITMAP_H */