1
2 /*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) NGINX, Inc.
5 */
6
7 #ifndef _NXT_VECTOR_H_INCLUDED_
8 #define _NXT_VECTOR_H_INCLUDED_
9
10
11 typedef enum {
12 NXT_VECTOR_INITED = 0,
13 NXT_VECTOR_DESCRETE,
14 NXT_VECTOR_EMBEDDED,
15 } nxt_vector_type_t;
16
17
18 typedef struct {
19 void *start;
20 /*
21 * A vector can hold no more than 65536 items.
22 * The item size is no more than 64K.
23 */
24 uint16_t items;
25 uint16_t avalaible;
26 uint16_t item_size;
27 nxt_vector_type_t type:8;
28 } nxt_vector_t;
29
30
31 NXT_EXPORT nxt_vector_t *nxt_vector_create(nxt_uint_t items, size_t item_size,
32 const nxt_mem_proto_t *proto, void *pool);
33 NXT_EXPORT void *nxt_vector_init(nxt_vector_t *vector, nxt_uint_t items,
34 size_t item_size, const nxt_mem_proto_t *proto, void *pool);
35 NXT_EXPORT void nxt_vector_destroy(nxt_vector_t *vector,
36 const nxt_mem_proto_t *proto, void *pool);
37 NXT_EXPORT void *nxt_vector_add(nxt_vector_t *vector,
38 const nxt_mem_proto_t *proto, void *pool);
39 NXT_EXPORT void *nxt_vector_zero_add(nxt_vector_t *vector,
40 const nxt_mem_proto_t *proto, void *pool);
41 NXT_EXPORT void nxt_vector_remove(nxt_vector_t *vector, void *item);
42
43
44 #define nxt_vector_last(vector) \
45 nxt_pointer_to((vector)->start, \
46 (vector)->item_size * ((vector)->items - 1))
47
48
49 #define nxt_vector_reset(vector) \
50 (vector)->items = 0;
51
52
53 #define nxt_vector_is_empty(vector) \
54 ((vector)->items == 0)
55
56
57 nxt_inline void *
nxt_vector_remove_last(nxt_vector_t * vector)58 nxt_vector_remove_last(nxt_vector_t *vector)
59 {
60 vector->items--;
61 return nxt_pointer_to(vector->start, vector->item_size * vector->items);
62 }
63
64
65 #endif /* _NXT_VECTOR_H_INCLUDED_ */
66