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