X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=ucw%2Fgary.h;h=b87a6fef03c36c5debe42ab9a21e6b0cbc9215b9;hb=6efdc514c193f18c9ef840096750c37e78a01bf6;hp=386dd765cc913a7557b5f27e770b31f01bdf2df1;hpb=305df0095d05525e1324cbc7c74d764535338b07;p=libucw.git diff --git a/ucw/gary.h b/ucw/gary.h index 386dd765..b87a6fef 100644 --- a/ucw/gary.h +++ b/ucw/gary.h @@ -1,7 +1,7 @@ /* * UCW Library -- A simple growing array of an arbitrary type * - * (c) 2010 Martin Mares + * (c) 2010--2012 Martin Mares */ #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_FREE(ptr) xfree(GARY_HDR(ptr)) +#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);