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