1 /**
2 * @file re_bitv.h Interface to Bit Vector functions
3 *
4 * Copyright (C) 2010 Creytiv.com
5 */
6
7
8 typedef unsigned long bitv_t;
9
10 enum {
11 BITS_SZ = (8*sizeof(bitv_t)),
12 BITS_MASK = (BITS_SZ-1)
13 };
14
15 #define BITV_NELEM(nbits) (((nbits) + (BITS_SZ) - 1) / (BITS_SZ))
16 #define BITV_DECL(name, nbits) bitv_t (name)[BITV_NELEM(nbits)]
17
18
index2offset(uint32_t i)19 static inline uint32_t index2offset(uint32_t i)
20 {
21 return i/BITS_SZ;
22 }
23
index2bit(uint32_t i)24 static inline bitv_t index2bit(uint32_t i)
25 {
26 return (bitv_t)1<<(i & BITS_MASK);
27 }
28
29
30 /*
31 * Public API
32 */
33
34
bitv_init(bitv_t * bv,uint32_t nbits,bool val)35 static inline void bitv_init(bitv_t *bv, uint32_t nbits, bool val)
36 {
37 memset(bv, val?0xff:0x00, BITV_NELEM(nbits)*sizeof(bitv_t));
38 }
39
bitv_set(bitv_t * bv,uint32_t i)40 static inline void bitv_set(bitv_t *bv, uint32_t i)
41 {
42 bv[index2offset(i)] |= index2bit(i);
43 }
44
bitv_clr(bitv_t * bv,uint32_t i)45 static inline void bitv_clr(bitv_t *bv, uint32_t i)
46 {
47 bv[index2offset(i)] &= ~index2bit(i);
48 }
49
bitv_assign(bitv_t * bv,uint32_t i,bool val)50 static inline void bitv_assign(bitv_t *bv, uint32_t i, bool val)
51 {
52 if (val)
53 bitv_set(bv, i);
54 else
55 bitv_clr(bv, i);
56 }
57
bitv_val(const bitv_t * bv,uint32_t i)58 static inline bool bitv_val(const bitv_t *bv, uint32_t i)
59 {
60 return 0 != (bv[index2offset(i)] & index2bit(i));
61 }
62
bitv_toggle(bitv_t * bv,uint32_t i)63 static inline void bitv_toggle(bitv_t *bv, uint32_t i)
64 {
65 bv[index2offset(i)] ^= index2bit(i);
66 }
67
bitv_assign_range(bitv_t * bv,uint32_t i,uint32_t n,bool val)68 static inline void bitv_assign_range(bitv_t *bv, uint32_t i, uint32_t n,
69 bool val)
70 {
71 while (n--)
72 bitv_assign(bv, i+n, val);
73 }
74