1 /* src/toolbox/bitvector.c - bitvector implementation
3 Copyright (C) 2005, 2006 R. Grafl, A. Krall, C. Kruegel, C. Oates,
4 R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
5 C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
6 Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
25 Contact: cacao@complang.tuwien.ac.at
27 Authors: Christian Ullrich
33 #include "mm/memory.h"
34 #include "toolbox/bitvector.h"
37 /******************************************************************************
39 Bitvector Implementation
41 ******************************************************************************/
45 /* Number of ints needed for size bits */
47 # define BV_NUM_INTS(size) (((((size) + 7)/ 8) + sizeof(int) - 1)\
50 /* Get index in bitvector */
52 # define BV_INT_INDEX(bit) ( ((bit) / 8) / sizeof(int) + 1)
54 /* Get bit index inside int */
56 # define BV_BIT_INDEX(bit, index) ( (bit) - (index - 1) * sizeof(int) * 8 );
60 /* Number of ints needed for size bits */
62 # define BV_NUM_INTS(size) (((((size) + 7)/ 8) + sizeof(int) - 1) / sizeof(int))
64 /* Get index in bitvector */
66 # define BV_INT_INDEX(bit) ( ((bit) / 8) / sizeof(int) )
68 /* Get bit index inside int */
70 # define BV_BIT_INDEX(bit, index) ( (bit) - (index) * sizeof(int) * 8 );
74 /************************************************************************
77 Transforms the bitvector bv to a string of 1's and 0's.
79 IN: bitvector bv bitvector created with bv_new()
80 int size size of bitvector bv
82 IN/OUT: char *string allocated buffer, at least size + 1 elements
84 RETURN:pointer to string
85 ******************************************************************************/
86 char *bv_to_string(bitvector bv, char *string, int size) {
89 _BV_ASSERT(bv[0] == size);
91 for(i = 0; i < size; i++)
92 if (bv_get_bit(bv, i))
101 /******************************************************************************
104 Creates a new bitvector and initializes all bits to 0.
106 IN: int size size of bitvector bv
110 *******************************************************************************/
111 bitvector bv_new(int size) {
115 /* Number of ints needed for size bits */
116 /* n = (((size+7)/8) + sizeof(int) - 1)/sizeof(int); */
117 n = BV_NUM_INTS(size);
121 for(i = 0; i < n; i++) bv[i] = 0;
123 #ifdef BV_DEBUG_CHECK
130 /******************************************************************************
133 Checks if a specific bit of the bitvector is set.
136 int bit Index of bit to check (0..size(
138 RETURN: bool true if bit is set otherwise false
139 *******************************************************************************/
140 bool bv_get_bit(bitvector bv, int bit) {
143 _BV_ASSERT(bit >= 0);
145 i = BV_INT_INDEX(bit);
146 n = BV_BIT_INDEX(bit, i);
148 _BV_ASSERT(i < (BV_NUM_INTS(bv[0])));
149 return (bv[i] & (1<<n));
152 /******************************************************************************
155 Sets a specific bit of the bitvector
158 int bit Index of bit to set (0..size(
159 *******************************************************************************/
160 void bv_set_bit(bitvector bv, int bit) {
163 _BV_ASSERT(bit >= 0);
165 i = BV_INT_INDEX(bit);
166 n = BV_BIT_INDEX(bit, i);
168 _BV_ASSERT(i < BV_NUM_INTS(bv[0]));
173 /******************************************************************************
176 Resets a specific bit of the bitvector
179 int bit Index of bit to reset (0..size(
180 *******************************************************************************/
181 void bv_reset_bit(bitvector bv, int bit) {
184 _BV_ASSERT(bit >= 0);
186 i = BV_INT_INDEX(bit);
187 n = BV_BIT_INDEX(bit, i);
189 _BV_ASSERT(i < BV_NUM_INTS(bv[0]));
194 /******************************************************************************
197 Resets all bits of the bitvector
200 int size Size of the bitvector
201 *******************************************************************************/
202 void bv_reset(bitvector bv, int size) {
205 _BV_ASSERT(bv[0] == size);
207 n = BV_NUM_INTS(size);
209 #ifdef BV_DEBUG_CHECK
210 for(i = 1; i < n; i++)
212 for(i = 0; i < n; i++)
217 /******************************************************************************
220 Checks if no bits of the bitvector are set == bitvector is "empty"
223 int size Size of the bitvector
225 RETURN: bool return true if bv is empty, false otherwise
226 *******************************************************************************/
227 bool bv_is_empty(bitvector bv, int size) {
231 _BV_ASSERT(bv[0] == size);
233 n = BV_NUM_INTS(size);
236 #ifdef BV_DEBUG_CHECK
237 for(i = 1; (i < n) && empty; i++)
239 for(i = 0; (i < n) && empty; i++)
241 empty = empty && (bv[i] == 0);
245 /******************************************************************************
248 Copyes bitvector src to dst
250 IN: bitvector dst bitvector created with bv_new
251 bitvector src bitvector created with bv_new
252 int size Size of the bitvector
253 *******************************************************************************/
254 void bv_copy(bitvector dst, bitvector src, int size) {
256 /* copy the whole bitvector */
257 _BV_ASSERT(dst[0] == size);
258 _BV_ASSERT(src[0] == size);
259 n = BV_NUM_INTS(size);
261 #ifdef BV_DEBUG_CHECK
262 for(i = 1; i < n; i++)
264 for(i = 0; i < n; i++)
269 /******************************************************************************
272 Compares two bitvectors
274 IN: bitvector s1 bitvector created with bv_new
275 bitvector s2 bitvector created with bv_new
276 int size Size of the bitvector
278 RETURN: bool true if s1==s1, false otherwise
279 *******************************************************************************/
280 bool bv_equal(bitvector s1, bitvector s2, int size) {
284 /* copy the whole bitvector */
285 _BV_ASSERT(s1[0] == size);
286 _BV_ASSERT(s2[0] == size);
291 n = BV_NUM_INTS(size);
293 #ifdef BV_DEBUG_CHECK
294 for(i = 1; equal && (i < n-1); i++)
296 for(i = 0; equal && (i < n-1); i++)
298 equal = (s1[i] == s2[i]);
300 /* Last compare maybe has to be masked! */
302 i = BV_INT_INDEX(size - 1);
303 n = BV_BIT_INDEX(size - 1, i);
305 _BV_ASSERT(i < BV_NUM_INTS(s1[0]));
306 _BV_ASSERT(i < BV_NUM_INTS(s2[0]));
308 if (n == (sizeof(int) * 8 - 1)) {
312 mask = (1<<(n+1)) - 1;
315 equal = equal && ( (s1[i]&mask) == (s2[i]&mask));
320 /******************************************************************************
323 d = s1 \ s2. ( set minus operator )
325 IN: bitvector s1 bitvector created with bv_new
326 bitvector s2 bitvector created with bv_new
327 int size Size of the bitvector
329 IN/OUT:bitvector d bitvector created with bv_new
331 *******************************************************************************/
332 void bv_minus(bitvector d, bitvector s1, bitvector s2, int size) {
335 _BV_ASSERT(d[0] == size);
336 _BV_ASSERT(s1[0] == size);
337 _BV_ASSERT(s2[0] == size);
338 n = BV_NUM_INTS(size);
339 #ifdef BV_DEBUG_CHECK
340 for(i = 1; i < n; i++)
342 for(i = 0; i < n; i++)
344 d[i] = s1[i] & (~s2[i]);
347 /******************************************************************************
350 d = s1 "union" s2. ( set union operator )
352 IN: bitvector s1 bitvector created with bv_new
353 bitvector s2 bitvector created with bv_new
354 int size Size of the bitvector
356 IN/OUT:bitvector d bitvector created with bv_new
358 *******************************************************************************/
359 void bv_union(bitvector d, bitvector s1, bitvector s2, int size) {
361 /* d = s1 union s2 */
362 _BV_ASSERT(d[0] == size);
363 _BV_ASSERT(s1[0] == size);
364 _BV_ASSERT(s2[0] == size);
365 n = BV_NUM_INTS(size);
366 #ifdef BV_DEBUG_CHECK
367 for(i = 1; i < n; i++)
369 for(i = 0; i < n; i++)
371 d[i] = s1[i] | s2[i];
375 * These are local overrides for various environment variables in Emacs.
376 * Please do not remove this and leave it at the end of the file, where
377 * Emacs will automagically detect them.
378 * ---------------------------------------------------------------------
381 * indent-tabs-mode: t