chiark / gitweb /
Add support for arena management.
[mLib] / darray.h
index 065c5071edced675cf76332c9b8eed9e98e089b6..b8f17eb0499bf5418b23346b46c828abf00242d2 100644 (file)
--- a/darray.h
+++ b/darray.h
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: darray.h,v 1.4 1999/12/10 23:42:04 mdw Exp $
+ * $Id: darray.h,v 1.5 2000/06/17 10:37:39 mdw Exp $
  *
  * Dynamically growing dense arrays
  *
@@ -30,6 +30,9 @@
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: darray.h,v $
+ * Revision 1.5  2000/06/17 10:37:39  mdw
+ * Add support for arena management.
+ *
  * Revision 1.4  1999/12/10 23:42:04  mdw
  * Change header file guard names.
  *
@@ -104,6 +107,7 @@ typedef struct da_base {
   size_t len;                          /* Length of useful portion */
   size_t off;                          /* Offset of @v@ into space */
   unsigned push, unshift;              /* Pushes/unshifts since growth */
+  arena *a;                            /* Pointer to allocation arena */
 } da_base;
 
 /* --- @DA_DECL@ --- *
@@ -119,7 +123,7 @@ typedef struct da_base {
 
 /*----- Initialization, creation and destruction --------------------------*/
 
-#define DA_INIT { { 0, 0, 0, 0, 0 }, 0 } /* Standard initializer */
+#define DA_INIT { { 0, 0, 0, 0, 0, &arena_stdlib }, 0 }
 
 /* --- @DA_CREATE@ --- *
  *
@@ -128,11 +132,12 @@ typedef struct da_base {
  * Use:                Initializes an array block.
  */
 
-#define DA_CREATE(a) do {                                              \
-  (a)->b.sz = (a)->b.len = 0;                                          \
-  (a)->b.off = 0;                                                      \
-  (a)->b.push = (a)->b.unshift = 0;                                    \
-  (a)->v = 0;                                                          \
+#define DA_CREATE(aa) do {                                             \
+  (aa)->b.sz = (aa)->b.len = 0;                                                \
+  (aa)->b.off = 0;                                                     \
+  (aa)->b.push = (aa)->b.unshift = 0;                                  \
+  (aa)->b.a = &arena_stdlib;                                           \
+  (aa)->v = 0;                                                         \
 } while (0)
 
 /* --- @DA_DESTROY@ --- *
@@ -142,10 +147,10 @@ typedef struct da_base {
  * Use:                Destroys an array.  The array is left valid but empty.
  */
 
-#define DA_DESTROY(a) do {                                             \
-  if ((a)->v)                                                          \
-    free((a)->v - (a)->b.off);                                         \
-  DA_CREATE(a);                                                                \
+#define DA_DESTROY(aa) do {                                            \
+  if ((aa)->v)                                                         \
+    x_free((aa)->b.a, (aa)->v - (aa)->b.off);                          \
+  DA_CREATE(aa);                                                               \
 } while (0)
 
 /*----- Storage reservation -----------------------------------------------*/