Loading...
Searching...
No Matches
fixed_bitset.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2026 Raspberry Pi (Trading) Ltd.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#ifndef _PICO_UTIL_FIXED_BITSET_H
8#define _PICO_UTIL_FIXED_BITSET_H
9
10#include "pico.h"
11
18
19#ifdef __cplusplus
20extern "C" {
21#endif
22
29typedef struct {
30 uint16_t size;
31 uint16_t word_size;
32 uint32_t words[];
34
48#define fixed_bitset_type(N) union { \
49 fixed_bitset_t bitset; \
50 struct { \
51 uint16_t size; \
52 uint16_t word_size; \
53 uint32_t words[((N) + 31) / 32]; \
54 } sized_bitset; \
55}
56#define fixed_bitset_sizeof_for(N) ((((N) + 63u) / 32u) * 4u)
57
65#define fixed_bitset_with_fill(type, N, fill) ({ type bitset; fixed_bitset_init(&bitset, type, N, fill); bitset; })
66
67// Quick test that the bitset macros give the correct size
68extern fixed_bitset_type(32) __not_real_bitset32;
69extern fixed_bitset_type(33) __not_real_bitset33;
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), "");
73
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)); \
87})
88
94static inline uint fixed_bitset_size(const fixed_bitset_t *bitset) {
95 return bitset->size;
96}
97
103static inline uint fixed_bitset_word_size(const fixed_bitset_t *bitset) {
104 return bitset->word_size;
105}
106
113static inline void check_fixed_bitset(__unused const fixed_bitset_t *bitset) {
114 assert(bitset->word_size == (bitset->size + 31) / 32);
115}
116
124static inline fixed_bitset_t *fixed_bitset_write_word(fixed_bitset_t *bitset, uint word_num, uint32_t value) {
125 check_fixed_bitset(bitset);
126 if (word_num < fixed_bitset_word_size(bitset)) {
127 bitset->words[word_num] = value;
128 }
129 return bitset;
130}
131
138static inline uint32_t fixed_bitset_read_word(const fixed_bitset_t *bitset, uint word_num) {
139 check_fixed_bitset(bitset);
140 if (word_num < fixed_bitset_word_size(bitset)) {
141 return bitset->words[word_num];
142 }
143 return 0;
144}
145
152 check_fixed_bitset(bitset);
153 __builtin_memset(bitset->words, 0, bitset->word_size * sizeof(uint32_t));
154 return bitset;
155}
156
163 check_fixed_bitset(bitset);
164 __builtin_memset(bitset->words, 0xff, bitset->word_size * sizeof(uint32_t));
165 return bitset;
166}
167
174
181
188static inline fixed_bitset_t *fixed_bitset_set(fixed_bitset_t *bitset, uint bit_index) {
189 check_fixed_bitset(bitset);
190 if (bit_index < bitset->size) {
191 bitset->words[bit_index / 32u] |= 1u << (bit_index % 32u);
192 }
193 return bitset;
194}
195
202static inline fixed_bitset_t *fixed_bitset_clear(fixed_bitset_t *bitset, uint bit_index) {
203 check_fixed_bitset(bitset);
204 if (bit_index < bitset->size) {
205 bitset->words[bit_index / 32u] &= ~(1u << (bit_index % 32u));
206 }
207 return bitset;
208}
209
216static inline fixed_bitset_t *fixed_bitset_flip(fixed_bitset_t *bitset, uint bit_index) {
217 check_fixed_bitset(bitset);
218 if (bit_index < bitset->size) {
219 bitset->words[bit_index / 32u] ^= 1u << (bit_index % 32u);
220 }
221 return bitset;
222}
223
224
231static inline bool fixed_bitset_get(const fixed_bitset_t *bitset, uint bit_index) {
232 check_fixed_bitset(bitset);
233 assert(bit_index < bitset->size);
234// if (bit < bitset->size) {
235 return bitset->words[bit_index / 32u] & (1u << (bit_index % 32u));
236// }
237 return false;
238}
239
246static inline bool fixed_bitset_equal(const fixed_bitset_t *bitset1, const fixed_bitset_t *bitset2) {
247 check_fixed_bitset(bitset1);
248 check_fixed_bitset(bitset2);
249 assert(bitset1->size == bitset2->size);
250 return __builtin_memcmp(bitset1->words, bitset2->words, bitset1->word_size * sizeof(uint32_t)) == 0;
251}
252
253#ifdef __cplusplus
254}
255#endif
256#endif
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