]> mj.ucw.cz Git - libucw.git/blobdiff - ucw/gary.h
Conf: Decoupled cf_stack_done() from committing
[libucw.git] / ucw / gary.h
index 98fb26ffac1e97f323b93829358746b559299f47..b87a6fef03c36c5debe42ab9a21e6b0cbc9215b9 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *     UCW Library -- A simple growing array of an arbitrary type
  *
- *     (c) 2010 Martin Mares <mj@ucw.cz>
+ *     (c) 2010--2012 Martin Mares <mj@ucw.cz>
  */
 
 #ifndef _UCW_GARY_H
@@ -11,16 +11,19 @@ struct gary_hdr {
   size_t num_elts;
   size_t have_space;
   size_t elt_size;
+  int zeroed;
 };
 
 #define GARY_HDR_SIZE ALIGN_TO(sizeof(struct gary_hdr), CPU_STRUCT_ALIGN)
 #define GARY_HDR(ptr) ((struct gary_hdr *)((byte*)(ptr) - GARY_HDR_SIZE))
 #define GARY_BODY(ptr) ((byte *)(ptr) + GARY_HDR_SIZE)
 
-#define GARY_INIT(ptr, n) (ptr) = gary_init(sizeof(*(ptr)), (n))
+#define GARY_INIT(ptr, n) (ptr) = gary_init(sizeof(*(ptr)), (n), 0)
+#define GARY_INIT_ZERO(ptr, n) (ptr) = gary_init(sizeof(*(ptr)), (n), 1)
 #define GARY_FREE(ptr) do { if (ptr) xfree(GARY_HDR(ptr)); } while (0)
 #define GARY_SIZE(ptr) (GARY_HDR(ptr)->num_elts)
-#define GARY_SET_SIZE(ptr, n) (ptr) = gary_set_size((ptr), (n))
+#define GARY_RESIZE(ptr, n) (ptr) = gary_set_size((ptr), (n))
+#define GARY_INIT_OR_RESIZE(ptr, n) (ptr) = (ptr) ? gary_set_size((ptr), (n)) : gary_init(sizeof(*(ptr)), (n), 0)
 
 #define GARY_PUSH(ptr, n) ({                                           \
   struct gary_hdr *_h = GARY_HDR(ptr);                                 \
@@ -35,7 +38,7 @@ struct gary_hdr {
 #define GARY_FIX(ptr) (ptr) = gary_fix((ptr))
 
 /* Internal functions */
-void *gary_init(size_t elt_size, size_t num_elts);
+void *gary_init(size_t elt_size, size_t num_elts, int zeroed);
 void gary_free(void *array);
 void *gary_set_size(void *array, size_t n);
 void *gary_push_helper(void *array, size_t n, byte **cptr);