7#ifndef _PICO_UTIL_FIXED_BITSET_H
8#define _PICO_UTIL_FIXED_BITSET_H
48#define fixed_bitset_type(N) union { \
49 fixed_bitset_t bitset; \
53 uint32_t words[((N) + 31) / 32]; \
56#define fixed_bitset_sizeof_for(N) ((((N) + 63u) / 32u) * 4u)
65#define fixed_bitset_with_fill(type, N, fill) ({ type bitset; fixed_bitset_init(&bitset, type, N, fill); bitset; })
70static_assert(sizeof(__not_real_bitset32) == fixed_bitset_sizeof_for(1),
"");
71static_assert(sizeof(__not_real_bitset33) == fixed_bitset_sizeof_for(37),
"");
72static_assert(sizeof(__not_real_bitset33) != fixed_bitset_sizeof_for(1),
"");
81#define fixed_bitset_init(ptr, type, N, fill) ({ \
82 assert(sizeof(type) == fixed_bitset_sizeof_for(N)); \
83 __unused type *type_check = ptr; \
84 (ptr)->bitset.size = N; \
85 (ptr)->bitset.word_size = ((N) + 31u) / 32u; \
86 __builtin_memset(&(ptr)->bitset.words, (fill) ? 0xff : 0, (ptr)->bitset.word_size * sizeof(uint32_t)); \
104 return bitset->word_size;
114 assert(bitset->word_size == (bitset->size + 31) / 32);
127 bitset->words[word_num] = value;
141 return bitset->words[word_num];
153 __builtin_memset(bitset->words, 0, bitset->word_size *
sizeof(uint32_t));
164 __builtin_memset(bitset->words, 0xff, bitset->word_size *
sizeof(uint32_t));
190 if (bit_index < bitset->size) {
191 bitset->words[bit_index / 32u] |= 1u << (bit_index % 32u);
204 if (bit_index < bitset->size) {
205 bitset->words[bit_index / 32u] &= ~(1u << (bit_index % 32u));
218 if (bit_index < bitset->size) {
219 bitset->words[bit_index / 32u] ^= 1u << (bit_index % 32u);
233 assert(bit_index < bitset->size);
235 return bitset->words[bit_index / 32u] & (1u << (bit_index % 32u));
249 assert(bitset1->
size == bitset2->
size);
250 return __builtin_memcmp(bitset1->
words, bitset2->
words, bitset1->
word_size *
sizeof(uint32_t)) == 0;
static fixed_bitset_t * fixed_bitset_clear(fixed_bitset_t *bitset, uint bit_index)
Clear a single bit in the bitset.
Definition fixed_bitset.h:202
bool fixed_bitset_is_empty(fixed_bitset_t *bitset)
Determine if bitset is empty.
Definition fixed_bitset.c:17
static fixed_bitset_t * fixed_bitset_set(fixed_bitset_t *bitset, uint bit_index)
Set a single bit in the bitset.
Definition fixed_bitset.h:188
static bool fixed_bitset_get(const fixed_bitset_t *bitset, uint bit_index)
Get the value of a single bit in the bitset.
Definition fixed_bitset.h:231
static void check_fixed_bitset(__unused const fixed_bitset_t *bitset)
Check that the bitset is valid.
Definition fixed_bitset.h:113
static uint fixed_bitset_word_size(const fixed_bitset_t *bitset)
Get the size of the bitset in words.
Definition fixed_bitset.h:103
static fixed_bitset_t * fixed_bitset_flip(fixed_bitset_t *bitset, uint bit_index)
Flip a single bit in the bitset.
Definition fixed_bitset.h:216
static fixed_bitset_t * fixed_bitset_clear_all(fixed_bitset_t *bitset)
Clear all bits in the bitset.
Definition fixed_bitset.h:151
#define fixed_bitset_type(N)
Macro used to define a fixed-size bitset of a given size.
Definition fixed_bitset.h:48
static fixed_bitset_t * fixed_bitset_set_all(fixed_bitset_t *bitset)
Set all bits in the bitset.
Definition fixed_bitset.h:162
static uint32_t fixed_bitset_read_word(const fixed_bitset_t *bitset, uint word_num)
Read a word in the bitset.
Definition fixed_bitset.h:138
fixed_bitset_t * fixed_bitset_flip_all(fixed_bitset_t *bitset)
Flip all bits in the bitset.
Definition fixed_bitset.c:9
static bool fixed_bitset_equal(const fixed_bitset_t *bitset1, const fixed_bitset_t *bitset2)
Check if two bitsets are equal.
Definition fixed_bitset.h:246
static uint fixed_bitset_size(const fixed_bitset_t *bitset)
Get the size of the bitset.
Definition fixed_bitset.h:94
static fixed_bitset_t * fixed_bitset_write_word(fixed_bitset_t *bitset, uint word_num, uint32_t value)
Write a word in the bitset.
Definition fixed_bitset.h:124
Base type for a fixed-size bitset.
Definition fixed_bitset.h:29
uint16_t word_size
Number of 32-bit words used to store the bits.
Definition fixed_bitset.h:31
uint16_t size
Number of bits in the bitset.
Definition fixed_bitset.h:30
uint32_t words[]
Storage array for the bitset words.
Definition fixed_bitset.h:32