1*76404edcSAsim Jamshed #include "buffer.h"
2*76404edcSAsim Jamshed #include "bitset.h"
3*76404edcSAsim Jamshed 
4*76404edcSAsim Jamshed #include <limits.h>
5*76404edcSAsim Jamshed #include <stdlib.h>
6*76404edcSAsim Jamshed #include <string.h>
7*76404edcSAsim Jamshed #include <stdio.h>
8*76404edcSAsim Jamshed #include <assert.h>
9*76404edcSAsim Jamshed 
10*76404edcSAsim Jamshed #define BITSET_BITS \
11*76404edcSAsim Jamshed 	( CHAR_BIT * sizeof(size_t) )
12*76404edcSAsim Jamshed 
13*76404edcSAsim Jamshed #define BITSET_MASK(pos) \
14*76404edcSAsim Jamshed 	( ((size_t)1) << ((pos) % BITSET_BITS) )
15*76404edcSAsim Jamshed 
16*76404edcSAsim Jamshed #define BITSET_WORD(set, pos) \
17*76404edcSAsim Jamshed 	( (set)->bits[(pos) / BITSET_BITS] )
18*76404edcSAsim Jamshed 
19*76404edcSAsim Jamshed #define BITSET_USED(nbits) \
20*76404edcSAsim Jamshed 	( ((nbits) + (BITSET_BITS - 1)) / BITSET_BITS )
21*76404edcSAsim Jamshed 
bitset_init(size_t nbits)22*76404edcSAsim Jamshed bitset *bitset_init(size_t nbits) {
23*76404edcSAsim Jamshed 	bitset *set;
24*76404edcSAsim Jamshed 
25*76404edcSAsim Jamshed 	set = malloc(sizeof(*set));
26*76404edcSAsim Jamshed 	assert(set);
27*76404edcSAsim Jamshed 
28*76404edcSAsim Jamshed 	set->bits = calloc(BITSET_USED(nbits), sizeof(*set->bits));
29*76404edcSAsim Jamshed 	set->nbits = nbits;
30*76404edcSAsim Jamshed 
31*76404edcSAsim Jamshed 	assert(set->bits);
32*76404edcSAsim Jamshed 
33*76404edcSAsim Jamshed 	return set;
34*76404edcSAsim Jamshed }
35*76404edcSAsim Jamshed 
bitset_reset(bitset * set)36*76404edcSAsim Jamshed void bitset_reset(bitset *set) {
37*76404edcSAsim Jamshed 	memset(set->bits, 0, BITSET_USED(set->nbits) * sizeof(*set->bits));
38*76404edcSAsim Jamshed }
39*76404edcSAsim Jamshed 
bitset_free(bitset * set)40*76404edcSAsim Jamshed void bitset_free(bitset *set) {
41*76404edcSAsim Jamshed 	free(set->bits);
42*76404edcSAsim Jamshed 	free(set);
43*76404edcSAsim Jamshed }
44*76404edcSAsim Jamshed 
bitset_clear_bit(bitset * set,size_t pos)45*76404edcSAsim Jamshed void bitset_clear_bit(bitset *set, size_t pos) {
46*76404edcSAsim Jamshed 	if (pos >= set->nbits) {
47*76404edcSAsim Jamshed 	    SEGFAULT();
48*76404edcSAsim Jamshed 	}
49*76404edcSAsim Jamshed 
50*76404edcSAsim Jamshed 	BITSET_WORD(set, pos) &= ~BITSET_MASK(pos);
51*76404edcSAsim Jamshed }
52*76404edcSAsim Jamshed 
bitset_set_bit(bitset * set,size_t pos)53*76404edcSAsim Jamshed void bitset_set_bit(bitset *set, size_t pos) {
54*76404edcSAsim Jamshed 	if (pos >= set->nbits) {
55*76404edcSAsim Jamshed 	    SEGFAULT();
56*76404edcSAsim Jamshed 	}
57*76404edcSAsim Jamshed 
58*76404edcSAsim Jamshed 	BITSET_WORD(set, pos) |= BITSET_MASK(pos);
59*76404edcSAsim Jamshed }
60*76404edcSAsim Jamshed 
bitset_test_bit(bitset * set,size_t pos)61*76404edcSAsim Jamshed int bitset_test_bit(bitset *set, size_t pos) {
62*76404edcSAsim Jamshed 	if (pos >= set->nbits) {
63*76404edcSAsim Jamshed 	    SEGFAULT();
64*76404edcSAsim Jamshed 	}
65*76404edcSAsim Jamshed 
66*76404edcSAsim Jamshed 	return (BITSET_WORD(set, pos) & BITSET_MASK(pos)) != 0;
67*76404edcSAsim Jamshed }
68