libcute 0.1
Loading...
Searching...
No Matches
bitset.h
Go to the documentation of this file.
1#pragma once
2
3#include <stdalign.h>
4#include <stdbool.h>
5#include <stddef.h>
6#include <stdint.h>
7
11#define CU_BITSET_HEADER(NAME) \
12 NAME##_BitSet NAME##_BitSet_create(void); \
13 void NAME##_BitSet_set(NAME##_BitSet *set, size_t index); \
14 void NAME##_BitSet_clear(NAME##_BitSet *set, size_t index); \
15 bool NAME##_BitSet_get(const NAME##_BitSet *set, size_t index); \
16 void NAME##_BitSet_clear_all(NAME##_BitSet *set); \
17 size_t NAME##_BitSet_size(void);
18
21#define CU_BITSET_DECL(NAME, SIZE) \
22 typedef struct { \
23 alignas(sizeof(size_t)) uint8_t bits[((SIZE) + 7) / 8]; \
24 } NAME##_BitSet; \
25 CU_BITSET_HEADER(NAME)
26
29#define CU_BITSET_IMPL(NAME, SIZE) \
30 NAME##_BitSet NAME##_BitSet_create(void) { \
31 NAME##_BitSet set = {0}; \
32 return set; \
33 } \
34 \
35 void NAME##_BitSet_set(NAME##_BitSet *set, size_t index) { \
36 if (index < SIZE) { \
37 set->bits[index / 8] |= (1u << (index % 8)); \
38 } \
39 } \
40 \
41 void NAME##_BitSet_clear(NAME##_BitSet *set, size_t index) { \
42 if (index < SIZE) { \
43 set->bits[index / 8] &= (uint8_t)~(1u << (index % 8)); \
44 } \
45 } \
46 \
47 bool NAME##_BitSet_get(const NAME##_BitSet *set, size_t index) { \
48 return index < SIZE && (set->bits[index / 8] & (1u << (index % 8))); \
49 } \
50 \
51 void NAME##_BitSet_clear_all(NAME##_BitSet *set) { \
52 for (size_t i = 0; i < sizeof(set->bits); ++i) { \
53 set->bits[i] = 0; \
54 } \
55 } \
56 \
57 size_t NAME##_BitSet_size(void) { return SIZE; }