1 /* ISC license. */
2 
3 #ifndef GENSETDYN_H
4 #define GENSETDYN_H
5 
6 #include <stdint.h>
7 #include <skalibs/stralloc.h>
8 #include <skalibs/genalloc.h>
9 #include <skalibs/functypes.h>
10 
11 typedef struct gensetdyn_s gensetdyn, *gensetdyn_ref ;
12 struct gensetdyn_s
13 {
14   stralloc storage ;
15   genalloc freelist ; /* array of uint32_t */
16   uint32_t esize ;
17   uint32_t base ;
18   uint32_t fracnum ;
19   uint32_t fracden ;
20 } ;
21 
22 #define GENSETDYN_ZERO { .storage = STRALLOC_ZERO, .freelist = GENALLOC_ZERO, .esize = 1, .base = 0, .fracnum = 0, .fracden = 1 }
23 extern gensetdyn const gensetdyn_zero ;
24 
25 #define GENSETDYN_INIT(type, b, num, den) { .storage = STRALLOC_ZERO, .freelist = GENALLOC_ZERO, .esize = sizeof(type), .base = (b), .fracnum = (num), .fracden = (den) }
26 extern void gensetdyn_init (gensetdyn *, uint32_t, uint32_t, uint32_t, uint32_t) ;
27 
28 #define gensetdyn_n(g) ((uint32_t)((g)->storage.len - genalloc_len(uint32_t, &(g)->freelist)))
29 extern int gensetdyn_ready (gensetdyn *, uint32_t) ;
30 #define gensetdyn_readyplus(x, n) gensetdyn_ready(x, gensetdyn_n(x) + (n))
31 extern void gensetdyn_free (gensetdyn *) ;
32 extern void gensetdyn_deepfree (gensetdyn *, freefunc_t_ref) ;
33 
34 extern int gensetdyn_new (gensetdyn *, uint32_t *) ;
35 extern int gensetdyn_delete (gensetdyn *, uint32_t) ;
36 
37 #define gensetdyn_p(g, i) ((g)->storage.s + (i) * (g)->esize)
38 #define GENSETDYN_P(type, g, i) ((type *)gensetdyn_p(g, i))
39 
40 extern uint32_t gensetdyn_iter_nocancel (gensetdyn *, uint32_t, iterfunc_t_ref, void *) ;
41 #define gensetdyn_iter(g, f, stuff) gensetdyn_iter_nocancel(g, gensetdyn_n(g), f, stuff)
42 extern int gensetdyn_iter_withcancel (gensetdyn *, iterfunc_t_ref, iterfunc_t_ref, void *) ;
43 
44 #endif
45