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