summaryrefslogtreecommitdiff
path: root/src/include/skalibs/genset.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/skalibs/genset.h')
-rw-r--r--src/include/skalibs/genset.h37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/include/skalibs/genset.h b/src/include/skalibs/genset.h
new file mode 100644
index 0000000..5eb47d7
--- /dev/null
+++ b/src/include/skalibs/genset.h
@@ -0,0 +1,37 @@
+/* ISC license. */
+
+#ifndef GENSET_H
+#define GENSET_H
+
+#include <skalibs/functypes.h>
+
+typedef struct genset_s genset, *genset_ref ;
+struct genset_s
+{
+ char *storage ;
+ unsigned int *freelist ;
+ unsigned int esize ;
+ unsigned int max ;
+ unsigned int sp ;
+} ;
+
+#define GENSET_ZERO { .storage = 0, .freelist = 0, .esize = 1, .max = 0, .sp = 0 }
+extern void genset_init (genset_ref, void *, unsigned int *, unsigned int, unsigned int) ;
+#define GENSET_init(g, type, storage, fl, size) genset_init(g, storage, fl, sizeof(type), size)
+
+#define genset_p(type, g, i) ((type *)((g)->storage + (i) * (g)->esize))
+extern unsigned int genset_new (genset_ref) ;
+extern int genset_delete (genset_ref, unsigned int) ;
+#define genset_n(g) ((g)->max - (g)->sp)
+extern unsigned int genset_iter (genset_ref, iterfunc_t_ref, void *) ;
+
+
+#define GENSETB_TYPE(type, size) struct { type storage[size] ; unsigned int freelist[size] ; genset info ; }
+#define GENSETB_init(type, g, size) GENSET_init(&(g)->info, type, (g)->storage, (g)->freelist, size)
+#define gensetb_p(type, g, i) genset_p(type, &(g)->info, i)
+#define gensetb_new(g) genset_new(&(g)->info)
+#define gensetb_delete(g, i) genset_delete(&(g)->info, i)
+#define gensetb_n(g) genset_n(&(g)->info)
+#define gensetb_iter(g, f, p) genset_iter(&(g)->info, f, p)
+
+#endif