1
2 /*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) NGINX, Inc.
5 */
6
7 #ifndef _NJS_ARR_H_INCLUDED_
8 #define _NJS_ARR_H_INCLUDED_
9
10
11 typedef struct {
12 void *start;
13 /*
14 * A array can hold no more than 2**32 items.
15 * the item size is no more than 64K.
16 */
17 uint32_t items;
18 uint32_t available;
19 uint16_t item_size;
20
21 uint8_t pointer;
22 uint8_t separate;
23 njs_mp_t *mem_pool;
24 } njs_arr_t;
25
26
27 NJS_EXPORT njs_arr_t *njs_arr_create(njs_mp_t *mp, njs_uint_t n,
28 size_t size);
29 NJS_EXPORT void *njs_arr_init(njs_mp_t *mp, njs_arr_t *arr, void *start,
30 njs_uint_t n, size_t size);
31 NJS_EXPORT void njs_arr_destroy(njs_arr_t *arr);
32 NJS_EXPORT void *njs_arr_add(njs_arr_t *arr);
33 NJS_EXPORT void *njs_arr_add_multiple(njs_arr_t *arr, njs_uint_t n);
34 NJS_EXPORT void *njs_arr_zero_add(njs_arr_t *arr);
35 NJS_EXPORT void njs_arr_remove(njs_arr_t *arr, void *item);
36
37
38 #define njs_arr_item(arr, i) \
39 ((void *) ((char *) (arr)->start + (arr)->item_size * (i)))
40
41
42 #define njs_arr_last(arr) \
43 ((void *) \
44 ((char *) (arr)->start \
45 + (arr)->item_size * ((arr)->items - 1)))
46
47
48 #define njs_arr_reset(arr) \
49 (arr)->items = 0;
50
51
52 #define njs_arr_is_empty(arr) \
53 ((arr)->items == 0)
54
55
56 njs_inline void *
njs_arr_remove_last(njs_arr_t * arr)57 njs_arr_remove_last(njs_arr_t *arr)
58 {
59 arr->items--;
60 return (char *) arr->start + arr->item_size * arr->items;
61 }
62
63
64 #endif /* _NJS_ARR_H_INCLUDED_ */
65