example stack implementation
authorken <ken@mihrtec.com>
Mon, 3 Oct 2016 20:55:50 +0000 (13:55 -0700)
committerken <ken@mihrtec.com>
Mon, 3 Oct 2016 20:55:50 +0000 (13:55 -0700)
src/apc/irmem.c

index 140a16a..5b4fb57 100644 (file)
@@ -63,10 +63,30 @@ int num_odats = 0;
 void* odat_buf[MAX_CHUNKS];
 long odats_per_page;
 
-int num_vdat_chunks = 0;
-int num_vdats = 0;
-void* vdat_buf[MAX_CHUNKS];
-long vdats_per_page;
+
+//"type free" chunk stacking
+struct chunk_stack
+{ void* chunks[MAX_CHUNKS];
+  void* csp;             //chunk stack pointer
+  void* dsp[MAX_CHUNKS]; //dat stack pointer (per chunk)
+} ocs, vcs, ccs;         //odat, vdat, and cdat chunk stacks
+
+//type safety handled by macro expansion
+#define CHUNK_LEN(STACK)    ((STACK).csp - (STACK).chunks)
+#define CURRENT_DAT(STACK,TYPE) ((TYPE)(STACK.dsp[CHUNK_LEN(STACK)])
+#define INCREMENT_DAT(STACK,TYPE) (++CURRENT_DAT(STACK,TYPE))
+//Stack-specific macros
+#define CURRENT_ODAT() (CURRENT_DAT(ocs,struct odat*))
+#define CURRENT_VDAT() (CURRENT_DAT(vcs,struct vdat*))
+#define CURRENT_CDAT() (CURRENT_DAT(ccs,struct cdat*))
+//Metadata
+#define CURRENT_MODEL() (CURRENT_VDAT()->model_list[CURRENT_VDAT()->num_models])
+
+
+int          num_vdat_chunks = 0;
+int          num_vdats = 0;
+struct vdat* vdat_buf[MAX_CHUNKS];
+long         vdats_per_page;
 
 int num_ref_chunks = 0;
 int num_refs = 0;