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