libcute 0.1
Loading...
Searching...
No Matches
Macros
bitset.h File Reference
#include <stdalign.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
Include dependency graph for bitset.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define CU_BITSET_HEADER(NAME)
 
#define CU_BITSET_DECL(NAME, SIZE)
 
#define CU_BITSET_IMPL(NAME, SIZE)
 

Detailed Description

Fixed-size local bitset utilities.

Macro Definition Documentation

◆ CU_BITSET_DECL

#define CU_BITSET_DECL (   NAME,
  SIZE 
)
Value:
typedef struct { \
alignas(sizeof(size_t)) uint8_t bits[((SIZE) + 7) / 8]; \
} NAME##_BitSet; \
CU_BITSET_HEADER(NAME)

Declare the bitset struct and its helpers.

◆ CU_BITSET_HEADER

#define CU_BITSET_HEADER (   NAME)
Value:
NAME##_BitSet NAME##_BitSet_create(void); \
void NAME##_BitSet_set(NAME##_BitSet *set, size_t index); \
void NAME##_BitSet_clear(NAME##_BitSet *set, size_t index); \
bool NAME##_BitSet_get(const NAME##_BitSet *set, size_t index); \
void NAME##_BitSet_clear_all(NAME##_BitSet *set); \
size_t NAME##_BitSet_size(void);

Declare helper functions for a fixed-size bitset type.

◆ CU_BITSET_IMPL

#define CU_BITSET_IMPL (   NAME,
  SIZE 
)
Value:
NAME##_BitSet NAME##_BitSet_create(void) { \
NAME##_BitSet set = {0}; \
return set; \
} \
\
void NAME##_BitSet_set(NAME##_BitSet *set, size_t index) { \
if (index < SIZE) { \
set->bits[index / 8] |= (1u << (index % 8)); \
} \
} \
\
void NAME##_BitSet_clear(NAME##_BitSet *set, size_t index) { \
if (index < SIZE) { \
set->bits[index / 8] &= (uint8_t)~(1u << (index % 8)); \
} \
} \
\
bool NAME##_BitSet_get(const NAME##_BitSet *set, size_t index) { \
return index < SIZE && (set->bits[index / 8] & (1u << (index % 8))); \
} \
\
void NAME##_BitSet_clear_all(NAME##_BitSet *set) { \
for (size_t i = 0; i < sizeof(set->bits); ++i) { \
set->bits[i] = 0; \
} \
} \
\
size_t NAME##_BitSet_size(void) { return SIZE; }

Implement the helpers declared by CU_BITSET_DECL.