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