1 2 /* 3 * Copyright (C) Igor Sysoev 4 * Copyright (C) NGINX, Inc. 5 */ 6 7 #ifndef _NXT_ARRAY_H_INCLUDED_ 8 #define _NXT_ARRAY_H_INCLUDED_ 9 10 11 typedef struct { 12 void *elts; 13 /* nelts has uint32_t type because it is used most often. */ 14 uint32_t nelts; 15 uint16_t size; 16 uint16_t nalloc; 17 nxt_mp_t *mem_pool; 18 } nxt_array_t; 19 20 21 nxt_inline void 22 nxt_array_init(nxt_array_t *array, nxt_mp_t *mp, size_t size) 23 { 24 array->elts = nxt_pointer_to(array, sizeof(nxt_array_t)); 25 array->size = size; 26 array->mem_pool = mp; 27 } 28 29 NXT_EXPORT nxt_array_t *nxt_array_create(nxt_mp_t *mp, nxt_uint_t n, 30 size_t size); 31 NXT_EXPORT void nxt_array_destroy(nxt_array_t *array); 32 NXT_EXPORT void *nxt_array_add(nxt_array_t *array); 33 NXT_EXPORT void *nxt_array_zero_add(nxt_array_t *array); 34 NXT_EXPORT void nxt_array_remove(nxt_array_t *array, void *elt); 35 NXT_EXPORT nxt_array_t *nxt_array_copy(nxt_mp_t *mp, nxt_array_t *dst, 36 nxt_array_t *src); 37 38 #define \ 39 nxt_array_last(array) \ 40 nxt_pointer_to((array)->elts, (array)->size * ((array)->nelts - 1)) 41 42 43 #define \ 44 nxt_array_reset(array) \ 45 (array)->nelts = 0; 46 47 48 #define \ 49 nxt_array_is_empty(array) \ 50 ((array)->nelts == 0) 51 52 53 nxt_inline void * 54 nxt_array_remove_last(nxt_array_t *array) 55 { 56 array->nelts--; 57 return nxt_pointer_to(array->elts, array->size * array->nelts); 58 } 59 60 61 #endif /* _NXT_ARRAY_H_INCLUDED_ */ 62