2 * UCW Library -- A simple growing array of an arbitrary type
4 * (c) 2010 Martin Mares <mj@ucw.cz>
16 #define GARY_HDR_SIZE ALIGN_TO(sizeof(struct gary_hdr), CPU_STRUCT_ALIGN)
17 #define GARY_HDR(ptr) ((struct gary_hdr *)((byte*)(ptr) - GARY_HDR_SIZE))
18 #define GARY_BODY(ptr) ((byte *)(ptr) + GARY_HDR_SIZE)
20 #define GARY_INIT(ptr, n) (ptr) = gary_init(sizeof(*(ptr)), (n))
21 #define GARY_FREE(ptr) do { if (ptr) xfree(GARY_HDR(ptr)); } while (0)
22 #define GARY_SIZE(ptr) (GARY_HDR(ptr)->num_elts)
23 #define GARY_SET_SIZE(ptr, n) (ptr) = gary_set_size((ptr), (n))
25 #define GARY_PUSH(ptr, n) ({ \
26 struct gary_hdr *_h = GARY_HDR(ptr); \
27 typeof(*(ptr)) *_c = &(ptr)[_h->num_elts]; \
30 if (_h->num_elts > _h->have_space) \
31 (ptr) = gary_push_helper((ptr), _n, (byte **) &_c); \
34 #define GARY_POP(ptr, n) GARY_HDR(ptr)->num_elts -= (n)
35 #define GARY_FIX(ptr) (ptr) = gary_fix((ptr))
37 /* Internal functions */
38 void *gary_init(size_t elt_size, size_t num_elts);
39 void gary_free(void *array);
40 void *gary_set_size(void *array, size_t n);
41 void *gary_push_helper(void *array, size_t n, byte **cptr);
42 void *gary_fix(void *array);