agileRTOS (zrtos)  Version 0.8.0 (ghostbuster)
bitfield.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2024 ykat UG (haftungsbeschraenkt) - All Rights Reserved
3  *
4  * Permission for non-commercial use is hereby granted,
5  * free of charge, without warranty of any kind.
6  */
7 #ifndef ZRTOS_BITFIELD_H
8 #define ZRTOS_BITFIELD_H
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 
14 #include <zrtos/types.h>
15 #include <zrtos/mem.h>
16 
17 
19 
20 #pragma pack(push,1)
21 typedef struct{
24 #pragma pack(pop)
25 
26 #define ZRTOS_BITFIELD__NFDBITS (8 * sizeof(zrtos_bitfield_mask_t))
27 #define ZRTOS_BITFIELD__ELT(d) (((size_t)d) / ZRTOS_BITFIELD__NFDBITS)
28 #define ZRTOS_BITFIELD__MASK(d) ((zrtos_bitfield_mask_t) (1 << (((size_t)d) % ZRTOS_BITFIELD__NFDBITS)))
29 #define ZRTOS_BITFIELD__MASK_MSB(d) ((zrtos_bitfield_mask_t) (1 << (7-(((size_t)d) % ZRTOS_BITFIELD__NFDBITS))))
30 
31 void zrtos_bitfield__set(zrtos_bitfield_t *thiz,size_t pos,bool val){
32  zrtos_bitfield_mask_t *tmp = &(&thiz->val)[ZRTOS_BITFIELD__ELT(pos)];
33  if(val){
34  *tmp |= ZRTOS_BITFIELD__MASK(pos);
35  }else{
36  *tmp &= ~ZRTOS_BITFIELD__MASK(pos);
37  }
38 }
39 
40 void zrtos_bitfield__set_msb(zrtos_bitfield_t *thiz,size_t pos,bool val){
41  zrtos_bitfield_mask_t *tmp = &(&thiz->val)[ZRTOS_BITFIELD__ELT(pos)];
42  if(val){
43  *tmp |= ZRTOS_BITFIELD__MASK_MSB(pos);
44  }else{
45  *tmp &= ~ZRTOS_BITFIELD__MASK_MSB(pos);
46  }
47 }
48 
49 bool zrtos_bitfield__get(zrtos_bitfield_t *thiz,size_t pos){
50  return 0 != (
51  (&thiz->val)[ZRTOS_BITFIELD__ELT(pos)] & ZRTOS_BITFIELD__MASK(pos)
52  );
53 }
54 
56  return (&thiz->val)[pos];
57 }
58 
59 void zrtos_bitfield__zero(zrtos_bitfield_t *thiz,size_t len){
60  zrtos_mem__zero(thiz,len);
61 }
62 
64  zrtos_mem__cpy(thiz,src,len);
65 }
66 
68  zrtos_bitfield_t *thiz
69  ,size_t len
70  ,size_t start
71  ,bool zero
72 ){
74  for(size_t i=start;i<len;i++){
75  bool val = zrtos_bitfield__get(thiz,i);
76 
77  if(zero){
78  val = !val;
79  }
80 
81  if(val){
82  return i;
83  }
84  }
85  return ZRTOS_TYPES__SIZE_MAX;
86 }
87 
89  zrtos_bitfield_t *thiz
90  ,size_t len
91  ,size_t start
92 ){
94  thiz
95  ,len
96  ,start
97  ,true
98  );
99 }
100 
102  zrtos_bitfield_t *thiz
103  ,size_t len
104  ,size_t start
105 ){
107  thiz
108  ,len
109  ,start
110  ,false
111  );
112 }
113 
114 #define ZRTOS_BITFIELD__EACH(thiz,len,pos) \
115  for(size_t pos = 0 \
116  ; ZRTOS_TYPES__SIZE_MAX \
117  != (pos = zrtos_bitfield__find_first_set(thiz,len,pos)) \
118  ;pos++ \
119  )
120 
121 
122 #ifdef __cplusplus
123 }
124 #endif
125 #endif
#define ZRTOS_BITFIELD__MASK(d)
Definition: bitfield.h:28
#define ZRTOS_BITFIELD__ELT(d)
Definition: bitfield.h:27
#define ZRTOS_BITFIELD__NFDBITS
Definition: bitfield.h:26
bool zrtos_bitfield__get(zrtos_bitfield_t *thiz, size_t pos)
Definition: bitfield.h:49
void zrtos_mem__zero(void *dest, size_t len)
Definition: mem.h:144
uint8_t val
Definition: bitfield.h:22
void zrtos_bitfield__copy(zrtos_bitfield_t *thiz, zrtos_bitfield_t *src, size_t len)
Definition: bitfield.h:63
#define ZRTOS_TYPES__SIZE_MAX
Definition: types.h:170
size_t zrtos_bitfield__find_first_set(zrtos_bitfield_t *thiz, size_t len, size_t start)
Definition: bitfield.h:101
size_t zrtos_bitfield__find_first(zrtos_bitfield_t *thiz, size_t len, size_t start, bool zero)
Definition: bitfield.h:67
void zrtos_mem__cpy(void *dest, void *src, size_t length)
Definition: mem.h:105
uint8_t zrtos_bitfield__get_uint8(zrtos_bitfield_t *thiz, size_t pos)
Definition: bitfield.h:55
size_t zrtos_bitfield__find_first_zero(zrtos_bitfield_t *thiz, size_t len, size_t start)
Definition: bitfield.h:88
void zrtos_bitfield__set_msb(zrtos_bitfield_t *thiz, size_t pos, bool val)
Definition: bitfield.h:40
uint8_t zrtos_bitfield_mask_t
Definition: bitfield.h:18
#define ZRTOS_BITFIELD__MASK_MSB(d)
Definition: bitfield.h:29
void zrtos_bitfield__zero(zrtos_bitfield_t *thiz, size_t len)
Definition: bitfield.h:59
void zrtos_bitfield__set(zrtos_bitfield_t *thiz, size_t pos, bool val)
Definition: bitfield.h:31
static uint8_t
Definition: mcp2515.h:159