]> mj.ucw.cz Git - libucw.git/blob - ucw/bitarray.h
Added a list of exported symbols, which are subject to renaming
[libucw.git] / ucw / bitarray.h
1 /*
2  *      UCW Library -- Bit Array Operations
3  *
4  *      (c) 2003--2006 Martin Mares <mj@ucw.cz>
5  *      (c) 2012 Pavel Charvat <pchar@ucw.cz>
6  *
7  *      This software may be freely distributed and used according to the terms
8  *      of the GNU Lesser General Public License.
9  */
10
11 #ifndef _UCW_BITARRAY_H
12 #define _UCW_BITARRAY_H
13
14 #include <string.h>
15
16 typedef u32 *bitarray_t; // Must be initialized by bit_array_xmalloc(), bit_array_zero() or bit_array_set_all()
17
18 #define BIT_ARRAY_WORDS(n) (((n)+31)/32)
19 #define BIT_ARRAY_BYTES(n) (4*BIT_ARRAY_WORDS(n))
20 #define BIT_ARRAY(name,size) u32 name[BIT_ARRAY_WORDS(size)]
21
22 static inline bitarray_t bit_array_xmalloc(uns n)
23 {
24   return xmalloc(BIT_ARRAY_BYTES(n));
25 }
26
27 bitarray_t bit_array_xrealloc(bitarray_t a, uns old_n, uns new_n);
28
29 static inline bitarray_t bit_array_xmalloc_zero(uns n)
30 {
31   return xmalloc_zero(BIT_ARRAY_BYTES(n));
32 }
33
34 static inline void bit_array_zero(bitarray_t a, uns n)
35 {
36   bzero(a, BIT_ARRAY_BYTES(n));
37 }
38
39 static inline void bit_array_set_all(bitarray_t a, uns n)
40 {
41   uns w = n / 32;
42   memset(a, 255, w * 4);
43   uns m = n & 31;
44   if (m)
45     a[w] = (1U << m) - 1;
46 }
47
48 static inline void bit_array_set(bitarray_t a, uns i)
49 {
50   a[i/32] |= (1 << (i%32));
51 }
52
53 static inline void bit_array_clear(bitarray_t a, uns i)
54 {
55   a[i/32] &= ~(1 << (i%32));
56 }
57
58 static inline void bit_array_assign(bitarray_t a, uns i, uns x)
59 {
60   if (x)
61     bit_array_set(a, i);
62   else
63     bit_array_clear(a, i);
64 }
65
66 static inline uns bit_array_isset(bitarray_t a, uns i)
67 {
68   return a[i/32] & (1 << (i%32));
69 }
70
71 static inline uns bit_array_get(bitarray_t a, uns i)
72 {
73   return !! bit_array_isset(a, i);
74 }
75
76 static inline uns bit_array_test_and_set(bitarray_t a, uns i)
77 {
78   uns t = bit_array_isset(a, i);
79   bit_array_set(a, i);
80   return t;
81 }
82
83 static inline uns bit_array_test_and_clear(bitarray_t a, uns i)
84 {
85   uns t = bit_array_isset(a, i);
86   bit_array_clear(a, i);
87   return t;
88 }
89
90 uns bit_array_count_bits(bitarray_t a, uns n);
91
92 /* Iterate over all set bits */
93 #define BIT_ARRAY_FISH_BITS_BEGIN(var,ary,size)                                 \
94   for (uns var##_hi=0; var##_hi < BIT_ARRAY_WORDS(size); var##_hi++)            \
95     {                                                                           \
96       u32 var##_cur = ary[var##_hi];                                            \
97       for (uns var = 32 * var##_hi; var##_cur; var++, var##_cur >>= 1)          \
98         if (var##_cur & 1)                                                      \
99           do
100
101 #define BIT_ARRAY_FISH_BITS_END                                                 \
102           while (0);                                                            \
103     }
104
105 #endif